Module: wine Branch: master Commit: 842d49939d6d76010c5ced4e9eb371e0bb986b71 URL: http://source.winehq.org/git/wine.git/?a=commit;h=842d49939d6d76010c5ced4e9e...
Author: Huw Davies huw@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);