| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/native_theme/native_theme_mac.h" | 5 #include "ui/native_theme/native_theme_mac.h" |
| 6 | 6 |
| 7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include "base/mac/mac_util.h" | 10 #include "base/mac/mac_util.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // CGColorRefToSkColor will not like. But RGB is additive, so the conversion | 84 // CGColorRefToSkColor will not like. But RGB is additive, so the conversion |
| 85 // is easy (RGB to grayscale is less easy). | 85 // is easy (RGB to grayscale is less easy). |
| 86 const CGFloat* components = CGColorGetComponents(cg_color); | 86 const CGFloat* components = CGColorGetComponents(cg_color); |
| 87 CGFloat alpha = component_count == 2 ? components[1] : 1.0; | 87 CGFloat alpha = component_count == 2 ? components[1] : 1.0; |
| 88 return SkColorSetARGB(SkScalarRoundToInt(255.0 * alpha), | 88 return SkColorSetARGB(SkScalarRoundToInt(255.0 * alpha), |
| 89 SkScalarRoundToInt(255.0 * components[0]), | 89 SkScalarRoundToInt(255.0 * components[0]), |
| 90 SkScalarRoundToInt(255.0 * components[0]), | 90 SkScalarRoundToInt(255.0 * components[0]), |
| 91 SkScalarRoundToInt(255.0 * components[0])); | 91 SkScalarRoundToInt(255.0 * components[0])); |
| 92 } | 92 } |
| 93 | 93 |
| 94 // Converts an SkColor to grayscale by using luminance for all three components. |
| 95 // Experimentally, this seems to produce a better result than a flat average or |
| 96 // a min/max average for UI controls. |
| 97 SkColor ColorToGrayscale(SkColor color) { |
| 98 SkScalar luminance = SkColorGetR(color) * 0.21 + |
| 99 SkColorGetG(color) * 0.72 + |
| 100 SkColorGetB(color) * 0.07; |
| 101 uint8_t component = SkScalarRoundToInt(luminance); |
| 102 return SkColorSetARGB(SkColorGetA(color), component, component, component); |
| 103 } |
| 104 |
| 94 } // namespace | 105 } // namespace |
| 95 | 106 |
| 96 namespace ui { | 107 namespace ui { |
| 97 | 108 |
| 98 // static | 109 // static |
| 99 NativeTheme* NativeTheme::GetInstanceForWeb() { | 110 NativeTheme* NativeTheme::GetInstanceForWeb() { |
| 100 return NativeThemeMac::instance(); | 111 return NativeThemeMac::instance(); |
| 101 } | 112 } |
| 102 | 113 |
| 103 // static | 114 // static |
| 104 NativeThemeMac* NativeThemeMac::instance() { | 115 NativeThemeMac* NativeThemeMac::instance() { |
| 105 CR_DEFINE_STATIC_LOCAL(NativeThemeMac, s_native_theme, ()); | 116 CR_DEFINE_STATIC_LOCAL(NativeThemeMac, s_native_theme, ()); |
| 106 return &s_native_theme; | 117 return &s_native_theme; |
| 107 } | 118 } |
| 108 | 119 |
| 120 // static |
| 121 SkColor NativeThemeMac::ApplySystemControlTint(SkColor color) { |
| 122 if ([NSColor currentControlTint] == NSGraphiteControlTint) |
| 123 return ColorToGrayscale(color); |
| 124 return color; |
| 125 } |
| 126 |
| 109 SkColor NativeThemeMac::GetSystemColor(ColorId color_id) const { | 127 SkColor NativeThemeMac::GetSystemColor(ColorId color_id) const { |
| 110 // TODO(tapted): Add caching for these, and listen for | 128 // TODO(tapted): Add caching for these, and listen for |
| 111 // NSSystemColorsDidChangeNotification. | 129 // NSSystemColorsDidChangeNotification. |
| 112 switch (color_id) { | 130 switch (color_id) { |
| 113 case kColorId_WindowBackground: | 131 case kColorId_WindowBackground: |
| 114 return NSSystemColorToSkColor([NSColor windowBackgroundColor]); | 132 return NSSystemColorToSkColor([NSColor windowBackgroundColor]); |
| 115 case kColorId_DialogBackground: | 133 case kColorId_DialogBackground: |
| 116 return kDialogBackgroundColor; | 134 return kDialogBackgroundColor; |
| 117 case kColorId_BubbleBackground: | 135 case kColorId_BubbleBackground: |
| 118 return SK_ColorWHITE; | 136 return SK_ColorWHITE; |
| 119 | 137 |
| 120 case kColorId_FocusedBorderColor: | 138 case kColorId_FocusedBorderColor: |
| 121 case kColorId_FocusedMenuButtonBorderColor: | 139 case kColorId_FocusedMenuButtonBorderColor: |
| 122 return NSSystemColorToSkColor([NSColor keyboardFocusIndicatorColor]); | 140 return NSSystemColorToSkColor([NSColor keyboardFocusIndicatorColor]); |
| 123 case kColorId_UnfocusedBorderColor: | 141 case kColorId_UnfocusedBorderColor: |
| 124 return NSSystemColorToSkColor([NSColor controlColor]); | 142 return NSSystemColorToSkColor([NSColor controlColor]); |
| 125 | 143 |
| 126 // Buttons and labels. | 144 // Buttons and labels. |
| 127 case kColorId_ButtonBackgroundColor: | 145 case kColorId_ButtonBackgroundColor: |
| 128 case kColorId_ButtonHoverBackgroundColor: | 146 case kColorId_ButtonHoverBackgroundColor: |
| 129 case kColorId_HoverMenuButtonBorderColor: | 147 case kColorId_HoverMenuButtonBorderColor: |
| 130 case kColorId_LabelBackgroundColor: | 148 case kColorId_LabelBackgroundColor: |
| 131 return NSSystemColorToSkColor([NSColor controlBackgroundColor]); | 149 return NSSystemColorToSkColor([NSColor controlBackgroundColor]); |
| 132 case kColorId_ButtonEnabledColor: | 150 case kColorId_ButtonEnabledColor: |
| 133 case kColorId_EnabledMenuButtonBorderColor: | 151 case kColorId_EnabledMenuButtonBorderColor: |
| 134 case kColorId_LabelEnabledColor: | 152 case kColorId_LabelEnabledColor: |
| 135 return NSSystemColorToSkColor([NSColor controlTextColor]); | 153 return NSSystemColorToSkColor([NSColor controlTextColor]); |
| 154 case kColorId_CallToActionColor: |
| 155 return NSSystemColorToSkColor([NSColor controlTextColor]); |
| 136 case kColorId_ButtonDisabledColor: | 156 case kColorId_ButtonDisabledColor: |
| 137 case kColorId_LabelDisabledColor: | 157 case kColorId_LabelDisabledColor: |
| 138 return NSSystemColorToSkColor([NSColor disabledControlTextColor]); | 158 return NSSystemColorToSkColor([NSColor disabledControlTextColor]); |
| 139 case kColorId_ButtonHighlightColor: | 159 case kColorId_ButtonHighlightColor: |
| 140 // Although the NSColor documentation names "selectedControlTextColor" as | 160 // Although the NSColor documentation names "selectedControlTextColor" as |
| 141 // the color for a "text in a .. control being clicked or dragged", it | 161 // the color for a "text in a .. control being clicked or dragged", it |
| 142 // remains black, and text on Yosemite-style pressed buttons is white. | 162 // remains black, and text on Yosemite-style pressed buttons is white. |
| 143 return SK_ColorWHITE; | 163 return SK_ColorWHITE; |
| 144 case kColorId_ButtonHoverColor: | 164 case kColorId_ButtonHoverColor: |
| 145 return NSSystemColorToSkColor([NSColor selectedControlTextColor]); | 165 return NSSystemColorToSkColor([NSColor selectedControlTextColor]); |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 start_colors[ButtonBackgroundType::PRESSED] = kPressedBlueStart; | 300 start_colors[ButtonBackgroundType::PRESSED] = kPressedBlueStart; |
| 281 | 301 |
| 282 ColorByState end_colors; | 302 ColorByState end_colors; |
| 283 end_colors[ButtonBackgroundType::DISABLED] = kGrey; | 303 end_colors[ButtonBackgroundType::DISABLED] = kGrey; |
| 284 end_colors[ButtonBackgroundType::HIGHLIGHTED] = kBlueEnd; | 304 end_colors[ButtonBackgroundType::HIGHLIGHTED] = kBlueEnd; |
| 285 end_colors[ButtonBackgroundType::NORMAL] = SK_ColorWHITE; | 305 end_colors[ButtonBackgroundType::NORMAL] = SK_ColorWHITE; |
| 286 end_colors[ButtonBackgroundType::PRESSED] = kPressedBlueEnd; | 306 end_colors[ButtonBackgroundType::PRESSED] = kPressedBlueEnd; |
| 287 | 307 |
| 288 SkColor gradient_colors[] = {start_colors[type], end_colors[type]}; | 308 SkColor gradient_colors[] = {start_colors[type], end_colors[type]}; |
| 289 | 309 |
| 310 for (size_t i = 0; i < arraysize(gradient_colors); ++i) |
| 311 gradient_colors[i] = ApplySystemControlTint(gradient_colors[i]); |
| 312 |
| 290 return SkGradientShader::MakeLinear( | 313 return SkGradientShader::MakeLinear( |
| 291 gradient_points, gradient_colors, gradient_positions, | 314 gradient_points, gradient_colors, gradient_positions, |
| 292 arraysize(gradient_positions), | 315 arraysize(gradient_positions), |
| 293 SkShader::kClamp_TileMode); | 316 SkShader::kClamp_TileMode); |
| 294 } | 317 } |
| 295 | 318 |
| 296 // static | 319 // static |
| 297 sk_sp<SkShader> NativeThemeMac::GetButtonBorderShader(ButtonBackgroundType type, | 320 sk_sp<SkShader> NativeThemeMac::GetButtonBorderShader(ButtonBackgroundType type, |
| 298 int height) { | 321 int height) { |
| 299 using ColorByState = EnumArray<ButtonBackgroundType, SkColor>; | 322 using ColorByState = EnumArray<ButtonBackgroundType, SkColor>; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 313 top_edge[ButtonBackgroundType::PRESSED] = SkColorSetRGB(0x4f, 0x72, 0xfb); | 336 top_edge[ButtonBackgroundType::PRESSED] = SkColorSetRGB(0x4f, 0x72, 0xfb); |
| 314 ColorByState bottom_edge; | 337 ColorByState bottom_edge; |
| 315 bottom_edge[ButtonBackgroundType::DISABLED] = SkColorSetRGB(0xbe, 0xbe, 0xbe); | 338 bottom_edge[ButtonBackgroundType::DISABLED] = SkColorSetRGB(0xbe, 0xbe, 0xbe); |
| 316 bottom_edge[ButtonBackgroundType::HIGHLIGHTED] = | 339 bottom_edge[ButtonBackgroundType::HIGHLIGHTED] = |
| 317 SkColorSetRGB(0x43, 0x52, 0xff); | 340 SkColorSetRGB(0x43, 0x52, 0xff); |
| 318 bottom_edge[ButtonBackgroundType::NORMAL] = SkColorSetRGB(0x9d, 0x9d, 0x9d); | 341 bottom_edge[ButtonBackgroundType::NORMAL] = SkColorSetRGB(0x9d, 0x9d, 0x9d); |
| 319 bottom_edge[ButtonBackgroundType::PRESSED] = SkColorSetRGB(0x3e, 0x12, 0xff); | 342 bottom_edge[ButtonBackgroundType::PRESSED] = SkColorSetRGB(0x3e, 0x12, 0xff); |
| 320 | 343 |
| 321 SkColor gradient_colors[] = {top_edge[type], bottom_edge[type]}; | 344 SkColor gradient_colors[] = {top_edge[type], bottom_edge[type]}; |
| 322 | 345 |
| 346 for (size_t i = 0; i < arraysize(gradient_colors); ++i) |
| 347 gradient_colors[i] = ApplySystemControlTint(gradient_colors[i]); |
| 348 |
| 323 return SkGradientShader::MakeLinear( | 349 return SkGradientShader::MakeLinear( |
| 324 gradient_points, gradient_colors, gradient_positions, | 350 gradient_points, gradient_colors, gradient_positions, |
| 325 arraysize(gradient_positions), SkShader::kClamp_TileMode); | 351 arraysize(gradient_positions), SkShader::kClamp_TileMode); |
| 326 } | 352 } |
| 327 | 353 |
| 328 // static | 354 // static |
| 329 void NativeThemeMac::PaintStyledGradientButton(SkCanvas* canvas, | 355 void NativeThemeMac::PaintStyledGradientButton(SkCanvas* canvas, |
| 330 const gfx::Rect& integer_bounds, | 356 const gfx::Rect& integer_bounds, |
| 331 ButtonBackgroundType type, | 357 ButtonBackgroundType type, |
| 332 bool round_left, | 358 bool round_left, |
| 333 bool round_right, | 359 bool round_right, |
| 334 bool focus) { | 360 bool focus) { |
| 335 const SkScalar kBorderThickness = 1; | 361 const SkScalar kBorderThickness = 1; |
| 336 const SkScalar kFocusRingThickness = 4; | 362 const SkScalar kFocusRingThickness = 4; |
| 337 const SkColor kFocusRingColor = SkColorSetARGB(0x94, 0x79, 0xa7, 0xe9); | 363 const SkColor kFocusRingColor = ApplySystemControlTint( |
| 364 SkColorSetARGB(0x94, 0x79, 0xa7, 0xe9)); |
| 338 | 365 |
| 339 const SkVector kNoCurve = {0, 0}; | 366 const SkVector kNoCurve = {0, 0}; |
| 340 const SkVector kCurve = {kButtonCornerRadius, kButtonCornerRadius}; | 367 const SkVector kCurve = {kButtonCornerRadius, kButtonCornerRadius}; |
| 341 const SkVector kLeftCurves[4] = {kCurve, kNoCurve, kNoCurve, kCurve}; | 368 const SkVector kLeftCurves[4] = {kCurve, kNoCurve, kNoCurve, kCurve}; |
| 342 const SkVector kRightCurves[4] = {kNoCurve, kCurve, kCurve, kNoCurve}; | 369 const SkVector kRightCurves[4] = {kNoCurve, kCurve, kCurve, kNoCurve}; |
| 343 | 370 |
| 344 const SkScalar kShadowOffsetY = 1; | 371 const SkScalar kShadowOffsetY = 1; |
| 345 const SkColor kShadowColor = SkColorSetA(SK_ColorBLACK, 0x05); | 372 const SkColor kShadowColor = SkColorSetA(SK_ColorBLACK, 0x05); |
| 346 const double kShadowBlur = 0.0; | 373 const double kShadowBlur = 0.0; |
| 347 const std::vector<gfx::ShadowValue> shadows( | 374 const std::vector<gfx::ShadowValue> shadows( |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 canvas->drawDRRect(outer_shape, shape, paint); | 417 canvas->drawDRRect(outer_shape, shape, paint); |
| 391 } | 418 } |
| 392 | 419 |
| 393 NativeThemeMac::NativeThemeMac() { | 420 NativeThemeMac::NativeThemeMac() { |
| 394 } | 421 } |
| 395 | 422 |
| 396 NativeThemeMac::~NativeThemeMac() { | 423 NativeThemeMac::~NativeThemeMac() { |
| 397 } | 424 } |
| 398 | 425 |
| 399 } // namespace ui | 426 } // namespace ui |
| OLD | NEW |