53 lines
1.0 KiB
C
53 lines
1.0 KiB
C
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <FS.h>
|
||
|
|
|
||
|
|
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] = {};
|
||
|
|
};
|