ole32: Fix OleDraw() regarding passed rectangle handling

Nikolay Sivov nsivov at codeweavers.com
Mon Nov 26 04:53:58 CST 2012


http://bugs.winehq.org/show_bug.cgi?id=32292
-------------- next part --------------
>From 04cbde83b4ca72162da1e59f7b2b740ba41234f4 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon, 26 Nov 2012 12:49:59 -0500
Subject: [PATCH 5/5] Fix OleDraw() regarding passed rectangle handling

---
 dlls/ole32/ole2.c       |   14 ++------
 dlls/ole32/tests/ole2.c |   87 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+), 12 deletions(-)

diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
index 6a91ba6..7e55fb2 100644
--- a/dlls/ole32/ole2.c
+++ b/dlls/ole32/ole2.c
@@ -2554,7 +2554,7 @@ HRESULT WINAPI OleDraw(
 	IUnknown *pUnk,
 	DWORD dwAspect,
 	HDC hdcDraw,
-	LPCRECT lprcBounds)
+	LPCRECT rect)
 {
   HRESULT hres;
   IViewObject *viewobject;
@@ -2562,24 +2562,14 @@ HRESULT WINAPI OleDraw(
   hres = IUnknown_QueryInterface(pUnk,
 				 &IID_IViewObject,
 				 (void**)&viewobject);
-
   if (SUCCEEDED(hres))
   {
-    RECTL rectl;
-
-    rectl.left = lprcBounds->left;
-    rectl.right = lprcBounds->right;
-    rectl.top = lprcBounds->top;
-    rectl.bottom = lprcBounds->bottom;
-    hres = IViewObject_Draw(viewobject, dwAspect, -1, 0, 0, 0, hdcDraw, &rectl, 0, 0, 0);
-
+    hres = IViewObject_Draw(viewobject, dwAspect, -1, 0, 0, 0, hdcDraw, (RECTL*)rect, 0, 0, 0);
     IViewObject_Release(viewobject);
     return hres;
   }
   else
-  {
     return DV_E_NOIVIEWOBJECT;
-  }
 }
 
 /***********************************************************************
diff --git a/dlls/ole32/tests/ole2.c b/dlls/ole32/tests/ole2.c
index 8dd3606..eb8e6d3 100644
--- a/dlls/ole32/tests/ole2.c
+++ b/dlls/ole32/tests/ole2.c
@@ -726,6 +726,84 @@ static IRunnableObject OleObjectRunnable = { &OleObjectRunnableVtbl };
 
 static const CLSID CLSID_Equation3 = {0x0002CE02, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} };
 
+static HRESULT WINAPI viewobject_QueryInterface(IViewObject *iface, REFIID riid, void **obj)
+{
+    if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IViewObject))
+    {
+        *obj = iface;
+        return S_OK;
+    }
+
+    *obj = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI viewobject_AddRef(IViewObject *iface)
+{
+    return 2;
+}
+
+static ULONG WINAPI viewobject_Release(IViewObject *iface)
+{
+    return 1;
+}
+
+static HRESULT WINAPI viewobject_Draw(IViewObject *iface, DWORD aspect, LONG index,
+    void *paspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw,
+    LPCRECTL bounds, LPCRECTL wbounds, BOOL (STDMETHODCALLTYPE *pfnContinue)(ULONG_PTR dwContinue),
+    ULONG_PTR dwContinue)
+{
+    ok(index == -1, "index=%d\n", index);
+    return S_OK;
+}
+
+static HRESULT WINAPI viewobject_GetColorSet(IViewObject *iface, DWORD draw_aspect, LONG index,
+    void *aspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **colorset)
+{
+    ok(0, "unexpected call GetColorSet\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI viewobject_Freeze(IViewObject *iface, DWORD draw_aspect, LONG index,
+    void *aspect, DWORD *freeze)
+{
+    ok(0, "unexpected call Freeze\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI viewobject_Unfreeze(IViewObject *iface, DWORD freeze)
+{
+    ok(0, "unexpected call Unfreeze\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI viewobject_SetAdvise(IViewObject *iface, DWORD aspects, DWORD advf, IAdviseSink *sink)
+{
+    ok(0, "unexpected call SetAdvise\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI viewobject_GetAdvise(IViewObject *iface, DWORD *aspects, DWORD *advf,
+    IAdviseSink **sink)
+{
+    ok(0, "unexpected call GetAdvise\n");
+    return E_NOTIMPL;
+}
+
+static const struct IViewObjectVtbl viewobjectvtbl = {
+    viewobject_QueryInterface,
+    viewobject_AddRef,
+    viewobject_Release,
+    viewobject_Draw,
+    viewobject_GetColorSet,
+    viewobject_Freeze,
+    viewobject_Unfreeze,
+    viewobject_SetAdvise,
+    viewobject_GetAdvise
+};
+
+static IViewObject viewobject = { &viewobjectvtbl };
+
 static void test_OleCreate(IStorage *pStorage)
 {
     HRESULT hr;
@@ -1853,6 +1931,14 @@ static void test_OleLockRunning(void)
     ok(hr == S_OK, "OleLockRunning failed 0x%08x\n", hr);
 }
 
+static void test_OleDraw(void)
+{
+    HRESULT hr;
+
+    hr = OleDraw((IUnknown*)&viewobject, 0, (HDC)0x1, NULL);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+}
+
 START_TEST(ole2)
 {
     DWORD dwRegister;
@@ -1889,6 +1975,7 @@ START_TEST(ole2)
     test_default_handler();
     test_runnable();
     test_OleLockRunning();
+    test_OleDraw();
 
     CoUninitialize();
 }
-- 
1.7.10.4



More information about the wine-patches mailing list