Mikolaj Zalewski : oleaut32: olepicture: Support loading Aldus Placable Metafiles.

Alexandre Julliard julliard at winehq.org
Thu Oct 4 06:21:14 CDT 2007


Module: wine
Branch: master
Commit: 8e7e2c25aae54c73bf01e521010a3a9e85509859
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8e7e2c25aae54c73bf01e521010a3a9e85509859

Author: Mikolaj Zalewski <mikolajz at google.com>
Date:   Wed Oct  3 16:56:53 2007 -0700

oleaut32: olepicture: Support loading Aldus Placable Metafiles.

---

 dlls/oleaut32/olepicture.c       |   40 +++++++++++++++++++++++++-
 dlls/oleaut32/tests/olepicture.c |   59 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 97 insertions(+), 2 deletions(-)

diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c
index d8f01db..6608fa2 100644
--- a/dlls/oleaut32/olepicture.c
+++ b/dlls/oleaut32/olepicture.c
@@ -90,6 +90,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
 
 #include "pshpack1.h"
 
+/* Header for Aldus Placable Metafiles - a standard metafile follows */
+typedef struct _APM_HEADER
+{
+    DWORD key;
+    WORD handle;
+    SHORT left;
+    SHORT top;
+    SHORT right;
+    SHORT bottom;
+    WORD inch;
+    DWORD reserved;
+    WORD checksum;
+} APM_HEADER;
+
 typedef struct {
     BYTE bWidth;
     BYTE bHeight;
@@ -554,8 +568,10 @@ static HRESULT WINAPI OLEPictureImpl_get_hPal(IPicture *iface,
       *phandle = (OLE_HANDLE)This->desc.u.bmp.hpal;
       hres = S_OK;
       break;
-    case PICTYPE_ICON:
     case PICTYPE_METAFILE:
+      hres = E_FAIL;
+      break;
+    case PICTYPE_ICON:
     case PICTYPE_ENHMETAFILE:
     default:
       FIXME("unimplemented for type %d. Returning 0 palette.\n",
@@ -1690,6 +1706,25 @@ static HRESULT OLEPictureImpl_LoadMetafile(OLEPictureImpl *This,
     return S_OK;
 }
 
+static HRESULT OLEPictureImpl_LoadAPM(OLEPictureImpl *This,
+                                      const BYTE *data, ULONG size)
+{
+    APM_HEADER *header = (APM_HEADER *)data;
+    HRESULT hr;
+
+    if (size < sizeof(APM_HEADER))
+        return E_FAIL;
+    if (header->key != 0x9ac6cdd7)
+        return E_FAIL;
+
+    if ((hr = OLEPictureImpl_LoadMetafile(This, data + sizeof(APM_HEADER), size - sizeof(*header))) != S_OK)
+        return hr;
+
+    This->himetricWidth = MulDiv((INT)header->right - header->left, 2540, header->inch);
+    This->himetricHeight = MulDiv((INT)header->bottom - header->top, 2540, header->inch);
+    return S_OK;
+}
+
 /************************************************************************
  * OLEPictureImpl_IPersistStream_Load (IUnknown)
  *
@@ -1848,6 +1883,9 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
   case 0x5089: /* PNG */
     hr = OLEPictureImpl_LoadPNG(This, xbuf, xread);
     break;
+  case 0xcdd7: /* APM */
+    hr = OLEPictureImpl_LoadAPM(This, xbuf, xread);
+    break;
   case 0x0000: { /* ICON , first word is dwReserved */
     hr = OLEPictureImpl_LoadIcon(This, xbuf, xread);
     break;
diff --git a/dlls/oleaut32/tests/olepicture.c b/dlls/oleaut32/tests/olepicture.c
index 99cefd2..c0d0de9 100644
--- a/dlls/oleaut32/tests/olepicture.c
+++ b/dlls/oleaut32/tests/olepicture.c
@@ -27,7 +27,7 @@
 
 #define COBJMACROS
 
-#include <wine/test.h>
+#include "wine/test.h"
 #include <windef.h>
 #include <winbase.h>
 #include <winuser.h>
@@ -40,6 +40,15 @@
 #include <olectl.h>
 #include <objidl.h>
 
+#define expect_eq(expr, value, type, format) { type ret = (expr); ok((value) == ret, #expr " expected " format " got " format "\n", value, ret); }
+
+#define ole_expect(expr, expect) { \
+    HRESULT r = expr; \
+    ok(r == (expect), #expr " returned %x, expected %s (%x)\n", r, #expect, expect); \
+}
+
+#define ole_check(expr) ole_expect(expr, S_OK);
+
 static HMODULE hOleaut32;
 
 static HRESULT (WINAPI *pOleLoadPicture)(LPSTREAM,LONG,BOOL,REFIID,LPVOID*);
@@ -103,6 +112,15 @@ static const unsigned char gif4pixel[42] = {
 0x02,0x00,0x00,0x02,0x03,0x14,0x16,0x05,0x00,0x3b
 };
 
+/* APM with an empty metafile with some padding zeros - looks like under Window the
+ * metafile data should be at least 20 bytes */
+static const unsigned char apmdata[] = {
+0xd7,0xcd,0xc6,0x9a, 0x00,0x00,0x00,0x00, 0x00,0x00,0xee,0x02, 0xb1,0x03,0xa0,0x05,
+0x00,0x00,0x00,0x00, 0xee,0x53,0x01,0x00, 0x09,0x00,0x00,0x03, 0x13,0x00,0x00,0x00,
+0x01,0x00,0x05,0x00, 0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00
+};
+
 struct NoStatStreamImpl
 {
 	const IStreamVtbl	*lpVtbl;   
@@ -424,6 +442,44 @@ static void test_OleCreatePictureIndirect(void)
     IPicture_Release(pict);
 }
 
+static void test_apm()
+{
+    OLE_HANDLE handle;
+    LPSTREAM stream;
+    IPicture *pict;
+    HGLOBAL hglob;
+    LPBYTE *data;
+    LONG cxy;
+    BOOL keep;
+    short type;
+
+    hglob = GlobalAlloc (0, sizeof(apmdata));
+    data = GlobalLock(hglob);
+    memcpy(data, apmdata, sizeof(apmdata));
+
+    ole_check(CreateStreamOnHGlobal(hglob, TRUE, &stream));
+    ole_check(OleLoadPictureEx(stream, sizeof(apmdata), TRUE, &IID_IPicture, 100, 100, 0, (LPVOID *)&pict));
+
+    ole_check(IPicture_get_Handle(pict, &handle));
+    ok(handle != 0, "handle is null\n");
+
+    ole_check(IPicture_get_Type(pict, &type));
+    expect_eq(type, PICTYPE_METAFILE, short, "%d");
+
+    ole_check(IPicture_get_Height(pict, &cxy));
+    expect_eq(cxy,  1667, LONG, "%d");
+
+    ole_check(IPicture_get_Width(pict, &cxy));
+    expect_eq(cxy,  1323, LONG, "%d");
+
+    ole_check(IPicture_get_KeepOriginalFormat(pict, &keep));
+    todo_wine expect_eq(keep, FALSE, LONG, "%d");
+
+    ole_expect(IPicture_get_hPal(pict, &handle), E_FAIL);
+    IPicture_Release(pict);
+    IStream_Release(stream);
+}
+
 START_TEST(olepicture)
 {
 	hOleaut32 = GetModuleHandleA("oleaut32.dll");
@@ -444,6 +500,7 @@ START_TEST(olepicture)
 	if (0) test_pic(pngimage, sizeof(pngimage));
 	test_empty_image();
 	test_empty_image_2();
+        test_apm();
 
 	test_Invoke();
         test_OleCreatePictureIndirect();




More information about the wine-cvs mailing list