2022-03-06 01:51:51 +01:00
|
|
|
#ifndef BMPPP_BMPHEADER_H
|
|
|
|
#define BMPPP_BMPHEADER_H
|
2022-03-05 19:30:41 +01:00
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
namespace Leonetienne::BmpPP {
|
|
|
|
|
|
|
|
// This struct represents the actual image file.
|
|
|
|
class BmpHeader {
|
|
|
|
public:
|
|
|
|
|
|
|
|
//! This header contains information about the file itself.
|
|
|
|
struct FileHeader {
|
|
|
|
//! Constant value. These two bytes identify a bmp file.
|
|
|
|
const std::uint16_t signature = 0x4D42;
|
|
|
|
|
|
|
|
//! The size of the entire file, in bytes.
|
|
|
|
std::uint32_t filesize;
|
|
|
|
|
|
|
|
//! Reserved...
|
|
|
|
std::uint16_t reserved0;
|
|
|
|
|
|
|
|
//! Reserved...
|
|
|
|
std::uint16_t reserved1;
|
|
|
|
|
|
|
|
//! The address where the pixel buffer / pixel array begins.
|
|
|
|
std::uint32_t addressPixelBuffer;
|
|
|
|
|
|
|
|
// Since C++ tends to pad structures, we have to explicitly define how many bytes
|
|
|
|
// this struct is long. For example, sizeof(FileHeader) (without the size field)
|
|
|
|
// returns 16, even though it really should only be 14.
|
|
|
|
// This has to be set at the END of the struct, as to not be written to the file itself.
|
|
|
|
static constexpr std::uint16_t NBYTES = 14;
|
|
|
|
|
|
|
|
|
|
|
|
} fileHeader;
|
|
|
|
|
|
|
|
//! This header contains information about the image itself.
|
|
|
|
//! We are using the BITMAPINFOHEADER format.
|
|
|
|
struct DibHeader {
|
|
|
|
//! The size of the dibHeader (since there are multiple to choose from).
|
|
|
|
//! This one 40 bytes, fix.
|
|
|
|
const std::uint32_t dibHeaderSize = 40;
|
|
|
|
|
|
|
|
//! The width of the image, in pixels.
|
|
|
|
std::int32_t imageWidth;
|
|
|
|
|
|
|
|
//! The height of the image, in pixels.
|
|
|
|
std::int32_t imageHeight;
|
|
|
|
|
|
|
|
//! The amount of color planes used. Always 1.
|
|
|
|
const std::uint16_t numColorPlanes = 1;
|
|
|
|
|
|
|
|
//! The amount of bits (not bytes!) per pixel.
|
|
|
|
std::uint16_t numBitsPerPixel;
|
|
|
|
|
|
|
|
//! We don't use any compression.
|
|
|
|
const std::uint32_t compressionUsed = 0;
|
|
|
|
|
|
|
|
//! The size of the pixel array (including row padding)
|
|
|
|
std::uint32_t pixelArraySize;
|
|
|
|
|
|
|
|
//! The amount of pixels per meter on the horizontal axis. Kinda useless for our purposes, but required to be in the header.
|
|
|
|
const std::int32_t printResolutionHorizontal = 2835;
|
|
|
|
|
|
|
|
//! The amount of pixels per meter on the vertical axis. Kinda useless for our purposes, but required to be in the header.
|
|
|
|
const std::int32_t printResolutionVertical = 2835;
|
|
|
|
|
|
|
|
//! We don't have any colors in our color palette
|
|
|
|
const std::uint32_t numColorsInPalette = 0;
|
|
|
|
|
|
|
|
//! All colors are important
|
|
|
|
const std::uint32_t numImportantColors = 0;
|
|
|
|
|
|
|
|
// This has to be set at the END of the struct, as to not be written to the file itself.
|
|
|
|
static constexpr std::uint16_t NBYTES = 40;
|
|
|
|
|
|
|
|
} dibHeader;
|
|
|
|
|
|
|
|
//! Will return bytes representing the header
|
|
|
|
//! Just dumping the memory won't work, because the compiler may insert padding in between members
|
|
|
|
std::vector<std::uint8_t> ToBytes() const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
template <typename T>
|
|
|
|
void InsertBytes(std::vector<std::uint8_t>& vec, const T& value) const {
|
|
|
|
vec.insert(
|
|
|
|
vec.cend(),
|
|
|
|
static_cast<const std::uint8_t*>(static_cast<const void*>(&value)),
|
|
|
|
static_cast<const std::uint8_t*>(static_cast<const void*>(&value)) + sizeof(value)
|
|
|
|
);
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
};
|
2022-03-06 01:51:51 +01:00
|
|
|
|
2022-03-05 19:30:41 +01:00
|
|
|
}
|
|
|
|
|
2022-03-06 01:51:51 +01:00
|
|
|
#endif //BMPPP_BMPHEADER_H
|