@ -6412,19 +6412,22 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
// on first frame, any non-written pixels get the background colour (non-transparent)
first_frame = 0 ;
if ( g - > out = = 0 ) {
if ( ! stbi__gif_header ( s , g , comp , 0 ) ) return 0 ; // stbi__g_failure_reason set by stbi__gif_header
g - > out = ( stbi_uc * ) stbi__malloc ( 4 * g - > w * g - > h ) ;
g - > background = ( stbi_uc * ) stbi__malloc ( 4 * g - > w * g - > h ) ;
g - > history = ( stbi_uc * ) stbi__malloc ( g - > w * g - > h ) ;
if ( ! stbi__gif_header ( s , g , comp , 0 ) ) return 0 ; // stbi__g_failure_reason set by stbi__gif_header
if ( ! stbi__mad3sizes_valid ( 4 , g - > w , g - > h , 0 ) )
return stbi__errpuc ( " too large " , " GIF image is too large " ) ;
pcount = g - > w * g - > h ;
g - > out = ( stbi_uc * ) stbi__malloc ( 4 * pcount ) ;
g - > background = ( stbi_uc * ) stbi__malloc ( 4 * pcount ) ;
g - > history = ( stbi_uc * ) stbi__malloc ( pcount ) ;
if ( ! g - > out | | ! g - > background | | ! g - > history )
return stbi__errpuc ( " outofmem " , " Out of memory " ) ;
// image is treated as "transparent" at the start - ie, nothing overwrites the current background;
// background colour is only used for pixels that are not rendered first frame, after that "background"
// color refers to the color that was there the previous frame.
memset ( g - > out , 0x00 , 4 * g - > w * g - > h ) ;
memset ( g - > background , 0x00 , 4 * g - > w * g - > h ) ; // state of the background (starts transparent)
memset ( g - > history , 0x00 , g - > w * g - > h ) ; // pixels that were affected previous frame
memset ( g - > out , 0x00 , 4 * pcount ) ;
memset ( g - > background , 0x00 , 4 * pcount ) ; // state of the background (starts transparent)
memset ( g - > history , 0x00 , pcount ) ; // pixels that were affected previous frame
first_frame = 1 ;
} else {
// second frame - how do we dispoase of the previous one?