fix generation of PolyPolygon in mfdrv
Warren_Baird at cimmetry.com
Warren_Baird at cimmetry.com
Wed Feb 5 17:37:01 CST 2003
ChangeLog:
Fix the Metafile driver PolyPolygon function so it really
generates a polypolygon and not multiple sets of polygons.
Warren Baird : Warren_Baird at cimmetry.com
Xavier Servettaz
diff -ur clean/wine/dlls/gdi/mfdrv/graphics.c wine/dlls/gdi/mfdrv/graphics.c
--- clean/wine/dlls/gdi/mfdrv/graphics.c Wed Jan 29 15:30:25 2003
+++ wine/dlls/gdi/mfdrv/graphics.c Fri Jan 31 13:28:55 2003
@@ -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;
-
- 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]);
+ BOOL ret;
+ DWORD len;
+ METARECORD *mr;
+ int i,j;
+ LPPOINT16 pt16;
+ INT16 totalpoint16 = 0;
+ INT16 * pointcounts;
+
+ for (i=0;i<polygons;i++) {
+ totalpoint16 += counts[i];
+ }
+
+ /* 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 );
- if (!ret)
- return FALSE;
- curpt+=counts[i];
- }
- return TRUE;
+ HeapFree( GetProcessHeap(), 0, pointcounts );
+ HeapFree( GetProcessHeap(), 0, mr);
+ return ret;
}
More information about the wine-patches
mailing list