From 5e9fe048771fd3b5304e02df9f468166d0e3c4a8 Mon Sep 17 00:00:00 2001 From: Qixing Cao Date: Sun, 10 Jul 2022 19:23:55 +0800 Subject: [PATCH] [Windows] Fix GDI resource leaks in the software fallback path --- shell/platform/windows/flutter_window_win32.cc | 3 ++- .../windows/flutter_window_win32_unittests.cc | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/shell/platform/windows/flutter_window_win32.cc b/shell/platform/windows/flutter_window_win32.cc index 66e528cb9c395..a512fc7bd6996 100644 --- a/shell/platform/windows/flutter_window_win32.cc +++ b/shell/platform/windows/flutter_window_win32.cc @@ -249,7 +249,7 @@ void FlutterWindowWin32::OnResetImeComposing() { bool FlutterWindowWin32::OnBitmapSurfaceUpdated(const void* allocation, size_t row_bytes, size_t height) { - HDC dc = ::GetDC(std::get(GetRenderTarget())); + HDC dc = ::GetDC(GetWindowHandle()); BITMAPINFO bmi; memset(&bmi, 0, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); @@ -261,6 +261,7 @@ bool FlutterWindowWin32::OnBitmapSurfaceUpdated(const void* allocation, bmi.bmiHeader.biSizeImage = 0; int ret = SetDIBitsToDevice(dc, 0, 0, row_bytes / 4, height, 0, 0, 0, height, allocation, &bmi, DIB_RGB_COLORS); + ::ReleaseDC(GetWindowHandle(), dc); return ret != 0; } diff --git a/shell/platform/windows/flutter_window_win32_unittests.cc b/shell/platform/windows/flutter_window_win32_unittests.cc index 280209ab59b9e..a429bf04ba00c 100644 --- a/shell/platform/windows/flutter_window_win32_unittests.cc +++ b/shell/platform/windows/flutter_window_win32_unittests.cc @@ -211,6 +211,20 @@ TEST(FlutterWindowWin32Test, CreateDestroy) { ASSERT_TRUE(TRUE); } +TEST(FlutterWindowWin32Test, OnBitmapSurfaceUpdated) { + FlutterWindowWin32 win32window(100, 100); + int old_handle_count = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS); + + constexpr size_t row_bytes = 100 * 4; + constexpr size_t height = 100; + std::array allocation; + win32window.OnBitmapSurfaceUpdated(allocation.data(), row_bytes, height); + + int new_handle_count = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS); + // Check GDI resources leak + EXPECT_EQ(old_handle_count, new_handle_count); +} + // Tests that composing rect updates are transformed from Flutter logical // coordinates to device coordinates and passed to the text input manager // when the DPI scale is 100% (96 DPI).