| Index: ui/gfx/color_utils.cc
|
| diff --git a/ui/gfx/color_utils.cc b/ui/gfx/color_utils.cc
|
| deleted file mode 100644
|
| index 37cfe302d5a3c8b72df24b052acbaa1c50d78e44..0000000000000000000000000000000000000000
|
| --- a/ui/gfx/color_utils.cc
|
| +++ /dev/null
|
| @@ -1,316 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "ui/gfx/color_utils.h"
|
| -
|
| -#include <math.h>
|
| -#if defined(OS_WIN)
|
| -#include <windows.h>
|
| -#endif
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/logging.h"
|
| -#include "build/build_config.h"
|
| -#if defined(OS_WIN)
|
| -#include "skia/ext/skia_utils_win.h"
|
| -#endif
|
| -#include "third_party/skia/include/core/SkBitmap.h"
|
| -
|
| -namespace color_utils {
|
| -
|
| -
|
| -// Helper functions -----------------------------------------------------------
|
| -
|
| -namespace {
|
| -
|
| -int calcHue(double temp1, double temp2, double hue) {
|
| - if (hue < 0.0)
|
| - ++hue;
|
| - else if (hue > 1.0)
|
| - --hue;
|
| -
|
| - double result = temp1;
|
| - if (hue * 6.0 < 1.0)
|
| - result = temp1 + (temp2 - temp1) * hue * 6.0;
|
| - else if (hue * 2.0 < 1.0)
|
| - result = temp2;
|
| - 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);
|
| -}
|
| -
|
| -// 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) {
|
| - 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) {
|
| - 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);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -
|
| -// ----------------------------------------------------------------------------
|
| -
|
| -unsigned char GetLuminanceForColor(SkColor color) {
|
| - int luma = static_cast<int>((0.3 * SkColorGetR(color)) +
|
| - (0.59 * SkColorGetG(color)) +
|
| - (0.11 * SkColorGetB(color)));
|
| - return std::max(std::min(luma, 255), 0);
|
| -}
|
| -
|
| -double RelativeLuminance(SkColor color) {
|
| - return (0.2126 * ConvertSRGB(SkColorGetR(color))) +
|
| - (0.7152 * ConvertSRGB(SkColorGetG(color))) +
|
| - (0.0722 * ConvertSRGB(SkColorGetB(color)));
|
| -}
|
| -
|
| -void SkColorToHSL(SkColor c, HSL* hsl) {
|
| - double r = static_cast<double>(SkColorGetR(c)) / 255.0;
|
| - double g = static_cast<double>(SkColorGetG(c)) / 255.0;
|
| - double b = static_cast<double>(SkColorGetB(c)) / 255.0;
|
| - double vmax = std::max(std::max(r, g), b);
|
| - double vmin = std::min(std::min(r, g), b);
|
| - double delta = vmax - vmin;
|
| - hsl->l = (vmax + vmin) / 2;
|
| - if (SkColorGetR(c) == SkColorGetG(c) && SkColorGetR(c) == SkColorGetB(c)) {
|
| - hsl->h = hsl->s = 0;
|
| - } else {
|
| - double dr = (((vmax - r) / 6.0) + (delta / 2.0)) / delta;
|
| - double dg = (((vmax - g) / 6.0) + (delta / 2.0)) / delta;
|
| - double db = (((vmax - b) / 6.0) + (delta / 2.0)) / delta;
|
| - // We need to compare for the max value because comparing vmax to r, g, or b
|
| - // can sometimes result in values overflowing registers.
|
| - if (r >= g && r >= b)
|
| - hsl->h = db - dg;
|
| - else if (g >= r && g >= b)
|
| - hsl->h = (1.0 / 3.0) + dr - db;
|
| - else // (b >= r && b >= g)
|
| - hsl->h = (2.0 / 3.0) + dg - dr;
|
| -
|
| - if (hsl->h < 0.0)
|
| - ++hsl->h;
|
| - else if (hsl->h > 1.0)
|
| - --hsl->h;
|
| -
|
| - hsl->s = delta / ((hsl->l < 0.5) ? (vmax + vmin) : (2 - vmax - vmin));
|
| - }
|
| -}
|
| -
|
| -SkColor HSLToSkColor(const HSL& hsl, SkAlpha alpha) {
|
| - double hue = hsl.h;
|
| - double saturation = hsl.s;
|
| - double lightness = hsl.l;
|
| -
|
| - // If there's no color, we don't care about hue and can do everything based on
|
| - // brightness.
|
| - if (!saturation) {
|
| - uint8 light;
|
| -
|
| - if (lightness < 0)
|
| - light = 0;
|
| - else if (lightness >= 1.0)
|
| - light = 255;
|
| - else
|
| - light = SkDoubleToFixed(lightness) >> 8;
|
| -
|
| - return SkColorSetARGB(alpha, light, light, light);
|
| - }
|
| -
|
| - double temp2 = (lightness < 0.5) ?
|
| - (lightness * (1.0 + saturation)) :
|
| - (lightness + saturation - (lightness * saturation));
|
| - double temp1 = 2.0 * lightness - temp2;
|
| - return SkColorSetARGB(alpha,
|
| - calcHue(temp1, temp2, hue + 1.0 / 3.0),
|
| - calcHue(temp1, temp2, hue),
|
| - calcHue(temp1, temp2, hue - 1.0 / 3.0));
|
| -}
|
| -
|
| -void ClampHSL(HSL* hsl) {
|
| - if (hsl->h < 0)
|
| - hsl->h = 0;
|
| - if (hsl->h > 1)
|
| - hsl->h = 1;
|
| - if (hsl->s < 0)
|
| - hsl->s = 0;
|
| - if (hsl->s > 1)
|
| - hsl->s = 1;
|
| - if (hsl->l < 0)
|
| - hsl->l = 0;
|
| - if (hsl->l > 1)
|
| - hsl->l = 1;
|
| -}
|
| -
|
| -bool IsWithinHSLRange(const HSL& hsl,
|
| - const HSL& lower_bound,
|
| - const HSL& upper_bound) {
|
| - DCHECK(hsl.h >= 0 && hsl.h <= 1) << hsl.h;
|
| - DCHECK(hsl.s >= 0 && hsl.s <= 1) << hsl.s;
|
| - DCHECK(hsl.l >= 0 && hsl.l <= 1) << hsl.l;
|
| - DCHECK(lower_bound.h < 0 || upper_bound.h < 0 ||
|
| - (lower_bound.h <= 1 && upper_bound.h <= lower_bound.h + 1))
|
| - << "lower_bound.h: " << lower_bound.h
|
| - << ", upper_bound.h: " << upper_bound.h;
|
| - DCHECK(lower_bound.s < 0 || upper_bound.s < 0 ||
|
| - (lower_bound.s <= upper_bound.s && upper_bound.s <= 1))
|
| - << "lower_bound.s: " << lower_bound.s
|
| - << ", upper_bound.s: " << upper_bound.s;
|
| - DCHECK(lower_bound.l < 0 || upper_bound.l < 0 ||
|
| - (lower_bound.l <= upper_bound.l && upper_bound.l <= 1))
|
| - << "lower_bound.l: " << lower_bound.l
|
| - << ", upper_bound.l: " << upper_bound.l;
|
| -
|
| - // If the upper hue is >1, the given hue bounds wrap around at 1.
|
| - bool matches_hue = upper_bound.h > 1
|
| - ? hsl.h >= lower_bound.h || hsl.h <= upper_bound.h - 1
|
| - : hsl.h >= lower_bound.h && hsl.h <= upper_bound.h;
|
| - return (upper_bound.h < 0 || lower_bound.h < 0 || matches_hue) &&
|
| - (upper_bound.s < 0 || lower_bound.s < 0 ||
|
| - (hsl.s >= lower_bound.s && hsl.s <= upper_bound.s)) &&
|
| - (upper_bound.l < 0 || lower_bound.l < 0 ||
|
| - (hsl.l >= lower_bound.l && hsl.l <= upper_bound.l));
|
| -}
|
| -
|
| -SkColor HSLShift(SkColor color, const HSL& shift) {
|
| - HSL hsl;
|
| - int alpha = SkColorGetA(color);
|
| - SkColorToHSL(color, &hsl);
|
| -
|
| - // Replace the hue with the tint's hue.
|
| - if (shift.h >= 0)
|
| - hsl.h = shift.h;
|
| -
|
| - // Change the saturation.
|
| - if (shift.s >= 0) {
|
| - if (shift.s <= 0.5)
|
| - hsl.s *= shift.s * 2.0;
|
| - else
|
| - hsl.s += (1.0 - hsl.s) * ((shift.s - 0.5) * 2.0);
|
| - }
|
| -
|
| - SkColor result = HSLToSkColor(hsl, alpha);
|
| -
|
| - if (shift.l < 0)
|
| - return result;
|
| -
|
| - // Lightness shifts in the style of popular image editors aren't actually
|
| - // represented in HSL - the L value does have some effect on saturation.
|
| - double r = static_cast<double>(SkColorGetR(result));
|
| - double g = static_cast<double>(SkColorGetG(result));
|
| - double b = static_cast<double>(SkColorGetB(result));
|
| - if (shift.l <= 0.5) {
|
| - r *= (shift.l * 2.0);
|
| - g *= (shift.l * 2.0);
|
| - b *= (shift.l * 2.0);
|
| - } else {
|
| - r += (255.0 - r) * ((shift.l - 0.5) * 2.0);
|
| - g += (255.0 - g) * ((shift.l - 0.5) * 2.0);
|
| - b += (255.0 - b) * ((shift.l - 0.5) * 2.0);
|
| - }
|
| - return SkColorSetARGB(alpha,
|
| - static_cast<int>(r),
|
| - static_cast<int>(g),
|
| - static_cast<int>(b));
|
| -}
|
| -
|
| -void BuildLumaHistogram(const SkBitmap& bitmap, int histogram[256]) {
|
| - DCHECK_EQ(kN32_SkColorType, bitmap.colorType());
|
| -
|
| - SkAutoLockPixels bitmap_lock(bitmap);
|
| -
|
| - int pixel_width = bitmap.width();
|
| - 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))];
|
| - }
|
| -}
|
| -
|
| -SkColor AlphaBlend(SkColor foreground, SkColor background, SkAlpha alpha) {
|
| - if (alpha == 0)
|
| - return background;
|
| - if (alpha == 255)
|
| - return foreground;
|
| -
|
| - int f_alpha = SkColorGetA(foreground);
|
| - int b_alpha = SkColorGetA(background);
|
| -
|
| - double normalizer = (f_alpha * alpha + b_alpha * (255 - alpha)) / 255.0;
|
| - if (normalizer == 0.0)
|
| - return SK_ColorTRANSPARENT;
|
| -
|
| - double f_weight = f_alpha * alpha / normalizer;
|
| - double b_weight = b_alpha * (255 - alpha) / normalizer;
|
| -
|
| - double r = (SkColorGetR(foreground) * f_weight +
|
| - SkColorGetR(background) * b_weight) / 255.0;
|
| - double g = (SkColorGetG(foreground) * f_weight +
|
| - SkColorGetG(background) * b_weight) / 255.0;
|
| - double b = (SkColorGetB(foreground) * f_weight +
|
| - SkColorGetB(background) * b_weight) / 255.0;
|
| -
|
| - return SkColorSetARGB(static_cast<int>(normalizer),
|
| - static_cast<int>(r),
|
| - static_cast<int>(g),
|
| - static_cast<int>(b));
|
| -}
|
| -
|
| -SkColor BlendTowardOppositeLuminance(SkColor color, SkAlpha alpha) {
|
| - unsigned char background_luminance =
|
| - color_utils::GetLuminanceForColor(color);
|
| - const SkColor blend_color =
|
| - (background_luminance < 128) ? SK_ColorWHITE : SK_ColorBLACK;
|
| - return color_utils::AlphaBlend(blend_color, 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;
|
| -}
|
| -
|
| -SkColor InvertColor(SkColor color) {
|
| - return SkColorSetARGB(
|
| - SkColorGetA(color),
|
| - 255 - SkColorGetR(color),
|
| - 255 - SkColorGetG(color),
|
| - 255 - SkColorGetB(color));
|
| -}
|
| -
|
| -SkColor GetSysSkColor(int which) {
|
| -#if defined(OS_WIN)
|
| - return skia::COLORREFToSkColor(GetSysColor(which));
|
| -#else
|
| - NOTIMPLEMENTED();
|
| - return SK_ColorLTGRAY;
|
| -#endif
|
| -}
|
| -
|
| -} // namespace color_utils
|
|
|