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

Unified Diff: chrome/browser/ui/views/browser_action_view.cc

Issue 10827191: Convert extension action icons code to use ImageSkia instead of SkBitmap (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nits Created 8 years, 4 months 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
Index: chrome/browser/ui/views/browser_action_view.cc
diff --git a/chrome/browser/ui/views/browser_action_view.cc b/chrome/browser/ui/views/browser_action_view.cc
index dd2eeb776233b68c577f19c503deb54bac4d821f..ce54c0f34b8c0f75bfea813d304b82e14dc6de78 100644
--- a/chrome/browser/ui/views/browser_action_view.cc
+++ b/chrome/browser/ui/views/browser_action_view.cc
@@ -20,7 +20,10 @@
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
-#include "ui/gfx/skbitmap_operations.h"
+#include "ui/gfx/image/canvas_image_source.h"
+#include "ui/gfx/image/image_skia.h"
+#include "ui/gfx/image/image_skia_operations.h"
+#include "ui/gfx/image/image_skia_source.h"
#include "ui/views/controls/menu/menu_model_adapter.h"
#include "ui/views/controls/menu/menu_runner.h"
@@ -28,16 +31,130 @@ using extensions::Extension;
namespace {
-// Return a more transparent |image|, with 25% of its original opacity.
-SkBitmap MakeTransparent(const SkBitmap& image) {
- SkBitmap alpha;
- alpha.setConfig(SkBitmap::kARGB_8888_Config, image.width(), image.height());
- alpha.allocPixels();
- alpha.eraseColor(SkColorSetARGB(64, 0, 0, 0));
+// CanvasImageSource for creating an browser action icon image with the provided
+// background.
+class IconWithBackgroundImageSource : public gfx::CanvasImageSource {
+ public:
+ IconWithBackgroundImageSource(const gfx::ImageSkia& icon,
+ const gfx::ImageSkia& background)
+ : gfx::CanvasImageSource(background.size(), false),
+ icon_(icon),
+ background_(background) {
+ }
+
+ private:
+ virtual ~IconWithBackgroundImageSource() {}
+
+ virtual void Draw(gfx::Canvas* canvas) OVERRIDE {
+ SkPaint paint;
+ paint.setXfermode(SkXfermode::Create(SkXfermode::kSrcOver_Mode));
+
+ // We center the icon on the background.
+ canvas->DrawImageInt(icon_,
+ (background_.width() - icon_.width()) / 2,
+ (background_.height() - icon_.height()) / 2,
+ paint);
+ }
+
+ virtual gfx::ImageSkiaRep GetImageForScale(
+ ui::ScaleFactor scale_factor) OVERRIDE {
+ gfx::Canvas canvas(background_.GetRepresentation(scale_factor), is_opaque_);
+ Draw(&canvas);
+ return canvas.ExtractImageRep();
pkotwicz 2012/08/07 22:31:22 A couple comments. It feels like we could introduc
tbarzic 2012/08/08 02:09:29 Done.
+ }
+
+ gfx::ImageSkia icon_;
+ gfx::ImageSkia background_;
+};
+
+// ImageSource for creating an image to be used as alpha in CreateMaskedImage
+// image skia operation while creating transparent image.
+class TransparentAlphaImageSource : public gfx::ImageSkiaSource {
+ public:
+ TransparentAlphaImageSource(size_t width, size_t height)
+ : width_(width),
+ height_(height) {
+ }
+
pkotwicz 2012/08/07 22:31:22 Nit: destructor
tbarzic 2012/08/08 02:09:29 Done.
+ private:
+ virtual ~TransparentAlphaImageSource() {}
+
+ virtual gfx::ImageSkiaRep GetImageForScale(
+ ui::ScaleFactor scale_factor) OVERRIDE {
+ SkBitmap alpha;
+ const float scale = ui::GetScaleFactorScale(scale_factor);
+ alpha.setConfig(SkBitmap::kARGB_8888_Config,
+ static_cast<int>(width_ * scale),
+ static_cast<int>(height_ * scale));
+ alpha.allocPixels();
+ alpha.eraseColor(SkColorSetARGB(64, 0, 0, 0));
+ return gfx::ImageSkiaRep(alpha, scale_factor);
+ }
- return SkBitmapOperations::CreateMaskedBitmap(image, alpha);
+ // Icon width in DIP.
+ size_t width_;
+ // Icon height in DIP.
+ size_t height_;
+};
+
+// Return a more transparent |image|, with 25% of its original opacity.
+gfx::ImageSkia MakeTransparent(const gfx::ImageSkia& image) {
+ gfx::ImageSkia alpha(
+ new TransparentAlphaImageSource(image.width(), image.height()),
+ gfx::Size(image.width(), image.height()));
+ return gfx::ImageSkiaOperations::CreateMaskedImage(image, alpha);
}
+// CanvasImageSource for creating browser action icon with a badge.
+class ActionBadgeImageSource : public gfx::CanvasImageSource {
pkotwicz 2012/08/07 22:31:22 Can you move this to new function ExtensionAction:
tbarzic 2012/08/08 02:09:29 Done.
+ public:
+ ActionBadgeImageSource(gfx::ImageSkia icon,
+ bool button_enabled,
+ const std::string& text,
+ const SkColor& text_color,
+ const SkColor& background_color)
+ : gfx::CanvasImageSource(icon.size(), false),
+ icon_(icon),
+ button_enabled_(button_enabled),
+ text_(text),
+ text_color_(text_color),
+ background_color_(background_color) {
+ }
+
pkotwicz 2012/08/07 22:31:22 Nit: destructor
tbarzic 2012/08/08 02:09:29 Done.
+ private:
+ virtual ~ActionBadgeImageSource() {}
+
+ virtual void Draw(gfx::Canvas* canvas) OVERRIDE {
+ // Draw a badge on the provided browser action icon's canvas.
+ gfx::Rect bounds(size_.width(),
+ size_.height() + ToolbarView::kVertSpacing);
+ ExtensionAction::DoPaintBadge(canvas, bounds, text_, text_color_,
+ background_color_, size_.width());
+ }
+
+ virtual gfx::ImageSkiaRep GetImageForScale(
+ ui::ScaleFactor scale_factor) OVERRIDE {
+ gfx::ImageSkia icon = icon_;
+ if (!button_enabled_)
+ icon = MakeTransparent(icon);
+
+ gfx::Canvas canvas(icon.GetRepresentation(scale_factor), is_opaque_);
+ Draw(&canvas);
+ return canvas.ExtractImageRep();
+ }
+
+ // Browser action icon image.
+ gfx::ImageSkia icon_;
+ // Whether the browser actions button is enabled.
+ bool button_enabled_;
+ // Text to be displayed on the badge.
+ std::string text_;
+ // Color of badge text.
+ SkColor text_color_;
+ // Color of the badge.
+ SkColor background_color_;
+};
+
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -148,7 +265,8 @@ void BrowserActionButton::ShowContextMenuForView(View* source,
void BrowserActionButton::OnImageLoaded(const gfx::Image& image,
const std::string& extension_id,
int index) {
- browser_action_->CacheIcon(browser_action_->default_icon_path(), image);
+ browser_action_->CacheIcon(browser_action_->default_icon_path(),
+ *image.ToImageSkia());
// Call back to UpdateState() because a more specific icon might have been set
// while the load was outstanding.
@@ -168,39 +286,24 @@ void BrowserActionButton::UpdateState() {
views::CustomButton::BS_NORMAL);
}
- SkBitmap icon(*browser_action()->GetIcon(tab_id).ToSkBitmap());
+ gfx::ImageSkia icon(browser_action()->GetIcon(tab_id));
+
if (!icon.isNull()) {
if (!browser_action()->GetIsVisible(tab_id))
icon = MakeTransparent(icon);
- SkPaint paint;
- paint.setXfermode(SkXfermode::Create(SkXfermode::kSrcOver_Mode));
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- SkBitmap bg;
- rb.GetBitmapNamed(IDR_BROWSER_ACTION)->copyTo(&bg,
- SkBitmap::kARGB_8888_Config);
- SkCanvas bg_canvas(bg);
- bg_canvas.drawBitmap(icon, SkIntToScalar((bg.width() - icon.width()) / 2),
- SkIntToScalar((bg.height() - icon.height()) / 2), &paint);
- SetIcon(bg);
-
- SkBitmap bg_h;
- rb.GetBitmapNamed(IDR_BROWSER_ACTION_H)->copyTo(&bg_h,
- SkBitmap::kARGB_8888_Config);
- SkCanvas bg_h_canvas(bg_h);
- bg_h_canvas.drawBitmap(icon,
- SkIntToScalar((bg_h.width() - icon.width()) / 2),
- SkIntToScalar((bg_h.height() - icon.height()) / 2), &paint);
- SetHoverIcon(bg_h);
-
- SkBitmap bg_p;
- rb.GetBitmapNamed(IDR_BROWSER_ACTION_P)->copyTo(&bg_p,
- SkBitmap::kARGB_8888_Config);
- SkCanvas bg_p_canvas(bg_p);
- bg_p_canvas.drawBitmap(icon,
- SkIntToScalar((bg_p.width() - icon.width()) / 2),
- SkIntToScalar((bg_p.height() - icon.height()) / 2), &paint);
- SetPushedIcon(bg_p);
+ gfx::ImageSkia bg = *rb.GetImageSkiaNamed(IDR_BROWSER_ACTION);
+ SetIcon(gfx::ImageSkia(new IconWithBackgroundImageSource(icon, bg),
+ bg.size()));
+
+ gfx::ImageSkia bg_h = *rb.GetImageSkiaNamed(IDR_BROWSER_ACTION_H);
+ SetHoverIcon(gfx::ImageSkia(new IconWithBackgroundImageSource(icon, bg_h),
+ bg_h.size()));
+
+ gfx::ImageSkia bg_p = *rb.GetImageSkiaNamed(IDR_BROWSER_ACTION_P);
+ SetPushedIcon(gfx::ImageSkia(new IconWithBackgroundImageSource(icon, bg_p),
+ bg_p.size()));
}
// If the browser action name is empty, show the extension name instead.
@@ -363,7 +466,6 @@ void BrowserActionButton::MaybeUnregisterExtensionCommand(bool only_if_active) {
}
}
-
////////////////////////////////////////////////////////////////////////////////
// BrowserActionView
@@ -381,25 +483,23 @@ BrowserActionView::~BrowserActionView() {
button_->Destroy();
}
-gfx::Canvas* BrowserActionView::GetIconWithBadge() {
+gfx::ImageSkia BrowserActionView::GetIconWithBadge() {
int tab_id = panel_->GetCurrentTabId();
- SkBitmap icon = *button_->extension()->browser_action()->GetIcon(
- tab_id).ToSkBitmap();
+ const ExtensionAction* action = button_->extension()->browser_action();
- // Dim the icon if our button is disabled.
- if (!button_->IsEnabled(tab_id))
- icon = MakeTransparent(icon);
+ gfx::ImageSkia icon = action->GetIcon(tab_id);
- gfx::Canvas* canvas =
- new gfx::Canvas(gfx::ImageSkiaRep(icon, ui::SCALE_FACTOR_100P), false);
-
- if (tab_id >= 0) {
- gfx::Rect bounds(icon.width(), icon.height() + ToolbarView::kVertSpacing);
- button_->extension()->browser_action()->PaintBadge(canvas, bounds, tab_id);
- }
-
- return canvas;
+ if (tab_id < 0)
+ return icon;
+
+ return gfx::ImageSkia(
+ new ActionBadgeImageSource(action->GetIcon(tab_id),
+ button_->IsEnabled(tab_id),
+ action->GetBadgeText(tab_id),
+ action->GetBadgeTextColor(tab_id),
+ action->GetBadgeBackgroundColor(tab_id)),
+ icon.size());
}
void BrowserActionView::Layout() {

Powered by Google App Engine
This is Rietveld 408576698