gdiplus: Blend in the background colour.
This commit is contained in:
parent
43dcd40c0b
commit
6df5ce7c9e
|
@ -1483,6 +1483,18 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromResource(HINSTANCE hInstance,
|
|||
return stat;
|
||||
}
|
||||
|
||||
static inline DWORD blend_argb_no_bkgnd_alpha(DWORD src, DWORD bkgnd)
|
||||
{
|
||||
BYTE b = (BYTE)src;
|
||||
BYTE g = (BYTE)(src >> 8);
|
||||
BYTE r = (BYTE)(src >> 16);
|
||||
DWORD alpha = (BYTE)(src >> 24);
|
||||
return ((b + ((BYTE)bkgnd * (255 - alpha) + 127) / 255) |
|
||||
(g + ((BYTE)(bkgnd >> 8) * (255 - alpha) + 127) / 255) << 8 |
|
||||
(r + ((BYTE)(bkgnd >> 16) * (255 - alpha) + 127) / 255) << 16 |
|
||||
(alpha << 24));
|
||||
}
|
||||
|
||||
GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,
|
||||
HBITMAP* hbmReturn, ARGB background)
|
||||
{
|
||||
|
@ -1523,6 +1535,17 @@ GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,
|
|||
|
||||
if (stat == Ok)
|
||||
stat = GdipBitmapUnlockBits(bitmap, &lockeddata);
|
||||
|
||||
if (stat == Ok && (background & 0xffffff))
|
||||
{
|
||||
DWORD *ptr;
|
||||
UINT i;
|
||||
for (ptr = (DWORD*)bits, i = 0; i < width * height; ptr++, i++)
|
||||
{
|
||||
if ((*ptr & 0xff000000) == 0xff000000) continue;
|
||||
*ptr = blend_argb_no_bkgnd_alpha(*ptr, background);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
stat = GenericError;
|
||||
|
|
|
@ -1695,6 +1695,10 @@ static void test_createhbitmap(void)
|
|||
stat = GdipDisposeImage((GpImage*)bitmap);
|
||||
expect(Ok, stat);
|
||||
|
||||
/* make (1,0) have no alpha and (2,0) a different blue value. */
|
||||
bits[7] = 0x00;
|
||||
bits[8] = 0x40;
|
||||
|
||||
/* create alpha Bitmap */
|
||||
stat = GdipCreateBitmapFromScan0(8, 20, 32, PixelFormat32bppARGB, bits, &bitmap);
|
||||
expect(Ok, stat);
|
||||
|
@ -1720,21 +1724,106 @@ static void test_createhbitmap(void)
|
|||
{
|
||||
DWORD val = *(DWORD*)bm.bmBits;
|
||||
ok(val == 0x682a2a2a, "got %x, expected 0x682a2a2a\n", val);
|
||||
val = *((DWORD*)bm.bmBits + (bm.bmHeight-1) * bm.bmWidthBytes/4 + 1);
|
||||
ok(val == 0x0, "got %x, expected 0x682a2a2a\n", val);
|
||||
}
|
||||
|
||||
hdc = CreateCompatibleDC(NULL);
|
||||
|
||||
oldhbitmap = SelectObject(hdc, hbitmap);
|
||||
pixel = GetPixel(hdc, 5, 5);
|
||||
expect(0x2a2a2a, pixel);
|
||||
pixel = GetPixel(hdc, 1, 0);
|
||||
expect(0x0, pixel);
|
||||
|
||||
SelectObject(hdc, oldhbitmap);
|
||||
|
||||
DeleteDC(hdc);
|
||||
|
||||
expect(0x2a2a2a, pixel);
|
||||
|
||||
DeleteObject(hbitmap);
|
||||
}
|
||||
|
||||
/* create HBITMAP with bkgnd colour */
|
||||
stat = GdipCreateHBITMAPFromBitmap(bitmap, &hbitmap, 0xff00ff);
|
||||
expect(Ok, stat);
|
||||
|
||||
if (stat == Ok)
|
||||
{
|
||||
ret = GetObjectA(hbitmap, sizeof(BITMAP), &bm);
|
||||
expect(sizeof(BITMAP), ret);
|
||||
|
||||
expect(0, bm.bmType);
|
||||
expect(8, bm.bmWidth);
|
||||
expect(20, bm.bmHeight);
|
||||
expect(32, bm.bmWidthBytes);
|
||||
expect(1, bm.bmPlanes);
|
||||
expect(32, bm.bmBitsPixel);
|
||||
ok(bm.bmBits != NULL, "got DDB, expected DIB\n");
|
||||
|
||||
if (bm.bmBits)
|
||||
{
|
||||
DWORD val = *(DWORD*)bm.bmBits;
|
||||
ok(val == 0x68c12ac1, "got %x, expected 0x682a2a2a\n", val);
|
||||
val = *((DWORD*)bm.bmBits + (bm.bmHeight-1) * bm.bmWidthBytes/4 + 1);
|
||||
ok(val == 0xff00ff, "got %x, expected 0x682a2a2a\n", val);
|
||||
}
|
||||
|
||||
hdc = CreateCompatibleDC(NULL);
|
||||
|
||||
oldhbitmap = SelectObject(hdc, hbitmap);
|
||||
pixel = GetPixel(hdc, 5, 5);
|
||||
expect(0xc12ac1, pixel);
|
||||
pixel = GetPixel(hdc, 1, 0);
|
||||
expect(0xff00ff, pixel);
|
||||
pixel = GetPixel(hdc, 2, 0);
|
||||
expect(0xb12ac1, pixel);
|
||||
|
||||
SelectObject(hdc, oldhbitmap);
|
||||
DeleteDC(hdc);
|
||||
DeleteObject(hbitmap);
|
||||
}
|
||||
|
||||
/* create HBITMAP with bkgnd colour with alpha and show it behaves with no alpha. */
|
||||
stat = GdipCreateHBITMAPFromBitmap(bitmap, &hbitmap, 0x80ff00ff);
|
||||
expect(Ok, stat);
|
||||
|
||||
if (stat == Ok)
|
||||
{
|
||||
ret = GetObjectA(hbitmap, sizeof(BITMAP), &bm);
|
||||
expect(sizeof(BITMAP), ret);
|
||||
|
||||
expect(0, bm.bmType);
|
||||
expect(8, bm.bmWidth);
|
||||
expect(20, bm.bmHeight);
|
||||
expect(32, bm.bmWidthBytes);
|
||||
expect(1, bm.bmPlanes);
|
||||
expect(32, bm.bmBitsPixel);
|
||||
ok(bm.bmBits != NULL, "got DDB, expected DIB\n");
|
||||
|
||||
if (bm.bmBits)
|
||||
{
|
||||
DWORD val = *(DWORD*)bm.bmBits;
|
||||
ok(val == 0x68c12ac1, "got %x, expected 0x682a2a2a\n", val);
|
||||
val = *((DWORD*)bm.bmBits + (bm.bmHeight-1) * bm.bmWidthBytes/4 + 1);
|
||||
ok(val == 0xff00ff, "got %x, expected 0x682a2a2a\n", val);
|
||||
}
|
||||
|
||||
hdc = CreateCompatibleDC(NULL);
|
||||
|
||||
oldhbitmap = SelectObject(hdc, hbitmap);
|
||||
pixel = GetPixel(hdc, 5, 5);
|
||||
expect(0xc12ac1, pixel);
|
||||
pixel = GetPixel(hdc, 1, 0);
|
||||
expect(0xff00ff, pixel);
|
||||
pixel = GetPixel(hdc, 2, 0);
|
||||
expect(0xb12ac1, pixel);
|
||||
|
||||
SelectObject(hdc, oldhbitmap);
|
||||
DeleteDC(hdc);
|
||||
DeleteObject(hbitmap);
|
||||
}
|
||||
|
||||
stat = GdipDisposeImage((GpImage*)bitmap);
|
||||
expect(Ok, stat);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue