diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-12 05:43:05 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-12 05:43:05 +0000 |
commit | cb7a6399f3bed1a6800ac93a3a5edb44468fb62c (patch) | |
tree | 19980b87b6ac5fed65c3b1c2a0c91c66e01d9d0a | |
parent | 452b36f61997247d832fc61df0820e6fd161a696 (diff) | |
download | chromium_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.cc | 28 | ||||
-rw-r--r-- | ui/gfx/image/canvas_image_source.h | 46 | ||||
-rw-r--r-- | ui/gfx/image/image_skia_source.h | 3 | ||||
-rw-r--r-- | ui/ui.gyp | 2 | ||||
-rw-r--r-- | ui/views/controls/menu/menu_image_util.cc | 67 | ||||
-rw-r--r-- | ui/views/controls/menu/menu_scroll_view_container.cc | 27 |
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() {} @@ -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: |