This source file includes following definitions.
- SetOverlayIcon
- DrawTaskbarDecoration
#include "chrome/browser/ui/views/frame/taskbar_decorator.h"
#include <shobjidl.h>
#include "base/bind.h"
#include "base/location.h"
#include "base/threading/worker_pool.h"
#include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_comptr.h"
#include "base/win/scoped_gdi_object.h"
#include "base/win/windows_version.h"
#include "chrome/browser/profiles/profile_info_util.h"
#include "chrome/browser/ui/host_desktop.h"
#include "skia/ext/image_operations.h"
#include "skia/ext/platform_canvas.h"
#include "third_party/skia/include/core/SkRect.h"
#include "ui/gfx/icon_util.h"
#include "ui/gfx/image/image.h"
#include "ui/views/win/hwnd_util.h"
namespace chrome {
namespace {
void SetOverlayIcon(HWND hwnd, scoped_ptr<SkBitmap> bitmap) {
base::win::ScopedCOMInitializer com_initializer;
base::win::ScopedComPtr<ITaskbarList3> taskbar;
HRESULT result = taskbar.CreateInstance(CLSID_TaskbarList, NULL,
CLSCTX_INPROC_SERVER);
if (FAILED(result) || FAILED(taskbar->HrInit()))
return;
base::win::ScopedGDIObject<HICON> icon;
if (bitmap.get()) {
const SkBitmap* source_bitmap = NULL;
SkBitmap squarer_bitmap;
if ((bitmap->width() == profiles::kAvatarIconWidth) &&
(bitmap->height() == profiles::kAvatarIconHeight)) {
int x = 2;
bitmap->extractSubset(&squarer_bitmap, SkIRect::MakeXYWH(x, 0,
profiles::kAvatarIconWidth - x * 2, profiles::kAvatarIconHeight));
source_bitmap = &squarer_bitmap;
} else {
source_bitmap = bitmap.get();
}
const size_t kOverlayIconSize = 16;
size_t resized_height =
source_bitmap->height() * kOverlayIconSize / source_bitmap->width();
DCHECK_GE(kOverlayIconSize, resized_height);
SkBitmap sk_icon = skia::ImageOperations::Resize(
*source_bitmap,
skia::ImageOperations::RESIZE_LANCZOS3,
kOverlayIconSize, resized_height);
SkBitmap offscreen_bitmap;
offscreen_bitmap.allocN32Pixels(kOverlayIconSize, kOverlayIconSize);
SkCanvas offscreen_canvas(offscreen_bitmap);
offscreen_canvas.clear(SK_ColorTRANSPARENT);
offscreen_canvas.drawBitmap(sk_icon, 0, kOverlayIconSize - resized_height);
icon.Set(IconUtil::CreateHICONFromSkBitmap(offscreen_bitmap));
if (!icon.Get())
return;
}
taskbar->SetOverlayIcon(hwnd, icon, L"");
}
}
void DrawTaskbarDecoration(gfx::NativeWindow window, const gfx::Image* image) {
if (base::win::GetVersion() < base::win::VERSION_WIN7 ||
chrome::GetHostDesktopTypeForNativeWindow(window) !=
chrome::HOST_DESKTOP_TYPE_NATIVE)
return;
HWND hwnd = views::HWNDForNativeWindow(window);
if (!::IsWindowVisible(hwnd))
return;
scoped_ptr<SkBitmap> bitmap(
image ? new SkBitmap(*image->ToSkBitmap()) : NULL);
base::WorkerPool::PostTask(
FROM_HERE, base::Bind(&SetOverlayIcon, hwnd, Passed(&bitmap)), true);
}
}