OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/image/image_skia.h" | 5 #include "ui/gfx/image/image_skia.h" |
6 | 6 |
| 7 #include "base/command_line.h" |
7 #include "base/logging.h" | 8 #include "base/logging.h" |
8 #include "base/threading/simple_thread.h" | 9 #include "base/threading/simple_thread.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
10 #include "third_party/skia/include/core/SkBitmap.h" | 11 #include "third_party/skia/include/core/SkBitmap.h" |
11 #include "ui/gfx/image/image_skia_rep.h" | 12 #include "ui/gfx/image/image_skia_rep.h" |
12 #include "ui/gfx/image/image_skia_source.h" | 13 #include "ui/gfx/image/image_skia_source.h" |
13 #include "ui/gfx/size.h" | 14 #include "ui/gfx/size.h" |
| 15 #include "ui/gfx/switches.h" |
14 | 16 |
15 // Duplicated from base/threading/non_thread_safe.h so that we can be | 17 // Duplicated from base/threading/non_thread_safe.h so that we can be |
16 // good citizens there and undef the macro. | 18 // good citizens there and undef the macro. |
17 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) | 19 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) |
18 #define ENABLE_NON_THREAD_SAFE 1 | 20 #define ENABLE_NON_THREAD_SAFE 1 |
19 #else | 21 #else |
20 #define ENABLE_NON_THREAD_SAFE 0 | 22 #define ENABLE_NON_THREAD_SAFE 0 |
21 #endif | 23 #endif |
22 | 24 |
23 namespace gfx { | 25 namespace gfx { |
(...skipping 12 matching lines...) Expand all Loading... |
36 } | 38 } |
37 | 39 |
38 private: | 40 private: |
39 ImageSkiaRep image_; | 41 ImageSkiaRep image_; |
40 | 42 |
41 DISALLOW_COPY_AND_ASSIGN(FixedSource); | 43 DISALLOW_COPY_AND_ASSIGN(FixedSource); |
42 }; | 44 }; |
43 | 45 |
44 class DynamicSource : public ImageSkiaSource { | 46 class DynamicSource : public ImageSkiaSource { |
45 public: | 47 public: |
46 DynamicSource(const gfx::Size& size) : size_(size) {} | 48 DynamicSource(const gfx::Size& size) |
| 49 : size_(size), |
| 50 last_requested_scale_(0.0f) {} |
47 | 51 |
48 virtual ~DynamicSource() { | 52 virtual ~DynamicSource() { |
49 } | 53 } |
50 | 54 |
51 virtual ImageSkiaRep GetImageForScale(float scale) OVERRIDE { | 55 virtual ImageSkiaRep GetImageForScale(float scale) OVERRIDE { |
| 56 last_requested_scale_ = scale; |
52 return gfx::ImageSkiaRep(size_, scale); | 57 return gfx::ImageSkiaRep(size_, scale); |
53 } | 58 } |
54 | 59 |
| 60 float GetLastRequestedScaleAndReset() { |
| 61 float result = last_requested_scale_; |
| 62 last_requested_scale_ = 0.0f; |
| 63 return result; |
| 64 } |
| 65 |
55 private: | 66 private: |
56 gfx::Size size_; | 67 gfx::Size size_; |
| 68 float last_requested_scale_; |
57 | 69 |
58 DISALLOW_COPY_AND_ASSIGN(DynamicSource); | 70 DISALLOW_COPY_AND_ASSIGN(DynamicSource); |
59 }; | 71 }; |
60 | 72 |
61 class NullSource: public ImageSkiaSource { | 73 class NullSource: public ImageSkiaSource { |
62 public: | 74 public: |
63 NullSource() { | 75 NullSource() { |
64 } | 76 } |
65 | 77 |
66 virtual ~NullSource() { | 78 virtual ~NullSource() { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 ImageSkia* image_skia_; | 118 ImageSkia* image_skia_; |
107 | 119 |
108 bool can_read_; | 120 bool can_read_; |
109 bool can_modify_; | 121 bool can_modify_; |
110 | 122 |
111 DISALLOW_COPY_AND_ASSIGN(TestOnThread); | 123 DISALLOW_COPY_AND_ASSIGN(TestOnThread); |
112 }; | 124 }; |
113 | 125 |
114 } // namespace test | 126 } // namespace test |
115 | 127 |
116 TEST(ImageSkiaTest, FixedSource) { | 128 class ImageSkiaTest : public testing::Test { |
| 129 public: |
| 130 ImageSkiaTest() { |
| 131 // In the test, we assume that we support 1.0f and 2.0f DSFs. |
| 132 old_scales_ = ImageSkia::GetSupportedScales(); |
| 133 |
| 134 // Sets the list of scale factors supported by resource bundle. |
| 135 std::vector<float> supported_scales; |
| 136 supported_scales.push_back(1.0f); |
| 137 supported_scales.push_back(2.0f); |
| 138 ImageSkia::SetSupportedScales(supported_scales); |
| 139 } |
| 140 virtual ~ImageSkiaTest() { |
| 141 ImageSkia::SetSupportedScales(old_scales_); |
| 142 } |
| 143 |
| 144 private: |
| 145 std::vector<float> old_scales_; |
| 146 DISALLOW_COPY_AND_ASSIGN(ImageSkiaTest); |
| 147 }; |
| 148 |
| 149 TEST_F(ImageSkiaTest, FixedSource) { |
117 ImageSkiaRep image(Size(100, 200), 1.0f); | 150 ImageSkiaRep image(Size(100, 200), 1.0f); |
118 ImageSkia image_skia(new FixedSource(image), Size(100, 200)); | 151 ImageSkia image_skia(new FixedSource(image), Size(100, 200)); |
119 EXPECT_EQ(0U, image_skia.image_reps().size()); | 152 EXPECT_EQ(0U, image_skia.image_reps().size()); |
120 | 153 |
121 const ImageSkiaRep& result_100p = image_skia.GetRepresentation(1.0f); | 154 const ImageSkiaRep& result_100p = image_skia.GetRepresentation(1.0f); |
122 EXPECT_EQ(100, result_100p.GetWidth()); | 155 EXPECT_EQ(100, result_100p.GetWidth()); |
123 EXPECT_EQ(200, result_100p.GetHeight()); | 156 EXPECT_EQ(200, result_100p.GetHeight()); |
124 EXPECT_EQ(1.0f, result_100p.scale()); | 157 EXPECT_EQ(1.0f, result_100p.scale()); |
125 EXPECT_EQ(1U, image_skia.image_reps().size()); | 158 EXPECT_EQ(1U, image_skia.image_reps().size()); |
126 | 159 |
127 const ImageSkiaRep& result_200p = image_skia.GetRepresentation(2.0f); | 160 const ImageSkiaRep& result_200p = image_skia.GetRepresentation(2.0f); |
128 | 161 |
129 EXPECT_EQ(100, result_200p.GetWidth()); | 162 EXPECT_EQ(100, result_200p.GetWidth()); |
130 EXPECT_EQ(200, result_200p.GetHeight()); | 163 EXPECT_EQ(200, result_200p.GetHeight()); |
131 EXPECT_EQ(100, result_200p.pixel_width()); | 164 EXPECT_EQ(100, result_200p.pixel_width()); |
132 EXPECT_EQ(200, result_200p.pixel_height()); | 165 EXPECT_EQ(200, result_200p.pixel_height()); |
133 EXPECT_EQ(1.0f, result_200p.scale()); | 166 EXPECT_EQ(1.0f, result_200p.scale()); |
134 EXPECT_EQ(1U, image_skia.image_reps().size()); | 167 EXPECT_EQ(1U, image_skia.image_reps().size()); |
135 | 168 |
136 // Get the representation again and make sure it doesn't | 169 // Get the representation again and make sure it doesn't |
137 // generate new image skia rep. | 170 // generate new image skia rep. |
138 image_skia.GetRepresentation(1.0f); | 171 image_skia.GetRepresentation(1.0f); |
139 image_skia.GetRepresentation(2.0f); | 172 image_skia.GetRepresentation(2.0f); |
140 EXPECT_EQ(1U, image_skia.image_reps().size()); | 173 EXPECT_EQ(1U, image_skia.image_reps().size()); |
141 } | 174 } |
142 | 175 |
143 TEST(ImageSkiaTest, DynamicSource) { | 176 TEST_F(ImageSkiaTest, DynamicSource) { |
144 ImageSkia image_skia(new DynamicSource(Size(100, 200)), Size(100, 200)); | 177 ImageSkia image_skia(new DynamicSource(Size(100, 200)), Size(100, 200)); |
145 EXPECT_EQ(0U, image_skia.image_reps().size()); | 178 EXPECT_EQ(0U, image_skia.image_reps().size()); |
146 const ImageSkiaRep& result_100p = image_skia.GetRepresentation(1.0f); | 179 const ImageSkiaRep& result_100p = image_skia.GetRepresentation(1.0f); |
147 EXPECT_EQ(100, result_100p.GetWidth()); | 180 EXPECT_EQ(100, result_100p.GetWidth()); |
148 EXPECT_EQ(200, result_100p.GetHeight()); | 181 EXPECT_EQ(200, result_100p.GetHeight()); |
149 EXPECT_EQ(1.0f, result_100p.scale()); | 182 EXPECT_EQ(1.0f, result_100p.scale()); |
150 EXPECT_EQ(1U, image_skia.image_reps().size()); | 183 EXPECT_EQ(1U, image_skia.image_reps().size()); |
151 | 184 |
152 const ImageSkiaRep& result_200p = | 185 const ImageSkiaRep& result_200p = |
153 image_skia.GetRepresentation(2.0f); | 186 image_skia.GetRepresentation(2.0f); |
154 EXPECT_EQ(100, result_200p.GetWidth()); | 187 EXPECT_EQ(100, result_200p.GetWidth()); |
155 EXPECT_EQ(200, result_200p.GetHeight()); | 188 EXPECT_EQ(200, result_200p.GetHeight()); |
156 EXPECT_EQ(200, result_200p.pixel_width()); | 189 EXPECT_EQ(200, result_200p.pixel_width()); |
157 EXPECT_EQ(400, result_200p.pixel_height()); | 190 EXPECT_EQ(400, result_200p.pixel_height()); |
158 EXPECT_EQ(2.0f, result_200p.scale()); | 191 EXPECT_EQ(2.0f, result_200p.scale()); |
159 EXPECT_EQ(2U, image_skia.image_reps().size()); | 192 EXPECT_EQ(2U, image_skia.image_reps().size()); |
160 | 193 |
161 // Get the representation again and make sure it doesn't | 194 // Get the representation again and make sure it doesn't |
162 // generate new image skia rep. | 195 // generate new image skia rep. |
163 image_skia.GetRepresentation(1.0f); | 196 image_skia.GetRepresentation(1.0f); |
164 EXPECT_EQ(2U, image_skia.image_reps().size()); | 197 EXPECT_EQ(2U, image_skia.image_reps().size()); |
165 image_skia.GetRepresentation(2.0f); | 198 image_skia.GetRepresentation(2.0f); |
166 EXPECT_EQ(2U, image_skia.image_reps().size()); | 199 EXPECT_EQ(2U, image_skia.image_reps().size()); |
167 } | 200 } |
168 | 201 |
169 // Tests that image_reps returns all of the representations in the | 202 // Tests that image_reps returns all of the representations in the |
170 // image when there are multiple representations for a scale factor. | 203 // image when there are multiple representations for a scale factor. |
171 // This currently is the case with ImageLoader::LoadImages. | 204 // This currently is the case with ImageLoader::LoadImages. |
172 TEST(ImageSkiaTest, ManyRepsPerScaleFactor) { | 205 TEST_F(ImageSkiaTest, ManyRepsPerScaleFactor) { |
173 const int kSmallIcon1x = 16; | 206 const int kSmallIcon1x = 16; |
174 const int kSmallIcon2x = 32; | 207 const int kSmallIcon2x = 32; |
175 const int kLargeIcon1x = 32; | 208 const int kLargeIcon1x = 32; |
176 | 209 |
177 ImageSkia image(new NullSource(), gfx::Size(kSmallIcon1x, kSmallIcon1x)); | 210 ImageSkia image(new NullSource(), gfx::Size(kSmallIcon1x, kSmallIcon1x)); |
178 // Simulate a source which loads images on a delay. Upon | 211 // Simulate a source which loads images on a delay. Upon |
179 // GetImageForScaleFactor, it immediately returns null and starts loading | 212 // GetImageForScaleFactor, it immediately returns null and starts loading |
180 // image reps slowly. | 213 // image reps slowly. |
181 image.GetRepresentation(1.0f); | 214 image.GetRepresentation(1.0f); |
182 image.GetRepresentation(2.0f); | 215 image.GetRepresentation(2.0f); |
(...skipping 14 matching lines...) Expand all Loading... |
197 for (size_t i = 0; i < image_reps.size(); ++i) { | 230 for (size_t i = 0; i < image_reps.size(); ++i) { |
198 if (image_reps[i].scale() == 1.0f) | 231 if (image_reps[i].scale() == 1.0f) |
199 num_1x++; | 232 num_1x++; |
200 else if (image_reps[i].scale() == 2.0f) | 233 else if (image_reps[i].scale() == 2.0f) |
201 num_2x++; | 234 num_2x++; |
202 } | 235 } |
203 EXPECT_EQ(2, num_1x); | 236 EXPECT_EQ(2, num_1x); |
204 EXPECT_EQ(1, num_2x); | 237 EXPECT_EQ(1, num_2x); |
205 } | 238 } |
206 | 239 |
207 TEST(ImageSkiaTest, GetBitmap) { | 240 TEST_F(ImageSkiaTest, GetBitmap) { |
208 ImageSkia image_skia(new DynamicSource(Size(100, 200)), Size(100, 200)); | 241 ImageSkia image_skia(new DynamicSource(Size(100, 200)), Size(100, 200)); |
209 const SkBitmap* bitmap = image_skia.bitmap(); | 242 const SkBitmap* bitmap = image_skia.bitmap(); |
210 EXPECT_NE(static_cast<SkBitmap*>(NULL), bitmap); | 243 EXPECT_NE(static_cast<SkBitmap*>(NULL), bitmap); |
211 EXPECT_FALSE(bitmap->isNull()); | 244 EXPECT_FALSE(bitmap->isNull()); |
212 } | 245 } |
213 | 246 |
214 TEST(ImageSkiaTest, GetBitmapFromEmpty) { | 247 TEST_F(ImageSkiaTest, GetBitmapFromEmpty) { |
215 // Create an image with 1 representation and remove it so the ImageSkiaStorage | 248 // Create an image with 1 representation and remove it so the ImageSkiaStorage |
216 // is left with no representations. | 249 // is left with no representations. |
217 ImageSkia empty_image(ImageSkiaRep(Size(100, 200), 1.0f)); | 250 ImageSkia empty_image(ImageSkiaRep(Size(100, 200), 1.0f)); |
218 ImageSkia empty_image_copy(empty_image); | 251 ImageSkia empty_image_copy(empty_image); |
219 empty_image.RemoveRepresentation(1.0f); | 252 empty_image.RemoveRepresentation(1.0f); |
220 | 253 |
221 // Check that ImageSkia::bitmap() still returns a valid SkBitmap pointer for | 254 // Check that ImageSkia::bitmap() still returns a valid SkBitmap pointer for |
222 // the image and all its copies. | 255 // the image and all its copies. |
223 const SkBitmap* bitmap = empty_image_copy.bitmap(); | 256 const SkBitmap* bitmap = empty_image_copy.bitmap(); |
224 ASSERT_NE(static_cast<SkBitmap*>(NULL), bitmap); | 257 ASSERT_NE(static_cast<SkBitmap*>(NULL), bitmap); |
225 EXPECT_TRUE(bitmap->isNull()); | 258 EXPECT_TRUE(bitmap->isNull()); |
226 EXPECT_TRUE(bitmap->empty()); | 259 EXPECT_TRUE(bitmap->empty()); |
227 } | 260 } |
228 | 261 |
229 TEST(ImageSkiaTest, BackedBySameObjectAs) { | 262 TEST_F(ImageSkiaTest, BackedBySameObjectAs) { |
230 // Null images should all be backed by the same object (NULL). | 263 // Null images should all be backed by the same object (NULL). |
231 ImageSkia image; | 264 ImageSkia image; |
232 ImageSkia unrelated; | 265 ImageSkia unrelated; |
233 EXPECT_TRUE(image.BackedBySameObjectAs(unrelated)); | 266 EXPECT_TRUE(image.BackedBySameObjectAs(unrelated)); |
234 | 267 |
235 image.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), | 268 image.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), |
236 1.0f)); | 269 1.0f)); |
237 ImageSkia copy = image; | 270 ImageSkia copy = image; |
238 copy.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), | 271 copy.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), |
239 2.0f)); | 272 2.0f)); |
240 unrelated.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), | 273 unrelated.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), |
241 1.0f)); | 274 1.0f)); |
242 EXPECT_TRUE(image.BackedBySameObjectAs(copy)); | 275 EXPECT_TRUE(image.BackedBySameObjectAs(copy)); |
243 EXPECT_FALSE(image.BackedBySameObjectAs(unrelated)); | 276 EXPECT_FALSE(image.BackedBySameObjectAs(unrelated)); |
244 EXPECT_FALSE(copy.BackedBySameObjectAs(unrelated)); | 277 EXPECT_FALSE(copy.BackedBySameObjectAs(unrelated)); |
245 } | 278 } |
246 | 279 |
247 #if ENABLE_NON_THREAD_SAFE | 280 #if ENABLE_NON_THREAD_SAFE |
248 TEST(ImageSkiaTest, EmptyOnThreadTest) { | 281 TEST_F(ImageSkiaTest, EmptyOnThreadTest) { |
249 ImageSkia empty; | 282 ImageSkia empty; |
250 test::TestOnThread empty_on_thread(&empty); | 283 test::TestOnThread empty_on_thread(&empty); |
251 empty_on_thread.Start(); | 284 empty_on_thread.Start(); |
252 empty_on_thread.Join(); | 285 empty_on_thread.Join(); |
253 EXPECT_TRUE(empty_on_thread.can_read()); | 286 EXPECT_TRUE(empty_on_thread.can_read()); |
254 EXPECT_TRUE(empty_on_thread.can_modify()); | 287 EXPECT_TRUE(empty_on_thread.can_modify()); |
255 } | 288 } |
256 | 289 |
257 TEST(ImageSkiaTest, StaticOnThreadTest) { | 290 TEST_F(ImageSkiaTest, StaticOnThreadTest) { |
258 ImageSkia image(ImageSkiaRep(Size(100, 200), 1.0f)); | 291 ImageSkia image(ImageSkiaRep(Size(100, 200), 1.0f)); |
259 EXPECT_FALSE(image.IsThreadSafe()); | 292 EXPECT_FALSE(image.IsThreadSafe()); |
260 | 293 |
261 test::TestOnThread image_on_thread(&image); | 294 test::TestOnThread image_on_thread(&image); |
262 // an image that was never accessed on this thread can be | 295 // an image that was never accessed on this thread can be |
263 // read by other thread. | 296 // read by other thread. |
264 image_on_thread.StartAndJoin(); | 297 image_on_thread.StartAndJoin(); |
265 EXPECT_TRUE(image_on_thread.can_read()); | 298 EXPECT_TRUE(image_on_thread.can_read()); |
266 EXPECT_TRUE(image_on_thread.can_modify()); | 299 EXPECT_TRUE(image_on_thread.can_modify()); |
267 EXPECT_FALSE(image.CanRead()); | 300 EXPECT_FALSE(image.CanRead()); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 image.MakeThreadSafe(); | 349 image.MakeThreadSafe(); |
317 EXPECT_TRUE(image.IsThreadSafe()); | 350 EXPECT_TRUE(image.IsThreadSafe()); |
318 test::TestOnThread threadsafe_on_thread(&image); | 351 test::TestOnThread threadsafe_on_thread(&image); |
319 threadsafe_on_thread.StartAndJoin(); | 352 threadsafe_on_thread.StartAndJoin(); |
320 EXPECT_TRUE(threadsafe_on_thread.can_read()); | 353 EXPECT_TRUE(threadsafe_on_thread.can_read()); |
321 EXPECT_FALSE(threadsafe_on_thread.can_modify()); | 354 EXPECT_FALSE(threadsafe_on_thread.can_modify()); |
322 EXPECT_TRUE(image.CanRead()); | 355 EXPECT_TRUE(image.CanRead()); |
323 EXPECT_FALSE(image.CanModify()); | 356 EXPECT_FALSE(image.CanModify()); |
324 } | 357 } |
325 | 358 |
326 TEST(ImageSkiaTest, SourceOnThreadTest) { | 359 TEST_F(ImageSkiaTest, SourceOnThreadTest) { |
327 ImageSkia image(new DynamicSource(Size(100, 200)), Size(100, 200)); | 360 ImageSkia image(new DynamicSource(Size(100, 200)), Size(100, 200)); |
328 EXPECT_FALSE(image.IsThreadSafe()); | 361 EXPECT_FALSE(image.IsThreadSafe()); |
329 | 362 |
330 test::TestOnThread image_on_thread(&image); | 363 test::TestOnThread image_on_thread(&image); |
331 image_on_thread.StartAndJoin(); | 364 image_on_thread.StartAndJoin(); |
332 // an image that was never accessed on this thread can be | 365 // an image that was never accessed on this thread can be |
333 // read by other thread. | 366 // read by other thread. |
334 EXPECT_TRUE(image_on_thread.can_read()); | 367 EXPECT_TRUE(image_on_thread.can_read()); |
335 EXPECT_TRUE(image_on_thread.can_modify()); | 368 EXPECT_TRUE(image_on_thread.can_modify()); |
336 EXPECT_FALSE(image.CanRead()); | 369 EXPECT_FALSE(image.CanRead()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 EXPECT_TRUE(threadsafe_on_thread.can_read()); | 401 EXPECT_TRUE(threadsafe_on_thread.can_read()); |
369 EXPECT_FALSE(threadsafe_on_thread.can_modify()); | 402 EXPECT_FALSE(threadsafe_on_thread.can_modify()); |
370 EXPECT_TRUE(image.CanRead()); | 403 EXPECT_TRUE(image.CanRead()); |
371 EXPECT_FALSE(image.CanModify()); | 404 EXPECT_FALSE(image.CanModify()); |
372 } | 405 } |
373 #endif // ENABLE_NON_THREAD_SAFE | 406 #endif // ENABLE_NON_THREAD_SAFE |
374 | 407 |
375 // Just in case we ever get lumped together with other compilation units. | 408 // Just in case we ever get lumped together with other compilation units. |
376 #undef ENABLE_NON_THREAD_SAFE | 409 #undef ENABLE_NON_THREAD_SAFE |
377 | 410 |
378 TEST(ImageSkiaTest, Unscaled) { | 411 TEST_F(ImageSkiaTest, Unscaled) { |
379 SkBitmap bitmap; | 412 SkBitmap bitmap; |
380 | 413 |
381 // An ImageSkia created with 1x bitmap is unscaled. | 414 // An ImageSkia created with 1x bitmap is unscaled. |
382 ImageSkia image_skia = ImageSkia::CreateFrom1xBitmap(bitmap); | 415 ImageSkia image_skia = ImageSkia::CreateFrom1xBitmap(bitmap); |
383 EXPECT_TRUE(image_skia.GetRepresentation(1.0f).unscaled()); | 416 EXPECT_TRUE(image_skia.GetRepresentation(1.0f).unscaled()); |
384 ImageSkiaRep rep_2x(Size(100, 100), 2.0f); | 417 ImageSkiaRep rep_2x(Size(100, 100), 2.0f); |
385 | 418 |
386 // When reps for other scales are added, the unscaled image | 419 // When reps for other scales are added, the unscaled image |
387 // becomes scaled. | 420 // becomes scaled. |
388 image_skia.AddRepresentation(rep_2x); | 421 image_skia.AddRepresentation(rep_2x); |
389 EXPECT_FALSE(image_skia.GetRepresentation(1.0f).unscaled()); | 422 EXPECT_FALSE(image_skia.GetRepresentation(1.0f).unscaled()); |
390 EXPECT_FALSE(image_skia.GetRepresentation(2.0f).unscaled()); | 423 EXPECT_FALSE(image_skia.GetRepresentation(2.0f).unscaled()); |
391 } | 424 } |
392 | 425 |
| 426 TEST_F(ImageSkiaTest, ArbitraryScaleFactor) { |
| 427 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 428 switches::kAllowArbitraryScaleFactorInImageSkia); |
| 429 |
| 430 // Do not test if the ImageSkia doesn't support arbitrary scale factors. |
| 431 if (!ImageSkia::IsDSFScalingInImageSkiaEnabled()) |
| 432 return; |
| 433 |
| 434 // source is owned by |image| |
| 435 DynamicSource* source = new DynamicSource(Size(100, 200)); |
| 436 ImageSkia image(source, gfx::Size(100, 200)); |
| 437 |
| 438 image.GetRepresentation(1.5f); |
| 439 EXPECT_EQ(2.0f, source->GetLastRequestedScaleAndReset()); |
| 440 std::vector<ImageSkiaRep> image_reps = image.image_reps(); |
| 441 EXPECT_EQ(2u, image_reps.size()); |
| 442 |
| 443 std::vector<float> scale_factors; |
| 444 for (size_t i = 0; i < image_reps.size(); ++i) { |
| 445 scale_factors.push_back(image_reps[i].scale()); |
| 446 } |
| 447 std::sort(scale_factors.begin(), scale_factors.end()); |
| 448 EXPECT_EQ(1.5f, scale_factors[0]); |
| 449 EXPECT_EQ(2.0f, scale_factors[1]); |
| 450 |
| 451 // Requesting 1.75 scale factor also falls back to 2.0f and rescale. |
| 452 // However, the image already has the 2.0f data, so it won't fetch again. |
| 453 image.GetRepresentation(1.75f); |
| 454 EXPECT_EQ(0.0f, source->GetLastRequestedScaleAndReset()); |
| 455 image_reps = image.image_reps(); |
| 456 EXPECT_EQ(3u, image_reps.size()); |
| 457 |
| 458 scale_factors.clear(); |
| 459 for (size_t i = 0; i < image_reps.size(); ++i) { |
| 460 scale_factors.push_back(image_reps[i].scale()); |
| 461 } |
| 462 std::sort(scale_factors.begin(), scale_factors.end()); |
| 463 EXPECT_EQ(1.5f, scale_factors[0]); |
| 464 EXPECT_EQ(1.75f, scale_factors[1]); |
| 465 EXPECT_EQ(2.0f, scale_factors[2]); |
| 466 |
| 467 // 1.25 is falled back to 1.0. |
| 468 image.GetRepresentation(1.25f); |
| 469 EXPECT_EQ(1.0f, source->GetLastRequestedScaleAndReset()); |
| 470 image_reps = image.image_reps(); |
| 471 EXPECT_EQ(5u, image_reps.size()); |
| 472 |
| 473 // Scale factor less than 1.0f will be falled back to 1.0f |
| 474 image.GetRepresentation(0.75f); |
| 475 EXPECT_EQ(0.0f, source->GetLastRequestedScaleAndReset()); |
| 476 image_reps = image.image_reps(); |
| 477 EXPECT_EQ(6u, image_reps.size()); |
| 478 |
| 479 scale_factors.clear(); |
| 480 for (size_t i = 0; i < image_reps.size(); ++i) { |
| 481 scale_factors.push_back(image_reps[i].scale()); |
| 482 } |
| 483 std::sort(scale_factors.begin(), scale_factors.end()); |
| 484 EXPECT_EQ(0.75f, scale_factors[0]); |
| 485 EXPECT_EQ(1.0f, scale_factors[1]); |
| 486 EXPECT_EQ(1.25f, scale_factors[2]); |
| 487 EXPECT_EQ(1.5f, scale_factors[3]); |
| 488 EXPECT_EQ(1.75f, scale_factors[4]); |
| 489 EXPECT_EQ(2.0f, scale_factors[5]); |
| 490 |
| 491 // Scale factor greater than 2.0f is falled back to 2.0f because it's not |
| 492 // supported. |
| 493 image.GetRepresentation(3.0f); |
| 494 EXPECT_EQ(0.0f, source->GetLastRequestedScaleAndReset()); |
| 495 image_reps = image.image_reps(); |
| 496 EXPECT_EQ(7u, image_reps.size()); |
| 497 } |
| 498 |
| 499 TEST_F(ImageSkiaTest, ArbitraryScaleFactorWithMissingResource) { |
| 500 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 501 switches::kAllowArbitraryScaleFactorInImageSkia); |
| 502 |
| 503 // Do not test if the ImageSkia doesn't support arbitrary scale factors. |
| 504 if (!ImageSkia::IsDSFScalingInImageSkiaEnabled()) |
| 505 return; |
| 506 |
| 507 ImageSkia image(new FixedSource( |
| 508 ImageSkiaRep(Size(100, 200), 1.0f)), Size(100, 200)); |
| 509 |
| 510 // Requesting 1.5f -- falls back to 2.0f, but couldn't find. It should |
| 511 // look up 1.0f and then rescale it. |
| 512 const ImageSkiaRep& rep = image.GetRepresentation(1.5f); |
| 513 EXPECT_EQ(1.5f, rep.scale()); |
| 514 EXPECT_EQ(2U, image.image_reps().size()); |
| 515 EXPECT_EQ(1.0f, image.image_reps()[0].scale()); |
| 516 EXPECT_EQ(1.5f, image.image_reps()[1].scale()); |
| 517 } |
| 518 |
| 519 TEST_F(ImageSkiaTest, UnscaledImageForArbitraryScaleFactor) { |
| 520 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 521 switches::kAllowArbitraryScaleFactorInImageSkia); |
| 522 |
| 523 // Do not test if the ImageSkia doesn't support arbitrary scale factors. |
| 524 if (!ImageSkia::IsDSFScalingInImageSkiaEnabled()) |
| 525 return; |
| 526 |
| 527 // 0.0f means unscaled. |
| 528 ImageSkia image(new FixedSource( |
| 529 ImageSkiaRep(Size(100, 200), 0.0f)), Size(100, 200)); |
| 530 |
| 531 // Requesting 2.0f, which should return 1.0f unscaled image. |
| 532 const ImageSkiaRep& rep = image.GetRepresentation(2.0f); |
| 533 EXPECT_EQ(1.0f, rep.scale()); |
| 534 EXPECT_EQ("100x200", rep.pixel_size().ToString()); |
| 535 EXPECT_TRUE(rep.unscaled()); |
| 536 EXPECT_EQ(1U, image.image_reps().size()); |
| 537 |
| 538 // Same for any other scale factors. |
| 539 const ImageSkiaRep& rep15 = image.GetRepresentation(1.5f); |
| 540 EXPECT_EQ(1.0f, rep15.scale()); |
| 541 EXPECT_EQ("100x200", rep15.pixel_size().ToString()); |
| 542 EXPECT_TRUE(rep15.unscaled()); |
| 543 EXPECT_EQ(1U, image.image_reps().size()); |
| 544 |
| 545 const ImageSkiaRep& rep12 = image.GetRepresentation(1.2f); |
| 546 EXPECT_EQ(1.0f, rep12.scale()); |
| 547 EXPECT_EQ("100x200", rep12.pixel_size().ToString()); |
| 548 EXPECT_TRUE(rep12.unscaled()); |
| 549 EXPECT_EQ(1U, image.image_reps().size()); |
| 550 } |
| 551 |
393 } // namespace gfx | 552 } // namespace gfx |
OLD | NEW |