diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-01-13 12:56:02 +0000 |
---|---|---|
committer | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-01-13 12:56:02 +0000 |
commit | ba63e7b28d95bd67847afabe7f84e08e863b29ba (patch) | |
tree | 04a518a633b7fb0cba9496164aaf6bbdc195852b /libmpdemux/demux_gif.c | |
parent | 79cc33a8518f3408cbba621f4fa506a5a7572e26 (diff) | |
download | mpv-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/demux_gif.c')
-rw-r--r-- | libmpdemux/demux_gif.c | 18 |
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); |