Enhanced metafile fixes

Dmitry Timoshkov dmitry at sloboda.ru
Thu Feb 1 08:20:25 CST 2001


Hello.

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    Add support for EMR_EXTTEXTOUTA and EMR_CREATEMONOBRUSH
    enhanced metafile records. Better implementation of EMR_STRETCHDIBITS
    and EMR_EXTTEXTOUTW.

--- cvs/wine/objects/enhmetafile.c	Wed Jan 31 20:43:52 2001
+++ wine/objects/enhmetafile.c	Thu Feb  1 22:01:30 2001
@@ -622,44 +622,56 @@
 
     case EMR_STRETCHDIBITS:
       {
-	LONG xDest = mr->dParm[4];
-	LONG yDest = mr->dParm[5];
-	LONG xSrc = mr->dParm[6];
-	LONG ySrc = mr->dParm[7];
-	LONG cxSrc = mr->dParm[8];
-	LONG cySrc = mr->dParm[9];
-	DWORD offBmiSrc = mr->dParm[10];
-	DWORD offBitsSrc = mr->dParm[12];
-	DWORD iUsageSrc = mr->dParm[14];
-	DWORD dwRop = mr->dParm[15];
-	LONG cxDest = mr->dParm[16];
-	LONG cyDest = mr->dParm[17];
-
-	StretchDIBits(hdc,xDest,yDest,cxDest,cyDest,
-			    xSrc,ySrc,cxSrc,cySrc,
-			    ((char *)mr)+offBitsSrc,
-			    (const BITMAPINFO *)(((char *)mr)+offBmiSrc),
-			    iUsageSrc,dwRop);
+	EMRSTRETCHDIBITS *pStretchDIBits = (EMRSTRETCHDIBITS *)mr;
+
+	StretchDIBits(hdc,
+		      pStretchDIBits->xDest,
+		      pStretchDIBits->yDest,
+		      pStretchDIBits->cxDest,
+		      pStretchDIBits->cyDest,
+		      pStretchDIBits->xSrc,
+		      pStretchDIBits->ySrc,
+		      pStretchDIBits->cxSrc,
+		      pStretchDIBits->cySrc,
+		      (BYTE *)mr + pStretchDIBits->offBitsSrc,
+		      (const BITMAPINFO *)((BYTE *)mr + pStretchDIBits->offBmiSrc),
+		      pStretchDIBits->iUsageSrc,
+		      pStretchDIBits->dwRop);
 	break;
       }
+
+    case EMR_EXTTEXTOUTA:
+    {
+	PEMREXTTEXTOUTA pExtTextOutA = (PEMREXTTEXTOUTA)mr;
+	RECT rc;
+
+	rc.left = pExtTextOutA->emrtext.rcl.left;
+	rc.top = pExtTextOutA->emrtext.rcl.top;
+	rc.right = pExtTextOutA->emrtext.rcl.right;
+	rc.bottom = pExtTextOutA->emrtext.rcl.bottom;
+	ExtTextOutA(hdc, pExtTextOutA->emrtext.ptlReference.x, pExtTextOutA->emrtext.ptlReference.y,
+	    pExtTextOutA->emrtext.fOptions, &rc,
+	    (LPSTR)((BYTE *)mr + pExtTextOutA->emrtext.offString), pExtTextOutA->emrtext.nChars,
+	    (INT *)((BYTE *)mr + pExtTextOutA->emrtext.offDx));
+	break;
+    }
+
     case EMR_EXTTEXTOUTW:
-      {
-	/* 0-3: rect ??? */
-	DWORD flags = mr->dParm[4];
-	/* 5, 6: ??? */
-	DWORD x = mr->dParm[7], y = mr->dParm[8];
-	DWORD count = mr->dParm[9];
-	LPWSTR str = (LPWSTR)((char *)mr + mr->dParm[10]);
-	/* 11: ??? */
-	/* 12-15: rect ???*/
-	LPINT lpDx = (LPINT)((char *)mr + mr->dParm[16]);
-
-	FIXME("Some ExtTextOut args not handled\n");
-	ExtTextOutW(hdc, x, y, flags, NULL,
-		      str, count, lpDx);
+    {
+	PEMREXTTEXTOUTW pExtTextOutW = (PEMREXTTEXTOUTW)mr;
+	RECT rc;
+
+	rc.left = pExtTextOutW->emrtext.rcl.left;
+	rc.top = pExtTextOutW->emrtext.rcl.top;
+	rc.right = pExtTextOutW->emrtext.rcl.right;
+	rc.bottom = pExtTextOutW->emrtext.rcl.bottom;
+	ExtTextOutW(hdc, pExtTextOutW->emrtext.ptlReference.x, pExtTextOutW->emrtext.ptlReference.y,
+	    pExtTextOutW->emrtext.fOptions, &rc,
+	    (LPWSTR)((BYTE *)mr + pExtTextOutW->emrtext.offString), pExtTextOutW->emrtext.nChars,
+	    (INT *)((BYTE *)mr + pExtTextOutW->emrtext.offDx));
 	break;
-      }
- 
+    }
+
     case EMR_CREATEPALETTE:
       {
 	PEMRCREATEPALETTE lpCreatePal = (PEMRCREATEPALETTE)mr;
@@ -1168,14 +1180,24 @@
         break; 
       }
 
+    case EMR_CREATEMONOBRUSH:
+    {
+	PEMRCREATEMONOBRUSH pCreateMonoBrush = (PEMRCREATEMONOBRUSH)mr;
+	BITMAPINFO *pbi = (BITMAPINFO *)((BYTE *)mr + pCreateMonoBrush->offBmi);
+	HBITMAP hBmp = CreateDIBitmap(0, (BITMAPINFOHEADER *)pbi, CBM_INIT,
+		(BYTE *)mr + pCreateMonoBrush->offBits, pbi, 0);
+	(handletable->objectHandle)[pCreateMonoBrush->ihBrush] = CreatePatternBrush(hBmp);
+	/* CreatePatternBrush created a copy of the bitmap */
+	DeleteObject(hBmp);
+	break;
+    }
+
     case EMR_BITBLT:
     case EMR_STRETCHBLT:
     case EMR_MASKBLT:
     case EMR_PLGBLT:
     case EMR_SETDIBITSTODEVICE:
-    case EMR_EXTTEXTOUTA:
     case EMR_POLYDRAW16:
-    case EMR_CREATEMONOBRUSH:
     case EMR_POLYTEXTOUTA:
     case EMR_POLYTEXTOUTW:
     case EMR_FILLRGN:





More information about the wine-patches mailing list