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