Merge pull request #127 from jpirnay/feat-imagerefresh
fix: Autorefresh after image pages to get rid of ghosting artifacts (#116)
This commit is contained in:
@@ -152,6 +152,7 @@ STR_DST_ACTIVE: "DST: active"
|
|||||||
STR_DST_INACTIVE: "DST: inactive"
|
STR_DST_INACTIVE: "DST: inactive"
|
||||||
STR_DST_UNKNOWN: "DST: unknown"
|
STR_DST_UNKNOWN: "DST: unknown"
|
||||||
STR_REFRESH_FREQ: "Refresh Frequency"
|
STR_REFRESH_FREQ: "Refresh Frequency"
|
||||||
|
STR_REFRESH_AFTER_IMAGE_PAGES: "Refresh after image pages"
|
||||||
STR_KOREADER_SYNC: "KOReader Sync"
|
STR_KOREADER_SYNC: "KOReader Sync"
|
||||||
STR_CHECK_UPDATES: "Check for updates"
|
STR_CHECK_UPDATES: "Check for updates"
|
||||||
STR_LANGUAGE: "Language"
|
STR_LANGUAGE: "Language"
|
||||||
|
|||||||
@@ -237,6 +237,8 @@ class CrossPointSettings {
|
|||||||
uint8_t sleepTimeout = SLEEP_10_MIN;
|
uint8_t sleepTimeout = SLEEP_10_MIN;
|
||||||
// E-ink refresh frequency (default 15 pages)
|
// E-ink refresh frequency (default 15 pages)
|
||||||
uint8_t refreshFrequency = REFRESH_15;
|
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;
|
uint8_t hyphenationEnabled = 0;
|
||||||
|
|
||||||
// Reader screen margin settings
|
// Reader screen margin settings
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ inline const std::vector<SettingInfo> list = {
|
|||||||
{StrId::STR_PAGES_1, StrId::STR_PAGES_5, StrId::STR_PAGES_10, StrId::STR_PAGES_15, StrId::STR_PAGES_30},
|
{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)
|
"refreshFrequency", StrId::STR_CAT_DISPLAY)
|
||||||
.withSubcategory(StrId::STR_MENU_DISP_REFRESH),
|
.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",
|
SettingInfo::Toggle(StrId::STR_SUNLIGHT_FADING_FIX, &CrossPointSettings::fadingFix, "fadingFix",
|
||||||
StrId::STR_CAT_DISPLAY),
|
StrId::STR_CAT_DISPLAY),
|
||||||
SettingInfo::Enum(StrId::STR_UI_THEME, &CrossPointSettings::uiTheme,
|
SettingInfo::Enum(StrId::STR_UI_THEME, &CrossPointSettings::uiTheme,
|
||||||
|
|||||||
@@ -1145,6 +1145,8 @@ void EpubReaderActivity::renderContents(std::unique_ptr<Page> page, const int or
|
|||||||
|
|
||||||
// Force special handling for pages with images when anti-aliasing is on
|
// Force special handling for pages with images when anti-aliasing is on
|
||||||
bool imagePageWithAA = page->hasImages() && SETTINGS.textAntiAliasing;
|
bool imagePageWithAA = page->hasImages() && SETTINGS.textAntiAliasing;
|
||||||
|
bool forceHalfRefreshThisPage = pendingHalfRefreshAfterImagePage && SETTINGS.halfRefreshAfterImagePage;
|
||||||
|
pendingHalfRefreshAfterImagePage = false;
|
||||||
|
|
||||||
logReaderMemSnapshot("before_bw_render");
|
logReaderMemSnapshot("before_bw_render");
|
||||||
page->render(renderer, SETTINGS.getReaderFontId(), orientedMarginLeft, orientedMarginTop);
|
page->render(renderer, SETTINGS.getReaderFontId(), orientedMarginLeft, orientedMarginTop);
|
||||||
@@ -1172,6 +1174,12 @@ void EpubReaderActivity::renderContents(std::unique_ptr<Page> page, const int or
|
|||||||
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
|
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
|
||||||
}
|
}
|
||||||
// Double FAST_REFRESH handles ghosting for image pages; don't count toward full refresh cadence
|
// 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 {
|
} else {
|
||||||
ReaderUtils::displayWithRefreshCycle(renderer, pagesUntilFullRefresh);
|
ReaderUtils::displayWithRefreshCycle(renderer, pagesUntilFullRefresh);
|
||||||
}
|
}
|
||||||
@@ -1183,6 +1191,10 @@ void EpubReaderActivity::renderContents(std::unique_ptr<Page> page, const int or
|
|||||||
const auto tBwStore = millis();
|
const auto tBwStore = millis();
|
||||||
logReaderMemSnapshot("bw_store_end");
|
logReaderMemSnapshot("bw_store_end");
|
||||||
|
|
||||||
|
if (page->hasImages() && getEffectiveImageRendering() != CrossPointSettings::IMAGES_SUPPRESS) {
|
||||||
|
pendingHalfRefreshAfterImagePage = true;
|
||||||
|
}
|
||||||
|
|
||||||
// grayscale rendering
|
// grayscale rendering
|
||||||
// TODO: Only do this if font supports it
|
// TODO: Only do this if font supports it
|
||||||
if (SETTINGS.textAntiAliasing) {
|
if (SETTINGS.textAntiAliasing) {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ class EpubReaderActivity final : public Activity {
|
|||||||
int cachedChapterTotalPageCount = 0;
|
int cachedChapterTotalPageCount = 0;
|
||||||
unsigned long lastPageTurnTime = 0UL;
|
unsigned long lastPageTurnTime = 0UL;
|
||||||
unsigned long pageTurnDuration = 0UL;
|
unsigned long pageTurnDuration = 0UL;
|
||||||
|
bool pendingHalfRefreshAfterImagePage = false;
|
||||||
// Signals that the next render should reposition within the newly loaded section
|
// Signals that the next render should reposition within the newly loaded section
|
||||||
// based on a cross-book percentage jump.
|
// based on a cross-book percentage jump.
|
||||||
bool pendingPercentJump = false;
|
bool pendingPercentJump = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user