17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <stdlib.h> 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "third_party/skia/include/core/SkBitmap.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "third_party/skia/include/core/SkColorPriv.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ui/gfx/color_utils.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace color_utils { 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(ColorUtils, SkColorToHSLRed) { 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL hsl = {0, 0, 0}; 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColorToHSL(SK_ColorRED, &hsl); 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_DOUBLE_EQ(hsl.h, 0); 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_DOUBLE_EQ(hsl.s, 1); 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_DOUBLE_EQ(hsl.l, 0.5); 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(ColorUtils, SkColorToHSLGrey) { 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL hsl = {0, 0, 0}; 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColorToHSL(SkColorSetARGB(255, 128, 128, 128), &hsl); 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_DOUBLE_EQ(hsl.h, 0); 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_DOUBLE_EQ(hsl.s, 0); 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(static_cast<int>(hsl.l * 100), 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static_cast<int>(0.5 * 100)); // Accurate to two decimal places. 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(ColorUtils, HSLToSkColorWithAlpha) { 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor red = SkColorSetARGB(128, 255, 0, 0); 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL hsl = {0, 1, 0.5}; 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor result = HSLToSkColor(hsl, 128); 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetA(red), SkColorGetA(result)); 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetR(red), SkColorGetR(result)); 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetG(red), SkColorGetG(result)); 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetB(red), SkColorGetB(result)); 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(ColorUtils, RGBtoHSLRoundTrip) { 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Just spot check values near the edges. 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int r = 0; r < 10; ++r) { 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int g = 0; g < 10; ++g) { 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int b = 0; b < 10; ++b) { 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor rgb = SkColorSetARGB(255, r, g, b); 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL hsl = {0, 0, 0}; 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColorToHSL(rgb, &hsl); 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor out = HSLToSkColor(hsl, 255); 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetR(out), SkColorGetR(rgb)); 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetG(out), SkColorGetG(rgb)); 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetB(out), SkColorGetB(rgb)); 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int r = 240; r < 256; ++r) { 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (int g = 240; g < 256; ++g) { 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int b = 240; b < 256; ++b) { 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor rgb = SkColorSetARGB(255, r, g, b); 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL hsl = {0, 0, 0}; 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColorToHSL(rgb, &hsl); 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor out = HSLToSkColor(hsl, 255); 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetR(out), SkColorGetR(rgb)); 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetG(out), SkColorGetG(rgb)); 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetB(out), SkColorGetB(rgb)); 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(ColorUtils, IsWithinHSLRange) { 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL hsl = {0.3, 0.4, 0.5}; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL lower = {0.2, 0.3, 0.4}; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL upper = {0.4, 0.5, 0.6}; 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Bounds are inclusive. 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hsl.h = 0.2; 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hsl.h = 0.4; 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hsl.s = 0.3; 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hsl.s = 0.5; 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hsl.l = 0.4; 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hsl.l = 0.6; 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(ColorUtils, IsWithinHSLRangeHueWrapAround) { 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL hsl = {0.3, 0.4, 0.5}; 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL lower = {0.8, -1, -1}; 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL upper = {1.2, -1, -1}; 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hsl.h = 0.1; 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hsl.h = 0.9; 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch hsl.h = 0.3; 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(IsWithinHSLRange(hsl, lower, upper)); 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(ColorUtils, ColorToHSLRegisterSpill) { 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // In a opt build on Linux, this was causing a register spill on my laptop 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // (Pentium M) when converting from SkColor to HSL. 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor input = SkColorSetARGB(255, 206, 154, 89); 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HSL hsl = {-1, -1, -1}; 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor result = HSLShift(input, hsl); 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |result| should be the same as |input| since we passed in a value meaning 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // no color shift. 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetA(input), SkColorGetA(result)); 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetR(input), SkColorGetR(result)); 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetG(input), SkColorGetG(result)); 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(SkColorGetB(input), SkColorGetB(result)); 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(ColorUtils, AlphaBlend) { 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor fore = SkColorSetARGB(255, 200, 200, 200); 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor back = SkColorSetARGB(255, 100, 100, 100); 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(AlphaBlend(fore, back, 255) == fore); 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(AlphaBlend(fore, back, 0) == back); 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // One is fully transparent, result is partially transparent. 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch back = SkColorSetA(back, 0); 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(136U, SkColorGetA(AlphaBlend(fore, back, 136))); 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Both are fully transparent, result is fully transparent. 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch fore = SkColorSetA(fore, 0); 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0U, SkColorGetA(AlphaBlend(fore, back, 255))); 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace color_utils 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch