oleaut32: Add support for loading and drawing metafiles

Dmitry Timoshkov dmitry at codeweavers.com
Fri May 25 06:46:01 CDT 2007


Hello,

Changelog:
    oleaut32: Add support for loading and drawing metafiles.

---
 dlls/oleaut32/olepicture.c |   61 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 60 insertions(+), 1 deletions(-)

diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c
index 6485c7d..938604d 100644
--- a/dlls/oleaut32/olepicture.c
+++ b/dlls/oleaut32/olepicture.c
@@ -674,7 +674,16 @@ static HRESULT WINAPI OLEPictureImpl_Render(IPicture *iface, HDC hdc,
     break;
 
   case PICTYPE_METAFILE:
+    PlayMetaFile(hdc, This->desc.u.wmf.hmeta);
+    break;
+
   case PICTYPE_ENHMETAFILE:
+  {
+    RECT rc = { x, y, cx, cy };
+    PlayEnhMetaFile(hdc, This->desc.u.emf.hemf, &rc);
+    break;
+  }
+
   default:
     FIXME("type %d not implemented\n", This->desc.picType);
     return E_NOTIMPL;
@@ -795,6 +804,7 @@ static HRESULT WINAPI OLEPictureImpl_get_Attributes(IPicture *iface,
   switch (This->desc.picType) {
   case PICTYPE_BITMAP: 	if (This->hbmMask) *pdwAttr = PICTURE_TRANSPARENT; break;	/* not 'truly' scalable, see MSDN. */
   case PICTYPE_ICON: *pdwAttr     = PICTURE_TRANSPARENT;break;
+  case PICTYPE_ENHMETAFILE: /* fall through */
   case PICTYPE_METAFILE: *pdwAttr = PICTURE_TRANSPARENT|PICTURE_SCALABLE;break;
   default:FIXME("Unknown pictype %d\n",This->desc.picType);break;
   }
@@ -1385,6 +1395,50 @@ static HRESULT OLEPictureImpl_LoadIcon(OLEPictureImpl *This, BYTE *xbuf, ULONG x
     }
 }
 
+static HRESULT OLEPictureImpl_LoadMetafile(OLEPictureImpl *This,
+                                           const BYTE *data, ULONG size)
+{
+    const ENHMETAHEADER *emh;
+    HMETAFILE hmf;
+    HENHMETAFILE hemf;
+
+    /* SetMetaFileBitsEx performs data check on its own */
+    hmf = SetMetaFileBitsEx(size, data);
+    if (hmf)
+    {
+        This->desc.picType = PICTYPE_METAFILE;
+        This->desc.u.wmf.hmeta = hmf;
+        This->desc.u.wmf.xExt = 0;
+        This->desc.u.wmf.yExt = 0;
+
+        This->origWidth = 0;
+        This->origHeight = 0;
+        This->himetricWidth = 0;
+        This->himetricHeight = 0;
+
+        return S_OK;
+    }
+
+    /* SetEnhMetaFileBits (in Wine) does not perform data checks */
+    if (size < sizeof(ENHMETAHEADER)) return E_FAIL;
+    emh = (const ENHMETAHEADER *)data;
+    if (emh->iType != EMR_HEADER || emh->dSignature != ENHMETA_SIGNATURE)
+        return E_FAIL;
+
+    hemf = SetEnhMetaFileBits(size, data);
+    if (!hemf) return E_FAIL;
+
+    This->desc.picType = PICTYPE_ENHMETAFILE;
+    This->desc.u.emf.hemf = hemf;
+
+    This->origWidth = 0;
+    This->origHeight = 0;
+    This->himetricWidth = 0;
+    This->himetricHeight = 0;
+
+    return S_OK;
+}
+
 /************************************************************************
  * OLEPictureImpl_IPersistStream_Load (IUnknown)
  *
@@ -1393,7 +1447,7 @@ static HRESULT OLEPictureImpl_LoadIcon(OLEPictureImpl *This, BYTE *xbuf, ULONG x
  * 	DWORD magic;
  * 	DWORD len;
  *
- * Currently implemented: BITMAP, ICON, JPEG, GIF
+ * Currently implemented: BITMAP, ICON, JPEG, GIF, WMF, EMF
  */
 static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
   HRESULT	hr = E_FAIL;
@@ -1544,6 +1598,11 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
   default:
   {
     unsigned int i;
+
+    /* let's see if it's a metafile */
+    hr = OLEPictureImpl_LoadMetafile(This, xbuf, xread);
+    if (hr == S_OK) break;
+
     FIXME("Unknown magic %04x, %d read bytes:\n",magic,xread);
     hr=E_FAIL;
     for (i=0;i<xread+8;i++) {
-- 
1.5.1.6






More information about the wine-patches mailing list