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