diff --git a/src/bitmap.cpp b/src/bitmap.cpp index 779b924..90a1659 100644 --- a/src/bitmap.cpp +++ b/src/bitmap.cpp @@ -44,6 +44,10 @@ #include "font.h" #include "eventthread.h" +#ifdef __EMSCRIPTEN__ +#include +#endif + #define GUARD_MEGA \ { \ if (p->megaSurface) \ @@ -233,6 +237,39 @@ struct BitmapPrivate } }; +#ifdef __EMSCRIPTEN__ +EM_JS(void, load_file_async, (const char* fullPathC), { + Asyncify.handleSleep(function(wakeUp) { + const fullPath = UTF8ToString(fullPathC); + + // Make cache object + if (!window.fileAsyncCache) window.fileAsyncCache = {}; + + // Check if already loaded + if (window.fileAsyncCache.hasOwnProperty(fullPath)) return wakeUp(); + + // Get full destination + const file = "game/" + fullPath; + + // Get path and filename + const path = "/" + file.substring(0, file.lastIndexOf("/")); + const filename = file.substring(file.lastIndexOf("/") + 1); + + // Get target URL + const iurl = "gameasync/" + fullPath; + + // Delete original file + FS.unlink(path + "/" + filename); + + // Get the new file + FS.createPreloadedFile(path, filename, iurl, true, true, function() { + window.fileAsyncCache[fullPath] = 1; + wakeUp(); + }, console.error); + }); +}); +#endif; + struct BitmapOpenHandler : FileSystem::OpenHandler { SDL_Surface *surf; @@ -244,6 +281,7 @@ struct BitmapOpenHandler : FileSystem::OpenHandler bool tryRead(SDL_RWops &ops, const char *ext, const char * fullPath) { #ifdef __EMSCRIPTEN__ + load_file_async(fullPath); surf = IMG_Load(fullPath); #else surf = IMG_LoadTyped_RW(&ops, 1, ext);