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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutThemeMac.mm

Issue 2873333002: mac color: Use sRGB for native controls instead of device RGB (Closed)
Patch Set: And roll in the image decode bit Created 3 years, 7 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2008, 2009 Google, Inc. 3 * Copyright (C) 2008, 2009 Google, Inc.
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public 6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version. 8 * version 2 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details. 13 * Library General Public License for more details.
14 * 14 *
15 * You should have received a copy of the GNU Library General Public License 15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB. If not, write to 16 * along with this library; see the file COPYING.LIB. If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA. 18 * Boston, MA 02110-1301, USA.
19 */ 19 */
20 20
21 #import "core/layout/LayoutThemeMac.h" 21 #import "core/layout/LayoutThemeMac.h"
22 22
23 #import <AvailabilityMacros.h>
24 #import <Carbon/Carbon.h>
25 #import <Cocoa/Cocoa.h>
26 #import <math.h>
23 #import "core/CSSValueKeywords.h" 27 #import "core/CSSValueKeywords.h"
24 #import "core/HTMLNames.h" 28 #import "core/HTMLNames.h"
25 #import "core/fileapi/FileList.h" 29 #import "core/fileapi/FileList.h"
26 #import "core/layout/LayoutProgress.h" 30 #import "core/layout/LayoutProgress.h"
27 #import "core/layout/LayoutView.h" 31 #import "core/layout/LayoutView.h"
28 #import "core/paint/MediaControlsPainter.h" 32 #import "core/paint/MediaControlsPainter.h"
29 #import "core/style/ShadowList.h" 33 #import "core/style/ShadowList.h"
30 #import "platform/LayoutTestSupport.h" 34 #import "platform/LayoutTestSupport.h"
31 #import "platform/PlatformResourceLoader.h" 35 #import "platform/PlatformResourceLoader.h"
36 #import "platform/RuntimeEnabledFeatures.h"
32 #import "platform/Theme.h" 37 #import "platform/Theme.h"
33 #import "platform/graphics/BitmapImage.h" 38 #import "platform/graphics/BitmapImage.h"
34 #import "platform/mac/ColorMac.h" 39 #import "platform/mac/ColorMac.h"
35 #import "platform/mac/ThemeMac.h" 40 #import "platform/mac/ThemeMac.h"
36 #import "platform/mac/VersionUtilMac.h" 41 #import "platform/mac/VersionUtilMac.h"
37 #import "platform/mac/WebCoreNSCellExtras.h" 42 #import "platform/mac/WebCoreNSCellExtras.h"
38 #import "platform/text/PlatformLocale.h" 43 #import "platform/text/PlatformLocale.h"
39 #import "platform/text/StringTruncator.h" 44 #import "platform/text/StringTruncator.h"
40 #import <AvailabilityMacros.h>
41 #import <Carbon/Carbon.h>
42 #import <Cocoa/Cocoa.h>
43 #import <math.h>
44 45
45 // The methods in this file are specific to the Mac OS X platform. 46 // The methods in this file are specific to the Mac OS X platform.
46 47
47 @interface BlinkLayoutThemeNotificationObserver : NSObject { 48 @interface BlinkLayoutThemeNotificationObserver : NSObject {
48 blink::LayoutTheme* _theme; 49 blink::LayoutTheme* _theme;
49 } 50 }
50 51
51 - (id)initWithTheme:(blink::LayoutTheme*)theme; 52 - (id)initWithTheme:(blink::LayoutTheme*)theme;
52 - (void)systemColorsDidChange:(NSNotification*)notification; 53 - (void)systemColorsDidChange:(NSNotification*)notification;
53 54
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 int font_size = style.FontSize(); 122 int font_size = style.FontSize();
122 if (font_size == [NSFont systemFontSizeForControlSize:NSRegularControlSize]) 123 if (font_size == [NSFont systemFontSizeForControlSize:NSRegularControlSize])
123 return true; 124 return true;
124 if (font_size == [NSFont systemFontSizeForControlSize:NSSmallControlSize]) 125 if (font_size == [NSFont systemFontSizeForControlSize:NSSmallControlSize])
125 return true; 126 return true;
126 if (font_size == [NSFont systemFontSizeForControlSize:NSMiniControlSize]) 127 if (font_size == [NSFont systemFontSizeForControlSize:NSMiniControlSize])
127 return true; 128 return true;
128 return false; 129 return false;
129 } 130 }
130 131
132 NSColor* ColorInColorSpace(NSColor* color) {
133 if (RuntimeEnabledFeatures::colorCorrectRenderingEnabled()) {
134 return [color colorUsingColorSpace:[NSColorSpace sRGBColorSpace]];
135 } else {
136 return [color colorUsingColorSpaceName:NSDeviceRGBColorSpace];
137 }
138 }
139
131 } // namespace 140 } // namespace
132 141
133 using namespace HTMLNames; 142 using namespace HTMLNames;
134 143
135 LayoutThemeMac::LayoutThemeMac() 144 LayoutThemeMac::LayoutThemeMac()
136 : LayoutTheme(PlatformTheme()), 145 : LayoutTheme(PlatformTheme()),
137 notification_observer_( 146 notification_observer_(
138 kAdoptNS, 147 kAdoptNS,
139 [[BlinkLayoutThemeNotificationObserver alloc] initWithTheme:this]), 148 [[BlinkLayoutThemeNotificationObserver alloc] initWithTheme:this]),
140 painter_(*this) { 149 painter_(*this) {
141 [[NSNotificationCenter defaultCenter] 150 [[NSNotificationCenter defaultCenter]
142 addObserver:notification_observer_.Get() 151 addObserver:notification_observer_.Get()
143 selector:@selector(systemColorsDidChange:) 152 selector:@selector(systemColorsDidChange:)
144 name:NSSystemColorsDidChangeNotification 153 name:NSSystemColorsDidChangeNotification
145 object:nil]; 154 object:nil];
146 } 155 }
147 156
148 LayoutThemeMac::~LayoutThemeMac() { 157 LayoutThemeMac::~LayoutThemeMac() {
149 [[NSNotificationCenter defaultCenter] 158 [[NSNotificationCenter defaultCenter]
150 removeObserver:notification_observer_.Get()]; 159 removeObserver:notification_observer_.Get()];
151 } 160 }
152 161
153 Color LayoutThemeMac::PlatformActiveSelectionBackgroundColor() const { 162 Color LayoutThemeMac::PlatformActiveSelectionBackgroundColor() const {
154 NSColor* color = [[NSColor selectedTextBackgroundColor] 163 NSColor* color = ColorInColorSpace([NSColor selectedTextBackgroundColor]);
155 colorUsingColorSpaceName:NSDeviceRGBColorSpace];
156 return Color(static_cast<int>(255.0 * [color redComponent]), 164 return Color(static_cast<int>(255.0 * [color redComponent]),
157 static_cast<int>(255.0 * [color greenComponent]), 165 static_cast<int>(255.0 * [color greenComponent]),
158 static_cast<int>(255.0 * [color blueComponent])); 166 static_cast<int>(255.0 * [color blueComponent]));
159 } 167 }
160 168
161 Color LayoutThemeMac::PlatformInactiveSelectionBackgroundColor() const { 169 Color LayoutThemeMac::PlatformInactiveSelectionBackgroundColor() const {
162 NSColor* color = [[NSColor secondarySelectedControlColor] 170 NSColor* color = ColorInColorSpace([NSColor secondarySelectedControlColor]);
163 colorUsingColorSpaceName:NSDeviceRGBColorSpace];
164 return Color(static_cast<int>(255.0 * [color redComponent]), 171 return Color(static_cast<int>(255.0 * [color redComponent]),
165 static_cast<int>(255.0 * [color greenComponent]), 172 static_cast<int>(255.0 * [color greenComponent]),
166 static_cast<int>(255.0 * [color blueComponent])); 173 static_cast<int>(255.0 * [color blueComponent]));
167 } 174 }
168 175
169 Color LayoutThemeMac::PlatformActiveSelectionForegroundColor() const { 176 Color LayoutThemeMac::PlatformActiveSelectionForegroundColor() const {
170 return Color::kBlack; 177 return Color::kBlack;
171 } 178 }
172 179
173 Color LayoutThemeMac::PlatformActiveListBoxSelectionBackgroundColor() const { 180 Color LayoutThemeMac::PlatformActiveListBoxSelectionBackgroundColor() const {
174 NSColor* color = [[NSColor alternateSelectedControlColor] 181 NSColor* color = ColorInColorSpace([NSColor alternateSelectedControlColor]);
175 colorUsingColorSpaceName:NSDeviceRGBColorSpace];
176 return Color(static_cast<int>(255.0 * [color redComponent]), 182 return Color(static_cast<int>(255.0 * [color redComponent]),
177 static_cast<int>(255.0 * [color greenComponent]), 183 static_cast<int>(255.0 * [color greenComponent]),
178 static_cast<int>(255.0 * [color blueComponent])); 184 static_cast<int>(255.0 * [color blueComponent]));
179 } 185 }
180 186
181 Color LayoutThemeMac::PlatformActiveListBoxSelectionForegroundColor() const { 187 Color LayoutThemeMac::PlatformActiveListBoxSelectionForegroundColor() const {
182 return Color::kWhite; 188 return Color::kWhite;
183 } 189 }
184 190
185 Color LayoutThemeMac::PlatformInactiveListBoxSelectionForegroundColor() const { 191 Color LayoutThemeMac::PlatformInactiveListBoxSelectionForegroundColor() const {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 } 262 }
257 263
258 bool LayoutThemeMac::NeedsHackForTextControlWithFontFamily( 264 bool LayoutThemeMac::NeedsHackForTextControlWithFontFamily(
259 const AtomicString& family) const { 265 const AtomicString& family) const {
260 // This hack is only applied on OSX 10.9. 266 // This hack is only applied on OSX 10.9.
261 // https://code.google.com/p/chromium/issues/detail?id=515989#c8 267 // https://code.google.com/p/chromium/issues/detail?id=515989#c8
262 return IsOS10_9() && family == FontFamilyNames::system_ui; 268 return IsOS10_9() && family == FontFamilyNames::system_ui;
263 } 269 }
264 270
265 static RGBA32 ConvertNSColorToColor(NSColor* color) { 271 static RGBA32 ConvertNSColorToColor(NSColor* color) {
266 NSColor* color_in_color_space = 272 NSColor* color_in_color_space = ColorInColorSpace(color);
267 [color colorUsingColorSpaceName:NSDeviceRGBColorSpace];
268 if (color_in_color_space) { 273 if (color_in_color_space) {
269 static const double kScaleFactor = nextafter(256.0, 0.0); 274 static const double kScaleFactor = nextafter(256.0, 0.0);
270 return MakeRGB( 275 return MakeRGB(
271 static_cast<int>(kScaleFactor * [color_in_color_space redComponent]), 276 static_cast<int>(kScaleFactor * [color_in_color_space redComponent]),
272 static_cast<int>(kScaleFactor * [color_in_color_space greenComponent]), 277 static_cast<int>(kScaleFactor * [color_in_color_space greenComponent]),
273 static_cast<int>(kScaleFactor * [color_in_color_space blueComponent])); 278 static_cast<int>(kScaleFactor * [color_in_color_space blueComponent]));
274 } 279 }
275 280
276 // This conversion above can fail if the NSColor in question is an 281 // This conversion above can fail if the NSColor in question is an
277 // NSPatternColor 282 // NSPatternColor (as many system colors are). These colors are actually a
278 // (as many system colors are). These colors are actually a repeating pattern 283 // repeating pattern not just a solid color. To work around this we simply
279 // not just a solid color. To work around this we simply draw a 1x1 image of 284 // draw a 1x1 image of the color and use that pixel's color. It might be
280 // the color and use that pixel's color. It might be better to use an average 285 // better to use an average of the colors in the pattern instead.
281 // of
282 // the colors in the pattern instead.
283 NSBitmapImageRep* offscreen_rep = 286 NSBitmapImageRep* offscreen_rep =
284 [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil 287 [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil
285 pixelsWide:1 288 pixelsWide:1
286 pixelsHigh:1 289 pixelsHigh:1
287 bitsPerSample:8 290 bitsPerSample:8
288 samplesPerPixel:4 291 samplesPerPixel:4
289 hasAlpha:YES 292 hasAlpha:YES
290 isPlanar:NO 293 isPlanar:NO
291 colorSpaceName:NSDeviceRGBColorSpace 294 colorSpaceName:NSDeviceRGBColorSpace
292 bytesPerRow:4 295 bytesPerRow:4
293 bitsPerPixel:32]; 296 bitsPerPixel:32];
294 297
295 [NSGraphicsContext saveGraphicsState]; 298 [NSGraphicsContext saveGraphicsState];
296 [NSGraphicsContext 299 [NSGraphicsContext
297 setCurrentContext:[NSGraphicsContext 300 setCurrentContext:[NSGraphicsContext
298 graphicsContextWithBitmapImageRep:offscreen_rep]]; 301 graphicsContextWithBitmapImageRep:offscreen_rep]];
299 NSEraseRect(NSMakeRect(0, 0, 1, 1)); 302 NSEraseRect(NSMakeRect(0, 0, 1, 1));
300 [color drawSwatchInRect:NSMakeRect(0, 0, 1, 1)]; 303 [color drawSwatchInRect:NSMakeRect(0, 0, 1, 1)];
301 [NSGraphicsContext restoreGraphicsState]; 304 [NSGraphicsContext restoreGraphicsState];
302 305
303 NSUInteger pixel[4]; 306 NSUInteger pixel[4];
304 [offscreen_rep getPixel:pixel atX:0 y:0]; 307 [offscreen_rep getPixel:pixel atX:0 y:0];
305
306 [offscreen_rep release]; 308 [offscreen_rep release];
307 309 // This recursive call will not recurse again, because the color space
308 return MakeRGB(pixel[0], pixel[1], pixel[2]); 310 // the second time around is NSDeviceRGBColorSpace.
311 return ConvertNSColorToColor([NSColor colorWithDeviceRed:pixel[0] / 255.
312 green:pixel[1] / 255.
313 blue:pixel[2] / 255.
314 alpha:1.]);
309 } 315 }
310 316
311 static RGBA32 MenuBackgroundColor() { 317 static RGBA32 MenuBackgroundColor() {
312 NSBitmapImageRep* offscreen_rep = 318 NSBitmapImageRep* offscreen_rep =
313 [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil 319 [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil
314 pixelsWide:1 320 pixelsWide:1
315 pixelsHigh:1 321 pixelsHigh:1
316 bitsPerSample:8 322 bitsPerSample:8
317 samplesPerPixel:4 323 samplesPerPixel:4
318 hasAlpha:YES 324 hasAlpha:YES
319 isPlanar:NO 325 isPlanar:NO
320 colorSpaceName:NSDeviceRGBColorSpace 326 colorSpaceName:NSDeviceRGBColorSpace
321 bytesPerRow:4 327 bytesPerRow:4
322 bitsPerPixel:32]; 328 bitsPerPixel:32];
323 329
324 CGContextRef context = static_cast<CGContextRef>([[NSGraphicsContext 330 CGContextRef context = static_cast<CGContextRef>([[NSGraphicsContext
325 graphicsContextWithBitmapImageRep:offscreen_rep] graphicsPort]); 331 graphicsContextWithBitmapImageRep:offscreen_rep] graphicsPort]);
326 CGRect rect = CGRectMake(0, 0, 1, 1); 332 CGRect rect = CGRectMake(0, 0, 1, 1);
327 HIThemeMenuDrawInfo draw_info; 333 HIThemeMenuDrawInfo draw_info;
328 draw_info.version = 0; 334 draw_info.version = 0;
329 draw_info.menuType = kThemeMenuTypePopUp; 335 draw_info.menuType = kThemeMenuTypePopUp;
330 HIThemeDrawMenuBackground(&rect, &draw_info, context, 336 HIThemeDrawMenuBackground(&rect, &draw_info, context,
331 kHIThemeOrientationInverted); 337 kHIThemeOrientationInverted);
332 338
333 NSUInteger pixel[4]; 339 NSUInteger pixel[4];
334 [offscreen_rep getPixel:pixel atX:0 y:0]; 340 [offscreen_rep getPixel:pixel atX:0 y:0];
335
336 [offscreen_rep release]; 341 [offscreen_rep release];
337 342 return ConvertNSColorToColor([NSColor colorWithDeviceRed:pixel[0] / 255.
338 return MakeRGB(pixel[0], pixel[1], pixel[2]); 343 green:pixel[1] / 255.
344 blue:pixel[2] / 255.
345 alpha:1.]);
339 } 346 }
340 347
341 void LayoutThemeMac::PlatformColorsDidChange() { 348 void LayoutThemeMac::PlatformColorsDidChange() {
342 system_color_cache_.clear(); 349 system_color_cache_.clear();
343 LayoutTheme::PlatformColorsDidChange(); 350 LayoutTheme::PlatformColorsDidChange();
344 } 351 }
345 352
346 Color LayoutThemeMac::SystemColor(CSSValueID css_value_id) const { 353 Color LayoutThemeMac::SystemColor(CSSValueID css_value_id) const {
347 { 354 {
348 HashMap<int, RGBA32>::iterator it = system_color_cache_.find(css_value_id); 355 HashMap<int, RGBA32>::iterator it = system_color_cache_.find(css_value_id);
(...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 } 1115 }
1109 1116
1110 bool LayoutThemeMac::ShouldUseFallbackTheme(const ComputedStyle& style) const { 1117 bool LayoutThemeMac::ShouldUseFallbackTheme(const ComputedStyle& style) const {
1111 ControlPart part = style.Appearance(); 1118 ControlPart part = style.Appearance();
1112 if (part == kCheckboxPart || part == kRadioPart) 1119 if (part == kCheckboxPart || part == kRadioPart)
1113 return style.EffectiveZoom() != 1; 1120 return style.EffectiveZoom() != 1;
1114 return false; 1121 return false;
1115 } 1122 }
1116 1123
1117 } // namespace blink 1124 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698