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() { |