Huw Davies : gdi32: Add the ability to track whether we should defer to the graphics driver.
Alexandre Julliard
julliard at winehq.org
Thu Apr 7 11:16:42 CDT 2011
Module: wine
Branch: master
Commit: 842d49939d6d76010c5ced4e9eb371e0bb986b71
URL: http://source.winehq.org/git/wine.git/?a=commit;h=842d49939d6d76010c5ced4e9eb371e0bb986b71
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Apr 7 13:47:18 2011 +0100
gdi32: Add the ability to track whether we should defer to the graphics driver.
---
dlls/gdi32/dibdrv/dc.c | 17 ++++++++++-------
dlls/gdi32/dibdrv/objects.c | 13 +++++++++++++
dlls/gdi32/gdi_private.h | 5 +++++
3 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index b8b401d..d24ef37 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -90,12 +90,12 @@ static BOOL init_dib(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit
switch(dib->bit_count)
{
case 32:
- init_bit_fields(dib, bit_fields);
- if(dib->red_mask == 0xff0000 && dib->green_mask == 0x00ff00 && dib->blue_mask == 0x0000ff)
- dib->funcs = &funcs_8888;
- else
- dib->funcs = &funcs_32;
- break;
+ init_bit_fields(dib, bit_fields);
+ if(dib->red_mask == 0xff0000 && dib->green_mask == 0x00ff00 && dib->blue_mask == 0x0000ff)
+ dib->funcs = &funcs_8888;
+ else
+ dib->funcs = &funcs_32;
+ break;
default:
TRACE("bpp %d not supported, will forward to graphics driver.\n", dib->bit_count);
@@ -118,7 +118,10 @@ static HBITMAP CDECL dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap )
if (!bmp) return 0;
assert(bmp->dib);
- init_dib(&pdev->dib, &bmp->dib->dsBmih, bmp->dib->dsBitfields, bmp->dib->dsBm.bmBits);
+ pdev->defer = 0;
+
+ if(!init_dib(&pdev->dib, &bmp->dib->dsBmih, bmp->dib->dsBitfields, bmp->dib->dsBm.bmBits))
+ pdev->defer |= DEFER_FORMAT;
GDI_ReleaseObj( bitmap );
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index ce3c1b2..c9862dc 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -58,5 +58,18 @@ HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen )
pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logpen.lopnColor);
+ pdev->defer |= DEFER_PEN;
+
+ switch(logpen.lopnStyle & PS_STYLE_MASK)
+ {
+ case PS_SOLID:
+ if(logpen.lopnStyle & PS_GEOMETRIC) break;
+ if(logpen.lopnWidth.x > 1) break;
+ pdev->defer &= ~DEFER_PEN;
+ break;
+ default:
+ break;
+ }
+
return next->funcs->pSelectPen( next, hpen );
}
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 6629ee6..79fdb26 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -97,10 +97,15 @@ typedef struct dibdrv_physdev
struct gdi_physdev dev;
dib_info dib;
+ DWORD defer;
+
/* pen */
DWORD pen_color;
} dibdrv_physdev;
+#define DEFER_FORMAT 1
+#define DEFER_PEN 2
+
typedef struct tagDC_FUNCS
{
INT (CDECL *pAbortDoc)(PHYSDEV);
More information about the wine-cvs
mailing list