summaryrefslogtreecommitdiffstats
path: root/extensions/browser/extension_icon_placeholder.cc
diff options
context:
space:
mode:
authorrdevlin.cronin <rdevlin.cronin@chromium.org>2015-05-14 14:16:27 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-14 21:16:58 +0000
commita437dab3e6f188c53f452b35198b770b33a8aa96 (patch)
treece2564cf965c9d391060159e67623bdcfd5917ec /extensions/browser/extension_icon_placeholder.cc
parentb80d3de9f663b35a20860c311a475aef1b1774c8 (diff)
downloadchromium_src-a437dab3e6f188c53f452b35198b770b33a8aa96.zip
chromium_src-a437dab3e6f188c53f452b35198b770b33a8aa96.tar.gz
chromium_src-a437dab3e6f188c53f452b35198b770b33a8aa96.tar.bz2
[Extensions UI] Add a placeholder icon for extensions in the toolbar
Create a placeholder icon source for extensions that don't have an icon, so that they don't just look like puzzle pieces in the toolbar. To start, only use this in the toolbar, but the class is flexible enough that it could also be used, e.g., in the chrome://extensions page. BUG=486206 Review URL: https://codereview.chromium.org/1131443006 Cr-Commit-Position: refs/heads/master@{#329932}
Diffstat (limited to 'extensions/browser/extension_icon_placeholder.cc')
-rw-r--r--extensions/browser/extension_icon_placeholder.cc103
1 files changed, 103 insertions, 0 deletions
diff --git a/extensions/browser/extension_icon_placeholder.cc b/extensions/browser/extension_icon_placeholder.cc
new file mode 100644
index 0000000..fc37286
--- /dev/null
+++ b/extensions/browser/extension_icon_placeholder.cc
@@ -0,0 +1,103 @@
+// Copyright 2015 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 "extensions/browser/extension_icon_placeholder.h"
+
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "extensions/grit/extensions_browser_resources.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/codec/png_codec.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/image/canvas_image_source.h"
+#include "ui/gfx/image/image_skia.h"
+
+namespace extensions {
+
+namespace {
+
+// Returns the FontStyle to use for the given icon |size|.
+ui::ResourceBundle::FontStyle GetFontStyleForIconSize(
+ extension_misc::ExtensionIcons size) {
+ switch (size) {
+ case extension_misc::EXTENSION_ICON_INVALID:
+ case extension_misc::EXTENSION_ICON_BITTY:
+ return ui::ResourceBundle::SmallFont;
+ case extension_misc::EXTENSION_ICON_ACTION:
+ case extension_misc::EXTENSION_ICON_SMALLISH:
+ case extension_misc::EXTENSION_ICON_SMALL:
+ return ui::ResourceBundle::MediumFont;
+ case extension_misc::EXTENSION_ICON_MEDIUM:
+ case extension_misc::EXTENSION_ICON_LARGE:
+ case extension_misc::EXTENSION_ICON_EXTRA_LARGE:
+ case extension_misc::EXTENSION_ICON_GIGANTOR:
+ return ui::ResourceBundle::LargeFont;
+ }
+ NOTREACHED();
+ return ui::ResourceBundle::MediumFont;
+}
+
+// Returns the background image to use for the given icon |size|.
+gfx::Image GetBackgroundImageForIconSize(extension_misc::ExtensionIcons size) {
+ int resource_id = 0;
+ // Right now, we have resources for a 19x19 (action) and a 48x48 (extensions
+ // page icon). The implementation of the placeholder scales these correctly,
+ // so it's not a big deal to use these for other sizes, but if it's something
+ // that will be done frequently, we should probably make a devoted asset for
+ // that size.
+ switch (size) {
+ case extension_misc::EXTENSION_ICON_INVALID:
+ case extension_misc::EXTENSION_ICON_BITTY:
+ case extension_misc::EXTENSION_ICON_ACTION:
+ case extension_misc::EXTENSION_ICON_SMALLISH:
+ case extension_misc::EXTENSION_ICON_SMALL:
+ resource_id = IDR_EXTENSION_ACTION_PLAIN_BACKGROUND;
+ break;
+ case extension_misc::EXTENSION_ICON_MEDIUM:
+ case extension_misc::EXTENSION_ICON_LARGE:
+ case extension_misc::EXTENSION_ICON_EXTRA_LARGE:
+ case extension_misc::EXTENSION_ICON_GIGANTOR:
+ resource_id = IDR_EXTENSION_ICON_PLAIN_BACKGROUND;
+ break;
+ }
+ return ui::ResourceBundle::GetSharedInstance().GetImageNamed(resource_id);
+}
+
+} // namespace
+
+ExtensionIconPlaceholder::ExtensionIconPlaceholder(
+ extension_misc::ExtensionIcons size,
+ const std::string& letter)
+ : gfx::CanvasImageSource(gfx::Size(size, size), false),
+ icon_size_(size),
+ letter_(base::UTF8ToUTF16(letter.substr(0, 1))),
+ base_image_(GetBackgroundImageForIconSize(size)) {
+}
+
+ExtensionIconPlaceholder::~ExtensionIconPlaceholder() {
+}
+
+gfx::Image ExtensionIconPlaceholder::CreateImage(
+ extension_misc::ExtensionIcons size,
+ const std::string& name) {
+ return gfx::Image(gfx::ImageSkia(new ExtensionIconPlaceholder(size, name),
+ gfx::Size(size, size)));
+}
+
+void ExtensionIconPlaceholder::Draw(gfx::Canvas* canvas) {
+ // Draw the background image, correctly scaled.
+ canvas->DrawImageInt(*base_image_.ToImageSkia(), 0, 0,
+ base_image_.Size().width(), base_image_.Size().height(),
+ 0, 0, size().width(), size().height(), true);
+ gfx::Rect bounds(size().width(), size().height());
+ // Draw the letter on top.
+ canvas->DrawStringRectWithFlags(
+ letter_, ui::ResourceBundle::GetSharedInstance().GetFontList(
+ GetFontStyleForIconSize(icon_size_)),
+ SK_ColorWHITE, bounds, gfx::Canvas::TEXT_ALIGN_CENTER);
+}
+
+} // namespace extensions