Chromium Code Reviews| 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..193ca763b6a7e747608b336327b02055a22a7a23 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,42 @@ 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 which creates a partially transparent image mask. |
| +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. |
| + const int width_; |
| + // Icon height in DIP. |
| + const int 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); |
|
Jeffrey Yasskin
2012/08/09 21:39:04
Why do a 2-step transformation instead of directly
tbarzic
2012/08/10 06:24:08
Done. moved to image_skia_operations
|
| } |
| } // namespace |
| @@ -168,39 +197,23 @@ void BrowserActionButton::UpdateState() { |
| views::CustomButton::BS_NORMAL); |
| } |
| - SkBitmap icon(*browser_action()->GetIcon(tab_id).ToSkBitmap()); |
| + gfx::ImageSkia icon = *browser_action()->GetIcon(tab_id).ToImageSkia(); |
| + |
| 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 +376,6 @@ void BrowserActionButton::MaybeUnregisterExtensionCommand(bool only_if_active) { |
| } |
| } |
| - |
| //////////////////////////////////////////////////////////////////////////////// |
| // BrowserActionView |
| @@ -381,25 +393,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).ToImageSkia(); |
| 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() { |