Huw Davies : ole32/tests: Add tests for loading a dib 'CONTENTS' stream.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Mar 25 10:13:22 CDT 2015


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Mar 25 08:37:42 2015 +0000

ole32/tests: Add tests for loading a dib 'CONTENTS' stream.

---

 dlls/ole32/tests/ole2.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)

diff --git a/dlls/ole32/tests/ole2.c b/dlls/ole32/tests/ole2.c
index 05e8c4f..0c27bd1 100644
--- a/dlls/ole32/tests/ole2.c
+++ b/dlls/ole32/tests/ole2.c
@@ -31,6 +31,11 @@
 
 #include "wine/test.h"
 
+#include "initguid.h"
+
+DEFINE_GUID(CLSID_Picture_Metafile,0x315,0,0,0xc0,0,0,0,0,0,0,0x46);
+DEFINE_GUID(CLSID_Picture_Dib,0x316,0,0,0xc0,0,0,0,0,0,0,0x46);
+
 #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
 
 #define DEFINE_EXPECT(func) \
@@ -1680,6 +1685,113 @@ static void test_data_cache(void)
     IStorage_Release(pStorage);
 }
 
+
+static const WCHAR CONTENTS[] = {'C','O','N','T','E','N','T','S',0};
+
+/* 2 x 1 x 32 bpp dib. PelsPerMeter = 200x400 */
+static BYTE dib[] =
+{
+    0x42, 0x4d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
+
+    0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00,
+    0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
+
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00,
+    0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00,
+
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
+static IStorage *create_storage( int num )
+{
+    IStorage *stg;
+    IStream *stm;
+    HRESULT hr;
+    ULONG written;
+
+    hr = StgCreateDocfile( NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_DELETEONRELEASE, 0, &stg );
+    ok( hr == S_OK, "got %08x\n", hr);
+    hr = IStorage_SetClass( stg, &CLSID_Picture_Dib );
+    ok( hr == S_OK, "got %08x\n", hr);
+    hr = IStorage_CreateStream( stg, CONTENTS, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE, 0, 0, &stm );
+    ok( hr == S_OK, "got %08x\n", hr);
+    if (num == 1) /* Set biXPelsPerMeter = 0 */
+    {
+        dib[0x26] = 0;
+        dib[0x27] = 0;
+    }
+    hr = IStream_Write( stm, dib, sizeof(dib), &written );
+    ok( hr == S_OK, "got %08x\n", hr);
+    IStream_Release( stm );
+    return stg;
+}
+
+static void test_data_cache_dib_contents_stream(int num)
+{
+    HRESULT hr;
+    IUnknown *unk;
+    IPersistStorage *persist;
+    IDataObject *data;
+    IViewObject2 *view;
+    IStorage *stg;
+    FORMATETC fmt = {CF_DIB, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
+    STGMEDIUM med;
+    CLSID cls;
+    SIZEL sz;
+
+    hr = CreateDataCache( NULL, &CLSID_Picture_Metafile, &IID_IUnknown, (void *)&unk );
+    ok( SUCCEEDED(hr), "got %08x\n", hr );
+    hr = IUnknown_QueryInterface( unk, &IID_IPersistStorage, (void *)&persist );
+    ok( SUCCEEDED(hr), "got %08x\n", hr );
+    hr = IUnknown_QueryInterface( unk, &IID_IDataObject, (void *)&data );
+    ok( SUCCEEDED(hr), "got %08x\n", hr );
+    hr = IUnknown_QueryInterface( unk, &IID_IViewObject2, (void *)&view );
+    ok( SUCCEEDED(hr), "got %08x\n", hr );
+
+    stg = create_storage( num );
+
+    hr = IPersistStorage_Load( persist, stg );
+    ok( SUCCEEDED(hr), "got %08x\n", hr );
+    IStorage_Release( stg );
+
+    hr = IPersistStorage_GetClassID( persist, &cls );
+    ok( SUCCEEDED(hr), "got %08x\n", hr );
+    ok( IsEqualCLSID( &cls, &CLSID_Picture_Dib ), "class id mismatch\n" );
+
+    hr = IDataObject_GetData( data, &fmt, &med );
+    ok( SUCCEEDED(hr), "got %08x\n", hr );
+    if (SUCCEEDED(hr))
+    {
+        ok( med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed );
+        ReleaseStgMedium( &med );
+    }
+
+    hr = IViewObject2_GetExtent( view, DVASPECT_CONTENT, -1, NULL, &sz );
+    ok( SUCCEEDED(hr), "got %08x\n", hr );
+    if (num == 0)
+    {
+        ok( sz.cx == 1000, "got %d\n", sz.cx );
+        ok( sz.cy == 250, "got %d\n", sz.cy );
+    }
+    else
+    {
+        HDC hdc = GetDC( 0 );
+        LONG x = 2 * 2540 / GetDeviceCaps( hdc, LOGPIXELSX );
+        LONG y = 1 * 2540 / GetDeviceCaps( hdc, LOGPIXELSY );
+        ok( sz.cx == x, "got %d %d\n", sz.cx, x );
+        ok( sz.cy == y, "got %d %d\n", sz.cy, y );
+
+        ReleaseDC( 0, hdc );
+    }
+
+    IViewObject2_Release( view );
+    IDataObject_Release( data );
+    IPersistStorage_Release( persist );
+    IUnknown_Release( unk );
+}
+
 static void test_default_handler(void)
 {
     HRESULT hr;
@@ -2385,6 +2497,8 @@ START_TEST(ole2)
     ok_ole_success(hr, "CoRevokeClassObject");
 
     test_data_cache();
+    test_data_cache_dib_contents_stream( 0 );
+    test_data_cache_dib_contents_stream( 1 );
     test_default_handler();
     test_runnable();
     test_OleRun();




More information about the wine-cvs mailing list