Module: wine Branch: master Commit: 8dd207a219789c5fe43b5ef0344ab3d8a3f3ba1a URL: http://source.winehq.org/git/wine.git/?a=commit;h=8dd207a219789c5fe43b5ef034...
Author: Sergio Gómez Del Real sdelreal@codeweavers.com Date: Wed Dec 6 10:52:25 2017 -0500
ole32: Add support for saving metafiles to CONTENTS streams.
Signed-off-by: Sergio Gómez Del Real sdelreal@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ole32/datacache.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c index 945d2fe..869f122 100644 --- a/dlls/ole32/datacache.c +++ b/dlls/ole32/datacache.c @@ -842,6 +842,18 @@ end: return hr; }
+#include <pshpack2.h> +struct meta_placeable +{ + DWORD key; + WORD hwmf; + WORD bounding_box[4]; + WORD inch; + DWORD reserved; + WORD checksum; +}; +#include <poppack.h> + static HRESULT save_mfpict(DataCacheEntry *entry, BOOL contents, IStream *stream) { HRESULT hr = S_OK; @@ -879,6 +891,50 @@ static HRESULT save_mfpict(DataCacheEntry *entry, BOOL contents, IStream *stream hr = IStream_Write(stream, data, data_size, NULL); HeapFree(GetProcessHeap(), 0, data); } + else + { + struct meta_placeable meta_place_rec; + WORD *check; + + if (entry->stgmedium.tymed != TYMED_NULL) + { + mfpict = GlobalLock(entry->stgmedium.u.hMetaFilePict); + if (!mfpict) + return DV_E_STGMEDIUM; + data_size = GetMetaFileBitsEx(mfpict->hMF, 0, NULL); + data = HeapAlloc(GetProcessHeap(), 0, data_size); + if (!data) + { + GlobalUnlock(entry->stgmedium.u.hMetaFilePict); + return E_OUTOFMEMORY; + } + GetMetaFileBitsEx(mfpict->hMF, data_size, data); + } + + /* units are in 1/8th of a point (1 point is 1/72th of an inch) */ + meta_place_rec.key = 0x9ac6cdd7; + meta_place_rec.hwmf = 0; + meta_place_rec.inch = 576; + meta_place_rec.bounding_box[0] = 0; + meta_place_rec.bounding_box[1] = 0; + meta_place_rec.bounding_box[2] = 0; + meta_place_rec.bounding_box[3] = 0; + meta_place_rec.checksum = 0; + meta_place_rec.reserved = 0; + if (mfpict) + { + /* These values are rounded down so MulDiv won't do the right thing */ + meta_place_rec.bounding_box[2] = (LONGLONG)mfpict->xExt * meta_place_rec.inch / 2540; + meta_place_rec.bounding_box[3] = (LONGLONG)mfpict->yExt * meta_place_rec.inch / 2540; + GlobalUnlock(entry->stgmedium.u.hMetaFilePict); + } + for (check = (WORD *)&meta_place_rec; check != (WORD *)&meta_place_rec.checksum; check++) + meta_place_rec.checksum ^= *check; + hr = IStream_Write(stream, &meta_place_rec, sizeof(struct meta_placeable), NULL); + if (hr == S_OK && data_size) + hr = IStream_Write(stream, data, data_size, NULL); + HeapFree(GetProcessHeap(), 0, data); + }
return hr; }