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