1 // Copyright (c) 2012 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 "chrome/browser/history/select_favicon_frames.h" 6 7 #include "ui/base/layout.h" 8 #include "ui/gfx/image/image_skia.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 #include "third_party/skia/include/core/SkBitmap.h" 11 #include "third_party/skia/include/core/SkColor.h" 12 13 using std::vector; 14 15 namespace { 16 17 vector<ui::ScaleFactor> Scale1x() { 18 return vector<ui::ScaleFactor>(1, ui::SCALE_FACTOR_100P); 19 } 20 21 vector<ui::ScaleFactor> Scale1x2x() { 22 vector<ui::ScaleFactor> scales; 23 scales.push_back(ui::SCALE_FACTOR_100P); 24 scales.push_back(ui::SCALE_FACTOR_200P); 25 return scales; 26 } 27 28 SkBitmap MakeBitmap(SkColor color, int w, int h) { 29 SkBitmap bitmap; 30 bitmap.setConfig(SkBitmap::kARGB_8888_Config, w, h); 31 bitmap.allocPixels(); 32 bitmap.eraseColor(color); 33 return bitmap; 34 } 35 36 SkColor GetColor(const gfx::ImageSkia& image, ui::ScaleFactor factor, 37 int x = -1, int y = -1) { 38 const SkBitmap& bitmap = image.GetRepresentation(factor).sk_bitmap(); 39 if (x == -1) 40 x = bitmap.width() / 2; 41 if (y == -1) 42 y = bitmap.width() / 2; 43 bitmap.lockPixels(); 44 SkColor color = bitmap.getColor(x, y); 45 bitmap.unlockPixels(); 46 return color; 47 } 48 49 SkColor GetColor1x(const gfx::ImageSkia& image) { 50 return GetColor(image, ui::SCALE_FACTOR_100P); 51 } 52 53 SkColor GetColor2x(const gfx::ImageSkia& image) { 54 return GetColor(image, ui::SCALE_FACTOR_200P); 55 } 56 57 TEST(SelectFaviconFramesTest, ZeroSizePicksLargest) { 58 vector<SkBitmap> bitmaps; 59 bitmaps.push_back(MakeBitmap(SK_ColorRED, 16, 16)); 60 bitmaps.push_back(MakeBitmap(SK_ColorGREEN, 48, 48)); 61 bitmaps.push_back(MakeBitmap(SK_ColorBLUE, 32, 32)); 62 63 gfx::ImageSkia image = SelectFaviconFrames(bitmaps, Scale1x(), 0, NULL); 64 EXPECT_EQ(1u, image.image_reps().size()); 65 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_100P)); 66 EXPECT_EQ(48, image.width()); 67 EXPECT_EQ(48, image.height()); 68 69 EXPECT_EQ(SK_ColorGREEN, GetColor1x(image)); 70 } 71 72 TEST(SelectFaviconFramesTest, _16From16) { 73 vector<SkBitmap> bitmaps; 74 bitmaps.push_back(MakeBitmap(SK_ColorRED, 15, 15)); 75 bitmaps.push_back(MakeBitmap(SK_ColorGREEN, 16, 16)); 76 bitmaps.push_back(MakeBitmap(SK_ColorBLUE, 17, 17)); 77 78 gfx::ImageSkia image = SelectFaviconFrames(bitmaps, Scale1x(), 16, NULL); 79 EXPECT_EQ(1u, image.image_reps().size()); 80 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_100P)); 81 EXPECT_EQ(16, image.width()); 82 EXPECT_EQ(16, image.height()); 83 EXPECT_EQ(SK_ColorGREEN, GetColor1x(image)); 84 } 85 86 TEST(SelectFaviconFramesTest, _16From17) { 87 vector<SkBitmap> bitmaps; 88 bitmaps.push_back(MakeBitmap(SK_ColorRED, 15, 15)); 89 bitmaps.push_back(MakeBitmap(SK_ColorGREEN, 17, 17)); 90 91 // Should resample from the bigger candidate. 92 gfx::ImageSkia image = SelectFaviconFrames(bitmaps, Scale1x(), 16, NULL); 93 EXPECT_EQ(1u, image.image_reps().size()); 94 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_100P)); 95 EXPECT_EQ(16, image.width()); 96 EXPECT_EQ(16, image.height()); 97 EXPECT_EQ(SK_ColorGREEN, GetColor1x(image)); 98 } 99 100 TEST(SelectFaviconFramesTest, _16From15) { 101 vector<SkBitmap> bitmaps; 102 bitmaps.push_back(MakeBitmap(SK_ColorRED, 14, 14)); 103 bitmaps.push_back(MakeBitmap(SK_ColorGREEN, 15, 15)); 104 105 // If nothing else is available, should resample form the next smaller 106 // candidate. 107 gfx::ImageSkia image = SelectFaviconFrames(bitmaps, Scale1x(), 16, NULL); 108 EXPECT_EQ(1u, image.image_reps().size()); 109 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_100P)); 110 EXPECT_EQ(16, image.width()); 111 EXPECT_EQ(16, image.height()); 112 EXPECT_EQ(SK_ColorGREEN, GetColor1x(image)); 113 } 114 115 TEST(SelectFaviconFramesTest, _16From16_Scale2x_32_From_16) { 116 vector<SkBitmap> bitmaps; 117 bitmaps.push_back(MakeBitmap(SK_ColorGREEN, 16, 16)); 118 119 gfx::ImageSkia image = SelectFaviconFrames(bitmaps, Scale1x2x(), 16, NULL); 120 EXPECT_EQ(2u, image.image_reps().size()); 121 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_100P)); 122 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_200P)); 123 EXPECT_EQ(16, image.width()); 124 EXPECT_EQ(16, image.height()); 125 EXPECT_EQ(SK_ColorGREEN, GetColor1x(image)); 126 EXPECT_EQ(SK_ColorGREEN, GetColor2x(image)); 127 } 128 129 TEST(SelectFaviconFramesTest, _16From16_Scale2x_32_From_32) { 130 vector<SkBitmap> bitmaps; 131 bitmaps.push_back(MakeBitmap(SK_ColorGREEN, 16, 16)); 132 bitmaps.push_back(MakeBitmap(SK_ColorBLUE, 32, 32)); 133 134 gfx::ImageSkia image = SelectFaviconFrames(bitmaps, Scale1x2x(), 16, NULL); 135 EXPECT_EQ(2u, image.image_reps().size()); 136 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_100P)); 137 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_200P)); 138 EXPECT_EQ(16, image.width()); 139 EXPECT_EQ(16, image.height()); 140 EXPECT_EQ(SK_ColorGREEN, GetColor1x(image)); 141 EXPECT_EQ(SK_ColorBLUE, GetColor2x(image)); 142 } 143 144 TEST(SelectFaviconFramesTest, _24_48) { 145 vector<SkBitmap> bitmaps; 146 bitmaps.push_back(MakeBitmap(SK_ColorRED, 25, 25)); 147 bitmaps.push_back(MakeBitmap(SK_ColorGREEN, 16, 16)); 148 bitmaps.push_back(MakeBitmap(SK_ColorBLUE, 32, 32)); 149 bitmaps.push_back(MakeBitmap(SK_ColorYELLOW, 49, 49)); 150 151 gfx::ImageSkia image = SelectFaviconFrames(bitmaps, Scale1x2x(), 24, NULL); 152 EXPECT_EQ(2u, image.image_reps().size()); 153 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_100P)); 154 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_200P)); 155 EXPECT_EQ(24, image.width()); 156 EXPECT_EQ(24, image.height()); 157 EXPECT_EQ(SK_ColorGREEN, GetColor1x(image)); 158 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 0, 0))); 159 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 3, 4))); 160 EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 4, 4))); 161 EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 19, 19))); 162 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 20, 19))); 163 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 23, 23))); 164 165 EXPECT_EQ(SK_ColorBLUE, GetColor2x(image)); 166 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 0, 0))); 167 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 7, 8))); 168 EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 8, 8))); 169 EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 39, 39))); 170 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 40, 39))); 171 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 47, 47))); 172 } 173 174 TEST(SelectFaviconFramesTest, _48_From_16) { 175 vector<SkBitmap> bitmaps; 176 bitmaps.push_back(MakeBitmap(SK_ColorGREEN, 16, 16)); 177 178 gfx::ImageSkia image = SelectFaviconFrames(bitmaps, Scale1x2x(), 24, NULL); 179 EXPECT_EQ(2u, image.image_reps().size()); 180 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_100P)); 181 ASSERT_TRUE(image.HasRepresentation(ui::SCALE_FACTOR_200P)); 182 EXPECT_EQ(24, image.width()); 183 EXPECT_EQ(24, image.height()); 184 EXPECT_EQ(SK_ColorGREEN, GetColor1x(image)); 185 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 0, 0))); 186 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 3, 4))); 187 EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 4, 4))); 188 EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 19, 19))); 189 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 20, 19))); 190 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_100P, 23, 23))); 191 192 EXPECT_EQ(SK_ColorGREEN, GetColor2x(image)); 193 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 0, 0))); 194 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 7, 8))); 195 EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 8, 8))); 196 EXPECT_EQ(255u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 39, 39))); 197 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 40, 39))); 198 EXPECT_EQ(0u, SkColorGetA(GetColor(image, ui::SCALE_FACTOR_200P, 47, 47))); 199 } 200 201 TEST(SelectFaviconFramesTest, ExactMatchBetterThanHugeBitmap) { 202 float score1; 203 vector<SkBitmap> bitmaps1; 204 bitmaps1.push_back(MakeBitmap(SK_ColorGREEN, 255, 255)); 205 SelectFaviconFrames(bitmaps1, Scale1x2x(), 16, &score1); 206 207 float score2; 208 vector<SkBitmap> bitmaps2; 209 bitmaps2.push_back(MakeBitmap(SK_ColorGREEN, 16, 16)); 210 bitmaps2.push_back(MakeBitmap(SK_ColorGREEN, 32, 32)); 211 SelectFaviconFrames(bitmaps2, Scale1x2x(), 16, &score2); 212 213 EXPECT_GT(score2, score1); 214 } 215 216 TEST(SelectFaviconFramesTest, DownsamplingBetterThanUpsampling) { 217 float score1; 218 vector<SkBitmap> bitmaps1; 219 bitmaps1.push_back(MakeBitmap(SK_ColorGREEN, 8, 8)); 220 SelectFaviconFrames(bitmaps1, Scale1x(), 16, &score1); 221 222 float score2; 223 vector<SkBitmap> bitmaps2; 224 bitmaps2.push_back(MakeBitmap(SK_ColorGREEN, 24, 24)); 225 SelectFaviconFrames(bitmaps2, Scale1x(), 16, &score2); 226 227 EXPECT_GT(score2, score1); 228 } 229 230 } 231