Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(444)

Side by Side Diff: ui/native_theme/native_theme_mac.mm

Issue 2251123002: macviews: honor system control tint setting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: use luminance Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/native_theme/native_theme_mac.h ('k') | ui/views/cocoa/bridged_native_widget.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « ui/native_theme/native_theme_mac.h ('k') | ui/views/cocoa/bridged_native_widget.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698