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