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;