[Wine-patches] [eter-2.0.0] gdiplus: Use StretchBlt instead of GdiAlphaBlend if device doesn't support alpha blending. (eterbug #5892)
Dmitry Timoshkov
dmitry на baikal.ru
Пт Апр 20 08:35:15 MSK 2012
---
dlls/gdiplus/graphics.c | 67 +++++++++++++++++++++++------------------------
1 file changed, 33 insertions(+), 34 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 50d2f7c..cde312f 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -184,6 +184,30 @@ static void transform_and_round_points(GpGraphics *graphics, POINT *pti,
}
}
+static void gdi_alpha_blend(GpGraphics *graphics, INT dst_x, INT dst_y, INT dst_width, INT dst_height,
+ HDC hdc, INT src_x, INT src_y, INT src_width, INT src_height)
+{
+ if (GetDeviceCaps(graphics->hdc, SHADEBLENDCAPS) == SB_NONE)
+ {
+ TRACE("alpha blending not supported by device, fallback to StretchBlt\n");
+
+ StretchBlt(graphics->hdc, dst_x, dst_y, dst_width, dst_height,
+ hdc, src_x, src_y, src_width, src_height, SRCCOPY);
+ }
+ else
+ {
+ BLENDFUNCTION bf;
+
+ bf.BlendOp = AC_SRC_OVER;
+ bf.BlendFlags = 0;
+ bf.SourceConstantAlpha = 255;
+ bf.AlphaFormat = AC_SRC_ALPHA;
+
+ GdiAlphaBlend(graphics->hdc, dst_x, dst_y, dst_width, dst_height,
+ hdc, src_x, src_y, src_width, src_height, bf);
+ }
+}
+
/* Draw non-premultiplied ARGB data to the given graphics object */
static GpStatus alpha_blend_pixels(GpGraphics *graphics, INT dst_x, INT dst_y,
const BYTE *src, INT src_width, INT src_height, INT src_stride)
@@ -214,10 +238,9 @@ static GpStatus alpha_blend_pixels(GpGraphics *graphics, INT dst_x, INT dst_y,
else
{
HDC hdc;
- HBITMAP hbitmap, old_hbm=NULL;
+ HBITMAP hbitmap;
BITMAPINFOHEADER bih;
BYTE *temp_bits;
- BLENDFUNCTION bf;
hdc = CreateCompatibleDC(0);
@@ -239,17 +262,9 @@ static GpStatus alpha_blend_pixels(GpGraphics *graphics, INT dst_x, INT dst_y,
convert_32bppARGB_to_32bppPARGB(src_width, src_height, temp_bits,
4 * src_width, src, src_stride);
- old_hbm = SelectObject(hdc, hbitmap);
-
- bf.BlendOp = AC_SRC_OVER;
- bf.BlendFlags = 0;
- bf.SourceConstantAlpha = 255;
- bf.AlphaFormat = AC_SRC_ALPHA;
-
- GdiAlphaBlend(graphics->hdc, dst_x, dst_y, src_width, src_height,
- hdc, 0, 0, src_width, src_height, bf);
-
- SelectObject(hdc, old_hbm);
+ SelectObject(hdc, hbitmap);
+ gdi_alpha_blend(graphics, dst_x, dst_y, src_width, src_height,
+ hdc, 0, 0, src_width, src_height);
DeleteDC(hdc);
DeleteObject(hbitmap);
@@ -700,21 +715,12 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
{
HDC hdc = CreateCompatibleDC(NULL);
- HBITMAP oldbmp;
- BLENDFUNCTION bf;
if (!hdc) break;
- oldbmp = SelectObject(hdc, fill->bmp);
-
- bf.BlendOp = AC_SRC_OVER;
- bf.BlendFlags = 0;
- bf.SourceConstantAlpha = 255;
- bf.AlphaFormat = AC_SRC_ALPHA;
-
- GdiAlphaBlend(graphics->hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, hdc, 0, 0, 1, 1, bf);
-
- SelectObject(hdc, oldbmp);
+ SelectObject(hdc, fill->bmp);
+ gdi_alpha_blend(graphics, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
+ hdc, 0, 0, 1, 1);
DeleteDC(hdc);
}
@@ -2812,15 +2818,8 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha))
{
- BLENDFUNCTION bf;
-
- bf.BlendOp = AC_SRC_OVER;
- bf.BlendFlags = 0;
- bf.SourceConstantAlpha = 255;
- bf.AlphaFormat = AC_SRC_ALPHA;
-
- GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y,
- hdc, srcx, srcy, srcwidth, srcheight, bf);
+ gdi_alpha_blend(graphics, pti[0].x, pti[0].y, pti[1].x - pti[0].x, pti[2].y - pti[0].y,
+ hdc, srcx, srcy, srcwidth, srcheight);
}
else
{
--
1.7.9.4
Подробная информация о списке рассылки Wine-patches