Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(966)

Unified Diff: ui/views/controls/menu/menu_image_util.cc

Issue 10694045: Loading/Creating images for mutiple scale factors on the fly (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: size fix Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« ui/gfx/image/image_skia_source.h ('K') | « ui/ui_unittests.gypi ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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() {
« ui/gfx/image/image_skia_source.h ('K') | « ui/ui_unittests.gypi ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698