1// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <stdlib.h> 6 7#include "testing/gtest/include/gtest/gtest.h" 8#include "third_party/skia/include/core/SkBitmap.h" 9#include "third_party/skia/include/core/SkColorPriv.h" 10#include "ui/gfx/color_utils.h" 11 12namespace color_utils { 13 14TEST(ColorUtils, SkColorToHSLRed) { 15 HSL hsl = {0, 0, 0}; 16 SkColorToHSL(SK_ColorRED, &hsl); 17 EXPECT_DOUBLE_EQ(hsl.h, 0); 18 EXPECT_DOUBLE_EQ(hsl.s, 1); 19 EXPECT_DOUBLE_EQ(hsl.l, 0.5); 20} 21 22TEST(ColorUtils, SkColorToHSLGrey) { 23 HSL hsl = {0, 0, 0}; 24 SkColorToHSL(SkColorSetARGB(255, 128, 128, 128), &hsl); 25 EXPECT_DOUBLE_EQ(hsl.h, 0); 26 EXPECT_DOUBLE_EQ(hsl.s, 0); 27 EXPECT_EQ(static_cast<int>(hsl.l * 100), 28 static_cast<int>(0.5 * 100)); // Accurate to two decimal places. 29} 30 31TEST(ColorUtils, HSLToSkColorWithAlpha) { 32 SkColor red = SkColorSetARGB(128, 255, 0, 0); 33 HSL hsl = {0, 1, 0.5}; 34 SkColor result = HSLToSkColor(hsl, 128); 35 EXPECT_EQ(SkColorGetA(red), SkColorGetA(result)); 36 EXPECT_EQ(SkColorGetR(red), SkColorGetR(result)); 37 EXPECT_EQ(SkColorGetG(red), SkColorGetG(result)); 38 EXPECT_EQ(SkColorGetB(red), SkColorGetB(result)); 39} 40 41TEST(ColorUtils, RGBtoHSLRoundTrip) { 42 // Just spot check values near the edges. 43 for (int r = 0; r < 10; ++r) { 44 for (int g = 0; g < 10; ++g) { 45 for (int b = 0; b < 10; ++b) { 46 SkColor rgb = SkColorSetARGB(255, r, g, b); 47 HSL hsl = {0, 0, 0}; 48 SkColorToHSL(rgb, &hsl); 49 SkColor out = HSLToSkColor(hsl, 255); 50 EXPECT_EQ(SkColorGetR(out), SkColorGetR(rgb)); 51 EXPECT_EQ(SkColorGetG(out), SkColorGetG(rgb)); 52 EXPECT_EQ(SkColorGetB(out), SkColorGetB(rgb)); 53 } 54 } 55 } 56 for (int r = 240; r < 256; ++r) { 57 for (int g = 240; g < 256; ++g) { 58 for (int b = 240; b < 256; ++b) { 59 SkColor rgb = SkColorSetARGB(255, r, g, b); 60 HSL hsl = {0, 0, 0}; 61 SkColorToHSL(rgb, &hsl); 62 SkColor out = HSLToSkColor(hsl, 255); 63 EXPECT_EQ(SkColorGetR(out), SkColorGetR(rgb)); 64 EXPECT_EQ(SkColorGetG(out), SkColorGetG(rgb)); 65 EXPECT_EQ(SkColorGetB(out), SkColorGetB(rgb)); 66 } 67 } 68 } 69} 70 71TEST(ColorUtils, IsWithinHSLRange) { 72 HSL hsl = {0.3, 0.4, 0.5}; 73 HSL lower = {0.2, 0.3, 0.4}; 74 HSL upper = {0.4, 0.5, 0.6}; 75 EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 76 // Bounds are inclusive. 77 hsl.h = 0.2; 78 EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 79 hsl.h = 0.4; 80 EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 81 hsl.s = 0.3; 82 EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 83 hsl.s = 0.5; 84 EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 85 hsl.l = 0.4; 86 EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 87 hsl.l = 0.6; 88 EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 89} 90 91TEST(ColorUtils, IsWithinHSLRangeHueWrapAround) { 92 HSL hsl = {0.3, 0.4, 0.5}; 93 HSL lower = {0.8, -1, -1}; 94 HSL upper = {1.2, -1, -1}; 95 hsl.h = 0.1; 96 EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 97 hsl.h = 0.9; 98 EXPECT_TRUE(IsWithinHSLRange(hsl, lower, upper)); 99 hsl.h = 0.3; 100 EXPECT_FALSE(IsWithinHSLRange(hsl, lower, upper)); 101} 102 103TEST(ColorUtils, ColorToHSLRegisterSpill) { 104 // In a opt build on Linux, this was causing a register spill on my laptop 105 // (Pentium M) when converting from SkColor to HSL. 106 SkColor input = SkColorSetARGB(255, 206, 154, 89); 107 HSL hsl = {-1, -1, -1}; 108 SkColor result = HSLShift(input, hsl); 109 // |result| should be the same as |input| since we passed in a value meaning 110 // no color shift. 111 EXPECT_EQ(SkColorGetA(input), SkColorGetA(result)); 112 EXPECT_EQ(SkColorGetR(input), SkColorGetR(result)); 113 EXPECT_EQ(SkColorGetG(input), SkColorGetG(result)); 114 EXPECT_EQ(SkColorGetB(input), SkColorGetB(result)); 115} 116 117TEST(ColorUtils, AlphaBlend) { 118 SkColor fore = SkColorSetARGB(255, 200, 200, 200); 119 SkColor back = SkColorSetARGB(255, 100, 100, 100); 120 121 EXPECT_TRUE(AlphaBlend(fore, back, 255) == fore); 122 EXPECT_TRUE(AlphaBlend(fore, back, 0) == back); 123 124 // One is fully transparent, result is partially transparent. 125 back = SkColorSetA(back, 0); 126 EXPECT_EQ(136U, SkColorGetA(AlphaBlend(fore, back, 136))); 127 128 // Both are fully transparent, result is fully transparent. 129 fore = SkColorSetA(fore, 0); 130 EXPECT_EQ(0U, SkColorGetA(AlphaBlend(fore, back, 255))); 131} 132 133} // namespace color_utils 134