| Index: app/gfx/color_utils.cc
|
| ===================================================================
|
| --- app/gfx/color_utils.cc (revision 26827)
|
| +++ app/gfx/color_utils.cc (working copy)
|
| @@ -23,97 +23,11 @@
|
|
|
| namespace {
|
|
|
| -// These transformations are based on the equations in:
|
| -// http://en.wikipedia.org/wiki/Lab_color
|
| -// http://en.wikipedia.org/wiki/SRGB_color_space#Specification_of_the_transformation
|
| -// See also:
|
| -// http://www.brucelindbloom.com/index.html?ColorCalculator.html
|
| -
|
| -const double kCIEConversionAlpha = 0.055;
|
| -const double kCIEConversionGamma = 2.2;
|
| -const double kE = 0.008856;
|
| -const double kK = 903.3;
|
| -
|
| -double CIEConvertNonLinear(uint8 color_component) {
|
| - double color_component_d = static_cast<double>(color_component) / 255.0;
|
| - if (color_component_d > 0.04045) {
|
| - double base = (color_component_d + kCIEConversionAlpha) /
|
| - (1 + kCIEConversionAlpha);
|
| - return pow(base, kCIEConversionGamma);
|
| - } else {
|
| - return color_component_d / 12.92;
|
| - }
|
| -}
|
| -
|
| -uint8 sRGBColorComponentFromLinearComponent(double component) {
|
| - double result;
|
| - if (component <= 0.0031308) {
|
| - result = 12.92 * component;
|
| - } else {
|
| - result = (1 + kCIEConversionAlpha) *
|
| - pow(component, (static_cast<double>(1) / 2.4)) -
|
| - kCIEConversionAlpha;
|
| - }
|
| - return std::min(static_cast<uint8>(255), static_cast<uint8>(result * 255));
|
| -}
|
| -
|
| -double LabConvertNonLinear(double value) {
|
| - if (value > 0.008856) {
|
| - double goat = pow(value, static_cast<double>(1) / 3);
|
| - return goat;
|
| - }
|
| - return (kK * value + 16) / 116;
|
| -}
|
| -
|
| -double gen_yr(const LabColor& lab) {
|
| - if (lab.L > (kE * kK))
|
| - return pow((lab.L + 16.0) / 116, 3.0);
|
| - return static_cast<double>(lab.L) / kK;
|
| -}
|
| -
|
| -double fy(const LabColor& lab) {
|
| - double yr = gen_yr(lab);
|
| - if (yr > kE)
|
| - return (lab.L + 16.0) / 116;
|
| - return (kK * yr + 16.0) / 116;
|
| -}
|
| -
|
| -double fx(const LabColor& lab) {
|
| - return (static_cast<double>(lab.a) / 500) + fy(lab);
|
| -}
|
| -
|
| -double gen_xr(const LabColor& lab) {
|
| - double x = fx(lab);
|
| - double x_cubed = pow(x, 3.0);
|
| - if (x_cubed > kE)
|
| - return x_cubed;
|
| - return (116.0 * x - 16.0) / kK;
|
| -}
|
| -
|
| -double fz(const LabColor& lab) {
|
| - return fy(lab) - (static_cast<double>(lab.b) / 200);
|
| -}
|
| -
|
| -double gen_zr(const LabColor& lab) {
|
| - double z = fz(lab);
|
| - double z_cubed = pow(z, 3.0);
|
| - if (z_cubed > kE)
|
| - return z_cubed;
|
| - return (116.0 * z - 16.0) / kK;
|
| -}
|
| -
|
| int GetLumaForColor(SkColor* color) {
|
| - int r = SkColorGetR(*color);
|
| - int g = SkColorGetG(*color);
|
| - int b = SkColorGetB(*color);
|
| -
|
| - int luma = static_cast<int>(0.3*r + 0.59*g + 0.11*b);
|
| - if (luma < 0)
|
| - luma = 0;
|
| - else if (luma > 255)
|
| - luma = 255;
|
| -
|
| - return luma;
|
| + 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);
|
| }
|
|
|
| // Next three functions' formulas from:
|
| @@ -142,69 +56,6 @@
|
|
|
| // ----------------------------------------------------------------------------
|
|
|
| -// Note: this works only for sRGB.
|
| -void SkColorToCIEXYZ(SkColor c, CIE_XYZ* xyz) {
|
| - uint8 r = SkColorGetR(c);
|
| - uint8 g = SkColorGetG(c);
|
| - uint8 b = SkColorGetB(c);
|
| -
|
| - xyz->X = 0.4124 * CIEConvertNonLinear(r) +
|
| - 0.3576 * CIEConvertNonLinear(g) +
|
| - 0.1805 * CIEConvertNonLinear(b);
|
| - xyz->Y = 0.2126 * CIEConvertNonLinear(r) +
|
| - 0.7152 * CIEConvertNonLinear(g) +
|
| - 0.0722 * CIEConvertNonLinear(g);
|
| - xyz->Z = 0.0193 * CIEConvertNonLinear(r) +
|
| - 0.1192 * CIEConvertNonLinear(g) +
|
| - 0.9505 * CIEConvertNonLinear(b);
|
| -}
|
| -
|
| -SkColor CIEXYZToSkColor(SkAlpha alpha, const CIE_XYZ& xyz) {
|
| - double r_linear = 3.2410 * xyz.X - 1.5374 * xyz.Y - 0.4986 * xyz.Z;
|
| - double g_linear = -0.9692 * xyz.X + 1.8760 * xyz.Y + 0.0416 * xyz.Z;
|
| - double b_linear = 0.0556 * xyz.X - 0.2040 * xyz.Y + 1.0570 * xyz.Z;
|
| - uint8 r = sRGBColorComponentFromLinearComponent(r_linear);
|
| - uint8 g = sRGBColorComponentFromLinearComponent(g_linear);
|
| - uint8 b = sRGBColorComponentFromLinearComponent(b_linear);
|
| - return SkColorSetARGB(alpha, r, g, b);
|
| -}
|
| -
|
| -void SkColorToLabColor(SkColor c, LabColor* lab) {
|
| - CIE_XYZ xyz;
|
| - SkColorToCIEXYZ(c, &xyz);
|
| - CIEXYZToLabColor(xyz, lab);
|
| -}
|
| -
|
| -SkColor LabColorToSkColor(const LabColor& lab, SkAlpha alpha) {
|
| - CIE_XYZ xyz;
|
| - LabColorToCIEXYZ(lab, &xyz);
|
| - return CIEXYZToSkColor(alpha, xyz);
|
| -}
|
| -
|
| -void CIEXYZToLabColor(const CIE_XYZ& xyz, LabColor* lab) {
|
| - CIE_XYZ white_xyz;
|
| - SkColorToCIEXYZ(SkColorSetRGB(255, 255, 255), &white_xyz);
|
| - double fx = LabConvertNonLinear(xyz.X / white_xyz.X);
|
| - double fy = LabConvertNonLinear(xyz.Y / white_xyz.Y);
|
| - double fz = LabConvertNonLinear(xyz.Z / white_xyz.Z);
|
| - lab->L = static_cast<int>(116 * fy) - 16;
|
| - lab->a = static_cast<int>(500 * (fx - fy));
|
| - lab->b = static_cast<int>(200 * (fy - fz));
|
| -}
|
| -
|
| -void LabColorToCIEXYZ(const LabColor& lab, CIE_XYZ* xyz) {
|
| - CIE_XYZ result;
|
| -
|
| - CIE_XYZ white_xyz;
|
| - SkColorToCIEXYZ(SkColorSetRGB(255, 255, 255), &white_xyz);
|
| -
|
| - result.X = gen_xr(lab) * white_xyz.X;
|
| - result.Y = gen_yr(lab) * white_xyz.Y;
|
| - result.Z = gen_zr(lab) * white_xyz.Z;
|
| -
|
| - *xyz = result;
|
| -}
|
| -
|
| bool IsColorCloseToTransparent(SkAlpha alpha) {
|
| const int kCloseToBoundary = 64;
|
| return alpha < kCloseToBoundary;
|
| @@ -249,16 +100,9 @@
|
| ++color_count;
|
| }
|
|
|
| - SkColor result;
|
| - if (color_count > 0) {
|
| - result = SkColorSetARGB(alpha,
|
| - r / color_count,
|
| - g / color_count,
|
| - b / color_count);
|
| - } else {
|
| - result = SkColorSetARGB(alpha, 0, 0, 0);
|
| - }
|
| - return result;
|
| + return color_count ?
|
| + SkColorSetARGB(alpha, r / color_count, g / color_count, b / color_count) :
|
| + SkColorSetARGB(alpha, 0, 0, 0);
|
| }
|
|
|
| void BuildLumaHistogram(SkBitmap* bitmap, int histogram[256]) {
|
| @@ -270,25 +114,23 @@
|
| int pixel_height = bitmap->height();
|
| for (int y = 0; y < pixel_height; ++y) {
|
| SkColor* current_color = static_cast<uint32_t*>(bitmap->getAddr32(0, y));
|
| - for (int x = 0; x < pixel_width; ++x, ++current_color) {
|
| + for (int x = 0; x < pixel_width; ++x, ++current_color)
|
| histogram[GetLumaForColor(current_color)]++;
|
| - }
|
| }
|
| }
|
|
|
| SkColor AlphaBlend(SkColor foreground, SkColor background, SkAlpha alpha) {
|
| if (alpha == 0)
|
| return background;
|
| - else if (alpha == 0xFF)
|
| + if (alpha == 255)
|
| return foreground;
|
| -
|
| return SkColorSetRGB(
|
| ((SkColorGetR(foreground) * alpha) +
|
| - (SkColorGetR(background) * (0xFF - alpha))) / 0xFF,
|
| + (SkColorGetR(background) * (255 - alpha))) / 255,
|
| ((SkColorGetG(foreground) * alpha) +
|
| - (SkColorGetG(background) * (0xFF - alpha))) / 0xFF,
|
| + (SkColorGetG(background) * (255 - alpha))) / 255,
|
| ((SkColorGetB(foreground) * alpha) +
|
| - (SkColorGetB(background) * (0xFF - alpha))) / 0xFF);
|
| + (SkColorGetB(background) * (255 - alpha))) / 255);
|
| }
|
|
|
| SkColor PickMoreReadableColor(SkColor foreground1,
|
| @@ -300,7 +142,7 @@
|
|
|
| SkColor GetSysSkColor(int which) {
|
| #if defined(OS_WIN)
|
| - return skia::COLORREFToSkColor(::GetSysColor(which));
|
| + return skia::COLORREFToSkColor(GetSysColor(which));
|
| #else
|
| NOTIMPLEMENTED();
|
| return SK_ColorLTGRAY;
|
|
|