Module: wine Branch: master Commit: 81d9ffa041129a9394e05ccdb564d7149884135b URL: http://source.winehq.org/git/wine.git/?a=commit;h=81d9ffa041129a9394e05ccdb5...
Author: Vincent Povirk vincent@codeweavers.com Date: Wed Dec 5 13:15:25 2012 -0600
gdiplus: Always use AlphaBlend to draw to 32-bit DIB's.
---
dlls/gdiplus/gdiplus_private.h | 1 + dlls/gdiplus/graphics.c | 19 ++++++++++++++----- dlls/gdiplus/tests/graphics.c | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 4a8b10a..cb7330e 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -152,6 +152,7 @@ struct GpGraphics{ HDC hdc; HWND hwnd; BOOL owndc; + BOOL alpha_hdc; GpImage *image; SmoothingMode smoothing; CompositingQuality compqual; diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 247b17d..4474db6 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -2250,6 +2250,8 @@ GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics) GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **graphics) { GpStatus retval; + HBITMAP hbitmap; + DIBSECTION dib;
TRACE("(%p, %p, %p)\n", hdc, hDevice, graphics);
@@ -2274,6 +2276,13 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra return retval; }
+ hbitmap = GetCurrentObject(hdc, OBJ_BITMAP); + if (hbitmap && GetObjectW(hbitmap, sizeof(dib), &dib) == sizeof(dib) && + dib.dsBmih.biBitCount == 32 && dib.dsBmih.biCompression == BI_RGB) + { + (*graphics)->alpha_hdc = 1; + } + (*graphics)->hdc = hdc; (*graphics)->hwnd = WindowFromDC(hdc); (*graphics)->owndc = FALSE; @@ -3157,7 +3166,7 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image graphics->scale, image->xres, image->yres, bitmap->format, imageAttributes ? imageAttributes->outside_color : 0);
- if (imageAttributes || + if (imageAttributes || graphics->alpha_hdc || (graphics->image && graphics->image->type == ImageTypeBitmap) || ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X || ptf[1].X - ptf[0].X != srcwidth || ptf[2].Y - ptf[0].Y != srcheight || @@ -4021,7 +4030,7 @@ GpStatus WINGDIPAPI GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *p if(graphics->busy) return ObjectBusy;
- if (!graphics->image) + if (!graphics->image && !graphics->alpha_hdc) stat = GDI32_GdipFillPath(graphics, brush, path);
if (stat == NotImplemented) @@ -4359,7 +4368,7 @@ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush, if(graphics->busy) return ObjectBusy;
- if (!graphics->image) + if (!graphics->image && !graphics->alpha_hdc) stat = GDI32_GdipFillRegion(graphics, brush, region);
if (stat == NotImplemented) @@ -5982,7 +5991,7 @@ GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc) { stat = METAFILE_GetDC((GpMetafile*)graphics->image, hdc); } - else if (!graphics->hdc || + else if (!graphics->hdc || graphics->alpha_hdc || (graphics->image && graphics->image->type == ImageTypeBitmap && ((GpBitmap*)graphics->image)->format & PixelFormatAlpha)) { /* Create a fake HDC and fill it with a constant color. */ @@ -6626,7 +6635,7 @@ static GpStatus draw_driver_string(GpGraphics *graphics, GDIPCONST UINT16 *text, if (length == -1) length = strlenW(text);
- if (graphics->hdc && + if (graphics->hdc && !graphics->alpha_hdc && ((flags & DriverStringOptionsRealizedAdvance) || length <= 1) && brush->bt == BrushTypeSolidColor && (((GpSolidFill*)brush)->color & 0xff000000) == 0xff000000) diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index 553e77f..f4e7ffa 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -4115,7 +4115,7 @@ static void test_alpha_hdc(void) status = GdipGraphicsClear(graphics, 0xffaaaaaa); expect(Ok, status);
- todo_wine expect(0xffaaaaaa, bits[0]); + expect(0xffaaaaaa, bits[0]);
SelectObject(hdc, old_hbm);