[PATCH v3 3/3] riched20: Draw OLE objects with IViewObject implementation.

Jinoh Kang wine at gitlab.winehq.org
Sat Jun 11 06:00:54 CDT 2022


From: Jinoh Kang <jinoh.kang.kr at gmail.com>

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52752
Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
---
 dlls/riched20/richole.c       | 29 +++++++++++++++++++++++++++++
 dlls/riched20/tests/richole.c |  2 --
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index 936f1c928b3..3d88b8a65b0 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -5733,6 +5733,7 @@ void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize)
 void draw_ole( ME_Context *c, int x, int y, ME_Run *run, BOOL selected )
 {
   IDataObject*  ido;
+  IViewObject*  ivo;
   FORMATETC     fmt;
   STGMEDIUM     stgm;
   DIBSECTION    dibsect;
@@ -5745,6 +5746,34 @@ void draw_ole( ME_Context *c, int x, int y, ME_Run *run, BOOL selected )
 
   assert(run->nFlags & MERF_GRAPHICS);
   assert(run->reobj);
+
+  if (SUCCEEDED(IOleObject_QueryInterface(run->reobj->obj.poleobj, &IID_IViewObject, (void**)&ivo)))
+  {
+    HRESULT hr;
+    RECTL bounds;
+
+    convert_sizel(c, &run->reobj->obj.sizel, &sz);
+    if (c->editor->nZoomNumerator != 0)
+    {
+      sz.cx = MulDiv(sz.cx, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
+      sz.cy = MulDiv(sz.cy, c->editor->nZoomNumerator, c->editor->nZoomDenominator);
+    }
+
+    bounds.left = x;
+    bounds.top = y - sz.cy;
+    bounds.right = x + sz.cx;
+    bounds.bottom = y;
+
+    hr = IViewObject_Draw(ivo, DVASPECT_CONTENT, -1, 0, 0, 0, c->hDC, &bounds, NULL, NULL, 0);
+    if (FAILED(hr))
+    {
+      WARN("failed to draw object: %#08lx\n", hr);
+    }
+
+    IViewObject_Release(ivo);
+    return;
+  }
+
   if (IOleObject_QueryInterface(run->reobj->obj.poleobj, &IID_IDataObject, (void**)&ido) != S_OK)
   {
     FIXME("Couldn't get interface\n");
diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c
index 52aa4deade4..1ac23526542 100644
--- a/dlls/riched20/tests/richole.c
+++ b/dlls/riched20/tests/richole.c
@@ -4193,7 +4193,6 @@ static void subtest_InsertObject(struct reolecb_obj *callback)
   UpdateWindow(hwnd);
   testobj->line = __LINE__;
   flush_dispatch_messages();
-  todo_wine
   ok(testobj->draw_count != 0, "expected draw_count to be nonzero, got %d\n", testobj->draw_count);
 
   SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)"");
@@ -4225,7 +4224,6 @@ static void subtest_InsertObject(struct reolecb_obj *callback)
   UpdateWindow(hwnd);
   testobj->line = __LINE__;
   flush_dispatch_messages();
-  todo_wine
   ok(testobj->draw_count != 0, "expected draw_count to be nonzero, got %d\n", testobj->draw_count);
 
   SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)"");
-- 
GitLab

https://gitlab.winehq.org/wine/wine/-/merge_requests/227



More information about the wine-devel mailing list