Merge pull request #242 from jpirnay/refactor-pr

perf: Shrink HomeActivity cover cache from 48KB framebuffer to 16KB region (PR 2035 by jeremydk)
This commit is contained in:
jpirnay
2026-05-19 13:29:15 +02:00
committed by GitHub
4 changed files with 96 additions and 23 deletions
+20 -23
View File
@@ -384,37 +384,28 @@ void HomeActivity::onExit() {
}
bool HomeActivity::storeCoverBuffer() {
uint8_t* frameBuffer = renderer.getFrameBuffer();
if (!frameBuffer) {
return false;
}
// Free any existing buffer first
if (coverRectW <= 0 || coverRectH <= 0) return false;
freeCoverBuffer();
const size_t bufferSize = renderer.getBufferSize();
coverBuffer = static_cast<uint8_t*>(malloc(bufferSize));
const size_t needed = renderer.getRegionByteSize(coverRectX, coverRectY, coverRectW, coverRectH);
if (needed == 0) return false;
coverBuffer = static_cast<uint8_t*>(malloc(needed));
if (!coverBuffer) {
LOG_ERR("HOME", "OOM: cover buffer (%u bytes)", (unsigned)needed);
return false;
}
coverBufferSize = needed;
if (!renderer.copyRegionToBuffer(coverRectX, coverRectY, coverRectW, coverRectH, coverBuffer, coverBufferSize)) {
free(coverBuffer);
coverBuffer = nullptr;
coverBufferSize = 0;
return false;
}
memcpy(coverBuffer, frameBuffer, bufferSize);
return true;
}
bool HomeActivity::restoreCoverBuffer() {
if (!coverBuffer) {
return false;
}
uint8_t* frameBuffer = renderer.getFrameBuffer();
if (!frameBuffer) {
return false;
}
const size_t bufferSize = renderer.getBufferSize();
memcpy(frameBuffer, coverBuffer, bufferSize);
return true;
if (!coverBuffer || coverRectW <= 0 || coverRectH <= 0) return false;
return renderer.copyBufferToRegion(coverRectX, coverRectY, coverRectW, coverRectH, coverBuffer, coverBufferSize);
}
void HomeActivity::freeCoverBuffer() {
@@ -422,6 +413,7 @@ void HomeActivity::freeCoverBuffer() {
free(coverBuffer);
coverBuffer = nullptr;
}
coverBufferSize = 0;
coverBufferStored = false;
}
@@ -549,6 +541,11 @@ void HomeActivity::render(RenderLock&&) {
const HomeScreenLayout layout = computeHomeScreenLayout(metrics, contentRect.height, menuCount);
coverRectX = contentRect.x;
coverRectY = metrics.homeTopPadding;
coverRectW = contentRect.width;
coverRectH = layout.recentTileHeight;
GUI.drawRecentBookCover(renderer,
Rect{contentRect.x, metrics.homeTopPadding, contentRect.width, layout.recentTileHeight},
recentBooks, selectorIndex, coverRendered, coverBufferStored, bufferRestored,
+5
View File
@@ -41,6 +41,11 @@ class HomeActivity final : public Activity {
bool coverBufferStored = false;
size_t nextRecentCoverIndex = 0;
uint8_t* coverBuffer = nullptr;
size_t coverBufferSize = 0;
int coverRectX = 0;
int coverRectY = 0;
int coverRectW = 0;
int coverRectH = 0;
std::vector<RecentBook> recentBooks;
std::vector<MenuEntry> menuEntries;