Index: chrome/browser/ui/views/wrench_menu.cc |
diff --git a/chrome/browser/ui/views/wrench_menu.cc b/chrome/browser/ui/views/wrench_menu.cc |
index fa5a5d0c4c2360c9018b505ae6405f9845828081..0f3cc71771a656bd88773f9419946b6b8dcd77d4 100644 |
--- a/chrome/browser/ui/views/wrench_menu.cc |
+++ b/chrome/browser/ui/views/wrench_menu.cc |
@@ -36,6 +36,7 @@ |
#include "ui/base/layout.h" |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/gfx/canvas.h" |
+#include "ui/gfx/image/canvas_image_source.h" |
#include "ui/gfx/skia_util.h" |
#include "ui/views/background.h" |
#include "ui/views/controls/button/image_button.h" |
@@ -396,21 +397,29 @@ class ButtonContainerMenuItemView : public MenuItemView { |
DISALLOW_COPY_AND_ASSIGN(ButtonContainerMenuItemView); |
}; |
-gfx::ImageSkia* TintImage(gfx::ImageSkia* image, SkColor tint_value) { |
- // In case of touch, the menu needs to be brightened up a bit. |
- // Create a new bitmap since we do not want to change the original image. |
- SkBitmap bitmap_copy; |
- image->bitmap()->copyTo(&bitmap_copy, SkBitmap::kARGB_8888_Config); |
- SkCanvas canvas(bitmap_copy); |
- SkPaint paint; |
- // We leave the old alpha alone and add the new color multiplied |
- // with the source alpha to the existing alpha. Thus: We brighten |
- // the image up - but only the non transparent pixels. |
- paint.setXfermodeMode(SkXfermode::kDstATop_Mode); |
- paint.setColor(tint_value); |
- canvas.drawPaint(paint); |
- return new gfx::ImageSkia(bitmap_copy); |
-} |
+class TintedImageSource: public gfx::CanvasImageSource { |
+ public: |
+ TintedImageSource(gfx::ImageSkia& image, SkColor tint_value) |
+ : CanvasImageSource(image.size(), false), |
+ image_(image), |
+ tint_value_(tint_value) { |
+ } |
+ |
+ virtual ~TintedImageSource() { |
+ } |
+ |
+ void Draw(gfx::Canvas* canvas) OVERRIDE { |
+ canvas->DrawImageInt(image_, 0, 0); |
+ SkPaint paint; |
+ paint.setXfermodeMode(SkXfermode::kDstATop_Mode); |
+ paint.setColor(tint_value_); |
+ canvas->sk_canvas()->drawPaint(paint); |
+ } |
+ |
+ private: |
+ const gfx::ImageSkia image_; |
+ const SkColor tint_value_; |
+}; |
} // namespace |
@@ -539,10 +548,10 @@ class WrenchMenu::ZoomView : public WrenchMenuView, |
ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
IDR_FULLSCREEN_MENU_BUTTON); |
if (is_touch) { |
- tinted_fullscreen_image_.reset(TintImage(full_screen_image, |
- kTouchImageBrighten)); |
+ tinted_fullscreen_image_ = gfx::ImageSkia(new TintedImageSource( |
+ *full_screen_image, kTouchImageBrighten), full_screen_image->size()); |
fullscreen_button_->SetImage(ImageButton::BS_NORMAL, |
- tinted_fullscreen_image_.get()); |
+ new gfx::ImageSkia(tinted_fullscreen_image_)); |
sadrul
2012/07/17 03:30:08
I think this is leaking ... you could just send &t
|
} else { |
fullscreen_button_->SetImage(ImageButton::BS_NORMAL, full_screen_image); |
} |
@@ -709,7 +718,7 @@ class WrenchMenu::ZoomView : public WrenchMenuView, |
ImageButton* fullscreen_button_; |
// The tinted bitmap of the fullscreen button. |
- scoped_ptr<gfx::ImageSkia> tinted_fullscreen_image_; |
+ gfx::ImageSkia tinted_fullscreen_image_; |
// Width given to |zoom_label_|. This is the width at 100%. |
int zoom_label_width_; |