| Index: ui/native_theme/native_theme_base.cc
|
| diff --git a/ui/native_theme/native_theme_base.cc b/ui/native_theme/native_theme_base.cc
|
| index 3b2bdd2471a31c63fd53b53dbf8c58f716f07269..cc0bacbadf26c894938f01601b3bebd20e20eaa2 100644
|
| --- a/ui/native_theme/native_theme_base.cc
|
| +++ b/ui/native_theme/native_theme_base.cc
|
| @@ -247,18 +247,20 @@ NativeThemeBase::NativeThemeBase()
|
| NativeThemeBase::~NativeThemeBase() {
|
| }
|
|
|
| +// static
|
| +scoped_ptr<gfx::Canvas> NativeThemeBase::CreateCanvas(SkCanvas* sk_canvas) {
|
| + // TODO(pkotwicz): Do something better and don't infer device
|
| + // scale factor from canvas scale.
|
| + SkMatrix m = sk_canvas->getTotalMatrix();
|
| + float device_scale = static_cast<float>(SkScalarAbs(m.getScaleX()));
|
| + return scoped_ptr<gfx::Canvas>(
|
| + gfx::Canvas::CreateCanvasWithoutScaling(sk_canvas, device_scale));
|
| +}
|
| +
|
| void NativeThemeBase::PaintArrowButton(
|
| SkCanvas* canvas,
|
| const gfx::Rect& rect, Part direction, State state) const {
|
| - int widthMiddle, lengthMiddle;
|
| SkPaint paint;
|
| - if (direction == kScrollbarUpArrow || direction == kScrollbarDownArrow) {
|
| - widthMiddle = rect.width() / 2 + 1;
|
| - lengthMiddle = rect.height() / 2 + 1;
|
| - } else {
|
| - lengthMiddle = rect.width() / 2 + 1;
|
| - widthMiddle = rect.height() / 2 + 1;
|
| - }
|
|
|
| // Calculate button color.
|
| SkScalar trackHSV[3];
|
| @@ -333,11 +335,24 @@ void NativeThemeBase::PaintArrowButton(
|
| paint.setColor(OutlineColor(trackHSV, thumbHSV));
|
| canvas->drawPath(outline, paint);
|
|
|
| - // If the button is disabled or read-only, the arrow is drawn with the
|
| - // outline color.
|
| - if (state != kDisabled)
|
| - paint.setColor(SK_ColorBLACK);
|
| + PaintArrow(canvas, rect, direction, GetArrowColor(state));
|
| +}
|
| +
|
| +void NativeThemeBase::PaintArrow(SkCanvas* gc,
|
| + const gfx::Rect& rect,
|
| + Part direction,
|
| + SkColor color) const {
|
| + int width_middle, length_middle;
|
| + if (direction == kScrollbarUpArrow || direction == kScrollbarDownArrow) {
|
| + width_middle = rect.width() / 2 + 1;
|
| + length_middle = rect.height() / 2 + 1;
|
| + } else {
|
| + length_middle = rect.width() / 2 + 1;
|
| + width_middle = rect.height() / 2 + 1;
|
| + }
|
|
|
| + SkPaint paint;
|
| + paint.setColor(color);
|
| paint.setAntiAlias(false);
|
| paint.setStyle(SkPaint::kFill_Style);
|
|
|
| @@ -346,22 +361,22 @@ void NativeThemeBase::PaintArrowButton(
|
| // looking arrows without anti-aliasing.
|
| switch (direction) {
|
| case kScrollbarUpArrow:
|
| - path.moveTo(rect.x() + widthMiddle - 4, rect.y() + lengthMiddle + 2);
|
| + path.moveTo(rect.x() + width_middle - 4, rect.y() + length_middle + 2);
|
| path.rLineTo(7, 0);
|
| path.rLineTo(-4, -4);
|
| break;
|
| case kScrollbarDownArrow:
|
| - path.moveTo(rect.x() + widthMiddle - 4, rect.y() + lengthMiddle - 3);
|
| + path.moveTo(rect.x() + width_middle - 4, rect.y() + length_middle - 3);
|
| path.rLineTo(7, 0);
|
| path.rLineTo(-4, 4);
|
| break;
|
| case kScrollbarRightArrow:
|
| - path.moveTo(rect.x() + lengthMiddle - 3, rect.y() + widthMiddle - 4);
|
| + path.moveTo(rect.x() + length_middle - 3, rect.y() + width_middle - 4);
|
| path.rLineTo(0, 7);
|
| path.rLineTo(4, -4);
|
| break;
|
| case kScrollbarLeftArrow:
|
| - path.moveTo(rect.x() + lengthMiddle + 1, rect.y() + widthMiddle - 5);
|
| + path.moveTo(rect.x() + length_middle + 1, rect.y() + width_middle - 5);
|
| path.rLineTo(0, 9);
|
| path.rLineTo(-4, -4);
|
| break;
|
| @@ -370,7 +385,7 @@ void NativeThemeBase::PaintArrowButton(
|
| }
|
| path.close();
|
|
|
| - canvas->drawPath(path, paint);
|
| + gc->drawPath(path, paint);
|
| }
|
|
|
| void NativeThemeBase::PaintScrollbarTrack(SkCanvas* canvas,
|
| @@ -999,12 +1014,7 @@ void NativeThemeBase::DrawImageInt(
|
| SkCanvas* sk_canvas, const gfx::ImageSkia& image,
|
| int src_x, int src_y, int src_w, int src_h,
|
| int dest_x, int dest_y, int dest_w, int dest_h) const {
|
| - // TODO(pkotwicz): Do something better and don't infer device
|
| - // scale factor from canvas scale.
|
| - SkMatrix m = sk_canvas->getTotalMatrix();
|
| - float device_scale = static_cast<float>(SkScalarAbs(m.getScaleX()));
|
| - scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling(
|
| - sk_canvas, device_scale));
|
| + scoped_ptr<gfx::Canvas> canvas(CreateCanvas(sk_canvas));
|
| canvas->DrawImageInt(image, src_x, src_y, src_w, src_h,
|
| dest_x, dest_y, dest_w, dest_h, true);
|
| }
|
| @@ -1013,12 +1023,7 @@ void NativeThemeBase::DrawTiledImage(SkCanvas* sk_canvas,
|
| const gfx::ImageSkia& image,
|
| int src_x, int src_y, float tile_scale_x, float tile_scale_y,
|
| int dest_x, int dest_y, int w, int h) const {
|
| - // TODO(pkotwicz): Do something better and don't infer device
|
| - // scale factor from canvas scale.
|
| - SkMatrix m = sk_canvas->getTotalMatrix();
|
| - float device_scale = static_cast<float>(SkScalarAbs(m.getScaleX()));
|
| - scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling(
|
| - sk_canvas, device_scale));
|
| + scoped_ptr<gfx::Canvas> canvas(CreateCanvas(sk_canvas));
|
| canvas->TileImageInt(image, src_x, src_y, tile_scale_x,
|
| tile_scale_y, dest_x, dest_y, w, h);
|
| }
|
| @@ -1033,6 +1038,17 @@ SkColor NativeThemeBase::SaturateAndBrighten(SkScalar* hsv,
|
| return SkHSVToColor(color);
|
| }
|
|
|
| +SkColor NativeThemeBase::GetArrowColor(State state) const {
|
| + if (state != kDisabled)
|
| + return SK_ColorBLACK;
|
| +
|
| + SkScalar track_hsv[3];
|
| + SkColorToHSV(track_color_, track_hsv);
|
| + SkScalar thumb_hsv[3];
|
| + SkColorToHSV(thumb_inactive_color_, thumb_hsv);
|
| + return OutlineColor(track_hsv, thumb_hsv);
|
| +}
|
| +
|
| void NativeThemeBase::DrawVertLine(SkCanvas* canvas,
|
| int x,
|
| int y1,
|
|
|