From: Felix Domke Date: Thu, 13 Dec 2007 01:06:31 +0000 (+0000) Subject: fix/implement alphablend for 8-to-32 bpp blits X-Git-Tag: 2.6.0~1670 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/27a9db5f79a6b3fdda1fbfaa577b8260ac68b8da?hp=1c242c0a654a5c4048ba4219a0982f8ba8a85246;ds=sidebyside fix/implement alphablend for 8-to-32 bpp blits --- diff --git a/lib/gdi/gpixmap.cpp b/lib/gdi/gpixmap.cpp index 855cb8b2..e2960ad7 100644 --- a/lib/gdi/gpixmap.cpp +++ b/lib/gdi/gpixmap.cpp @@ -207,6 +207,54 @@ void gPixmap::fill(const gRegion ®ion, const gRGB &color) } } +static void blit_8i_to_32(__u32 *dst, __u8 *src, __u32 *pal, int width) +{ + while (width--) + *dst++=pal[*src++]; +} + +static void blit_8i_to_32_at(__u32 *dst, __u8 *src, __u32 *pal, int width) +{ + while (width--) + { + if (!(pal[*src]&0x80000000)) + { + src++; + dst++; + } else + *dst++=pal[*src++]; + } +} + + /* WARNING, this function is not endian safe! */ +static void blit_8i_to_32_ab(__u32 *dst, __u8 *src, __u32 *pal, int width) +{ + while (width--) + { +#define BLEND(x, y, a) (y + (((x-y) * a)>>8)) + __u32 srccol = pal[*src++]; + __u32 dstcol = *dst; + unsigned char sb = srccol & 0xFF; + unsigned char sg = (srccol >> 8) & 0xFF; + unsigned char sr = (srccol >> 16) & 0xFF; + unsigned char sa = (srccol >> 24) & 0xFF; + + unsigned char db = dstcol & 0xFF; + unsigned char dg = (dstcol >> 8) & 0xFF; + unsigned char dr = (dstcol >> 16) & 0xFF; + unsigned char da = (dstcol >> 24) & 0xFF; + + da = BLEND(0xFF, da, sa) & 0xFF; + dr = BLEND(sr, dr, sa) & 0xFF; + dg = BLEND(sg, dg, sa) & 0xFF; + db = BLEND(sb, db, sa) & 0xFF; + +#undef BLEND + *dst++ = db | (dg << 8) | (dr << 16) | (da << 24); + } +} + + void gPixmap::blit(const gPixmap &src, ePoint pos, const gRegion &clip, int flag) { for (unsigned int i=0; ibypp+area.top()*surface->stride; for (int y=0; ystride; dstptr+=surface->stride; }