Leak GDI Objects in Windows

Tools

Anti Patterns

DeleteObject with HICON

DeleteObject WIN32 API works all GDI objects except for icon (97559)

We must use DestroyIcon.

In tabe_view.cc(237)

http://src.chromium.org/viewvc/chrome/trunk/src/views/controls/table/table_view.cc?annotate=101329

810 HICON empty_icon = 811 IconUtil::CreateHICONFromSkBitmap(canvas.ExtractBitmap()); 812 ImageList_AddIcon(image_list, empty_icon); 813 ImageList_AddIcon(image_list, empty_icon); 814 DeleteObject(empty_icon);

Leak Screen DC aka GetDC(NULL)

GetDC(NULL) returns newly created screen DC. So, you must release it by using ReleaseDC. You may want to use ScopedGetDC (http://codesearch.google.com/#OAMlx_jo-ck/src/base/win/scoped_hdc.h)

I would like to draw in bitmap (https://crbug.com/98523)

In print_web_view_helper_win.cc(237)

http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/print_web_view_helper_win.cc?annotate=103082

235 // Page used alpha blend, but printer doesn't support it. Rewrite the

236 // metafile and flatten out the transparency.

237 HDC bitmap_dc = CreateCompatibleDC(GetDC(NULL));

238 if (!bitmap_dc)

Easy way to know screen DPI:

In chrome_content_utility_cline.cc(299)

http://src.chromium.org/viewvc/chrome/trunk/src/chrome/utility/chrome_content_utility_client.cc?annotate=101911

299 int screen_dpi = GetDeviceCaps(GetDC(NULL), LOGPIXELSX);

300 xform.eM11 = xform.eM22 =

301 static_cast<float>(screen_dpi) / static_cast<float>(render_dpi);

Play Enhanced Metafile Record More Than Once

Oops, some devices don't support alpha blending. We should do alpha blending by ourselves by using bitmap DC (https://crbug.com/98523)

Since, metafile records having GDI object creation command and stores into lpHandleTable of second parameter of EnhMetaFileProc.

In crhome/renderer/print_web_view_helper_win.cc(40-69)

http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/print_web_view_helper_win.cc?annotate=103082

40 // Play this command to the bitmap DC.

41 PlayEnhMetaFileRecord(*bitmap_dc, handle_table, record, num_objects);

...

68 // Play this command to the metafile DC.

69 PlayEnhMetaFileRecord(dc, handle_table, record, num_objects);

References