Index: ui/native_theme/native_theme_mac.mm |
diff --git a/ui/native_theme/native_theme_mac.mm b/ui/native_theme/native_theme_mac.mm |
index 2477af8ea0b3b20754a2e138685c892134c67f06..90a1d56cde9247b2d514518968e11ec2f9121dee 100644 |
--- a/ui/native_theme/native_theme_mac.mm |
+++ b/ui/native_theme/native_theme_mac.mm |
@@ -12,10 +12,23 @@ |
#include "base/mac/sdk_forward_declarations.h" |
#include "ui/native_theme/common_theme.h" |
#import "skia/ext/skia_utils_mac.h" |
+#include "third_party/skia/include/effects/SkGradientShader.h" |
+#include "ui/gfx/geometry/rect.h" |
#include "ui/gfx/skia_util.h" |
namespace { |
+const SkColor kScrollerTrackGradientColors[] = { |
+ SkColorSetRGB(0xF0, 0xF0, 0xF0), |
+ SkColorSetRGB(0xFA, 0xFA, 0xFA), |
+ SkColorSetRGB(0xFD, 0xFD, 0xFD), |
+ SkColorSetRGB(0xF5, 0xF5, 0xF5) }; |
+const SkColor kScrollerTrackBorderColor = SkColorSetRGB(0xE4, 0xE4, 0xE4); |
+const SkColor kScrollerThumbColor = SkColorSetARGB(0x38, 0, 0, 0); |
+const SkColor kScrollerThumbHoverColor = SkColorSetARGB(0x80, 0, 0, 0); |
+const int kScrollerTrackBorderWidth = 1; |
+const int kScrollerThumbInset = 3; |
tapted
2014/08/13 01:13:29
nit: this one probably needs a comment - it's a bi
Andre
2014/08/13 20:04:21
Done.
|
+ |
// Values calculated by reading pixels and solving simultaneous equations |
// derived from "A over B" alpha compositing. Steps: Sample the semi-transparent |
// pixel over two backgrounds; P1, P2 over backgrounds B1, B2. Use the color |
@@ -184,6 +197,80 @@ SkColor NativeThemeMac::GetSystemColor(ColorId color_id) const { |
return FallbackTheme::GetSystemColor(color_id); |
} |
+void NativeThemeMac::PaintScrollbarTrack( |
+ SkCanvas* canvas, |
+ Part part, |
+ State state, |
+ const ScrollbarTrackExtraParams& extra_params, |
+ const gfx::Rect& rect) const { |
+ SkPoint gradient_bounds[2]; |
tapted
2014/08/13 01:13:29
nit: perhaps a comment in here saying which style
Andre
2014/08/13 20:04:22
Done.
|
+ if (part == kScrollbarVerticalTrack) { |
+ gradient_bounds[0].set(rect.x() + kScrollerTrackBorderWidth, rect.y()); |
+ gradient_bounds[1].set(rect.right(), rect.y()); |
+ } else { |
+ gradient_bounds[0].set(rect.x(), rect.y() + kScrollerTrackBorderWidth); |
tapted
2014/08/13 01:13:29
nit: DCHECK_EQ(part, kScrollbarHorizontalTrack);
Andre
2014/08/13 20:04:22
Done.
|
+ gradient_bounds[1].set(rect.x(), rect.bottom()); |
+ } |
+ skia::RefPtr<SkShader> shader = skia::AdoptRef( |
+ SkGradientShader::CreateLinear(gradient_bounds, |
+ kScrollerTrackGradientColors, |
+ NULL, |
+ 4, |
tapted
2014/08/13 01:13:29
nit: 4 -> arraysize(kScrollerTrackGradientColors)
Andre
2014/08/13 20:04:22
Done.
|
+ SkShader::kClamp_TileMode)); |
+ SkPaint gradient; |
+ gradient.setShader(shader.get()); |
+ |
+ SkIRect track_rect; |
+ track_rect.set(rect.x(), rect.y(), rect.right(), rect.bottom()); |
+ canvas->drawIRect(track_rect, gradient); |
+ |
+ // Draw line border next to content area. |
+ SkPaint paint; |
+ paint.setColor(kScrollerTrackBorderColor); |
+ if (part == kScrollbarVerticalTrack) { |
+ canvas->drawRectCoords(track_rect.left(), |
+ track_rect.top(), |
+ track_rect.left() + kScrollerTrackBorderWidth, |
+ track_rect.bottom(), |
+ paint); |
+ } else { |
+ canvas->drawRectCoords(track_rect.left(), |
+ track_rect.top(), |
+ track_rect.right(), |
+ track_rect.top() + kScrollerTrackBorderWidth, |
+ paint); |
+ } |
+} |
+ |
+void NativeThemeMac::PaintScrollbarThumb(SkCanvas* canvas, |
+ Part part, |
+ State state, |
+ const gfx::Rect& rect) const { |
+ gfx::Rect thumb_rect(rect); |
+ switch (part) { |
+ case kScrollbarHorizontalThumb: |
+ thumb_rect.Inset(0, kScrollerTrackBorderWidth, 0, 0); |
+ break; |
+ case kScrollbarVerticalThumb: |
+ thumb_rect.Inset(kScrollerTrackBorderWidth, 0, 0, 0); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ |
+ thumb_rect.Inset(kScrollerThumbInset, kScrollerThumbInset); |
+ |
+ SkPaint paint; |
tapted
2014/08/13 01:13:29
Looking at the screenshots.. I think we want paint
Andre
2014/08/13 20:04:22
Done.
|
+ paint.setColor(state == kHovered ? thumb_active_color_ |
tapted
2014/08/13 01:13:29
hm - it's odd there are protected data members in
Andre
2014/08/13 20:04:22
Acknowledged.
|
+ : thumb_inactive_color_); |
+ SkRect skrect; |
+ skrect.set( |
+ thumb_rect.x(), thumb_rect.y(), thumb_rect.right(), thumb_rect.bottom()); |
+ const SkScalar radius = std::min(skrect.width(), skrect.height()); |
+ canvas->drawRoundRect(skrect, radius, radius, paint); |
+} |
+ |
void NativeThemeMac::PaintMenuPopupBackground( |
SkCanvas* canvas, |
const gfx::Size& size, |
@@ -217,6 +304,10 @@ void NativeThemeMac::PaintMenuItemBackground( |
} |
NativeThemeMac::NativeThemeMac() { |
+ set_scrollbar_button_length(0); |
+ SetScrollbarColors(kScrollerThumbColor, |
+ kScrollerThumbHoverColor, |
+ kScrollerTrackGradientColors[0]); |
} |
NativeThemeMac::~NativeThemeMac() { |