gdi32: Keep track of the combined clip region.
authorHuw Davies <huw@codeweavers.com>
Wed, 13 Apr 2011 13:57:44 +0000 (14:57 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Fri, 15 Apr 2011 13:39:45 +0000 (15:39 +0200)
dlls/gdi32/dibdrv/dc.c
dlls/gdi32/gdi_private.h

index e5048d4d33bd2070ef17348e20d929f1cdd162a0..9e971775b4ebc57c37039c4cc4edc5ca7e62c21d 100644 (file)
@@ -32,7 +32,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(dib);
  */
 static BOOL CDECL dibdrv_DeleteDC( PHYSDEV dev )
 {
+    dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
     TRACE("(%p)\n", dev);
+    DeleteObject(pdev->clip);
     return 0;
 }
 
@@ -129,6 +131,7 @@ static HBITMAP CDECL dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap )
     if (!bmp) return 0;
     assert(bmp->dib);
 
+    pdev->clip = CreateRectRgn(0, 0, 0, 0);
     pdev->defer = 0;
 
     if(!init_dib(&pdev->dib, &bmp->dib->dsBmih, bmp->dib->dsBitfields, bmp->dib->dsBm.bmBits))
@@ -139,6 +142,19 @@ static HBITMAP CDECL dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap )
     return next->funcs->pSelectBitmap( next, bitmap );
 }
 
+/***********************************************************************
+ *           dibdrv_SetDeviceClipping
+ */
+static void CDECL dibdrv_SetDeviceClipping( PHYSDEV dev, HRGN vis_rgn, HRGN clip_rgn )
+{
+    PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetDeviceClipping );
+    dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
+    TRACE("(%p, %p, %p)\n", dev, vis_rgn, clip_rgn);
+
+    CombineRgn( pdev->clip, vis_rgn, clip_rgn, clip_rgn ? RGN_AND : RGN_COPY );
+    return next->funcs->pSetDeviceClipping( next, vis_rgn, clip_rgn);
+}
+
 /***********************************************************************
  *           dibdrv_SetROP2
  */
@@ -245,7 +261,7 @@ const DC_FUNCTIONS dib_driver =
     NULL,                               /* pSetDIBColorTable */
     NULL,                               /* pSetDIBits */
     NULL,                               /* pSetDIBitsToDevice */
-    NULL,                               /* pSetDeviceClipping */
+    dibdrv_SetDeviceClipping,           /* pSetDeviceClipping */
     NULL,                               /* pSetDeviceGammaRamp */
     NULL,                               /* pSetLayout */
     NULL,                               /* pSetMapMode */
index 91f4acb51610b532eed52af586304dd09e7cb44b..e126aa1b10af29bf9ba83e0f970e2525b2939e92 100644 (file)
@@ -97,6 +97,7 @@ typedef struct dibdrv_physdev
     struct gdi_physdev dev;
     dib_info dib;
 
+    HRGN clip;
     DWORD defer;
 
     /* pen */