diff options
| author | Přemysl Eric Janouch <p@janouch.name> | 2023-12-28 07:46:40 +0100 | 
|---|---|---|
| committer | Přemysl Eric Janouch <p@janouch.name> | 2023-12-28 07:48:11 +0100 | 
| commit | c04c4063e4a4feabf0eb23b3a38630e4fce1456b (patch) | |
| tree | ee7659fcce11508cf80bf076fe4c3d25d701dcc6 /fiv-io.c | |
| parent | aed6ae6b83454a8633b2ffd45ecfef1509354f29 (diff) | |
| download | fiv-c04c4063e4a4feabf0eb23b3a38630e4fce1456b.tar.gz fiv-c04c4063e4a4feabf0eb23b3a38630e4fce1456b.tar.xz fiv-c04c4063e4a4feabf0eb23b3a38630e4fce1456b.zip  | |
Fix a class of animated transparent WebPs
Diffstat (limited to 'fiv-io.c')
| -rw-r--r-- | fiv-io.c | 11 | 
1 files changed, 8 insertions, 3 deletions
@@ -1741,10 +1741,8 @@ load_libwebp_frame(WebPAnimDecoder *dec, const WebPAnimInfo *info,  		return NULL;  	} -	bool is_opaque = (info->bgcolor & 0xFF) == 0xFF;  	uint64_t area = info->canvas_width * info->canvas_height; -	FivIoImage *image = fiv_io_image_new( -		is_opaque ? CAIRO_FORMAT_RGB24 : CAIRO_FORMAT_ARGB32, +	FivIoImage *image = fiv_io_image_new(CAIRO_FORMAT_RGB24,  		info->canvas_width, info->canvas_height);  	if (!image) {  		set_error(error, "image allocation failure"); @@ -1760,6 +1758,13 @@ load_libwebp_frame(WebPAnimDecoder *dec, const WebPAnimInfo *info,  			*dst++ = GUINT32_FROM_LE(*src++);  	} +	// info->bgcolor is not reliable. +	for (const uint32_t *p = dst, *end = dst + area; p < end; p++) +		if ((~*p & 0xff000000)) { +			image->format = CAIRO_FORMAT_ARGB32; +			break; +		} +  	// This API is confusing and awkward.  	image->frame_duration = timestamp - *last_timestamp;  	*last_timestamp = timestamp;  | 
