Alexandre Julliard : gdi32: Emulate DDB support using the DIB driver when the graphics driver doesn' t support bitmaps.

Alexandre Julliard julliard at winehq.org
Tue Nov 1 13:23:15 CDT 2011


Module: wine
Branch: master
Commit: f1f5f334687a90842acff555bdb987c901d59f6d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f1f5f334687a90842acff555bdb987c901d59f6d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Oct 31 20:21:15 2011 +0100

gdi32: Emulate DDB support using the DIB driver when the graphics driver doesn't support bitmaps.

---

 dlls/gdi32/bitmap.c    |   11 +++--------
 dlls/gdi32/dibdrv/dc.c |   11 +++++++++--
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c
index fe9deb7..8aea89c 100644
--- a/dlls/gdi32/bitmap.c
+++ b/dlls/gdi32/bitmap.c
@@ -609,11 +609,7 @@ BOOL BITMAP_SetOwnerDC( HBITMAP hbitmap, PHYSDEV physdev )
                     set_initial_bitmap_bits( hbitmap, bitmap );
                 }
             }
-            else
-            {
-                WARN( "Trying to select bitmap %p in DC that doesn't support it\n", hbitmap );
-                ret = FALSE;
-            }
+            else bitmap->funcs = &dib_driver;  /* use the DIB driver to emulate DDB support */
         }
         else
         {
@@ -666,7 +662,8 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc )
     if(old_physdev == dc->dibdrv)
         old_physdev = pop_dc_driver( &dc->physDev );
 
-    if(bitmap->dib)
+    physdev = GET_DC_PHYSDEV( dc, pSelectBitmap );
+    if (bitmap->dib || physdev->funcs == &null_driver)
     {
         physdev = dc->dibdrv;
         if (physdev) push_dc_driver( &dc->physDev, physdev, physdev->funcs );
@@ -676,8 +673,6 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc )
             dc->dibdrv = physdev = dc->physDev;
         }
     }
-    else
-        physdev = GET_DC_PHYSDEV( dc, pSelectBitmap );
 
     if (!BITMAP_SetOwnerDC( handle, physdev ))
     {
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 0b67974..b312fab 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -404,6 +404,14 @@ static BOOL dibdrv_DeleteDC( PHYSDEV dev )
 }
 
 /***********************************************************************
+ *           dibdrv_DeleteBitmap
+ */
+static BOOL dibdrv_DeleteBitmap( HBITMAP bitmap )
+{
+    return TRUE;
+}
+
+/***********************************************************************
  *           dibdrv_SelectBitmap
  */
 static HBITMAP dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap )
@@ -414,7 +422,6 @@ static HBITMAP dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap )
     TRACE("(%p, %p)\n", dev, bitmap);
 
     if (!bmp) return 0;
-    assert(bmp->dib);
 
     free_dib_info(&pdev->dib);
     pdev->defer = 0;
@@ -533,7 +540,7 @@ const struct gdi_dc_funcs dib_driver =
     NULL,                               /* pCreateCompatibleDC */
     dibdrv_CreateDC,                    /* pCreateDC */
     NULL,                               /* pCreateDIBSection */
-    NULL,                               /* pDeleteBitmap */
+    dibdrv_DeleteBitmap,                /* pDeleteBitmap */
     dibdrv_DeleteDC,                    /* pDeleteDC */
     NULL,                               /* pDeleteObject */
     NULL,                               /* pDescribePixelFormat */




More information about the wine-cvs mailing list