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

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: some 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..f1ca5facca5d6f089f0e088375bb385413d44317 100644
--- a/chrome/browser/ui/views/browser_action_view.cc
+++ b/chrome/browser/ui/views/browser_action_view.cc
@@ -19,8 +19,9 @@
#include "ui/base/accessibility/accessible_view_state.h"
#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/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,14 +29,43 @@ 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));
+// ImageSource for creating an image to be used as alpha in CreateMaskedImage
+// image skia operation while creating transparent image.
pkotwicz 2012/08/08 15:58:50 Nit: How about "ImageSource which creates a partia
tbarzic 2012/08/08 18:53:51 Done.
+class TransparencyMaskImageSource : public gfx::ImageSkiaSource {
+ public:
+ explicit TransparencyMaskImageSource(const gfx::Size& size)
+ : width_(size.width()),
+ height_(size.height()) {
+ }
+
+ virtual ~TransparencyMaskImageSource() {}
+
+ private:
+ 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);
+ }
+
+ // Icon width in DIP.
+ size_t width_;
sky 2012/08/08 16:55:45 gfx::Size uses int, not size_t. Also, make these c
tbarzic 2012/08/08 18:53:51 Done.
+ // Icon height in DIP.
+ size_t height_;
- return SkBitmapOperations::CreateMaskedBitmap(image, alpha);
+ DISALLOW_COPY_AND_ASSIGN(TransparencyMaskImageSource);
+};
+
+// Return a more transparent |image|, with 25% of its original opacity.
+gfx::ImageSkia MakeTransparent(const gfx::ImageSkia& image) {
+ gfx::ImageSkia alpha(new TransparencyMaskImageSource(image.size()),
+ image.size());
+ return gfx::ImageSkiaOperations::CreateMaskedImage(image, alpha);
}
} // namespace
@@ -148,7 +178,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 +199,23 @@ 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::ImageSkiaOperations::CreateSuperimposedImage(bg, icon));
+
+ gfx::ImageSkia bg_h = *rb.GetImageSkiaNamed(IDR_BROWSER_ACTION_H);
+ SetHoverIcon(gfx::ImageSkiaOperations::CreateSuperimposedImage(bg_h, icon));
+
+ gfx::ImageSkia bg_p = *rb.GetImageSkiaNamed(IDR_BROWSER_ACTION_P);
+ SetPushedIcon(
+ gfx::ImageSkiaOperations::CreateSuperimposedImage(bg_p, icon));
}
// If the browser action name is empty, show the extension name instead.
@@ -363,7 +378,6 @@ void BrowserActionButton::MaybeUnregisterExtensionCommand(bool only_if_active) {
}
}
-
////////////////////////////////////////////////////////////////////////////////
// BrowserActionView
@@ -381,25 +395,15 @@ 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();
-
- // Dim the icon if our button is disabled.
+ const ExtensionAction* action = button_->extension()->browser_action();
+ gfx::Size spacing(0, ToolbarView::kVertSpacing);
+ gfx::ImageSkia icon = action->GetIcon(tab_id);
if (!button_->IsEnabled(tab_id))
icon = MakeTransparent(icon);
-
- 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;
+ return action->GetIconWithBadge(icon, tab_id, spacing);
}
void BrowserActionView::Layout() {

Powered by Google App Engine
This is Rietveld 408576698