diff --git a/lib/I18n/translations/english.yaml b/lib/I18n/translations/english.yaml index e7631317..948ec599 100644 --- a/lib/I18n/translations/english.yaml +++ b/lib/I18n/translations/english.yaml @@ -152,6 +152,7 @@ STR_DST_ACTIVE: "DST: active" STR_DST_INACTIVE: "DST: inactive" STR_DST_UNKNOWN: "DST: unknown" STR_REFRESH_FREQ: "Refresh Frequency" +STR_REFRESH_AFTER_IMAGE_PAGES: "Refresh after image pages" STR_KOREADER_SYNC: "KOReader Sync" STR_CHECK_UPDATES: "Check for updates" STR_LANGUAGE: "Language" diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index e19eaf29..fa9f3720 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -237,6 +237,8 @@ class CrossPointSettings { uint8_t sleepTimeout = SLEEP_10_MIN; // E-ink refresh frequency (default 15 pages) uint8_t refreshFrequency = REFRESH_15; + // Perform a half refresh on the page immediately following an EPUB page that displayed images. + uint8_t halfRefreshAfterImagePage = 1; uint8_t hyphenationEnabled = 0; // Reader screen margin settings diff --git a/src/SettingsList.h b/src/SettingsList.h index e09fa64d..03cb30f6 100644 --- a/src/SettingsList.h +++ b/src/SettingsList.h @@ -72,6 +72,9 @@ inline const std::vector list = { {StrId::STR_PAGES_1, StrId::STR_PAGES_5, StrId::STR_PAGES_10, StrId::STR_PAGES_15, StrId::STR_PAGES_30}, "refreshFrequency", StrId::STR_CAT_DISPLAY) .withSubcategory(StrId::STR_MENU_DISP_REFRESH), + SettingInfo::Toggle(StrId::STR_REFRESH_AFTER_IMAGE_PAGES, &CrossPointSettings::halfRefreshAfterImagePage, + "halfRefreshAfterImagePage", StrId::STR_CAT_DISPLAY) + .withSubcategory(StrId::STR_MENU_DISP_REFRESH), SettingInfo::Toggle(StrId::STR_SUNLIGHT_FADING_FIX, &CrossPointSettings::fadingFix, "fadingFix", StrId::STR_CAT_DISPLAY), SettingInfo::Enum(StrId::STR_UI_THEME, &CrossPointSettings::uiTheme, diff --git a/src/activities/reader/EpubReaderActivity.cpp b/src/activities/reader/EpubReaderActivity.cpp index 5f3fa1ff..e2711c7b 100644 --- a/src/activities/reader/EpubReaderActivity.cpp +++ b/src/activities/reader/EpubReaderActivity.cpp @@ -1145,6 +1145,8 @@ void EpubReaderActivity::renderContents(std::unique_ptr page, const int or // Force special handling for pages with images when anti-aliasing is on bool imagePageWithAA = page->hasImages() && SETTINGS.textAntiAliasing; + bool forceHalfRefreshThisPage = pendingHalfRefreshAfterImagePage && SETTINGS.halfRefreshAfterImagePage; + pendingHalfRefreshAfterImagePage = false; logReaderMemSnapshot("before_bw_render"); page->render(renderer, SETTINGS.getReaderFontId(), orientedMarginLeft, orientedMarginTop); @@ -1172,6 +1174,12 @@ void EpubReaderActivity::renderContents(std::unique_ptr page, const int or renderer.displayBuffer(HalDisplay::HALF_REFRESH); } // Double FAST_REFRESH handles ghosting for image pages; don't count toward full refresh cadence + if (forceHalfRefreshThisPage) { + pagesUntilFullRefresh = SETTINGS.getRefreshFrequency(); + } + } else if (forceHalfRefreshThisPage) { + renderer.displayBuffer(HalDisplay::HALF_REFRESH); + pagesUntilFullRefresh = SETTINGS.getRefreshFrequency(); } else { ReaderUtils::displayWithRefreshCycle(renderer, pagesUntilFullRefresh); } @@ -1183,6 +1191,10 @@ void EpubReaderActivity::renderContents(std::unique_ptr page, const int or const auto tBwStore = millis(); logReaderMemSnapshot("bw_store_end"); + if (page->hasImages() && getEffectiveImageRendering() != CrossPointSettings::IMAGES_SUPPRESS) { + pendingHalfRefreshAfterImagePage = true; + } + // grayscale rendering // TODO: Only do this if font supports it if (SETTINGS.textAntiAliasing) { diff --git a/src/activities/reader/EpubReaderActivity.h b/src/activities/reader/EpubReaderActivity.h index 004e36fc..8fa2d167 100644 --- a/src/activities/reader/EpubReaderActivity.h +++ b/src/activities/reader/EpubReaderActivity.h @@ -37,6 +37,7 @@ class EpubReaderActivity final : public Activity { int cachedChapterTotalPageCount = 0; unsigned long lastPageTurnTime = 0UL; unsigned long pageTurnDuration = 0UL; + bool pendingHalfRefreshAfterImagePage = false; // Signals that the next render should reposition within the newly loaded section // based on a cross-book percentage jump. bool pendingPercentJump = false;