mirror of
https://github.com/daveallie/crosspoint-reader.git
synced 2026-02-07 08:07:40 +03:00
Moving color and dithering related helpers into dedicated file. In case of 2bpp (i.e. file generated from JPG), we don't apply any color adjustments. In other cases, they are applied based on selected algorithm.
68 lines
1.5 KiB
C++
68 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include <SdFat.h>
|
|
|
|
#include <cstdint>
|
|
|
|
#include "BitmapHelpers.h"
|
|
|
|
enum class BmpReaderError : uint8_t {
|
|
Ok = 0,
|
|
FileInvalid,
|
|
SeekStartFailed,
|
|
|
|
NotBMP,
|
|
DIBTooSmall,
|
|
|
|
BadPlanes,
|
|
UnsupportedBpp,
|
|
UnsupportedCompression,
|
|
|
|
BadDimensions,
|
|
ImageTooLarge,
|
|
PaletteTooLarge,
|
|
|
|
SeekPixelDataFailed,
|
|
BufferTooSmall,
|
|
OomRowBuffer,
|
|
ShortReadRow,
|
|
};
|
|
|
|
class Bitmap {
|
|
public:
|
|
static const char* errorToString(BmpReaderError err);
|
|
|
|
explicit Bitmap(FsFile& file, bool dithering = false) : file(file), dithering(dithering) {}
|
|
~Bitmap();
|
|
BmpReaderError parseHeaders();
|
|
BmpReaderError readNextRow(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(FsFile& f);
|
|
static uint32_t readLE32(FsFile& f);
|
|
|
|
FsFile& file;
|
|
bool dithering = false;
|
|
int width = 0;
|
|
int height = 0;
|
|
bool topDown = false;
|
|
uint32_t bfOffBits = 0;
|
|
uint16_t bpp = 0;
|
|
int rowBytes = 0;
|
|
uint8_t paletteLum[256] = {};
|
|
|
|
// Floyd-Steinberg dithering state (mutable for const methods)
|
|
mutable int16_t* errorCurRow = nullptr;
|
|
mutable int16_t* errorNextRow = nullptr;
|
|
mutable int prevRowY = -1; // Track row progression for error propagation
|
|
|
|
mutable AtkinsonDitherer* atkinsonDitherer = nullptr;
|
|
mutable FloydSteinbergDitherer* fsDitherer = nullptr;
|
|
};
|