From d3743185e73af929a02d44dc18c643bbbe884a22 Mon Sep 17 00:00:00 2001 From: Dave Allie Date: Mon, 8 Dec 2025 03:07:10 +1100 Subject: [PATCH] Refresh screen every 15 pages to avoid ghosting --- lib/EpdRenderer/EpdRenderer.cpp | 10 +++++----- lib/EpdRenderer/EpdRenderer.h | 2 +- lib/Epub/Epub/blocks/TextBlock.cpp | 2 +- src/main.cpp | 2 +- src/screens/EpubReaderScreen.cpp | 12 +++++++++--- src/screens/EpubReaderScreen.h | 2 +- src/screens/FileSelectionScreen.cpp | 4 ++-- src/screens/FullScreenMessageScreen.cpp | 6 +++--- src/screens/FullScreenMessageScreen.h | 13 ++++++------- 9 files changed, 29 insertions(+), 24 deletions(-) diff --git a/lib/EpdRenderer/EpdRenderer.cpp b/lib/EpdRenderer/EpdRenderer.cpp index 88bf891..6519be1 100644 --- a/lib/EpdRenderer/EpdRenderer.cpp +++ b/lib/EpdRenderer/EpdRenderer.cpp @@ -128,7 +128,7 @@ void EpdRenderer::drawTextBox(const int x, const int y, const std::string& text, int ypos = 0; while (true) { if (end >= length) { - drawText(x, y + ypos, text.substr(start, length - start).c_str(), 1, style); + drawText(x, y + ypos, text.substr(start, length - start).c_str(), true, style); break; } @@ -137,7 +137,7 @@ void EpdRenderer::drawTextBox(const int x, const int y, const std::string& text, } if (text[end - 1] == '\n') { - drawText(x, y + ypos, text.substr(start, end - start).c_str(), 1, style); + drawText(x, y + ypos, text.substr(start, end - start).c_str(), true, style); ypos += getLineHeight(); start = end; end = start + 1; @@ -145,7 +145,7 @@ void EpdRenderer::drawTextBox(const int x, const int y, const std::string& text, } if (getTextWidth(text.substr(start, end - start).c_str(), style) > width) { - drawText(x, y + ypos, text.substr(start, end - start - 1).c_str(), 1, style); + drawText(x, y + ypos, text.substr(start, end - start - 1).c_str(), true, style); ypos += getLineHeight(); start = end - 1; continue; @@ -204,8 +204,8 @@ void EpdRenderer::clearScreen(const uint8_t color) const { einkDisplay.clearScreen(color); } -void EpdRenderer::flushDisplay(const bool partialUpdate) const { - einkDisplay.displayBuffer(partialUpdate ? EInkDisplay::FAST_REFRESH : EInkDisplay::FULL_REFRESH); +void EpdRenderer::flushDisplay(const EInkDisplay::RefreshMode refreshMode) const { + einkDisplay.displayBuffer(refreshMode); } // TODO: Support partial window update diff --git a/lib/EpdRenderer/EpdRenderer.h b/lib/EpdRenderer/EpdRenderer.h index 2e5473a..58f1489 100644 --- a/lib/EpdRenderer/EpdRenderer.h +++ b/lib/EpdRenderer/EpdRenderer.h @@ -37,7 +37,7 @@ class EpdRenderer { void copyGrayscaleMsbBuffers() const; void displayGrayBuffer() const; void clearScreen(uint8_t color = 0xFF) const; - void flushDisplay(bool partialUpdate = true) const; + void flushDisplay(EInkDisplay::RefreshMode refreshMode = EInkDisplay::FAST_REFRESH) const; void flushArea(int x, int y, int width, int height) const; int getPageWidth() const; diff --git a/lib/Epub/Epub/blocks/TextBlock.cpp b/lib/Epub/Epub/blocks/TextBlock.cpp index c6824b5..191cc48 100644 --- a/lib/Epub/Epub/blocks/TextBlock.cpp +++ b/lib/Epub/Epub/blocks/TextBlock.cpp @@ -165,7 +165,7 @@ void TextBlock::render(const EpdRenderer& renderer, const int x, const int y) co } else if (wordStyles[i] & ITALIC_SPAN) { fontStyle = ITALIC; } - renderer.drawText(x + wordXpos[i], y, words[i].c_str(), 1, fontStyle); + renderer.drawText(x + wordXpos[i], y, words[i].c_str(), true, fontStyle); } } diff --git a/src/main.cpp b/src/main.cpp index 4b170dd..22e6053 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -141,7 +141,7 @@ void onSelectEpubFile(const std::string& path) { enterNewScreen(new EpubReaderScreen(renderer, inputManager, epub, onGoHome)); } else { exitScreen(); - enterNewScreen(new FullScreenMessageScreen(renderer, inputManager, "Failed to load epub", REGULAR, false, false)); + enterNewScreen(new FullScreenMessageScreen(renderer, inputManager, "Failed to load epub", REGULAR, EInkDisplay::HALF_REFRESH)); delay(2000); onGoHome(); } diff --git a/src/screens/EpubReaderScreen.cpp b/src/screens/EpubReaderScreen.cpp index bfcd4d7..448a054 100644 --- a/src/screens/EpubReaderScreen.cpp +++ b/src/screens/EpubReaderScreen.cpp @@ -6,7 +6,7 @@ #include "Battery.h" -constexpr int PAGES_PER_REFRESH = 20; +constexpr int PAGES_PER_REFRESH = 15; constexpr unsigned long SKIP_CHAPTER_MS = 700; void EpubReaderScreen::taskTrampoline(void* param) { @@ -218,10 +218,16 @@ void EpubReaderScreen::renderScreen() { f.close(); } -void EpubReaderScreen::renderContents(const Page* p) const { +void EpubReaderScreen::renderContents(const Page* p) { p->render(renderer); renderStatusBar(); - renderer.flushDisplay(); + if (pagesUntilFullRefresh <= 1) { + renderer.flushDisplay(EInkDisplay::HALF_REFRESH); + pagesUntilFullRefresh = PAGES_PER_REFRESH; + } else { + renderer.flushDisplay(); + pagesUntilFullRefresh--; + } // grayscale rendering { diff --git a/src/screens/EpubReaderScreen.h b/src/screens/EpubReaderScreen.h index 55bbae7..81ffdcf 100644 --- a/src/screens/EpubReaderScreen.h +++ b/src/screens/EpubReaderScreen.h @@ -21,7 +21,7 @@ class EpubReaderScreen final : public Screen { static void taskTrampoline(void* param); [[noreturn]] void displayTaskLoop(); void renderScreen(); - void renderContents(const Page* p) const; + void renderContents(const Page *p); void renderStatusBar() const; public: diff --git a/src/screens/FileSelectionScreen.cpp b/src/screens/FileSelectionScreen.cpp index de03733..a29bc8b 100644 --- a/src/screens/FileSelectionScreen.cpp +++ b/src/screens/FileSelectionScreen.cpp @@ -120,7 +120,7 @@ void FileSelectionScreen::render() const { const auto pageWidth = renderer.getPageWidth(); const auto titleWidth = renderer.getTextWidth("CrossPoint Reader", BOLD); - renderer.drawText((pageWidth - titleWidth) / 2, 0, "CrossPoint Reader", 1, BOLD); + renderer.drawText((pageWidth - titleWidth) / 2, 0, "CrossPoint Reader", true, BOLD); if (files.empty()) { renderer.drawUiText(10, 50, "No EPUBs found"); @@ -130,7 +130,7 @@ void FileSelectionScreen::render() const { for (size_t i = 0; i < files.size(); i++) { const auto file = files[i]; - renderer.drawUiText(10, 50 + i * 30, file.c_str(), i == selectorIndex ? 0 : 1); + renderer.drawUiText(10, 50 + i * 30, file.c_str(), i != selectorIndex); } } diff --git a/src/screens/FullScreenMessageScreen.cpp b/src/screens/FullScreenMessageScreen.cpp index bba4a09..7110dd0 100644 --- a/src/screens/FullScreenMessageScreen.cpp +++ b/src/screens/FullScreenMessageScreen.cpp @@ -8,7 +8,7 @@ void FullScreenMessageScreen::onEnter() { const auto left = (renderer.getPageWidth() - width) / 2; const auto top = (renderer.getPageHeight() - height) / 2; - renderer.clearScreen(invert); - renderer.drawUiText(left, top, text.c_str(), invert ? 0 : 1, style); - renderer.flushDisplay(partialUpdate); + renderer.clearScreen(); + renderer.drawUiText(left, top, text.c_str(), true, style); + renderer.flushDisplay(refreshMode); } diff --git a/src/screens/FullScreenMessageScreen.h b/src/screens/FullScreenMessageScreen.h index 6d5fe9b..cdc6f01 100644 --- a/src/screens/FullScreenMessageScreen.h +++ b/src/screens/FullScreenMessageScreen.h @@ -2,23 +2,22 @@ #include #include -#include "EpdFontFamily.h" +#include +#include #include "Screen.h" class FullScreenMessageScreen final : public Screen { std::string text; EpdFontStyle style; - bool invert; - bool partialUpdate; + EInkDisplay::RefreshMode refreshMode; public: explicit FullScreenMessageScreen(EpdRenderer& renderer, InputManager& inputManager, std::string text, - const EpdFontStyle style = REGULAR, const bool invert = false, - const bool partialUpdate = true) + const EpdFontStyle style = REGULAR, + const EInkDisplay::RefreshMode refreshMode = EInkDisplay::FAST_REFRESH) : Screen(renderer, inputManager), text(std::move(text)), style(style), - invert(invert), - partialUpdate(partialUpdate) {} + refreshMode(refreshMode) {} void onEnter() override; };