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;