Index: ui/gfx/color_utils.cc |
diff --git a/ui/gfx/color_utils.cc b/ui/gfx/color_utils.cc |
index 2e3c96f86dc674824e2e8d998be1aae58831e951..a4618f27e66f5e383e0d175dba9e2cf7b7b4e6be 100644 |
--- a/ui/gfx/color_utils.cc |
+++ b/ui/gfx/color_utils.cc |
@@ -42,35 +42,21 @@ int calcHue(double temp1, double temp2, double hue) { |
else if (hue * 3.0 < 2.0) |
result = temp1 + (temp2 - temp1) * (2.0 / 3.0 - hue) * 6.0; |
- // Scale the result from 0 - 255 and round off the value. |
- return static_cast<int>(result * 255 + .5); |
+ return static_cast<int>(std::round(result * 255)); |
} |
-// Next two functions' formulas from: |
-// http://www.w3.org/TR/WCAG20/#relativeluminancedef |
-// http://www.w3.org/TR/WCAG20/#contrast-ratiodef |
- |
-double ConvertSRGB(double eight_bit_component) { |
+// Assumes sRGB. |
+double Linearize(double eight_bit_component) { |
const double component = eight_bit_component / 255.0; |
return (component <= 0.03928) ? |
(component / 12.92) : pow((component + 0.055) / 1.055, 2.4); |
} |
-SkColor LumaInvertColor(SkColor color) { |
+SkColor LightnessInvertColor(SkColor color) { |
HSL hsl; |
SkColorToHSL(color, &hsl); |
hsl.l = 1.0 - hsl.l; |
- return HSLToSkColor(hsl, 255); |
-} |
- |
-double ContrastRatio(double foreground_luminance, double background_luminance) { |
- DCHECK_GE(foreground_luminance, 0.0); |
- DCHECK_GE(background_luminance, 0.0); |
- foreground_luminance += 0.05; |
- background_luminance += 0.05; |
- return (foreground_luminance > background_luminance) ? |
- (foreground_luminance / background_luminance) : |
- (background_luminance / foreground_luminance); |
+ return HSLToSkColor(hsl, SkColorGetA(color)); |
} |
} // namespace |
@@ -79,20 +65,29 @@ double ContrastRatio(double foreground_luminance, double background_luminance) { |
// ---------------------------------------------------------------------------- |
double GetContrastRatio(SkColor color_a, SkColor color_b) { |
- return ContrastRatio(RelativeLuminance(color_a), RelativeLuminance(color_b)); |
+ return GetContrastRatio(GetRelativeLuminance(color_a), |
+ GetRelativeLuminance(color_b)); |
} |
-unsigned char GetLuminanceForColor(SkColor color) { |
- return base::saturated_cast<unsigned char>( |
- (0.3 * SkColorGetR(color)) + |
- (0.59 * SkColorGetG(color)) + |
- (0.11 * SkColorGetB(color))); |
+double GetContrastRatio(double luminance_a, double luminance_b) { |
+ DCHECK_GE(luminance_a, 0.0); |
+ DCHECK_GE(luminance_b, 0.0); |
+ luminance_a += 0.05; |
+ luminance_b += 0.05; |
+ return (luminance_a > luminance_b) ? (luminance_a / luminance_b) |
+ : (luminance_b / luminance_a); |
} |
-double RelativeLuminance(SkColor color) { |
- return (0.2126 * ConvertSRGB(SkColorGetR(color))) + |
- (0.7152 * ConvertSRGB(SkColorGetG(color))) + |
- (0.0722 * ConvertSRGB(SkColorGetB(color))); |
+double GetRelativeLuminance(SkColor color) { |
+ return (0.2126 * Linearize(SkColorGetR(color))) + |
+ (0.7152 * Linearize(SkColorGetG(color))) + |
+ (0.0722 * Linearize(SkColorGetB(color))); |
+} |
+ |
+uint8_t GetLuma(SkColor color) { |
+ return static_cast<uint8_t>(std::round((0.299 * SkColorGetR(color)) + |
+ (0.587 * SkColorGetG(color)) + |
+ (0.114 * SkColorGetB(color)))); |
} |
void SkColorToHSL(SkColor c, HSL* hsl) { |
@@ -242,7 +237,7 @@ void BuildLumaHistogram(const SkBitmap& bitmap, int histogram[256]) { |
int pixel_height = bitmap.height(); |
for (int y = 0; y < pixel_height; ++y) { |
for (int x = 0; x < pixel_width; ++x) |
- ++histogram[GetLuminanceForColor(bitmap.getColor(x, y))]; |
+ ++histogram[GetLuma(bitmap.getColor(x, y))]; |
} |
} |
@@ -287,20 +282,28 @@ SkColor AlphaBlend(SkColor foreground, SkColor background, SkAlpha alpha) { |
} |
bool IsDark(SkColor color) { |
- return GetLuminanceForColor(color) < 128; |
+ return GetLuma(color) < 128; |
} |
-SkColor BlendTowardOppositeLuminance(SkColor color, SkAlpha alpha) { |
+SkColor BlendTowardOppositeLuma(SkColor color, SkAlpha alpha) { |
return AlphaBlend(IsDark(color) ? SK_ColorWHITE : SK_ColorBLACK, color, |
alpha); |
} |
SkColor GetReadableColor(SkColor foreground, SkColor background) { |
- const SkColor foreground2 = LumaInvertColor(foreground); |
- const double background_luminance = RelativeLuminance(background); |
- return (ContrastRatio(RelativeLuminance(foreground), background_luminance) >= |
- ContrastRatio(RelativeLuminance(foreground2), background_luminance)) ? |
- foreground : foreground2; |
+ return PickContrastingColor(foreground, LightnessInvertColor(foreground), |
+ background); |
+} |
+ |
+SkColor PickContrastingColor(SkColor foreground1, |
+ SkColor foreground2, |
+ SkColor background) { |
+ const double background_luminance = GetRelativeLuminance(background); |
+ return (GetContrastRatio(GetRelativeLuminance(foreground1), |
+ background_luminance) >= |
+ GetContrastRatio(GetRelativeLuminance(foreground2), |
+ background_luminance)) ? |
+ foreground1 : foreground2; |
} |
SkColor InvertColor(SkColor color) { |