Some fixes

This commit is contained in:
jpirnay
2026-04-08 09:49:44 +02:00
parent 66508258d3
commit 655b5d4678
2 changed files with 47 additions and 8 deletions
+43 -8
View File
@@ -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;
}
@@ -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));
}