| // Copyright 2011 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/win/app_icon.h" |
| |
| #include "chrome/common/chrome_constants.h" |
| #include "chrome/install_static/install_details.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| #include "ui/gfx/geometry/size.h" |
| #include "ui/gfx/icon_util.h" |
| #include "ui/gfx/image/image_family.h" |
| |
| namespace { |
| |
| // Returns the resource id of the application icon. |
| int GetAppIconResourceId() { |
| return install_static::InstallDetails::Get().app_icon_resource_id(); |
| } |
| |
| } // namespace |
| |
| HICON GetAppIcon() { |
| // TODO(mgiuca): Use GetAppIconImageFamily/CreateExact instead of LoadIcon, to |
| // get correct scaling. (See http://crbug.com/551256) |
| const int icon_id = GetAppIconResourceId(); |
| // HICON returned from LoadIcon do not leak and do not have to be destroyed. |
| return LoadIcon(GetModuleHandle(chrome::kBrowserResourcesDll), |
| MAKEINTRESOURCE(icon_id)); |
| } |
| |
| HICON GetSmallAppIcon() { |
| // TODO(mgiuca): Use GetAppIconImageFamily/CreateExact instead of LoadIcon, to |
| // get correct scaling. (See http://crbug.com/551256) |
| const int icon_id = GetAppIconResourceId(); |
| gfx::Size size = GetSmallAppIconSize(); |
| // HICON returned from LoadImage must be released using DestroyIcon. |
| return static_cast<HICON>(LoadImage( |
| GetModuleHandle(chrome::kBrowserResourcesDll), MAKEINTRESOURCE(icon_id), |
| IMAGE_ICON, size.width(), size.height(), LR_DEFAULTCOLOR | LR_SHARED)); |
| } |
| |
| gfx::Size GetAppIconSize() { |
| return gfx::Size(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)); |
| } |
| |
| gfx::Size GetSmallAppIconSize() { |
| return gfx::Size(GetSystemMetrics(SM_CXSMICON), |
| GetSystemMetrics(SM_CYSMICON)); |
| } |
| |
| std::unique_ptr<gfx::ImageFamily> GetAppIconImageFamily() { |
| const int icon_id = GetAppIconResourceId(); |
| // Get the icon from chrome.dll (not chrome.exe, which has different resource |
| // IDs). If chrome.dll is not loaded, we are probably in a unit test, so fall |
| // back to getting the icon from the current module (assuming it is |
| // unit_tests.exe, that has the same resource IDs as chrome.dll). |
| HMODULE module = GetModuleHandle(chrome::kBrowserResourcesDll); |
| if (!module) |
| module = GetModuleHandle(nullptr); |
| DCHECK(module); |
| |
| return IconUtil::CreateImageFamilyFromIconResource(module, icon_id); |
| } |