From 655b5d46787eaf4cec988edbb0eb450acb0fd569 Mon Sep 17 00:00:00 2001 From: jpirnay Date: Wed, 8 Apr 2026 09:49:44 +0200 Subject: [PATCH] Some fixes --- src/activities/boot_sleep/SleepActivity.cpp | 51 +++++++++++++++++---- src/activities/util/BmpViewerActivity.cpp | 4 ++ 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/activities/boot_sleep/SleepActivity.cpp b/src/activities/boot_sleep/SleepActivity.cpp index a436de36..37f7ecc2 100644 --- a/src/activities/boot_sleep/SleepActivity.cpp +++ b/src/activities/boot_sleep/SleepActivity.cpp @@ -95,13 +95,12 @@ bool renderPngSleepScreen(const std::string& filename, GfxRenderer& renderer, co config.performanceMode = false; config.useExactDimensions = false; - PngToFramebufferConverter decoder; - if (!decoder.decodeToFramebuffer(filename, renderer, config)) { - LOG_DBG("SLP", "PNG sleep image decode failed: %s", filename.c_str()); - return false; - } - - if (!overlayInfo.progressText.empty()) { + // Overlay drawing is shared across all three rendering passes (BW + LSB + MSB) so the + // text appears on every plane. Captured by reference so the lambda sees the renderer. + const auto drawOverlay = [&]() { + if (overlayInfo.progressText.empty()) { + return; + } const int lineHeight12 = renderer.getLineHeight(BOOKERLY_12_FONT_ID); const int lineHeight10 = renderer.getLineHeight(UI_10_FONT_ID); constexpr int lineSpacing = 3; @@ -152,9 +151,45 @@ bool renderPngSleepScreen(const std::string& filename, GfxRenderer& renderer, co renderer.truncatedText(UI_10_FONT_ID, overlayInfo.progressText.c_str(), maxTextWidth); renderer.drawText(UI_10_FONT_ID, 10, y, progress.c_str(), true); } - } + }; + PngToFramebufferConverter decoder; + + // Pass 1: BW plane — mirrors SleepActivity::renderBitmapSleepScreen so the BW carrier + // matches the 4-level quantization layered on top via the LSB/MSB planes. + renderer.setRenderMode(GfxRenderer::BW); + renderer.clearScreen(); + if (!decoder.decodeToFramebuffer(filename, renderer, config)) { + LOG_DBG("SLP", "PNG sleep image decode failed: %s", filename.c_str()); + return false; + } + drawOverlay(); renderer.displayBuffer(HalDisplay::HALF_REFRESH); + + // Pass 2: GRAYSCALE_LSB plane. + renderer.clearScreen(0x00); + renderer.setRenderMode(GfxRenderer::GRAYSCALE_LSB); + if (!decoder.decodeToFramebuffer(filename, renderer, config)) { + LOG_DBG("SLP", "PNG sleep image LSB decode failed: %s", filename.c_str()); + renderer.setRenderMode(GfxRenderer::BW); + return false; + } + drawOverlay(); + renderer.copyGrayscaleLsbBuffers(); + + // Pass 3: GRAYSCALE_MSB plane. + renderer.clearScreen(0x00); + renderer.setRenderMode(GfxRenderer::GRAYSCALE_MSB); + if (!decoder.decodeToFramebuffer(filename, renderer, config)) { + LOG_DBG("SLP", "PNG sleep image MSB decode failed: %s", filename.c_str()); + renderer.setRenderMode(GfxRenderer::BW); + return false; + } + drawOverlay(); + renderer.copyGrayscaleMsbBuffers(); + + renderer.displayGrayBuffer(); + renderer.setRenderMode(GfxRenderer::BW); return true; } diff --git a/src/activities/util/BmpViewerActivity.cpp b/src/activities/util/BmpViewerActivity.cpp index 9c3e02e0..a5c478ea 100644 --- a/src/activities/util/BmpViewerActivity.cpp +++ b/src/activities/util/BmpViewerActivity.cpp @@ -290,6 +290,10 @@ bool BmpViewerActivity::renderDecodedImage(const bool showControls) { void BmpViewerActivity::toggleDisplayMode() { grayscaleDisplay = !grayscaleDisplay; + // Switching between 1-bit BW and 4-level grayscale requires a full refresh to clear + // ghosting from the previous mode — a half refresh leaves visible residue. + renderer.clearScreen(); + renderer.displayBuffer(HalDisplay::FULL_REFRESH); if (!renderCurrentImage()) { renderError(tr(STR_COULD_NOT_RENDER_IMAGE)); }