summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-12 05:43:05 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-12 05:43:05 +0000
commitcb7a6399f3bed1a6800ac93a3a5edb44468fb62c (patch)
tree19980b87b6ac5fed65c3b1c2a0c91c66e01d9d0a
parent452b36f61997247d832fc61df0820e6fd161a696 (diff)
downloadchromium_src-cb7a6399f3bed1a6800ac93a3a5edb44468fb62c.zip
chromium_src-cb7a6399f3bed1a6800ac93a3a5edb44468fb62c.tar.gz
chromium_src-cb7a6399f3bed1a6800ac93a3a5edb44468fb62c.tar.bz2
Support high dpi in menu scroll arrow, submenu arrow and drag_utils.
Created CanvasImageSource utility class to simplify the image creating using canvas. BUG=122992 TEST=manual Review URL: https://chromiumcodereview.appspot.com/10702136 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@146290 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--ui/gfx/image/canvas_image_source.cc28
-rw-r--r--ui/gfx/image/canvas_image_source.h46
-rw-r--r--ui/gfx/image/image_skia_source.h3
-rw-r--r--ui/ui.gyp2
-rw-r--r--ui/views/controls/menu/menu_image_util.cc67
-rw-r--r--ui/views/controls/menu/menu_scroll_view_container.cc27
6 files changed, 141 insertions, 32 deletions
diff --git a/ui/gfx/image/canvas_image_source.cc b/ui/gfx/image/canvas_image_source.cc
new file mode 100644
index 0000000..38f6db8
--- /dev/null
+++ b/ui/gfx/image/canvas_image_source.cc
@@ -0,0 +1,28 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/image/canvas_image_source.h"
+
+#include "base/logging.h"
+#include "ui/gfx/canvas.h"
+#include "ui/base/layout.h"
+
+namespace gfx {
+
+////////////////////////////////////////////////////////////////////////////////
+// CanvasImageSource
+
+CanvasImageSource::CanvasImageSource(const gfx::Size& size, bool is_opaque)
+ : size_(size),
+ is_opaque_(is_opaque) {
+}
+
+gfx::ImageSkiaRep CanvasImageSource::GetImageForScale(
+ ui::ScaleFactor scale_factor) {
+ gfx::Canvas canvas(size_, scale_factor, is_opaque_);
+ Draw(&canvas);
+ return canvas.ExtractImageSkiaRep();
+}
+
+} // namespace gfx
diff --git a/ui/gfx/image/canvas_image_source.h b/ui/gfx/image/canvas_image_source.h
new file mode 100644
index 0000000..a713b95
--- /dev/null
+++ b/ui/gfx/image/canvas_image_source.h
@@ -0,0 +1,46 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_IMAGE_CANVAS_IMAGE_SOURCE_H_
+#define UI_GFX_IMAGE_CANVAS_IMAGE_SOURCE_H_
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "ui/base/ui_export.h"
+#include "ui/gfx/image/image_skia_source.h"
+#include "ui/gfx/size.h"
+
+namespace gfx {
+class Canvas;
+class ImageSkiaRep;
+
+// CanvasImageSource is useful if you need to generate an image for
+// a scale factor using gfx::Canvas. It creates a new Canvas
+// with target scale factor and generates ImageSkiaRep when drawing is
+// completed.
+class UI_EXPORT CanvasImageSource : public gfx::ImageSkiaSource {
+ public:
+ CanvasImageSource(const gfx::Size& size, bool is_opaque);
+
+ // Called when a new image needs to be drawn for a scale factor.
+ virtual void Draw(gfx::Canvas* canvas) = 0;
+
+ // Returns the size of images in DIP that this source will generate.
+ const gfx::Size& size() const { return size_; };
+
+ // Overridden from gfx::ImageSkiaSource.
+ virtual gfx::ImageSkiaRep GetImageForScale(
+ ui::ScaleFactor scale_factor) OVERRIDE;
+
+ protected:
+ virtual ~CanvasImageSource() {}
+
+ const gfx::Size size_;
+ const bool is_opaque_;
+ DISALLOW_COPY_AND_ASSIGN(CanvasImageSource);
+};
+
+} // namespace gfx
+
+#endif // UI_GFX_IMAGE_CANVAS_IMAGE_SOURCE_H_
diff --git a/ui/gfx/image/image_skia_source.h b/ui/gfx/image/image_skia_source.h
index 11458cb..ed5e7ca 100644
--- a/ui/gfx/image/image_skia_source.h
+++ b/ui/gfx/image/image_skia_source.h
@@ -6,12 +6,13 @@
#define UI_GFX_IMAGE_IMAGE_SKIA_SOURCE_H_
#include "ui/base/layout.h"
+#include "ui/base/ui_export.h"
namespace gfx {
class ImageSkiaRep;
-class ImageSkiaSource {
+class UI_EXPORT ImageSkiaSource {
public:
virtual ~ImageSkiaSource() {}
diff --git a/ui/ui.gyp b/ui/ui.gyp
index 0800269..ab7a4a1 100644
--- a/ui/ui.gyp
+++ b/ui/ui.gyp
@@ -346,6 +346,8 @@
'gfx/font_smoothing_win.h',
'gfx/gfx_paths.cc',
'gfx/gfx_paths.h',
+ 'gfx/image/canvas_image_source.cc',
+ 'gfx/image/canvas_image_source.h',
'gfx/image/image.cc',
'gfx/image/image.h',
'gfx/image/image_skia.cc',
diff --git a/ui/views/controls/menu/menu_image_util.cc b/ui/views/controls/menu/menu_image_util.cc
index fafdb6c..02e6ae9 100644
--- a/ui/views/controls/menu/menu_image_util.cc
+++ b/ui/views/controls/menu/menu_image_util.cc
@@ -10,6 +10,7 @@
#include "third_party/skia/include/effects/SkGradientShader.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/image/canvas_image_source.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_source.h"
@@ -32,20 +33,17 @@ const SkColor kRadioButtonIndicatorGradient0 = SkColorSetRGB(0, 0, 0);
const SkColor kRadioButtonIndicatorGradient1 = SkColorSetRGB(0x83, 0x83, 0x83);
const SkColor kIndicatorStroke = SkColorSetRGB(0, 0, 0);
-class RadioButtonImageSource : public gfx::ImageSkiaSource {
+class RadioButtonImageSource : public gfx::CanvasImageSource {
public:
- explicit RadioButtonImageSource(bool selected) : selected_(selected) {
+ explicit RadioButtonImageSource(bool selected)
+ : CanvasImageSource(gfx::Size(kIndicatorSize + 2, kIndicatorSize + 2),
+ false),
+ 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));
+ virtual void Draw(gfx::Canvas* canvas) OVERRIDE {
+ canvas->Translate(gfx::Point(1, 1));
SkPoint gradient_points[3];
gradient_points[0].iset(0, 0);
@@ -62,12 +60,12 @@ class RadioButtonImageSource : public gfx::ImageSkiaSource {
paint.setShader(shader);
shader->unref();
int radius = kIndicatorSize / 2;
- canvas.sk_canvas()->drawCircle(radius, radius, radius, paint);
+ 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);
+ canvas->sk_canvas()->drawCircle(radius, radius, radius, paint);
if (selected_) {
SkPoint selected_gradient_points[2];
@@ -81,18 +79,16 @@ class RadioButtonImageSource : public gfx::ImageSkiaSource {
paint.setShader(shader);
shader->unref();
paint.setStyle(SkPaint::kFill_Style);
- canvas.sk_canvas()->drawCircle(radius, radius,
- kSelectedIndicatorSize / 2, paint);
+ 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);
+ canvas->sk_canvas()->drawCircle(radius, radius,
+ kSelectedIndicatorSize / 2, paint);
}
- LOG(ERROR) << "Generating:" << selected_;
- return gfx::ImageSkiaRep(canvas.ExtractBitmap(), scale_factor);
}
private:
@@ -102,19 +98,38 @@ class RadioButtonImageSource : public gfx::ImageSkiaSource {
};
gfx::ImageSkia* CreateRadioButtonImage(bool selected) {
- return new gfx::ImageSkia(new RadioButtonImageSource(selected),
- gfx::Size(kIndicatorSize + 2, kIndicatorSize + 2));
+ RadioButtonImageSource* source = new RadioButtonImageSource(selected);
+ return new gfx::ImageSkia(source, source->size());
}
+class SubmenuArrowImageSource : public gfx::CanvasImageSource {
+ public:
+ SubmenuArrowImageSource()
+ : gfx::CanvasImageSource(GetSubmenuArrowSize(), false) {
+ }
+ virtual ~SubmenuArrowImageSource() {}
+
+ virtual void Draw(gfx::Canvas* canvas) OVERRIDE {
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+ const gfx::ImageSkia* r = rb.GetImageNamed(IDR_MENU_ARROW).ToImageSkia();
+ canvas->Scale(-1, 1);
+ canvas->DrawImageInt(*r, - r->width(), 0);
+ }
+
+ private:
+ static gfx::Size GetSubmenuArrowSize() {
+ return ui::ResourceBundle::GetSharedInstance()
+ .GetImageNamed(IDR_MENU_ARROW).ToImageSkia()->size();
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(SubmenuArrowImageSource);
+};
+
gfx::ImageSkia* GetRtlSubmenuArrowImage() {
static gfx::ImageSkia* kRtlArrow = NULL;
if (!kRtlArrow) {
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- const gfx::ImageSkia* r = rb.GetImageNamed(IDR_MENU_ARROW).ToImageSkia();
- gfx::Canvas canvas(gfx::Size(r->width(), r->height()), false);
- canvas.Scale(-1, 1);
- canvas.DrawImageInt(*r, - r->width(), 0);
- kRtlArrow = new gfx::ImageSkia(canvas.ExtractBitmap());
+ SubmenuArrowImageSource* source = new SubmenuArrowImageSource();
+ kRtlArrow = new gfx::ImageSkia(source, source->size());
}
return kRtlArrow;
}
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc
index 0bc133e..9b6ba551 100644
--- a/ui/views/controls/menu/menu_scroll_view_container.cc
+++ b/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -10,6 +10,8 @@
#include <Vssym32.h>
#endif
+#include "third_party/skia/include/core/SkPaint.h"
+#include "third_party/skia/include/core/SkPath.h"
#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/native_theme/native_theme.h"
#include "ui/gfx/canvas.h"
@@ -93,13 +95,28 @@ class MenuScrollButton : public View {
// Then the arrow.
int x = width() / 2;
int y = (height() - config.scroll_arrow_height) / 2;
- int delta_y = 1;
+
+ int x_left = x - config.scroll_arrow_height;
+ int x_right = x + config.scroll_arrow_height;
+ int y_bottom;
+
if (!is_up_) {
- delta_y = -1;
- y += config.scroll_arrow_height;
+ y_bottom = y;
+ y = y_bottom + config.scroll_arrow_height;
+ } else {
+ y_bottom = y + config.scroll_arrow_height;
}
- for (int i = 0; i < config.scroll_arrow_height; ++i, --x, y += delta_y)
- canvas->FillRect(gfx::Rect(x, y, (i * 2) + 1, 1), arrow_color);
+ SkPath path;
+ path.setFillType(SkPath::kWinding_FillType);
+ path.moveTo(SkIntToScalar(x), SkIntToScalar(y));
+ path.lineTo(SkIntToScalar(x_left), SkIntToScalar(y_bottom));
+ path.lineTo(SkIntToScalar(x_right), SkIntToScalar(y_bottom));
+ path.lineTo(SkIntToScalar(x), SkIntToScalar(y));
+ SkPaint paint;
+ paint.setStyle(SkPaint::kFill_Style);
+ paint.setAntiAlias(true);
+ paint.setColor(arrow_color);
+ canvas->DrawPath(path, paint);
}
private: