#pragma once #include enum class BmpReaderError : uint8_t { Ok = 0, FileInvalid, SeekStartFailed, NotBMP, DIBTooSmall, BadPlanes, UnsupportedBpp, UnsupportedCompression, BadDimensions, PaletteTooLarge, SeekPixelDataFailed, BufferTooSmall, OomRowBuffer, ShortReadRow, }; class Bitmap { public: static const char* errorToString(BmpReaderError err); explicit Bitmap(File& file) : file(file) {} BmpReaderError parseHeaders(); BmpReaderError readRow(uint8_t* data, uint8_t* rowBuffer) const; BmpReaderError rewindToData() const; int getWidth() const { return width; } int getHeight() const { return height; } bool isTopDown() const { return topDown; } bool hasGreyscale() const { return bpp > 1; } int getRowBytes() const { return rowBytes; } private: static uint16_t readLE16(File& f); static uint32_t readLE32(File& f); File& file; int width = 0; int height = 0; bool topDown = false; uint32_t bfOffBits = 0; uint16_t bpp = 0; int rowBytes = 0; uint8_t paletteLum[256] = {}; };