From f953c730af2b90db99f709258c5d5e50fdcaadf7 Mon Sep 17 00:00:00 2001 From: BossCode45 Date: Fri, 27 Jun 2025 14:54:46 +1200 Subject: Initial commit Bringing a lot of stuff over from my maze-reader project in an attempt to split the image reading code off into a library. --- src/PNGImage.h | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/PNGImage.h (limited to 'src/PNGImage.h') diff --git a/src/PNGImage.h b/src/PNGImage.h new file mode 100644 index 0000000..23c32a0 --- /dev/null +++ b/src/PNGImage.h @@ -0,0 +1,60 @@ +#pragma once + +#include "reader.h" +#include "image.h" +#include "zlib.h" +#include +#include +#include +#include +#include + +#define CHUNK_READER(X) void X(uint32_t chunkSize) +#define REGISTER_CHUNK_READER(X) chunkReaders.insert({#X, &PNGImage::X}) +#define DEFINE_CHUNK_READER(X) void PNGImage::X(uint32_t chunkSize) + +class PNGImage : Image +{ +private: + ZLibInflator zlib; + uint8_t* idatData; + unsigned long idatDataSize; +public: + PNGImage(std::string filename); + ~PNGImage(); + + // sRGB + uint8_t renderingIntent; + + // pHYs + uint32_t pixelsPerX; + uint32_t pixelsPerY; + uint8_t unit; + + // tIME + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint8_t second; + + bool readNextChunk(); + +private: + std::map chunkReaders; + CHUNK_READER(IHDR); + CHUNK_READER(iCCP); + CHUNK_READER(sRGB); + CHUNK_READER(eXIf); + CHUNK_READER(iDOT); + CHUNK_READER(pHYs); + CHUNK_READER(tIME); + CHUNK_READER(tEXt); + CHUNK_READER(IDAT); + CHUNK_READER(IEND); + + bool end = false; + + Reader reader; +}; -- cgit v1.2.3