From 0cc9949eadc8378000f7c165e3809411651357dc Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Thu, 8 Dec 2011 02:48:31 +0100 Subject: Mark one colour as transparent in the gif image encoder if the input palette contains at least one colour that is more than 50% transparent. Fixes ticket #715. --- libavcodec/gif.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'libavcodec/gif.c') diff --git a/libavcodec/gif.c b/libavcodec/gif.c index 8736f0f46c..830a059422 100644 --- a/libavcodec/gif.c +++ b/libavcodec/gif.c @@ -62,7 +62,7 @@ static int gif_image_write_header(AVCodecContext *avctx, uint8_t **bytestream, uint32_t *palette) { int i; - unsigned int v; + unsigned int v, smallest_alpha = 0xFF, alpha_component = 0; bytestream_put_buffer(bytestream, "GIF", 3); bytestream_put_buffer(bytestream, "89a", 3); @@ -77,6 +77,20 @@ static int gif_image_write_header(AVCodecContext *avctx, for(i=0;i<256;i++) { v = palette[i]; bytestream_put_be24(bytestream, v); + if (v >> 24 < smallest_alpha) { + smallest_alpha = v >> 24; + alpha_component = i; + } + } + + if (smallest_alpha < 128) { + bytestream_put_byte(bytestream, 0x21); /* Extension Introducer */ + bytestream_put_byte(bytestream, 0xf9); /* Graphic Control Label */ + bytestream_put_byte(bytestream, 0x04); /* block length */ + bytestream_put_byte(bytestream, 0x01); /* Transparent Color Flag */ + bytestream_put_le16(bytestream, 0x00); /* no delay */ + bytestream_put_byte(bytestream, alpha_component); + bytestream_put_byte(bytestream, 0x00); } return 0; -- cgit v1.2.3