summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-01-13 12:56:02 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-01-13 12:56:02 +0000
commitba63e7b28d95bd67847afabe7f84e08e863b29ba (patch)
tree04a518a633b7fb0cba9496164aaf6bbdc195852b /libmpdemux
parent79cc33a8518f3408cbba621f4fa506a5a7572e26 (diff)
downloadmpv-ba63e7b28d95bd67847afabe7f84e08e863b29ba.tar.bz2
mpv-ba63e7b28d95bd67847afabe7f84e08e863b29ba.tar.xz
Implement gif transparency
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@21913 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_gif.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/libmpdemux/demux_gif.c b/libmpdemux/demux_gif.c
index 1a3e235e8a..c3e2079e29 100644
--- a/libmpdemux/demux_gif.c
+++ b/libmpdemux/demux_gif.c
@@ -53,6 +53,8 @@ static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
ColorMapObject *effective_map = NULL;
char *buf = NULL;
int refmode = 0;
+ int transparency = 0;
+ uint8_t transparent_col;
while (type != IMAGE_DESC_RECORD_TYPE) {
if (DGifGetRecordType(gif, &type) == GIF_ERROR) {
@@ -78,8 +80,10 @@ static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
int frametime = 0;
if (p[0] == 4) // is the length correct?
{
+ transparency = p[1] & 1;
frametime = (p[3] << 8) | p[2]; // set the time, centiseconds
refmode = (p[1] >> 2) & 3;
+ transparent_col = p[4];
}
priv->current_pts += frametime;
} else if ((code == 0xFE) && (verbose)) { // comment extension
@@ -144,6 +148,20 @@ static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
priv->palette[(y * 4) + 3] = 0;
}
+ if (transparency) {
+ uint8_t *dpos = dest, *spos = buf;
+ int hleft = h;
+ while (hleft-- > 0) {
+ int wleft = w;
+ while (wleft-- > 0) {
+ if (*spos != transparent_col)
+ *dpos = *spos;
+ dpos++; spos++;
+ }
+ dpos += priv->w - w;
+ spos += gif->Image.Width - w;
+ }
+ } else
memcpy_pic(dest, buf, w, h, priv->w, gif->Image.Width);
if (refmode == 1) memcpy(priv->refimg, dp->buffer, priv->w * priv->h);