diff --git a/lib/Epub/Epub/converters/JpegToFramebufferConverter.cpp b/lib/Epub/Epub/converters/JpegToFramebufferConverter.cpp index 0968fb5d..d05c3d34 100644 --- a/lib/Epub/Epub/converters/JpegToFramebufferConverter.cpp +++ b/lib/Epub/Epub/converters/JpegToFramebufferConverter.cpp @@ -20,60 +20,37 @@ namespace { // The draw callback receives this via pDraw->pUser (set by setUserPointer()). // The file I/O callbacks receive the FsFile* via pFile->fHandle (set by jpegOpen()). struct JpegContext { - GfxRenderer* renderer; - const RenderConfig* config; - int screenWidth; - int screenHeight; + GfxRenderer* renderer{nullptr}; + const RenderConfig* config{nullptr}; + int screenWidth{0}; + int screenHeight{0}; // Source dimensions after JPEGDEC's built-in scaling - int scaledSrcWidth; - int scaledSrcHeight; + int scaledSrcWidth{0}; + int scaledSrcHeight{0}; // Final output dimensions - int dstWidth; - int dstHeight; + int dstWidth{0}; + int dstHeight{0}; // Fine scale in 16.16 fixed-point (ESP32-C3 has no FPU) - int32_t fineScaleFP; // src -> dst mapping - int32_t invScaleFP; // dst -> src mapping + int32_t fineScaleFP{1 << 16}; // src -> dst mapping + int32_t invScaleFP{1 << 16}; // dst -> src mapping PixelCache cache; - bool caching; + bool caching{false}; // See PngContext for the rationale: monochromeOutput requests a 1-bit Atkinson dither // emitting only 0/3 so the BW DirectPixelWriter (`pixelValue < 3` rule) maps cleanly. - int oneBitDitherRow; - Atkinson1BitDitherer* atkinson1BitDitherer; + int oneBitDitherRow{-1}; + Atkinson1BitDitherer* atkinson1BitDitherer{nullptr}; #ifdef ENABLE_IMAGE_DITHERING_EXTENSION - int currentDitherRow; - AtkinsonDitherer* atkinsonDitherer; - DiffusedBayerDitherer* diffusedBayerDitherer; + int currentDitherRow{-1}; + AtkinsonDitherer* atkinsonDitherer{nullptr}; + DiffusedBayerDitherer* diffusedBayerDitherer{nullptr}; #endif - JpegContext() - : renderer(nullptr), - config(nullptr), - screenWidth(0), - screenHeight(0), - scaledSrcWidth(0), - scaledSrcHeight(0), - dstWidth(0), - dstHeight(0), - fineScaleFP(1 << 16), - invScaleFP(1 << 16), - caching(false), - oneBitDitherRow(-1), - atkinson1BitDitherer(nullptr) -#ifdef ENABLE_IMAGE_DITHERING_EXTENSION - , - currentDitherRow(-1), - atkinsonDitherer(nullptr), - diffusedBayerDitherer(nullptr) -#endif - { - } - ~JpegContext() { delete atkinson1BitDitherer; #ifdef ENABLE_IMAGE_DITHERING_EXTENSION diff --git a/lib/Epub/Epub/converters/PngToFramebufferConverter.cpp b/lib/Epub/Epub/converters/PngToFramebufferConverter.cpp index 53bbbea1..014cdceb 100644 --- a/lib/Epub/Epub/converters/PngToFramebufferConverter.cpp +++ b/lib/Epub/Epub/converters/PngToFramebufferConverter.cpp @@ -20,62 +20,38 @@ namespace { // The draw callback receives this via pDraw->pUser (set by png.decode()). // The file I/O callbacks receive the FsFile* via pFile->fHandle (set by pngOpen()). struct PngContext { - GfxRenderer* renderer; - const RenderConfig* config; - int screenWidth; - int screenHeight; + GfxRenderer* renderer{nullptr}; + const RenderConfig* config{nullptr}; + int screenWidth{0}; + int screenHeight{0}; // Scaling state - float scale; - int srcWidth; - int srcHeight; - int dstWidth; - int dstHeight; - int lastDstY; // Track last rendered destination Y to avoid duplicates + float scale{1.f}; + int srcWidth{0}; + int srcHeight{0}; + int dstWidth{0}; + int dstHeight{0}; + int lastDstY{-1}; // Track last rendered destination Y to avoid duplicates PixelCache cache; - bool caching; + bool caching{false}; - uint8_t* grayLineBuffer; + uint8_t* grayLineBuffer{nullptr}; // When the caller requests monochrome output (RenderConfig::monochromeOutput), // we run a proper 1-bit Atkinson dither (matching PngToBmpConverter's BW path) // and emit only values 0 or 3, which round-trip cleanly through the BW writer's // `pixelValue < 3` rule. The 4-level dither path collapses mid-grays to solid // black under that rule. - int oneBitDitherRow; - Atkinson1BitDitherer* atkinson1BitDitherer; + int oneBitDitherRow{-1}; + Atkinson1BitDitherer* atkinson1BitDitherer{nullptr}; #ifdef ENABLE_IMAGE_DITHERING_EXTENSION - int currentDitherRow; - AtkinsonDitherer* atkinsonDitherer; - DiffusedBayerDitherer* diffusedBayerDitherer; + int currentDitherRow{-1}; + AtkinsonDitherer* atkinsonDitherer{nullptr}; + DiffusedBayerDitherer* diffusedBayerDitherer{nullptr}; #endif - PngContext() - : renderer(nullptr), - config(nullptr), - screenWidth(0), - screenHeight(0), - scale(1.0f), - srcWidth(0), - srcHeight(0), - dstWidth(0), - dstHeight(0), - lastDstY(-1), - caching(false), - grayLineBuffer(nullptr), - oneBitDitherRow(-1), - atkinson1BitDitherer(nullptr) -#ifdef ENABLE_IMAGE_DITHERING_EXTENSION - , - currentDitherRow(-1), - atkinsonDitherer(nullptr), - diffusedBayerDitherer(nullptr) -#endif - { - } - ~PngContext() { delete atkinson1BitDitherer; #ifdef ENABLE_IMAGE_DITHERING_EXTENSION