From 7ace470f25c63870bbede11a261607c09484cb57 Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Thu, 13 Feb 2025 12:22:27 -0500 Subject: [PATCH 01/16] IMG_webp: Fix animated WebP frame composition The WebP animation loader was not correctly handling frame composition and disposal. Fixed by properly implementing: 1. Frame disposal methods (WEBP_MUX_DISPOSE_BACKGROUND) 2. Initial canvas state based on alpha channel presence 3. Frame blending using SDL_BLENDMODE_NONE for accurate composition 4. Region-specific disposal and updates The loader now correctly: - Uses background color for non-alpha WebPs - Uses transparency for WebPs with alpha channel - Handles frame disposal before applying new frames - Maintains proper frame boundaries during composition This ensures animated WebPs render correctly regardless of their disposal methods and alpha channel configuration. --- src/IMG_webp.c | 115 +++++++++++++++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 43 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index 7c96e02d8..fbd098fbc 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -259,23 +259,23 @@ SDL_Surface *IMG_LoadWEBP_RW(SDL_RWops *src) return NULL; } -IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) +IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) { Sint64 start; - const char *error = NULL; + const char* error = NULL; WebPBitstreamFeatures features; - struct WebPDemuxer *demuxer = NULL; + struct WebPDemuxer* demuxer = NULL; WebPIterator iter; - IMG_Animation *anim = NULL; + IMG_Animation* anim = NULL; int raw_data_size; - uint8_t *raw_data = NULL; + uint8_t* raw_data = NULL; WebPData wd; uint32_t bgcolor; - SDL_Surface *canvas = NULL; - WebPMuxAnimDispose dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; + SDL_Surface* canvas = NULL; + SDL_Surface* prevCanvas = NULL; + SDL_Rect prevRect = { 0 }; if (!src) { - /* The error message has been set in SDL_RWFromFile */ return NULL; } @@ -291,7 +291,7 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) goto error; } - raw_data = (uint8_t*) SDL_malloc(raw_data_size); + raw_data = (uint8_t*)SDL_malloc(raw_data_size); if (raw_data == NULL) { goto error; } @@ -313,21 +313,24 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) goto error; } - anim = (IMG_Animation *)SDL_calloc(1, sizeof(*anim)); + anim = (IMG_Animation*)SDL_calloc(1, sizeof(*anim)); if (!anim) { goto error; } anim->w = features.width; anim->h = features.height; anim->count = lib.WebPDemuxGetI(demuxer, WEBP_FF_FRAME_COUNT); - anim->frames = (SDL_Surface **)SDL_calloc(anim->count, sizeof(*anim->frames)); - anim->delays = (int *)SDL_calloc(anim->count, sizeof(*anim->delays)); + anim->frames = (SDL_Surface**)SDL_calloc(anim->count, sizeof(*anim->frames)); + anim->delays = (int*)SDL_calloc(anim->count, sizeof(*anim->delays)); if (!anim->frames || !anim->delays) { goto error; } - canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); - if (!canvas) { + canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, + features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); + prevCanvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, + features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); + if (!canvas || !prevCanvas) { goto error; } @@ -335,19 +338,30 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) bgcolor = lib.WebPDemuxGetI(demuxer, WEBP_FF_BACKGROUND_COLOR); #if SDL_BYTEORDER == SDL_BIG_ENDIAN bgcolor = SDL_MapRGBA(canvas->format, - (bgcolor >> 8) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 24) & 0xFF, - (bgcolor >> 0) & 0xFF); + (bgcolor >> 8) & 0xFF, + (bgcolor >> 16) & 0xFF, + (bgcolor >> 24) & 0xFF, + (bgcolor >> 0) & 0xFF); #else bgcolor = SDL_MapRGBA(canvas->format, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - (bgcolor >> 0) & 0xFF, - (bgcolor >> 24) & 0xFF); + (bgcolor >> 16) & 0xFF, + (bgcolor >> 8) & 0xFF, + (bgcolor >> 0) & 0xFF, + (bgcolor >> 24) & 0xFF); #endif + // Initialize both canvases - use bgcolor for non-alpha format, transparency for alpha + if (features.has_alpha) { + SDL_FillRect(canvas, NULL, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); + SDL_FillRect(prevCanvas, NULL, SDL_MapRGBA(prevCanvas->format, 0, 0, 0, 0)); + } + else { + SDL_FillRect(canvas, NULL, bgcolor); + SDL_FillRect(prevCanvas, NULL, bgcolor); + } + SDL_zero(iter); + WebPMuxAnimDispose dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; if (lib.WebPDemuxGetFrame(demuxer, 1, &iter)) { do { SDL_Surface* curr; @@ -357,8 +371,15 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) continue; } - if (dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { - SDL_FillRect(canvas, NULL, bgcolor); + // Set up destination rect for current frame + dst.x = iter.x_offset; + dst.y = iter.y_offset; + dst.w = iter.width; + dst.h = iter.height; + + // Handle disposal of THIS frame's region before drawing it + if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { + SDL_FillRect(canvas, &dst, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); } curr = SDL_CreateRGBSurfaceWithFormat(0, iter.width, iter.height, 0, SDL_PIXELFORMAT_RGBA32); @@ -367,50 +388,59 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) } if (!lib.WebPDecodeRGBAInto(iter.fragment.bytes, - iter.fragment.size, - (uint8_t *)curr->pixels, - curr->pitch * curr->h, - curr->pitch)) { + iter.fragment.size, + (uint8_t*)curr->pixels, + curr->pitch * curr->h, + curr->pitch)) { error = "WebPDecodeRGBAInto() failed"; SDL_FreeSurface(curr); goto error; } - if (iter.blend_method == WEBP_MUX_BLEND) { - SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_BLEND); - } else { - SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); - } - dst.x = iter.x_offset; - dst.y = iter.y_offset; - dst.w = iter.width; - dst.h = iter.height; + // Use BLENDMODE_NONE like in your implementation + SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); SDL_BlitSurface(curr, NULL, canvas, &dst); SDL_FreeSurface(curr); + // Store complete frame state anim->frames[frame_idx] = SDL_DuplicateSurface(canvas); anim->delays[frame_idx] = iter.duration; + + // Save current frame region and disposal method for next iteration + prevRect = dst; dispose_method = iter.dispose_method; } while (lib.WebPDemuxNextFrame(&iter)); - lib.WebPDemuxReleaseIterator(&iter); } + SDL_FreeSurface(prevCanvas); SDL_FreeSurface(canvas); - lib.WebPDemuxDelete(demuxer); - SDL_free(raw_data); return anim; error: + if (prevCanvas) { + SDL_FreeSurface(prevCanvas); + } if (canvas) { SDL_FreeSurface(canvas); } if (anim) { - IMG_FreeAnimation(anim); + if (anim->frames) { + for (int i = 0; i < anim->count; ++i) { + if (anim->frames[i]) { + SDL_FreeSurface(anim->frames[i]); + } + } + SDL_free(anim->frames); + } + if (anim->delays) { + SDL_free(anim->delays); + } + SDL_free(anim); } if (demuxer) { lib.WebPDemuxDelete(demuxer); @@ -418,14 +448,13 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) if (raw_data) { SDL_free(raw_data); } - if (error) { IMG_SetError("%s", error); } SDL_RWseek(src, start, RW_SEEK_SET); + return NULL; } - #else #if _MSC_VER >= 1300 #pragma warning(disable : 4100) /* warning C4100: 'op' : unreferenced formal parameter */ From 09b4899111faaf4c1c4b9e5965d59ec7e7869641 Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Thu, 13 Feb 2025 13:18:35 -0500 Subject: [PATCH 02/16] formatting --- src/IMG_webp.c | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index fbd098fbc..cab72c8dc 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -259,23 +259,24 @@ SDL_Surface *IMG_LoadWEBP_RW(SDL_RWops *src) return NULL; } -IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) +IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops *src) { Sint64 start; - const char* error = NULL; + const char *error = NULL; WebPBitstreamFeatures features; - struct WebPDemuxer* demuxer = NULL; + struct WebPDemuxer *demuxer = NULL; WebPIterator iter; - IMG_Animation* anim = NULL; + IMG_Animation *anim = NULL; int raw_data_size; - uint8_t* raw_data = NULL; + uint8_t *raw_data = NULL; WebPData wd; uint32_t bgcolor; - SDL_Surface* canvas = NULL; - SDL_Surface* prevCanvas = NULL; + SDL_Surface *canvas = NULL; + SDL_Surface *prevCanvas = NULL; SDL_Rect prevRect = { 0 }; if (!src) { + /* The error message has been set in SDL_RWFromFile */ return NULL; } @@ -291,7 +292,7 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) goto error; } - raw_data = (uint8_t*)SDL_malloc(raw_data_size); + raw_data = (uint8_t*) SDL_malloc(raw_data_size); if (raw_data == NULL) { goto error; } @@ -320,16 +321,14 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) anim->w = features.width; anim->h = features.height; anim->count = lib.WebPDemuxGetI(demuxer, WEBP_FF_FRAME_COUNT); - anim->frames = (SDL_Surface**)SDL_calloc(anim->count, sizeof(*anim->frames)); - anim->delays = (int*)SDL_calloc(anim->count, sizeof(*anim->delays)); + anim->frames = (SDL_Surface **)SDL_calloc(anim->count, sizeof(*anim->frames)); + anim->delays = (int *)SDL_calloc(anim->count, sizeof(*anim->delays)); if (!anim->frames || !anim->delays) { goto error; } - canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, - features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); - prevCanvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, - features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); + canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); + prevCanvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); if (!canvas || !prevCanvas) { goto error; } @@ -338,16 +337,16 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) bgcolor = lib.WebPDemuxGetI(demuxer, WEBP_FF_BACKGROUND_COLOR); #if SDL_BYTEORDER == SDL_BIG_ENDIAN bgcolor = SDL_MapRGBA(canvas->format, - (bgcolor >> 8) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 24) & 0xFF, - (bgcolor >> 0) & 0xFF); + (bgcolor >> 8) & 0xFF, + (bgcolor >> 16) & 0xFF, + (bgcolor >> 24) & 0xFF, + (bgcolor >> 0) & 0xFF); #else bgcolor = SDL_MapRGBA(canvas->format, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - (bgcolor >> 0) & 0xFF, - (bgcolor >> 24) & 0xFF); + (bgcolor >> 16) & 0xFF, + (bgcolor >> 8) & 0xFF, + (bgcolor >> 0) & 0xFF, + (bgcolor >> 24) & 0xFF); #endif // Initialize both canvases - use bgcolor for non-alpha format, transparency for alpha From 374730d94277d171c24056c20a2caf30281dc9ce Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 10:06:56 -0500 Subject: [PATCH 03/16] Revert "formatting" This reverts commit 09b4899111faaf4c1c4b9e5965d59ec7e7869641. --- src/IMG_webp.c | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index cab72c8dc..fbd098fbc 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -259,24 +259,23 @@ SDL_Surface *IMG_LoadWEBP_RW(SDL_RWops *src) return NULL; } -IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops *src) +IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) { Sint64 start; - const char *error = NULL; + const char* error = NULL; WebPBitstreamFeatures features; - struct WebPDemuxer *demuxer = NULL; + struct WebPDemuxer* demuxer = NULL; WebPIterator iter; - IMG_Animation *anim = NULL; + IMG_Animation* anim = NULL; int raw_data_size; - uint8_t *raw_data = NULL; + uint8_t* raw_data = NULL; WebPData wd; uint32_t bgcolor; - SDL_Surface *canvas = NULL; - SDL_Surface *prevCanvas = NULL; + SDL_Surface* canvas = NULL; + SDL_Surface* prevCanvas = NULL; SDL_Rect prevRect = { 0 }; if (!src) { - /* The error message has been set in SDL_RWFromFile */ return NULL; } @@ -292,7 +291,7 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops *src) goto error; } - raw_data = (uint8_t*) SDL_malloc(raw_data_size); + raw_data = (uint8_t*)SDL_malloc(raw_data_size); if (raw_data == NULL) { goto error; } @@ -321,14 +320,16 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops *src) anim->w = features.width; anim->h = features.height; anim->count = lib.WebPDemuxGetI(demuxer, WEBP_FF_FRAME_COUNT); - anim->frames = (SDL_Surface **)SDL_calloc(anim->count, sizeof(*anim->frames)); - anim->delays = (int *)SDL_calloc(anim->count, sizeof(*anim->delays)); + anim->frames = (SDL_Surface**)SDL_calloc(anim->count, sizeof(*anim->frames)); + anim->delays = (int*)SDL_calloc(anim->count, sizeof(*anim->delays)); if (!anim->frames || !anim->delays) { goto error; } - canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); - prevCanvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); + canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, + features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); + prevCanvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, + features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); if (!canvas || !prevCanvas) { goto error; } @@ -337,16 +338,16 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops *src) bgcolor = lib.WebPDemuxGetI(demuxer, WEBP_FF_BACKGROUND_COLOR); #if SDL_BYTEORDER == SDL_BIG_ENDIAN bgcolor = SDL_MapRGBA(canvas->format, - (bgcolor >> 8) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 24) & 0xFF, - (bgcolor >> 0) & 0xFF); + (bgcolor >> 8) & 0xFF, + (bgcolor >> 16) & 0xFF, + (bgcolor >> 24) & 0xFF, + (bgcolor >> 0) & 0xFF); #else bgcolor = SDL_MapRGBA(canvas->format, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - (bgcolor >> 0) & 0xFF, - (bgcolor >> 24) & 0xFF); + (bgcolor >> 16) & 0xFF, + (bgcolor >> 8) & 0xFF, + (bgcolor >> 0) & 0xFF, + (bgcolor >> 24) & 0xFF); #endif // Initialize both canvases - use bgcolor for non-alpha format, transparency for alpha From 2638cb20a6d0fafc4f4eeeffa7dae62282f70e16 Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 10:07:02 -0500 Subject: [PATCH 04/16] Revert "IMG_webp: Fix animated WebP frame composition" This reverts commit 7ace470f25c63870bbede11a261607c09484cb57. --- src/IMG_webp.c | 115 ++++++++++++++++++------------------------------- 1 file changed, 43 insertions(+), 72 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index fbd098fbc..7c96e02d8 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -259,23 +259,23 @@ SDL_Surface *IMG_LoadWEBP_RW(SDL_RWops *src) return NULL; } -IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) +IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) { Sint64 start; - const char* error = NULL; + const char *error = NULL; WebPBitstreamFeatures features; - struct WebPDemuxer* demuxer = NULL; + struct WebPDemuxer *demuxer = NULL; WebPIterator iter; - IMG_Animation* anim = NULL; + IMG_Animation *anim = NULL; int raw_data_size; - uint8_t* raw_data = NULL; + uint8_t *raw_data = NULL; WebPData wd; uint32_t bgcolor; - SDL_Surface* canvas = NULL; - SDL_Surface* prevCanvas = NULL; - SDL_Rect prevRect = { 0 }; + SDL_Surface *canvas = NULL; + WebPMuxAnimDispose dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; if (!src) { + /* The error message has been set in SDL_RWFromFile */ return NULL; } @@ -291,7 +291,7 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) goto error; } - raw_data = (uint8_t*)SDL_malloc(raw_data_size); + raw_data = (uint8_t*) SDL_malloc(raw_data_size); if (raw_data == NULL) { goto error; } @@ -313,24 +313,21 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) goto error; } - anim = (IMG_Animation*)SDL_calloc(1, sizeof(*anim)); + anim = (IMG_Animation *)SDL_calloc(1, sizeof(*anim)); if (!anim) { goto error; } anim->w = features.width; anim->h = features.height; anim->count = lib.WebPDemuxGetI(demuxer, WEBP_FF_FRAME_COUNT); - anim->frames = (SDL_Surface**)SDL_calloc(anim->count, sizeof(*anim->frames)); - anim->delays = (int*)SDL_calloc(anim->count, sizeof(*anim->delays)); + anim->frames = (SDL_Surface **)SDL_calloc(anim->count, sizeof(*anim->frames)); + anim->delays = (int *)SDL_calloc(anim->count, sizeof(*anim->delays)); if (!anim->frames || !anim->delays) { goto error; } - canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, - features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); - prevCanvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, - features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); - if (!canvas || !prevCanvas) { + canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); + if (!canvas) { goto error; } @@ -338,30 +335,19 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) bgcolor = lib.WebPDemuxGetI(demuxer, WEBP_FF_BACKGROUND_COLOR); #if SDL_BYTEORDER == SDL_BIG_ENDIAN bgcolor = SDL_MapRGBA(canvas->format, - (bgcolor >> 8) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 24) & 0xFF, - (bgcolor >> 0) & 0xFF); + (bgcolor >> 8) & 0xFF, + (bgcolor >> 16) & 0xFF, + (bgcolor >> 24) & 0xFF, + (bgcolor >> 0) & 0xFF); #else bgcolor = SDL_MapRGBA(canvas->format, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - (bgcolor >> 0) & 0xFF, - (bgcolor >> 24) & 0xFF); + (bgcolor >> 16) & 0xFF, + (bgcolor >> 8) & 0xFF, + (bgcolor >> 0) & 0xFF, + (bgcolor >> 24) & 0xFF); #endif - // Initialize both canvases - use bgcolor for non-alpha format, transparency for alpha - if (features.has_alpha) { - SDL_FillRect(canvas, NULL, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); - SDL_FillRect(prevCanvas, NULL, SDL_MapRGBA(prevCanvas->format, 0, 0, 0, 0)); - } - else { - SDL_FillRect(canvas, NULL, bgcolor); - SDL_FillRect(prevCanvas, NULL, bgcolor); - } - SDL_zero(iter); - WebPMuxAnimDispose dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; if (lib.WebPDemuxGetFrame(demuxer, 1, &iter)) { do { SDL_Surface* curr; @@ -371,15 +357,8 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) continue; } - // Set up destination rect for current frame - dst.x = iter.x_offset; - dst.y = iter.y_offset; - dst.w = iter.width; - dst.h = iter.height; - - // Handle disposal of THIS frame's region before drawing it - if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { - SDL_FillRect(canvas, &dst, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); + if (dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { + SDL_FillRect(canvas, NULL, bgcolor); } curr = SDL_CreateRGBSurfaceWithFormat(0, iter.width, iter.height, 0, SDL_PIXELFORMAT_RGBA32); @@ -388,59 +367,50 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) } if (!lib.WebPDecodeRGBAInto(iter.fragment.bytes, - iter.fragment.size, - (uint8_t*)curr->pixels, - curr->pitch * curr->h, - curr->pitch)) { + iter.fragment.size, + (uint8_t *)curr->pixels, + curr->pitch * curr->h, + curr->pitch)) { error = "WebPDecodeRGBAInto() failed"; SDL_FreeSurface(curr); goto error; } - // Use BLENDMODE_NONE like in your implementation - SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); + if (iter.blend_method == WEBP_MUX_BLEND) { + SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_BLEND); + } else { + SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); + } + dst.x = iter.x_offset; + dst.y = iter.y_offset; + dst.w = iter.width; + dst.h = iter.height; SDL_BlitSurface(curr, NULL, canvas, &dst); SDL_FreeSurface(curr); - // Store complete frame state anim->frames[frame_idx] = SDL_DuplicateSurface(canvas); anim->delays[frame_idx] = iter.duration; - - // Save current frame region and disposal method for next iteration - prevRect = dst; dispose_method = iter.dispose_method; } while (lib.WebPDemuxNextFrame(&iter)); + lib.WebPDemuxReleaseIterator(&iter); } - SDL_FreeSurface(prevCanvas); SDL_FreeSurface(canvas); + lib.WebPDemuxDelete(demuxer); + SDL_free(raw_data); return anim; error: - if (prevCanvas) { - SDL_FreeSurface(prevCanvas); - } if (canvas) { SDL_FreeSurface(canvas); } if (anim) { - if (anim->frames) { - for (int i = 0; i < anim->count; ++i) { - if (anim->frames[i]) { - SDL_FreeSurface(anim->frames[i]); - } - } - SDL_free(anim->frames); - } - if (anim->delays) { - SDL_free(anim->delays); - } - SDL_free(anim); + IMG_FreeAnimation(anim); } if (demuxer) { lib.WebPDemuxDelete(demuxer); @@ -448,13 +418,14 @@ IMG_Animation* IMG_LoadWEBPAnimation_RW(SDL_RWops* src) if (raw_data) { SDL_free(raw_data); } + if (error) { IMG_SetError("%s", error); } SDL_RWseek(src, start, RW_SEEK_SET); - return NULL; } + #else #if _MSC_VER >= 1300 #pragma warning(disable : 4100) /* warning C4100: 'op' : unreferenced formal parameter */ From 312ae5398c87c0b09169ed9d64ec126a6ba5a43d Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 10:23:54 -0500 Subject: [PATCH 05/16] formatting fixup --- src/IMG_webp.c | 57 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index 7c96e02d8..019ab359a 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -272,6 +272,8 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) WebPData wd; uint32_t bgcolor; SDL_Surface *canvas = NULL; + SDL_Surface *prevCanvas = NULL; + SDL_Rect prevRect = { 0 }; WebPMuxAnimDispose dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; if (!src) { @@ -327,7 +329,8 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) } canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); - if (!canvas) { + prevCanvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); + if (!canvas || !prevCanvas) { goto error; } @@ -347,6 +350,16 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) (bgcolor >> 24) & 0xFF); #endif + // Initialize both canvases - use bgcolor for non-alpha format, transparency for alpha + if (features.has_alpha) { + SDL_FillRect(canvas, NULL, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); + SDL_FillRect(prevCanvas, NULL, SDL_MapRGBA(prevCanvas->format, 0, 0, 0, 0)); + } + else { + SDL_FillRect(canvas, NULL, bgcolor); + SDL_FillRect(prevCanvas, NULL, bgcolor); + } + SDL_zero(iter); if (lib.WebPDemuxGetFrame(demuxer, 1, &iter)) { do { @@ -357,8 +370,15 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) continue; } - if (dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { - SDL_FillRect(canvas, NULL, bgcolor); + // Set up destination rect for current frame + dst.x = iter.x_offset; + dst.y = iter.y_offset; + dst.w = iter.width; + dst.h = iter.height; + + // Handle disposal of THIS frame's region before drawing it + if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { + SDL_FillRect(canvas, &dst, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); } curr = SDL_CreateRGBSurfaceWithFormat(0, iter.width, iter.height, 0, SDL_PIXELFORMAT_RGBA32); @@ -376,20 +396,16 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) goto error; } - if (iter.blend_method == WEBP_MUX_BLEND) { - SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_BLEND); - } else { - SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); - } - dst.x = iter.x_offset; - dst.y = iter.y_offset; - dst.w = iter.width; - dst.h = iter.height; + SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); SDL_BlitSurface(curr, NULL, canvas, &dst); SDL_FreeSurface(curr); + // Store complete frame state anim->frames[frame_idx] = SDL_DuplicateSurface(canvas); anim->delays[frame_idx] = iter.duration; + + // Save current frame region and disposal method for next iteration + prevRect = dst; dispose_method = iter.dispose_method; } while (lib.WebPDemuxNextFrame(&iter)); @@ -397,15 +413,20 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) lib.WebPDemuxReleaseIterator(&iter); } - SDL_FreeSurface(canvas); - - lib.WebPDemuxDelete(demuxer); - - SDL_free(raw_data); + SDL_FreeSurface(prevCanvas); + + SDL_FreeSurface(canvas); + + lib.WebPDemuxDelete(demuxer); + + SDL_free(raw_data); return anim; error: + if (prevCanvas) { + SDL_FreeSurface(prevCanvas); + } if (canvas) { SDL_FreeSurface(canvas); } @@ -418,7 +439,7 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) if (raw_data) { SDL_free(raw_data); } - + if (error) { IMG_SetError("%s", error); } From b105e308d5e6a8df2c24dbb775cdd8a2d119345d Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 10:25:19 -0500 Subject: [PATCH 06/16] formatting fixup #2 --- src/IMG_webp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index 019ab359a..a8b9fe8dc 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -354,8 +354,7 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) if (features.has_alpha) { SDL_FillRect(canvas, NULL, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); SDL_FillRect(prevCanvas, NULL, SDL_MapRGBA(prevCanvas->format, 0, 0, 0, 0)); - } - else { + } else { SDL_FillRect(canvas, NULL, bgcolor); SDL_FillRect(prevCanvas, NULL, bgcolor); } From a27e2edc95a16ae4c6558c5f244da36b93cb4f92 Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 10:29:37 -0500 Subject: [PATCH 07/16] formatting #3 --- src/IMG_webp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index a8b9fe8dc..c51e01dac 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -414,11 +414,11 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) SDL_FreeSurface(prevCanvas); - SDL_FreeSurface(canvas); + SDL_FreeSurface(canvas); - lib.WebPDemuxDelete(demuxer); + lib.WebPDemuxDelete(demuxer); - SDL_free(raw_data); + SDL_free(raw_data); return anim; From 387b5d5b71900e6129f3e6a9a59d6bc7f6fa4a5b Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 10:30:50 -0500 Subject: [PATCH 08/16] formatting #4 --- src/IMG_webp.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index c51e01dac..b43254733 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -438,7 +438,6 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) if (raw_data) { SDL_free(raw_data); } - if (error) { IMG_SetError("%s", error); } From 8f6c6a0dc7257cd674f4c85134b8da10f4ca1880 Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 10:32:54 -0500 Subject: [PATCH 09/16] formatting #4 --- src/IMG_webp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index b43254733..e3eb7b870 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -413,11 +413,11 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) } SDL_FreeSurface(prevCanvas); - + SDL_FreeSurface(canvas); - + lib.WebPDemuxDelete(demuxer); - + SDL_free(raw_data); return anim; From abeb7bf538365956c2b84dcea57b6f90ef29e7e2 Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 10:33:41 -0500 Subject: [PATCH 10/16] formatting #6 --- src/IMG_webp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index e3eb7b870..f2142cc4a 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -438,6 +438,7 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) if (raw_data) { SDL_free(raw_data); } + if (error) { IMG_SetError("%s", error); } From f8d4896a855f5c61e4f63e34f5b94a301323f4c1 Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 14:48:58 -0500 Subject: [PATCH 11/16] - Combines disposal and blend preparation into a single operation - Properly handles WEBP_MUX_DISPOSE_BACKGROUND with alpha channel status - Correctly applies bgcolor for non-alpha WebPs and transparency for alpha WebPs - Sets appropriate blend modes (BLEND/NONE) based on frame's blend_method - Removes unused prevCanvas and associated operations - Eliminates redundant frame region tracking --- src/IMG_webp.c | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index f2142cc4a..8e684c5fe 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -272,8 +272,6 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) WebPData wd; uint32_t bgcolor; SDL_Surface *canvas = NULL; - SDL_Surface *prevCanvas = NULL; - SDL_Rect prevRect = { 0 }; WebPMuxAnimDispose dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; if (!src) { @@ -329,8 +327,7 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) } canvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); - prevCanvas = SDL_CreateRGBSurfaceWithFormat(0, anim->w, anim->h, 0, features.has_alpha ? SDL_PIXELFORMAT_RGBA32 : SDL_PIXELFORMAT_RGBX32); - if (!canvas || !prevCanvas) { + if (!canvas) { goto error; } @@ -353,10 +350,8 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) // Initialize both canvases - use bgcolor for non-alpha format, transparency for alpha if (features.has_alpha) { SDL_FillRect(canvas, NULL, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); - SDL_FillRect(prevCanvas, NULL, SDL_MapRGBA(prevCanvas->format, 0, 0, 0, 0)); } else { SDL_FillRect(canvas, NULL, bgcolor); - SDL_FillRect(prevCanvas, NULL, bgcolor); } SDL_zero(iter); @@ -375,9 +370,15 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) dst.w = iter.width; dst.h = iter.height; - // Handle disposal of THIS frame's region before drawing it - if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { - SDL_FillRect(canvas, &dst, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); + // Handle disposal and prepare region for new frame + if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND || + iter.blend_method == WEBP_MUX_NO_BLEND) { + if (features.has_alpha) { + SDL_FillRect(canvas, &dst, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); + } + else { + SDL_FillRect(canvas, &dst, bgcolor); + } } curr = SDL_CreateRGBSurfaceWithFormat(0, iter.width, iter.height, 0, SDL_PIXELFORMAT_RGBA32); @@ -386,16 +387,23 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) } if (!lib.WebPDecodeRGBAInto(iter.fragment.bytes, - iter.fragment.size, - (uint8_t *)curr->pixels, - curr->pitch * curr->h, - curr->pitch)) { + iter.fragment.size, + (uint8_t*)curr->pixels, + curr->pitch * curr->h, + curr->pitch)) { error = "WebPDecodeRGBAInto() failed"; SDL_FreeSurface(curr); goto error; } - SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); + // Set blend mode based on the frame's blend method + if (iter.blend_method == WEBP_MUX_BLEND) { + SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_BLEND); + } + else { + SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); + } + SDL_BlitSurface(curr, NULL, canvas, &dst); SDL_FreeSurface(curr); @@ -403,17 +411,11 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) anim->frames[frame_idx] = SDL_DuplicateSurface(canvas); anim->delays[frame_idx] = iter.duration; - // Save current frame region and disposal method for next iteration - prevRect = dst; - dispose_method = iter.dispose_method; - } while (lib.WebPDemuxNextFrame(&iter)); lib.WebPDemuxReleaseIterator(&iter); } - SDL_FreeSurface(prevCanvas); - SDL_FreeSurface(canvas); lib.WebPDemuxDelete(demuxer); @@ -423,9 +425,6 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) return anim; error: - if (prevCanvas) { - SDL_FreeSurface(prevCanvas); - } if (canvas) { SDL_FreeSurface(canvas); } From ed1bda399d3832a6bacc4aaed92fe5d0d0aa9cd2 Mon Sep 17 00:00:00 2001 From: InigoMontoya Date: Fri, 14 Feb 2025 15:02:26 -0500 Subject: [PATCH 12/16] - Use bgcolor for non alpha --- src/IMG_webp.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index 8e684c5fe..844c353b8 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -347,7 +347,7 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) (bgcolor >> 24) & 0xFF); #endif - // Initialize both canvases - use bgcolor for non-alpha format, transparency for alpha + // Initialize canvas - use bgcolor for non-alpha format, transparency for alpha if (features.has_alpha) { SDL_FillRect(canvas, NULL, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); } else { @@ -373,12 +373,7 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) // Handle disposal and prepare region for new frame if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND || iter.blend_method == WEBP_MUX_NO_BLEND) { - if (features.has_alpha) { - SDL_FillRect(canvas, &dst, SDL_MapRGBA(canvas->format, 0, 0, 0, 0)); - } - else { SDL_FillRect(canvas, &dst, bgcolor); - } } curr = SDL_CreateRGBSurfaceWithFormat(0, iter.width, iter.height, 0, SDL_PIXELFORMAT_RGBA32); From b8c0093781e82f85f566a8f5dc4247bbaea8bc26 Mon Sep 17 00:00:00 2001 From: inigomonyota <96964704+inigomonyota@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:44:35 -0500 Subject: [PATCH 13/16] formatting --- VisualC/SDL_image.vcxproj | 12 ++++++------ src/IMG_webp.c | 3 +-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/VisualC/SDL_image.vcxproj b/VisualC/SDL_image.vcxproj index 7cc72d216..7a5e0417a 100644 --- a/VisualC/SDL_image.vcxproj +++ b/VisualC/SDL_image.vcxproj @@ -123,7 +123,7 @@ - $(ProjectDir)..\include;external\include;%(AdditionalIncludeDirectories) + $(ProjectDir)..\include;external\include;%(AdditionalIncludeDirectories);C:\Users\ohmys\source\repos\RetroFE\RetroFE\ThirdParty\SDL2-2.30.0\include\SDL2 DLL_EXPORT;_DEBUG;WIN32;_WINDOWS;USE_STBIMAGE;LOAD_AVIF;LOAD_AVIF_DYNAMIC="libavif-16.dll";LOAD_BMP;LOAD_GIF;LOAD_JPG;LOAD_LBM;LOAD_PCX;LOAD_PNG;LOAD_PNM;LOAD_QOI;LOAD_SVG;LOAD_TGA;LOAD_TIF;LOAD_TIF_DYNAMIC="libtiff-5.dll";LOAD_WEBP;LOAD_WEBP_DYNAMIC="libwebp-7.dll";LOAD_WEBPDEMUX_DYNAMIC="libwebpdemux-2.dll";LOAD_XCF;LOAD_XPM;LOAD_XV;%(PreprocessorDefinitions) MultiThreadedDebug Level3 @@ -134,7 +134,7 @@ _DEBUG;%(PreprocessorDefinitions) - SDL2.lib;%(AdditionalDependencies) + C:\Users\ohmys\source\repos\RetroFE\RetroFE\ThirdParty\SDL2-2.30.0\lib\x64\SDL2.lib;%(AdditionalDependencies) true Windows @@ -177,8 +177,8 @@ - $(ProjectDir)..\include;external\include;%(AdditionalIncludeDirectories) - DLL_EXPORT;NDEBUG;WIN32;_WINDOWS;USE_STBIMAGE;LOAD_AVIF;LOAD_AVIF_DYNAMIC="libavif-16.dll";LOAD_BMP;LOAD_GIF;LOAD_JPG;LOAD_LBM;LOAD_PCX;LOAD_PNG;LOAD_PNM;LOAD_QOI;LOAD_SVG;LOAD_TGA;LOAD_TIF;LOAD_TIF_DYNAMIC="libtiff-5.dll";LOAD_WEBP;LOAD_WEBP_DYNAMIC="libwebp-7.dll";LOAD_WEBPDEMUX_DYNAMIC="libwebpdemux-2.dll";LOAD_XCF;LOAD_XPM;LOAD_XV;%(PreprocessorDefinitions) + $(ProjectDir)..\include;external\include;%(AdditionalIncludeDirectories);C:\Users\ohmys\source\repos\RetroFE\RetroFE\ThirdParty\SDL2-2.30.0\include\SDL2 + DLL_EXPORT;NDEBUG;WIN32;_WINDOWS;USE_STBIMAGE;LOAD_AVIF;LOAD_AVIF_DYNAMIC="libavif-16.dll";LOAD_BMP;LOAD_GIF;LOAD_JPG;LOAD_LBM;LOAD_PCX;LOAD_PNG;LOAD_PNM;LOAD_QOI;LOAD_SVG;LOAD_TGA;LOAD_TIF;LOAD_TIF_DYNAMIC="libtiff-5.dll";LOAD_WEBP;LOAD_WEBP_DYNAMIC="libwebp-7.dll";LOAD_WEBPDEMUX_DYNAMIC="libwebpdemux-2.dll";LOAD_XCF;LOAD_XPM;LOAD_XV;LOAD_WEBP%(PreprocessorDefinitions) MultiThreaded Level3 @@ -187,7 +187,7 @@ Windows - SDL2.lib;%(AdditionalDependencies) + C:\Users\ohmys\source\repos\RetroFE\RetroFE\ThirdParty\SDL2-2.30.0\lib\x64\SDL2.lib;%(AdditionalDependencies) true true @@ -223,4 +223,4 @@ - + \ No newline at end of file diff --git a/src/IMG_webp.c b/src/IMG_webp.c index 844c353b8..9dc4bf418 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -394,8 +394,7 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) // Set blend mode based on the frame's blend method if (iter.blend_method == WEBP_MUX_BLEND) { SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_BLEND); - } - else { + } else { SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); } From bfbbc2cb804eb79e8fa6550ed14fc034bf9ba620 Mon Sep 17 00:00:00 2001 From: inigomonyota <96964704+inigomonyota@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:45:08 -0500 Subject: [PATCH 14/16] Revert "formatting" This reverts commit b8c0093781e82f85f566a8f5dc4247bbaea8bc26. --- VisualC/SDL_image.vcxproj | 12 ++++++------ src/IMG_webp.c | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/VisualC/SDL_image.vcxproj b/VisualC/SDL_image.vcxproj index 7a5e0417a..7cc72d216 100644 --- a/VisualC/SDL_image.vcxproj +++ b/VisualC/SDL_image.vcxproj @@ -123,7 +123,7 @@ - $(ProjectDir)..\include;external\include;%(AdditionalIncludeDirectories);C:\Users\ohmys\source\repos\RetroFE\RetroFE\ThirdParty\SDL2-2.30.0\include\SDL2 + $(ProjectDir)..\include;external\include;%(AdditionalIncludeDirectories) DLL_EXPORT;_DEBUG;WIN32;_WINDOWS;USE_STBIMAGE;LOAD_AVIF;LOAD_AVIF_DYNAMIC="libavif-16.dll";LOAD_BMP;LOAD_GIF;LOAD_JPG;LOAD_LBM;LOAD_PCX;LOAD_PNG;LOAD_PNM;LOAD_QOI;LOAD_SVG;LOAD_TGA;LOAD_TIF;LOAD_TIF_DYNAMIC="libtiff-5.dll";LOAD_WEBP;LOAD_WEBP_DYNAMIC="libwebp-7.dll";LOAD_WEBPDEMUX_DYNAMIC="libwebpdemux-2.dll";LOAD_XCF;LOAD_XPM;LOAD_XV;%(PreprocessorDefinitions) MultiThreadedDebug Level3 @@ -134,7 +134,7 @@ _DEBUG;%(PreprocessorDefinitions) - C:\Users\ohmys\source\repos\RetroFE\RetroFE\ThirdParty\SDL2-2.30.0\lib\x64\SDL2.lib;%(AdditionalDependencies) + SDL2.lib;%(AdditionalDependencies) true Windows @@ -177,8 +177,8 @@ - $(ProjectDir)..\include;external\include;%(AdditionalIncludeDirectories);C:\Users\ohmys\source\repos\RetroFE\RetroFE\ThirdParty\SDL2-2.30.0\include\SDL2 - DLL_EXPORT;NDEBUG;WIN32;_WINDOWS;USE_STBIMAGE;LOAD_AVIF;LOAD_AVIF_DYNAMIC="libavif-16.dll";LOAD_BMP;LOAD_GIF;LOAD_JPG;LOAD_LBM;LOAD_PCX;LOAD_PNG;LOAD_PNM;LOAD_QOI;LOAD_SVG;LOAD_TGA;LOAD_TIF;LOAD_TIF_DYNAMIC="libtiff-5.dll";LOAD_WEBP;LOAD_WEBP_DYNAMIC="libwebp-7.dll";LOAD_WEBPDEMUX_DYNAMIC="libwebpdemux-2.dll";LOAD_XCF;LOAD_XPM;LOAD_XV;LOAD_WEBP%(PreprocessorDefinitions) + $(ProjectDir)..\include;external\include;%(AdditionalIncludeDirectories) + DLL_EXPORT;NDEBUG;WIN32;_WINDOWS;USE_STBIMAGE;LOAD_AVIF;LOAD_AVIF_DYNAMIC="libavif-16.dll";LOAD_BMP;LOAD_GIF;LOAD_JPG;LOAD_LBM;LOAD_PCX;LOAD_PNG;LOAD_PNM;LOAD_QOI;LOAD_SVG;LOAD_TGA;LOAD_TIF;LOAD_TIF_DYNAMIC="libtiff-5.dll";LOAD_WEBP;LOAD_WEBP_DYNAMIC="libwebp-7.dll";LOAD_WEBPDEMUX_DYNAMIC="libwebpdemux-2.dll";LOAD_XCF;LOAD_XPM;LOAD_XV;%(PreprocessorDefinitions) MultiThreaded Level3 @@ -187,7 +187,7 @@ Windows - C:\Users\ohmys\source\repos\RetroFE\RetroFE\ThirdParty\SDL2-2.30.0\lib\x64\SDL2.lib;%(AdditionalDependencies) + SDL2.lib;%(AdditionalDependencies) true true @@ -223,4 +223,4 @@ - \ No newline at end of file + diff --git a/src/IMG_webp.c b/src/IMG_webp.c index 9dc4bf418..844c353b8 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -394,7 +394,8 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) // Set blend mode based on the frame's blend method if (iter.blend_method == WEBP_MUX_BLEND) { SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_BLEND); - } else { + } + else { SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); } From 609cd35a784ed7f59815dab299a0267fa8aeabd0 Mon Sep 17 00:00:00 2001 From: inigomonyota <96964704+inigomonyota@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:48:34 -0500 Subject: [PATCH 15/16] formatting --- src/IMG_webp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index 844c353b8..9dc4bf418 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -394,8 +394,7 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) // Set blend mode based on the frame's blend method if (iter.blend_method == WEBP_MUX_BLEND) { SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_BLEND); - } - else { + } else { SDL_SetSurfaceBlendMode(curr, SDL_BLENDMODE_NONE); } From 683d653309fe0dd0f8b1bf34e0905344857a933d Mon Sep 17 00:00:00 2001 From: inigomonyota <96964704+inigomonyota@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:51:25 -0500 Subject: [PATCH 16/16] formatting --- src/IMG_webp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/IMG_webp.c b/src/IMG_webp.c index 9dc4bf418..9e14c83ac 100644 --- a/src/IMG_webp.c +++ b/src/IMG_webp.c @@ -382,10 +382,10 @@ IMG_Animation *IMG_LoadWEBPAnimation_RW(SDL_RWops *src) } if (!lib.WebPDecodeRGBAInto(iter.fragment.bytes, - iter.fragment.size, - (uint8_t*)curr->pixels, - curr->pitch * curr->h, - curr->pitch)) { + iter.fragment.size, + (uint8_t *)curr->pixels, + curr->pitch * curr->h, + curr->pitch)) { error = "WebPDecodeRGBAInto() failed"; SDL_FreeSurface(curr); goto error;