gdi32: Added correct path bounding box to FillPath, StrokePath, StrokeAndFillPath.

Fabian Franz FabianFranz at gmx.de
Thu Feb 1 18:41:34 CST 2007


Signed-off-by: Fabian Franz <FabianFranz at gmx.de>
---
 dlls/gdi32/enhmfdrv/dc.c             |   26 +++++++++++---------------
 dlls/gdi32/enhmfdrv/enhmetafiledrv.h |    1 +
 dlls/gdi32/enhmfdrv/init.c           |   12 ++++++++++++
 3 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c
index 485d205..dab9cac 100644
--- a/dlls/gdi32/enhmfdrv/dc.c
+++ b/dlls/gdi32/enhmfdrv/dc.c
@@ -188,11 +188,16 @@ BOOL EMFDRV_AbortPath( PHYSDEV dev )
 
 BOOL EMFDRV_BeginPath( PHYSDEV dev )
 {
+    EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE *)dev;
     EMRBEGINPATH emr;
 
     emr.emr.iType = EMR_BEGINPATH;
     emr.emr.nSize = sizeof(emr);
 
+    /* Re-initialise the bounding box */
+    physDev->Path_rclBounds.left = 1;
+    physDev->Path_rclBounds.right = 0;
+
     return EMFDRV_WriteRecord( dev, &emr.emr );
 }
 
@@ -218,15 +223,12 @@ BOOL EMFDRV_EndPath( PHYSDEV dev )
 
 BOOL EMFDRV_FillPath( PHYSDEV dev )
 {
+    EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE *)dev;
     EMRFILLPATH emr;
 
     emr.emr.iType = EMR_FILLPATH;
     emr.emr.nSize = sizeof(emr);
-    FIXME("Bounds\n");
-    emr.rclBounds.left = 0;
-    emr.rclBounds.top = 0;
-    emr.rclBounds.right = 0;
-    emr.rclBounds.bottom = 0;
+    emr.rclBounds = physDev->Path_rclBounds;
     return EMFDRV_WriteRecord( dev, &emr.emr );
 }
 
@@ -253,29 +255,23 @@ BOOL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode )
 
 BOOL EMFDRV_StrokeAndFillPath( PHYSDEV dev )
 {
+    EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE *)dev;
     EMRSTROKEANDFILLPATH emr;
 
     emr.emr.iType = EMR_STROKEANDFILLPATH;
     emr.emr.nSize = sizeof(emr);
-    FIXME("Bounds\n");
-    emr.rclBounds.left = 0;
-    emr.rclBounds.top = 0;
-    emr.rclBounds.right = 0;
-    emr.rclBounds.bottom = 0;
+    emr.rclBounds = physDev->Path_rclBounds;
     return EMFDRV_WriteRecord( dev, &emr.emr );
 }
 
 BOOL EMFDRV_StrokePath( PHYSDEV dev )
 {
+    EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE *)dev;
     EMRSTROKEPATH emr;
 
     emr.emr.iType = EMR_STROKEPATH;
     emr.emr.nSize = sizeof(emr);
-    FIXME("Bounds\n");
-    emr.rclBounds.left = 0;
-    emr.rclBounds.top = 0;
-    emr.rclBounds.right = 0;
-    emr.rclBounds.bottom = 0;
+    emr.rclBounds = physDev->Path_rclBounds;
     return EMFDRV_WriteRecord( dev, &emr.emr );
 }
 
diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
index 6d84d19..22141e6 100644
--- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
+++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
@@ -38,6 +38,7 @@ typedef struct
     UINT       handles_size, cur_handles;
     HGDIOBJ   *handles;
     HANDLE     hFile;              /* Handle for disk based MetaFile */
+    RECTL      Path_rclBounds;
     INT        horzres, vertres;
     INT        horzsize, vertsize;
     INT        logpixelsx, logpixelsy;
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index 82d61c6..7b01567 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -224,6 +224,9 @@ void EMFDRV_UpdateBBox( PHYSDEV dev, RECTL *rect )
     RECTL *bounds = &physDev->emh->rclBounds;
     RECTL vportRect = *rect;
 
+    /* We need to run the code twice ... */
+    INT runLoop=2;
+
     LPtoDP(physDev->hdc, (LPPOINT)&vportRect, 2);
     
     /* The coordinate systems may be mirrored
@@ -241,6 +244,9 @@ void EMFDRV_UpdateBBox( PHYSDEV dev, RECTL *rect )
         vportRect.top = temp;
     }
 
+    do
+    {
+
     if (bounds->left > bounds->right)
     {
         /* first bounding rectangle */
@@ -253,6 +259,12 @@ void EMFDRV_UpdateBBox( PHYSDEV dev, RECTL *rect )
         bounds->right  = max(bounds->right,  vportRect.right);
         bounds->bottom = max(bounds->bottom, vportRect.bottom);
     }
+
+    runLoop--;
+    bounds=&physDev->Path_rclBounds;
+
+    }
+    while (runLoop > 0);
 }
 
 /**********************************************************************
-- 
1.4.4.3




More information about the wine-patches mailing list