Mercurial > mplayer.hg
diff gui/util/bitmap.c @ 34130:b0c63b098b6b
Fix bug in bpRenderMask().
Currently, it only works for images which width is a multiple
of 8 pixels. Fix it to work with arbitrary images.
author | ib |
---|---|
date | Thu, 20 Oct 2011 12:05:47 +0000 |
parents | d99f341d8442 |
children | db5ddd7433c8 |
line wrap: on
line diff
--- a/gui/util/bitmap.c Thu Oct 20 11:15:30 2011 +0000 +++ b/gui/util/bitmap.c Thu Oct 20 12:05:47 2011 +0000 @@ -272,15 +272,15 @@ int bpRenderMask(const guiImage *in, guiImage *out) { uint32_t *buf; - unsigned long i; - int b = 0, c = 0; - unsigned char tmp = 0; + unsigned long x, y; + unsigned long i = 0, c = 0; + unsigned char tmp = 0, b = 1; int shaped = 0; out->Width = in->Width; out->Height = in->Height; out->Bpp = 1; - out->ImageSize = (out->Width * out->Height + 7) / 8; + out->ImageSize = ((out->Width + 7) / 8) * out->Height; out->Image = calloc(1, out->ImageSize); if (!out->Image) { @@ -290,24 +290,31 @@ buf = (uint32_t *)in->Image; - for (i = 0; i < out->Width * out->Height; i++) { - tmp >>= 1; - + for (y = 0; y < in->Height; y++) { + for (x = 0; x < in->Width; x++) { if (!IS_TRANSPARENT(buf[i])) - tmp |= 0x80; + tmp |= b; else { buf[i] = 0; shaped = 1; } - if (++b == 8) { + i++; + b <<= 1; + + if (b == 0) { out->Image[c++] = tmp; - tmp = b = 0; + tmp = 0; + b = 1; } } - if (b) - out->Image[c] = tmp; + if (b != 1) { + out->Image[c++] = tmp; + tmp = 0; + b = 1; + } + } if (!shaped) bpFree(out);