Index: ui/views/controls/menu/menu_image_util.cc |
diff --git a/ui/views/controls/menu/menu_image_util.cc b/ui/views/controls/menu/menu_image_util.cc |
index bac396bcbff82f3d29fce8a11c4b0e0d3f2898c7..fafdb6c7e505223459ecda39a25d6f23c846bfe5 100644 |
--- a/ui/views/controls/menu/menu_image_util.cc |
+++ b/ui/views/controls/menu/menu_image_util.cc |
@@ -5,12 +5,14 @@ |
#include "ui/views/controls/menu/menu_image_util.h" |
#include "base/i18n/rtl.h" |
+#include "base/logging.h" |
#include "grit/ui_resources.h" |
#include "third_party/skia/include/effects/SkGradientShader.h" |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/image/image.h" |
#include "ui/gfx/image/image_skia.h" |
+#include "ui/gfx/image/image_skia_source.h" |
#include "ui/gfx/point.h" |
#include "ui/gfx/size.h" |
@@ -30,56 +32,78 @@ const SkColor kRadioButtonIndicatorGradient0 = SkColorSetRGB(0, 0, 0); |
const SkColor kRadioButtonIndicatorGradient1 = SkColorSetRGB(0x83, 0x83, 0x83); |
const SkColor kIndicatorStroke = SkColorSetRGB(0, 0, 0); |
-gfx::ImageSkia* CreateRadioButtonImage(bool selected) { |
- // + 2 (1px on each side) to cover rounding error. |
- gfx::Canvas canvas(gfx::Size(kIndicatorSize + 2, kIndicatorSize + 2), false); |
- canvas.Translate(gfx::Point(1, 1)); |
- |
- SkPoint gradient_points[3]; |
- gradient_points[0].iset(0, 0); |
- gradient_points[1].iset(0, static_cast<int>(kIndicatorSize * kGradientStop)); |
- gradient_points[2].iset(0, kIndicatorSize); |
- SkColor gradient_colors[3] = { kGradient0, kGradient1, kGradient2 }; |
- SkShader* shader = SkGradientShader::CreateLinear( |
- gradient_points, gradient_colors, NULL, arraysize(gradient_points), |
- SkShader::kClamp_TileMode, NULL); |
- SkPaint paint; |
- paint.setStyle(SkPaint::kFill_Style); |
- paint.setAntiAlias(true); |
- paint.setShader(shader); |
- shader->unref(); |
- int radius = kIndicatorSize / 2; |
- canvas.sk_canvas()->drawCircle(radius, radius, radius, paint); |
- |
- paint.setStrokeWidth(SkIntToScalar(0)); |
- paint.setShader(NULL); |
- paint.setStyle(SkPaint::kStroke_Style); |
- paint.setColor(kBaseStroke); |
- canvas.sk_canvas()->drawCircle(radius, radius, radius, paint); |
- |
- if (selected) { |
- SkPoint selected_gradient_points[2]; |
- selected_gradient_points[0].iset(0, 0); |
- selected_gradient_points[1].iset(0, kSelectedIndicatorSize); |
- SkColor selected_gradient_colors[2] = { kRadioButtonIndicatorGradient0, |
- kRadioButtonIndicatorGradient1 }; |
- shader = SkGradientShader::CreateLinear( |
- selected_gradient_points, selected_gradient_colors, NULL, |
- arraysize(selected_gradient_points), SkShader::kClamp_TileMode, NULL); |
+class RadioButtonImageSource : public gfx::ImageSkiaSource { |
+ public: |
+ explicit RadioButtonImageSource(bool selected) : selected_(selected) { |
+ } |
+ virtual ~RadioButtonImageSource() {} |
+ |
+ virtual gfx::ImageSkiaRep GetImageForScale( |
+ ui::ScaleFactor scale_factor) OVERRIDE { |
+ float scale = GetScaleFactorScale(scale_factor); |
+ // + 2 (1px on each side) to cover rounding error. |
+ gfx::Size size(kIndicatorSize + 2, kIndicatorSize + 2); |
+ gfx::Canvas canvas(size.Scale(scale), false); |
+ canvas.Scale(scale, scale); |
+ canvas.Translate(gfx::Point(1, 1)); |
+ |
+ SkPoint gradient_points[3]; |
+ gradient_points[0].iset(0, 0); |
+ gradient_points[1].iset(0, |
+ static_cast<int>(kIndicatorSize * kGradientStop)); |
+ gradient_points[2].iset(0, kIndicatorSize); |
+ SkColor gradient_colors[3] = { kGradient0, kGradient1, kGradient2 }; |
+ SkShader* shader = SkGradientShader::CreateLinear( |
+ gradient_points, gradient_colors, NULL, arraysize(gradient_points), |
+ SkShader::kClamp_TileMode, NULL); |
+ SkPaint paint; |
+ paint.setStyle(SkPaint::kFill_Style); |
+ paint.setAntiAlias(true); |
paint.setShader(shader); |
shader->unref(); |
- paint.setStyle(SkPaint::kFill_Style); |
- canvas.sk_canvas()->drawCircle(radius, radius, |
- kSelectedIndicatorSize / 2, paint); |
- |
+ int radius = kIndicatorSize / 2; |
+ canvas.sk_canvas()->drawCircle(radius, radius, radius, paint); |
paint.setStrokeWidth(SkIntToScalar(0)); |
paint.setShader(NULL); |
paint.setStyle(SkPaint::kStroke_Style); |
- paint.setColor(kIndicatorStroke); |
- canvas.sk_canvas()->drawCircle(radius, radius, |
- kSelectedIndicatorSize / 2, paint); |
+ paint.setColor(kBaseStroke); |
+ canvas.sk_canvas()->drawCircle(radius, radius, radius, paint); |
+ |
+ if (selected_) { |
+ SkPoint selected_gradient_points[2]; |
+ selected_gradient_points[0].iset(0, 0); |
+ selected_gradient_points[1].iset(0, kSelectedIndicatorSize); |
+ SkColor selected_gradient_colors[2] = { kRadioButtonIndicatorGradient0, |
+ kRadioButtonIndicatorGradient1 }; |
+ shader = SkGradientShader::CreateLinear( |
+ selected_gradient_points, selected_gradient_colors, NULL, |
+ arraysize(selected_gradient_points), SkShader::kClamp_TileMode, NULL); |
+ paint.setShader(shader); |
+ shader->unref(); |
+ paint.setStyle(SkPaint::kFill_Style); |
+ canvas.sk_canvas()->drawCircle(radius, radius, |
+ kSelectedIndicatorSize / 2, paint); |
+ |
+ paint.setStrokeWidth(SkIntToScalar(0)); |
+ paint.setShader(NULL); |
+ paint.setStyle(SkPaint::kStroke_Style); |
+ paint.setColor(kIndicatorStroke); |
+ canvas.sk_canvas()->drawCircle(radius, radius, |
+ kSelectedIndicatorSize / 2, paint); |
+ } |
+ LOG(ERROR) << "Generating:" << selected_; |
+ return gfx::ImageSkiaRep(canvas.ExtractBitmap(), scale_factor); |
} |
- return new gfx::ImageSkia(canvas.ExtractBitmap()); |
+ |
+ private: |
+ bool selected_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RadioButtonImageSource); |
+}; |
+ |
+gfx::ImageSkia* CreateRadioButtonImage(bool selected) { |
+ return new gfx::ImageSkia(new RadioButtonImageSource(selected), |
+ gfx::Size(kIndicatorSize + 2, kIndicatorSize + 2)); |
} |
gfx::ImageSkia* GetRtlSubmenuArrowImage() { |