[PATCH 2/3] gdi32: Don't update the bounds if any poly{line|gon} has fewer than two points.
Huw Davies
huw at codeweavers.com
Wed Mar 9 05:17:04 CST 2016
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/gdi32/enhmfdrv/graphics.c | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c
index 83f822a..d3b3325 100644
--- a/dlls/gdi32/enhmfdrv/graphics.c
+++ b/dlls/gdi32/enhmfdrv/graphics.c
@@ -484,28 +484,33 @@ EMFDRV_PolyPolylinegon( PHYSDEV dev, const POINT* pt, const INT* counts, UINT po
EMRPOLYPOLYLINE *emr;
DWORD cptl = 0, poly, size, i;
INT point;
- RECTL bounds;
+ const RECTL empty = {0, 0, -1, -1};
+ RECTL bounds = empty;
const POINT *pts;
- BOOL ret, use_small_emr = TRUE;
-
- bounds.left = bounds.right = pt[0].x;
- bounds.top = bounds.bottom = pt[0].y;
+ BOOL ret, use_small_emr = TRUE, bounds_valid = TRUE;
pts = pt;
for(poly = 0; poly < polys; poly++) {
cptl += counts[poly];
+ if(counts[poly] < 2) bounds_valid = FALSE;
for(point = 0; point < counts[poly]; point++) {
/* check whether all points fit in the SHORT int POINT structure */
if( ((pts->x+0x8000) & ~0xffff ) ||
((pts->y+0x8000) & ~0xffff ) )
use_small_emr = FALSE;
- if(bounds.left > pts->x) bounds.left = pts->x;
- else if(bounds.right < pts->x) bounds.right = pts->x;
- if(bounds.top > pts->y) bounds.top = pts->y;
- else if(bounds.bottom < pts->y) bounds.bottom = pts->y;
+ if(pts == pt) {
+ bounds.left = bounds.right = pts->x;
+ bounds.top = bounds.bottom = pts->y;
+ } else {
+ if(bounds.left > pts->x) bounds.left = pts->x;
+ else if(bounds.right < pts->x) bounds.right = pts->x;
+ if(bounds.top > pts->y) bounds.top = pts->y;
+ else if(bounds.bottom < pts->y) bounds.bottom = pts->y;
+ }
pts++;
}
}
+ if(!cptl) bounds_valid = FALSE;
size = FIELD_OFFSET(EMRPOLYPOLYLINE, aPolyCounts[polys]);
if(use_small_emr)
@@ -519,7 +524,10 @@ EMFDRV_PolyPolylinegon( PHYSDEV dev, const POINT* pt, const INT* counts, UINT po
if(use_small_emr) emr->emr.iType += EMR_POLYPOLYLINE16 - EMR_POLYPOLYLINE;
emr->emr.nSize = size;
- emr->rclBounds = bounds;
+ if(bounds_valid)
+ emr->rclBounds = bounds;
+ else
+ emr->rclBounds = empty;
emr->nPolys = polys;
emr->cptl = cptl;
@@ -543,6 +551,11 @@ EMFDRV_PolyPolylinegon( PHYSDEV dev, const POINT* pt, const INT* counts, UINT po
}
ret = EMFDRV_WriteRecord( dev, &emr->emr );
+ if(ret && !bounds_valid)
+ {
+ ret = FALSE;
+ SetLastError( ERROR_INVALID_PARAMETER );
+ }
if(ret)
EMFDRV_UpdateBBox( dev, &emr->rclBounds );
HeapFree( GetProcessHeap(), 0, emr );
--
2.7.0
More information about the wine-patches
mailing list