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, |