You've already forked crosspoint-reader
mirror of
https://github.com/crosspoint-reader/crosspoint-reader.git
synced 2026-02-13 15:13:44 -08:00
## Summary Continue my changes to introduce the HAL infrastructure from https://github.com/crosspoint-reader/crosspoint-reader/pull/522 This PR touches quite a lot of files, but most of them are just name changing. It should not have any impacts to the end behavior. ## Additional Context My plan is to firstly add this small shim layer, which sounds useless at first, but then I'll implement an emulated driver which can be helpful for testing and for development. Currently, on my fork, I'm using a FS driver that allow "mounting" a local directory from my computer to the device, much like the `-v` mount option on docker. This allows me to quickly reset `.crosspoint` directory if anything goes wrong. I plan to upstream this feature when this PR get merged. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? NO
70 lines
1.6 KiB
C++
70 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include <HalStorage.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; }
|
|
bool is1Bit() const { return bpp == 1; }
|
|
uint16_t getBpp() const { return bpp; }
|
|
|
|
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;
|
|
};
|