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

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: Rebase Created 5 years 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
« no previous file with comments | « ui/gfx/icon_util.h ('k') | ui/gfx/icon_util_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/icon_util.cc
diff --git a/ui/gfx/icon_util.cc b/ui/gfx/icon_util.cc
index b75b0c2fde5abd98641737cff1f40dfca0cdde2c..1497a2908391b73e700fd485032e18d19c48cdd9 100644
--- a/ui/gfx/icon_util.cc
+++ b/ui/gfx/icon_util.cc
@@ -161,14 +161,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
@@ -186,7 +187,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);
@@ -225,7 +226,7 @@ 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;
@@ -269,12 +270,11 @@ scoped_ptr<gfx::ImageFamily> IconUtil::CreateImageFamilyFromIconResource(
continue;
// For everything except the Vista+ 256x256 icons, use |LoadImage()|.
- HICON icon_handle = static_cast<HICON>(LoadImage(
+ base::win::ScopedHICON icon_handle(static_cast<HICON>(LoadImage(
module, MAKEINTRESOURCE(resource_id), IMAGE_ICON, entry->bWidth,
- entry->bHeight, LR_DEFAULTCOLOR | LR_DEFAULTSIZE));
+ entry->bHeight, LR_DEFAULTCOLOR | LR_DEFAULTSIZE)));
scoped_ptr<SkBitmap> bitmap(
- IconUtil::CreateSkBitmapFromHICON(icon_handle));
- DestroyIcon(icon_handle);
+ IconUtil::CreateSkBitmapFromHICON(icon_handle.get()));
result->Add(gfx::Image::CreateFrom1xBitmap(*bitmap));
} else {
// 256x256 icons are stored with width and height set to 0.
@@ -313,10 +313,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(),
@@ -334,7 +334,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,
@@ -343,7 +343,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);
@@ -357,10 +357,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));
}
SkBitmap IconUtil::CreateSkBitmapFromHICONHelper(HICON icon,
« no previous file with comments | « ui/gfx/icon_util.h ('k') | ui/gfx/icon_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698