Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(875)

Unified Diff: ui/gfx/icon_util.cc

Issue 1406403007: Eliminate HICON leaks caused by creating icons from bitmap image. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use ScopedHICON instead of HICON. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/gfx/icon_util.cc
diff --git a/ui/gfx/icon_util.cc b/ui/gfx/icon_util.cc
index f9758d39f67626b02bf8a1f470ff8338452ed793..11a292256fe8e906b7e53b7b68f43b11a1d7e5e4 100644
--- a/ui/gfx/icon_util.cc
+++ b/ui/gfx/icon_util.cc
@@ -163,14 +163,15 @@ const int IconUtil::kIconDimensions[] = {
const size_t IconUtil::kNumIconDimensions = arraysize(kIconDimensions);
const size_t IconUtil::kNumIconDimensionsUpToMediumSize = 9;
-HICON IconUtil::CreateHICONFromSkBitmap(const SkBitmap& bitmap) {
+base::win::ScopedHICON IconUtil::CreateHICONFromSkBitmap(
+ const SkBitmap& bitmap) {
// Only 32 bit ARGB bitmaps are supported. We also try to perform as many
// validations as we can on the bitmap.
SkAutoLockPixels bitmap_lock(bitmap);
if ((bitmap.colorType() != kN32_SkColorType) ||
(bitmap.width() <= 0) || (bitmap.height() <= 0) ||
(bitmap.getPixels() == NULL))
- return NULL;
+ return base::win::ScopedHICON();
// We start by creating a DIB which we'll use later on in order to create
// the HICON. We use BITMAPV5HEADER since the bitmap we are about to convert
@@ -188,7 +189,7 @@ HICON IconUtil::CreateHICONFromSkBitmap(const SkBitmap& bitmap) {
DIB_RGB_COLORS, &bits, NULL, 0);
}
if (!dib || !bits)
- return NULL;
+ return base::win::ScopedHICON();
memcpy(bits, bitmap.getPixels(), bitmap.width() * bitmap.height() * 4);
@@ -227,10 +228,10 @@ HICON IconUtil::CreateHICONFromSkBitmap(const SkBitmap& bitmap) {
icon_info.yHotspot = 0;
icon_info.hbmMask = mono_bitmap;
icon_info.hbmColor = dib;
- HICON icon = ::CreateIconIndirect(&icon_info);
+ base::win::ScopedHICON icon(CreateIconIndirect(&icon_info));
::DeleteObject(dib);
::DeleteObject(mono_bitmap);
- return icon;
+ return icon.Pass();
}
SkBitmap* IconUtil::CreateSkBitmapFromHICON(HICON icon, const gfx::Size& s) {
@@ -252,12 +253,11 @@ scoped_ptr<SkBitmap> IconUtil::CreateSkBitmapFromIconResource(HMODULE module,
// For everything except the Vista+ 256x256 icons, use |LoadImage()|.
if (size != kLargeIconSize) {
- HICON icon_handle =
+ base::win::ScopedHICON icon(
static_cast<HICON>(LoadImage(module, MAKEINTRESOURCE(resource_id),
IMAGE_ICON, size, size,
- LR_DEFAULTCOLOR | LR_DEFAULTSIZE));
- scoped_ptr<SkBitmap> bitmap(IconUtil::CreateSkBitmapFromHICON(icon_handle));
- DestroyIcon(icon_handle);
+ LR_DEFAULTCOLOR | LR_DEFAULTSIZE)));
+ scoped_ptr<SkBitmap> bitmap(IconUtil::CreateSkBitmapFromHICON(icon.get()));
grt (UTC plus 2) 2015/11/10 16:44:43 return make_scoped_ptr(CreateSkBitmapFromHICON(ico
return bitmap.Pass();
}
@@ -319,10 +319,10 @@ SkBitmap* IconUtil::CreateSkBitmapFromHICON(HICON icon) {
return new SkBitmap(CreateSkBitmapFromHICONHelper(icon, icon_size));
}
-HICON IconUtil::CreateCursorFromDIB(const gfx::Size& icon_size,
- const gfx::Point& hotspot,
- const void* dib_bits,
- size_t dib_size) {
+base::win::ScopedHICON IconUtil::CreateCursorFromDIB(const gfx::Size& icon_size,
+ const gfx::Point& hotspot,
+ const void* dib_bits,
+ size_t dib_size) {
BITMAPINFO icon_bitmap_info = {};
gfx::CreateBitmapHeader(
icon_size.width(),
@@ -340,7 +340,7 @@ HICON IconUtil::CreateCursorFromDIB(const gfx::Size& icon_size,
0));
if (dib_size > 0) {
SetDIBits(0,
- bitmap_handle,
+ bitmap_handle.get(),
0,
icon_size.height(),
dib_bits,
@@ -349,7 +349,7 @@ HICON IconUtil::CreateCursorFromDIB(const gfx::Size& icon_size,
}
HBITMAP old_bitmap = reinterpret_cast<HBITMAP>(
- SelectObject(working_dc.Get(), bitmap_handle));
+ SelectObject(working_dc.Get(), bitmap_handle.get()));
SetBkMode(working_dc.Get(), TRANSPARENT);
SelectObject(working_dc.Get(), old_bitmap);
@@ -363,10 +363,10 @@ HICON IconUtil::CreateCursorFromDIB(const gfx::Size& icon_size,
ii.fIcon = FALSE;
ii.xHotspot = hotspot.x();
ii.yHotspot = hotspot.y();
- ii.hbmMask = mask;
- ii.hbmColor = bitmap_handle;
+ ii.hbmMask = mask.get();
+ ii.hbmColor = bitmap_handle.get();
- return CreateIconIndirect(&ii);
+ return base::win::ScopedHICON(CreateIconIndirect(&ii)).Pass();
grt (UTC plus 2) 2015/11/10 16:44:43 can you remove .Pass() here?
}
SkBitmap IconUtil::CreateSkBitmapFromHICONHelper(HICON icon,

Powered by Google App Engine
This is Rietveld 408576698