fix: Align double FAST_REFRESH image rendering with upstream PR #957
Reorder refresh branches so image+AA pages always use the double FAST_REFRESH technique instead of occasionally falling through to HALF_REFRESH when the refresh counter expires. Image pages no longer count toward the full refresh cadence. Remove experimental Method B toggle (USE_IMAGE_DOUBLE_FAST_REFRESH / displayWindow). Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -22,11 +22,6 @@
|
|||||||
#include "util/BookmarkStore.h"
|
#include "util/BookmarkStore.h"
|
||||||
#include "util/Dictionary.h"
|
#include "util/Dictionary.h"
|
||||||
|
|
||||||
// Image refresh optimization strategy:
|
|
||||||
// 0 = Use double FAST_REFRESH technique (default, feels snappier)
|
|
||||||
// 1 = Use displayWindow() for partial refresh (experimental)
|
|
||||||
#define USE_IMAGE_DOUBLE_FAST_REFRESH 0
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
// pagesPerRefresh now comes from SETTINGS.getRefreshFrequency()
|
// pagesPerRefresh now comes from SETTINGS.getRefreshFrequency()
|
||||||
constexpr unsigned long skipChapterMs = 700;
|
constexpr unsigned long skipChapterMs = 700;
|
||||||
@@ -1022,13 +1017,8 @@ void EpubReaderActivity::saveProgress(int spineIndex, int currentPage, int pageC
|
|||||||
void EpubReaderActivity::renderContents(std::unique_ptr<Page> page, const int orientedMarginTop,
|
void EpubReaderActivity::renderContents(std::unique_ptr<Page> page, const int orientedMarginTop,
|
||||||
const int orientedMarginRight, const int orientedMarginBottom,
|
const int orientedMarginRight, const int orientedMarginBottom,
|
||||||
const int orientedMarginLeft) {
|
const int orientedMarginLeft) {
|
||||||
// Determine if this page needs special image handling
|
// Force special handling for pages with images when anti-aliasing is on
|
||||||
bool pageHasImages = page->hasImages();
|
bool imagePageWithAA = page->hasImages() && SETTINGS.textAntiAliasing;
|
||||||
bool useAntiAliasing = SETTINGS.textAntiAliasing;
|
|
||||||
|
|
||||||
// Force half refresh for pages with images when anti-aliasing is on,
|
|
||||||
// as grayscale tones require half refresh to display correctly
|
|
||||||
bool forceFullRefresh = pageHasImages && useAntiAliasing;
|
|
||||||
|
|
||||||
page->render(renderer, SETTINGS.getReaderFontId(), orientedMarginLeft, orientedMarginTop);
|
page->render(renderer, SETTINGS.getReaderFontId(), orientedMarginLeft, orientedMarginTop);
|
||||||
|
|
||||||
@@ -1048,42 +1038,26 @@ void EpubReaderActivity::renderContents(std::unique_ptr<Page> page, const int or
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderStatusBar(orientedMarginRight, orientedMarginBottom, orientedMarginLeft);
|
renderStatusBar(orientedMarginRight, orientedMarginBottom, orientedMarginLeft);
|
||||||
|
if (imagePageWithAA) {
|
||||||
// Check if half-refresh is needed (either entering Reader or pages counter reached)
|
// Double FAST_REFRESH with selective image blanking (pablohc's technique):
|
||||||
if (pagesUntilFullRefresh <= 1) {
|
// HALF_REFRESH sets particles too firmly for the grayscale LUT to adjust.
|
||||||
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
|
// Instead, blank only the image area and do two fast refreshes.
|
||||||
pagesUntilFullRefresh = SETTINGS.getRefreshFrequency();
|
|
||||||
} else if (forceFullRefresh) {
|
|
||||||
// OPTIMIZATION: For image pages with anti-aliasing, use fast double-refresh technique
|
|
||||||
// to reduce perceived lag. Only when pagesUntilFullRefresh > 1 (screen already clean).
|
|
||||||
int imgX, imgY, imgW, imgH;
|
int imgX, imgY, imgW, imgH;
|
||||||
if (page->getImageBoundingBox(imgX, imgY, imgW, imgH)) {
|
if (page->getImageBoundingBox(imgX, imgY, imgW, imgH)) {
|
||||||
int screenX = imgX + orientedMarginLeft;
|
renderer.fillRect(imgX + orientedMarginLeft, imgY + orientedMarginTop, imgW, imgH, false);
|
||||||
int screenY = imgY + orientedMarginTop;
|
renderer.displayBuffer(HalDisplay::FAST_REFRESH);
|
||||||
LOG_DBG("ERS", "Image page: fast double-refresh (page bbox: %d,%d %dx%d, screen: %d,%d %dx%d)", imgX, imgY, imgW,
|
|
||||||
imgH, screenX, screenY, imgW, imgH);
|
|
||||||
|
|
||||||
#if USE_IMAGE_DOUBLE_FAST_REFRESH == 0
|
|
||||||
// Method A: Fill blank area + two FAST_REFRESH operations
|
|
||||||
renderer.fillRect(screenX, screenY, imgW, imgH, false);
|
|
||||||
renderer.displayBuffer(HalDisplay::FAST_REFRESH);
|
|
||||||
page->render(renderer, SETTINGS.getReaderFontId(), orientedMarginLeft, orientedMarginTop);
|
page->render(renderer, SETTINGS.getReaderFontId(), orientedMarginLeft, orientedMarginTop);
|
||||||
renderStatusBar(orientedMarginRight, orientedMarginBottom, orientedMarginLeft);
|
renderStatusBar(orientedMarginRight, orientedMarginBottom, orientedMarginLeft);
|
||||||
renderer.displayBuffer(HalDisplay::FAST_REFRESH);
|
renderer.displayBuffer(HalDisplay::FAST_REFRESH);
|
||||||
#else
|
|
||||||
// Method B (experimental): Use displayWindow() for partial refresh
|
|
||||||
renderer.displayBuffer(HalDisplay::FAST_REFRESH);
|
|
||||||
page->render(renderer, SETTINGS.getReaderFontId(), orientedMarginLeft, orientedMarginTop);
|
|
||||||
renderStatusBar(orientedMarginRight, orientedMarginBottom, orientedMarginLeft);
|
|
||||||
renderer.displayWindow(screenX, screenY, imgW, imgH, HalDisplay::FAST_REFRESH);
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
LOG_DBG("ERS", "Image page but no bbox, using standard half refresh");
|
|
||||||
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
|
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
|
||||||
}
|
}
|
||||||
pagesUntilFullRefresh--;
|
// Double FAST_REFRESH handles ghosting for image pages; don't count toward full refresh cadence
|
||||||
|
} else if (pagesUntilFullRefresh <= 1) {
|
||||||
|
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
|
||||||
|
pagesUntilFullRefresh = SETTINGS.getRefreshFrequency();
|
||||||
} else {
|
} else {
|
||||||
// Normal page without images, or images without anti-aliasing
|
|
||||||
renderer.displayBuffer();
|
renderer.displayBuffer();
|
||||||
pagesUntilFullRefresh--;
|
pagesUntilFullRefresh--;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user