From ecc607c6da96a5c2e8988f3021e98b442fe24c12 Mon Sep 17 00:00:00 2001 From: Jinoh Kang Date: Fri, 1 Apr 2022 01:25:24 +0900 Subject: [PATCH] riched20: Draw OLE objects with IViewObject implementation. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52752 Signed-off-by: Jinoh Kang --- 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 db9d123815e..6a361bc3fa4 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)""); -- 2.11.4.GIT