From e142e88ce7725a736228a54e2efcef062c27a055 Mon Sep 17 00:00:00 2001 From: hooligan333 <59103913+hooligan333@users.noreply.github.com> Date: Sat, 11 Jul 2026 19:23:52 -0700 Subject: [PATCH] perf: drop per-image delay(50) on chapter build, retry getDimensions (#2434) Co-authored-by: Erica Jensen --- lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp index 865f7d96..c6c5723a 100644 --- a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp +++ b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp @@ -537,14 +537,22 @@ void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char* extractSuccess = self->epub->readItemContentsToStream(resolvedPath, cachedImageFile, 4096); cachedImageFile.flush(); cachedImageFile.close(); - delay(50); // Give SD card time to sync } if (extractSuccess) { - // Get image dimensions + // Get image dimensions, retrying to absorb SD-card sync latency on slow + // cards. Replaces a blanket delay(50) that cost ~50ms on every image, and + // closes the silent-drop bug where a single getDimensions failure was fatal. ImageDimensions dims = {0, 0}; ImageToFramebufferDecoder* decoder = ImageDecoderFactory::getDecoder(cachedImagePath); - if (decoder && decoder->getDimensions(cachedImagePath, dims)) { + bool gotDimensions = false; + for (int attempt = 0; attempt < 3 && !gotDimensions; attempt++) { + if (attempt > 0) { + delay(50); // Give a slow SD card time to finish syncing before retrying + } + gotDimensions = decoder && decoder->getDimensions(cachedImagePath, dims); + } + if (gotDimensions) { LOG_DBG("EHP", "Image dimensions: %dx%d", dims.width, dims.height); int displayWidth = 0;