Fix the PolyPolygon function so it really generates a polypolygon and
not multiple sets of polygons.
diff --git a/dlls/gdi/mfdrv/graphics.c b/dlls/gdi/mfdrv/graphics.c
index 591d05c..bbfb3ae 100644
--- a/dlls/gdi/mfdrv/graphics.c
+++ b/dlls/gdi/mfdrv/graphics.c
@@ -190,23 +190,53 @@
BOOL
MFDRV_PolyPolygon( PHYSDEV dev, const POINT* pt, const INT* counts, UINT polygons)
{
- int i,j;
- LPPOINT16 pt16;
- const POINT* curpt=pt;
- BOOL ret;
+ BOOL ret;
+ DWORD len;
+ METARECORD *mr;
+ int i,j;
+ LPPOINT16 pt16;
+ INT16 totalpoint16 = 0;
+ INT16 * pointcounts;
for (i=0;i<polygons;i++) {
- pt16=(LPPOINT16)HeapAlloc( GetProcessHeap(), 0,
- sizeof(POINT16) * counts[i] );
- if(!pt16) return FALSE;
- for (j=counts[i];j--;) CONV_POINT32TO16(&(curpt[j]),&(pt16[j]));
- ret = MFDRV_MetaPoly(dev, META_POLYGON, pt16, counts[i]);
- HeapFree( GetProcessHeap(), 0, pt16 );
- if (!ret)
- return FALSE;
- curpt+=counts[i];
+ totalpoint16 += counts[i];
}
- return TRUE;
+
+ /* allocate space for all points */
+ pt16=(LPPOINT16)HeapAlloc( GetProcessHeap(), 0,
+ sizeof(POINT16) * totalpoint16 );
+ pointcounts = (INT16*)HeapAlloc( GetProcessHeap(), 0,
+ sizeof(INT16) * totalpoint16 );
+
+ /* copy point counts */
+ for (i=0;i<polygons;i++) {
+ pointcounts[i] = counts[i];
+ }
+
+ /* convert all points */
+ for (j = totalpoint16; j--;){
+ CONV_POINT32TO16(&(pt[j]),&(pt16[j]));
+ }
+
+ len = sizeof(METARECORD) + sizeof(WORD) + polygons*sizeof(INT16) + totalpoint16*sizeof(POINT16);
+
+ if (!(mr = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len ))) {
+ HeapFree( GetProcessHeap(), 0, pt16 );
+ HeapFree( GetProcessHeap(), 0, pointcounts );
+ return FALSE;
+ }
+
+ mr->rdSize = len /2;
+ mr->rdFunction = META_POLYPOLYGON;
+ *(mr->rdParm) = polygons;
+ memcpy(mr->rdParm + 1, pointcounts, polygons*sizeof(INT16));
+ memcpy(mr->rdParm + 1+polygons, pt16 , totalpoint16*sizeof(POINT16));
+ ret = MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);
+
+ HeapFree( GetProcessHeap(), 0, pt16 );
+ HeapFree( GetProcessHeap(), 0, pointcounts );
+ HeapFree( GetProcessHeap(), 0, mr);
+ return ret;
}