summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_icon_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/extension_icon_manager.cc')
-rw-r--r--chrome/browser/extensions/extension_icon_manager.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_icon_manager.cc b/chrome/browser/extensions/extension_icon_manager.cc
new file mode 100644
index 0000000..1e3befc
--- /dev/null
+++ b/chrome/browser/extensions/extension_icon_manager.cc
@@ -0,0 +1,96 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/extension_icon_manager.h"
+
+#include "app/resource_bundle.h"
+#include "base/logging.h"
+#include "base/stl_util-inl.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_resource.h"
+#include "gfx/color_utils.h"
+#include "gfx/favicon_size.h"
+#include "gfx/skbitmap_operations.h"
+#include "gfx/size.h"
+#include "grit/theme_resources.h"
+#include "skia/ext/image_operations.h"
+
+ExtensionIconManager::ExtensionIconManager()
+ : ALLOW_THIS_IN_INITIALIZER_LIST(image_tracker_(this)),
+ monochrome_(false) {
+}
+
+void ExtensionIconManager::LoadIcon(Extension* extension) {
+ ExtensionResource icon_resource;
+ extension->GetIconPathAllowLargerSize(&icon_resource,
+ Extension::EXTENSION_ICON_BITTY);
+ if (!icon_resource.extension_root().empty()) {
+ image_tracker_.LoadImage(extension,
+ icon_resource,
+ gfx::Size(kFavIconSize, kFavIconSize),
+ ImageLoadingTracker::CACHE);
+ pending_icons_.insert(extension->id());
+ }
+}
+
+const SkBitmap& ExtensionIconManager::GetIcon(const std::string& extension_id) {
+ const SkBitmap* result = NULL;
+ if (ContainsKey(icons_, extension_id)) {
+ result = &icons_[extension_id];
+ } else {
+ EnsureDefaultIcon();
+ result = &default_icon_;
+ }
+ DCHECK(result);
+ DCHECK(result->width() == kFavIconSize);
+ DCHECK(result->height() == kFavIconSize);
+ return *result;
+}
+
+void ExtensionIconManager::RemoveIcon(const std::string& extension_id) {
+ icons_.erase(extension_id);
+ pending_icons_.erase(extension_id);
+}
+
+void ExtensionIconManager::OnImageLoaded(SkBitmap* image,
+ ExtensionResource resource,
+ int index) {
+ if (!image)
+ return;
+
+ const std::string extension_id = resource.extension_id();
+
+ // We may have removed the icon while waiting for it to load. In that case,
+ // do nothing.
+ if (!ContainsKey(pending_icons_, extension_id))
+ return;
+
+ pending_icons_.erase(extension_id);
+ icons_[extension_id] = ApplyTransforms(*image);
+}
+
+void ExtensionIconManager::EnsureDefaultIcon() {
+ if (default_icon_.empty()) {
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ SkBitmap* src = rb.GetBitmapNamed(IDR_EXTENSIONS_SECTION);
+ default_icon_ = ApplyTransforms(*src);
+ }
+}
+
+SkBitmap ExtensionIconManager::ApplyTransforms(const SkBitmap& source) {
+ SkBitmap result = source;
+
+ if (result.width() != kFavIconSize || result.height() != kFavIconSize) {
+ result = skia::ImageOperations::Resize(
+ result, skia::ImageOperations::RESIZE_LANCZOS3,
+ kFavIconSize, kFavIconSize);
+ }
+
+ if (monochrome_) {
+ color_utils::HSL shift = {-1, 0, 0.6};
+ result = SkBitmapOperations::CreateHSLShiftedBitmap(result, shift);
+ }
+
+ return result;
+}