From: Changping Yu Subject: [PATCH V2 2/2] gdiplus: keep temporary dc from being released. Message-Id: Date: Mon, 22 Jun 2020 20:02:56 +0800 From 0e5574a6b90c2336c7b200793ed21e5845c375a5 Mon Sep 17 00:00:00 2001 From: Changping Yu Date: Mon, 22 Jun 2020 19:55:12 +0800 Subject: [PATCH V2 2/2] gdiplus: keep temporary dc from being released. v2: add more tests. When quick call GdipGetDC then call GdipReleaseDC, now call GdipCreateFontFromLogfontA need the front dc, but wine will delete the temporary dc. Signed-off-by: Changping Yu --- dlls/gdiplus/graphics.c | 8 ++++++-- dlls/gdiplus/tests/graphics.c | 1 - 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 6619be9b58..3b36c50346 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -2548,6 +2548,9 @@ GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics) DeleteObject(graphics->gdi_clip); + if(graphics->temp_hdc) + DeleteDC(graphics->temp_hdc); + /* Native returns ObjectBusy on the second free, instead of crashing as we'd * do otherwise, but we can't have that in the test suite because it means * accessing freed memory. */ @@ -6675,6 +6678,9 @@ GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc) SelectObject(temp_hdc, hbitmap); graphics->temp_hbitmap = hbitmap; + if(graphics->temp_hdc) + DeleteDC(graphics->temp_hdc); + *hdc = graphics->temp_hdc = temp_hdc; } else @@ -6723,9 +6729,7 @@ GpStatus WINGDIPAPI GdipReleaseDC(GpGraphics *graphics, HDC hdc) graphics->temp_hbitmap_width * 4, PixelFormat32bppARGB); /* Clean up. */ - DeleteDC(graphics->temp_hdc); DeleteObject(graphics->temp_hbitmap); - graphics->temp_hdc = NULL; graphics->temp_hbitmap = NULL; } else if (hdc != graphics->hdc) diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index 2b47171d96..63b8d4c738 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -1728,7 +1728,6 @@ static void test_Get_Release_DC(void) expect(Ok, status); /* try to use temp dc released on image */ status = GdipCreateFontFromLogfontA(retdc, &logfont, &fnt); - todo_wine expect(Ok, status); status = GdipDisposeImage((GpImage*)bm); -- 2.26.2.windows.1