Separate Simple Backend creation from initialization.
[chromium-blink-merge.git] / ui / gfx / image / image_unittest.cc
blob6d3c649643d311d9e528c4d9c43751c6a065b5c4
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.
5 #include "testing/gtest/include/gtest/gtest.h"
6 #include "third_party/skia/include/core/SkCanvas.h"
7 #include "third_party/skia/include/core/SkPaint.h"
8 #include "ui/base/layout.h"
9 #include "ui/gfx/image/image.h"
10 #include "ui/gfx/image/image_png_rep.h"
11 #include "ui/gfx/image/image_skia.h"
12 #include "ui/gfx/image/image_unittest_util.h"
14 #if defined(TOOLKIT_GTK)
15 #include <gtk/gtk.h>
16 #include "ui/gfx/gtk_util.h"
17 #elif defined(OS_IOS)
18 #include "base/mac/foundation_util.h"
19 #include "skia/ext/skia_utils_ios.h"
20 #elif defined(OS_MACOSX)
21 #include "base/mac/mac_util.h"
22 #include "skia/ext/skia_utils_mac.h"
23 #endif
25 namespace {
27 #if defined(TOOLKIT_VIEWS) || defined(OS_ANDROID)
28 const bool kUsesSkiaNatively = true;
29 #else
30 const bool kUsesSkiaNatively = false;
31 #endif
33 class ImageTest : public testing::Test {
36 namespace gt = gfx::test;
38 TEST_F(ImageTest, EmptyImage) {
39 // Test the default constructor.
40 gfx::Image image;
41 EXPECT_EQ(0U, image.RepresentationCount());
42 EXPECT_TRUE(image.IsEmpty());
43 EXPECT_EQ(0, image.Width());
44 EXPECT_EQ(0, image.Height());
46 // Test the copy constructor.
47 gfx::Image imageCopy(image);
48 EXPECT_TRUE(imageCopy.IsEmpty());
49 EXPECT_EQ(0, imageCopy.Width());
50 EXPECT_EQ(0, imageCopy.Height());
52 // Test calling SwapRepresentations() with an empty image.
53 gfx::Image image2(gt::CreateImageSkia(25, 25));
54 EXPECT_FALSE(image2.IsEmpty());
55 EXPECT_EQ(25, image2.Width());
56 EXPECT_EQ(25, image2.Height());
58 image.SwapRepresentations(&image2);
59 EXPECT_FALSE(image.IsEmpty());
60 EXPECT_EQ(25, image.Width());
61 EXPECT_EQ(25, image.Height());
62 EXPECT_TRUE(image2.IsEmpty());
63 EXPECT_EQ(0, image2.Width());
64 EXPECT_EQ(0, image2.Height());
67 // Test constructing a gfx::Image from an empty PlatformImage.
68 TEST_F(ImageTest, EmptyImageFromEmptyPlatformImage) {
69 #if defined(OS_IOS) || defined(OS_MACOSX) || defined(TOOLKIT_GTK)
70 gfx::Image image1(NULL);
71 EXPECT_TRUE(image1.IsEmpty());
72 EXPECT_EQ(0, image1.Width());
73 EXPECT_EQ(0, image1.Height());
74 EXPECT_EQ(0U, image1.RepresentationCount());
75 #endif
77 // gfx::ImageSkia and gfx::ImagePNGRep are available on all platforms.
78 gfx::ImageSkia image_skia;
79 EXPECT_TRUE(image_skia.isNull());
80 gfx::Image image2(image_skia);
81 EXPECT_TRUE(image2.IsEmpty());
82 EXPECT_EQ(0, image2.Width());
83 EXPECT_EQ(0, image2.Height());
84 EXPECT_EQ(0U, image2.RepresentationCount());
86 std::vector<gfx::ImagePNGRep> image_png_reps;
87 gfx::Image image3(image_png_reps);
88 EXPECT_TRUE(image3.IsEmpty());
89 EXPECT_EQ(0, image3.Width());
90 EXPECT_EQ(0, image3.Height());
91 EXPECT_EQ(0U, image3.RepresentationCount());
94 // The resulting Image should be empty when it is created using obviously
95 // invalid data.
96 TEST_F(ImageTest, EmptyImageFromObviouslyInvalidPNGImage) {
97 std::vector<gfx::ImagePNGRep> image_png_reps1;
98 image_png_reps1.push_back(gfx::ImagePNGRep(NULL, ui::SCALE_FACTOR_100P));
99 gfx::Image image1(image_png_reps1);
100 EXPECT_TRUE(image1.IsEmpty());
101 EXPECT_EQ(0U, image1.RepresentationCount());
103 std::vector<gfx::ImagePNGRep> image_png_reps2;
104 image_png_reps2.push_back(gfx::ImagePNGRep(
105 new base::RefCountedBytes(), ui::SCALE_FACTOR_100P));
106 gfx::Image image2(image_png_reps2);
107 EXPECT_TRUE(image2.IsEmpty());
108 EXPECT_EQ(0U, image2.RepresentationCount());
111 // Test the Width, Height and Size of an empty and non-empty image.
112 TEST_F(ImageTest, ImageSize) {
113 gfx::Image image;
114 EXPECT_EQ(0, image.Width());
115 EXPECT_EQ(0, image.Height());
116 EXPECT_EQ(gfx::Size(0, 0), image.Size());
118 gfx::Image image2(gt::CreateImageSkia(10, 25));
119 EXPECT_EQ(10, image2.Width());
120 EXPECT_EQ(25, image2.Height());
121 EXPECT_EQ(gfx::Size(10, 25), image2.Size());
124 TEST_F(ImageTest, SkiaToSkia) {
125 gfx::Image image(gt::CreateImageSkia(25, 25));
126 EXPECT_EQ(25, image.Width());
127 EXPECT_EQ(25, image.Height());
129 // Test ToImageSkia().
130 const gfx::ImageSkia* image_skia1 = image.ToImageSkia();
131 EXPECT_TRUE(image_skia1);
132 EXPECT_FALSE(image_skia1->isNull());
133 EXPECT_EQ(1U, image.RepresentationCount());
135 // Make sure double conversion doesn't happen.
136 const gfx::ImageSkia* image_skia2 = image.ToImageSkia();
137 EXPECT_EQ(1U, image.RepresentationCount());
139 // ToImageSkia() should always return the same gfx::ImageSkia.
140 EXPECT_EQ(image_skia1, image_skia2);
142 // Test ToSkBitmap().
143 const SkBitmap* bitmap1 = image.ToSkBitmap();
144 const SkBitmap* bitmap2 = image.ToSkBitmap();
145 EXPECT_TRUE(bitmap1);
146 EXPECT_FALSE(bitmap1->isNull());
147 EXPECT_EQ(bitmap1, bitmap2);
149 EXPECT_EQ(1U, image.RepresentationCount());
150 EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepSkia));
151 if (!kUsesSkiaNatively)
152 EXPECT_FALSE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
155 TEST_F(ImageTest, EmptyImageToPNG) {
156 gfx::Image image;
157 scoped_refptr<base::RefCountedMemory> png_bytes = image.As1xPNGBytes();
158 EXPECT_TRUE(png_bytes.get());
159 EXPECT_FALSE(png_bytes->size());
162 // Check that getting the 1x PNG bytes from images which do not have a 1x
163 // representation returns NULL.
164 TEST_F(ImageTest, ImageNo1xToPNG) {
165 // Image with 2x only.
166 const int kSize2x = 50;
167 gfx::ImageSkia image_skia;
168 image_skia.AddRepresentation(gfx::ImageSkiaRep(gt::CreateBitmap(
169 kSize2x, kSize2x), ui::SCALE_FACTOR_200P));
170 gfx::Image image1(image_skia);
171 scoped_refptr<base::RefCountedMemory> png_bytes1 = image1.As1xPNGBytes();
172 EXPECT_TRUE(png_bytes1.get());
173 EXPECT_FALSE(png_bytes1->size());
175 std::vector<gfx::ImagePNGRep> image_png_reps;
176 image_png_reps.push_back(gfx::ImagePNGRep(
177 gt::CreatePNGBytes(kSize2x), ui::SCALE_FACTOR_200P));
178 gfx::Image image2(image_png_reps);
179 EXPECT_FALSE(image2.IsEmpty());
180 EXPECT_EQ(0, image2.Width());
181 EXPECT_EQ(0, image2.Height());
182 scoped_refptr<base::RefCountedMemory> png_bytes2 = image2.As1xPNGBytes();
183 EXPECT_TRUE(png_bytes2.get());
184 EXPECT_FALSE(png_bytes2->size());
187 // Check that for an image initialized with multi resolution PNG data,
188 // As1xPNGBytes() returns the 1x bytes.
189 TEST_F(ImageTest, CreateExtractPNGBytes) {
190 const int kSize1x = 25;
191 const int kSize2x = 50;
193 scoped_refptr<base::RefCountedMemory> bytes1x = gt::CreatePNGBytes(kSize1x);
194 std::vector<gfx::ImagePNGRep> image_png_reps;
195 image_png_reps.push_back(gfx::ImagePNGRep(bytes1x, ui::SCALE_FACTOR_100P));
196 image_png_reps.push_back(gfx::ImagePNGRep(
197 gt::CreatePNGBytes(kSize2x), ui::SCALE_FACTOR_200P));
199 gfx::Image image(image_png_reps);
200 EXPECT_FALSE(image.IsEmpty());
201 EXPECT_EQ(25, image.Width());
202 EXPECT_EQ(25, image.Height());
204 EXPECT_TRUE(std::equal(bytes1x->front(), bytes1x->front() + bytes1x->size(),
205 image.As1xPNGBytes()->front()));
208 TEST_F(ImageTest, MultiResolutionImageSkiaToPNG) {
209 const int kSize1x = 25;
210 const int kSize2x = 50;
212 SkBitmap bitmap_1x = gt::CreateBitmap(kSize1x, kSize1x);
213 gfx::ImageSkia image_skia;
214 image_skia.AddRepresentation(gfx::ImageSkiaRep(bitmap_1x,
215 ui::SCALE_FACTOR_100P));
216 image_skia.AddRepresentation(gfx::ImageSkiaRep(gt::CreateBitmap(
217 kSize2x, kSize2x), ui::SCALE_FACTOR_200P));
218 gfx::Image image(image_skia);
220 EXPECT_TRUE(gt::IsEqual(image.As1xPNGBytes(), bitmap_1x));
221 EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepPNG));
224 TEST_F(ImageTest, MultiResolutionPNGToImageSkia) {
225 const int kSize1x = 25;
226 const int kSize2x = 50;
228 scoped_refptr<base::RefCountedMemory> bytes1x = gt::CreatePNGBytes(kSize1x);
229 scoped_refptr<base::RefCountedMemory> bytes2x = gt::CreatePNGBytes(kSize2x);
231 std::vector<gfx::ImagePNGRep> image_png_reps;
232 image_png_reps.push_back(gfx::ImagePNGRep(bytes1x, ui::SCALE_FACTOR_100P));
233 image_png_reps.push_back(gfx::ImagePNGRep(bytes2x, ui::SCALE_FACTOR_200P));
234 gfx::Image image(image_png_reps);
236 std::vector<ui::ScaleFactor> scale_factors;
237 scale_factors.push_back(ui::SCALE_FACTOR_100P);
238 scale_factors.push_back(ui::SCALE_FACTOR_200P);
239 gfx::ImageSkia image_skia = image.AsImageSkia();
240 EXPECT_TRUE(gt::ImageSkiaStructureMatches(image_skia, kSize1x, kSize1x,
241 scale_factors));
242 EXPECT_TRUE(gt::IsEqual(bytes1x,
243 image_skia.GetRepresentation(ui::SCALE_FACTOR_100P).sk_bitmap()));
244 EXPECT_TRUE(gt::IsEqual(bytes2x,
245 image_skia.GetRepresentation(ui::SCALE_FACTOR_200P).sk_bitmap()));
248 TEST_F(ImageTest, MultiResolutionPNGToPlatform) {
249 const int kSize1x = 25;
250 const int kSize2x = 50;
252 scoped_refptr<base::RefCountedMemory> bytes1x = gt::CreatePNGBytes(kSize1x);
253 scoped_refptr<base::RefCountedMemory> bytes2x = gt::CreatePNGBytes(kSize2x);
254 std::vector<gfx::ImagePNGRep> image_png_reps;
255 image_png_reps.push_back(gfx::ImagePNGRep(bytes1x, ui::SCALE_FACTOR_100P));
256 image_png_reps.push_back(gfx::ImagePNGRep(bytes2x, ui::SCALE_FACTOR_200P));
258 gfx::Image from_png(image_png_reps);
259 gfx::Image from_platform(gt::CopyPlatformType(from_png));
260 #if defined(OS_IOS)
261 // On iOS the platform type (UIImage) only supports one resolution.
262 std::vector<ui::ScaleFactor> scale_factors = ui::GetSupportedScaleFactors();
263 EXPECT_EQ(scale_factors.size(), 1U);
264 if (scale_factors[0] == ui::SCALE_FACTOR_100P)
265 EXPECT_TRUE(gt::IsEqual(bytes1x, from_platform.AsBitmap()));
266 else if (scale_factors[0] == ui::SCALE_FACTOR_200P)
267 EXPECT_TRUE(gt::IsEqual(bytes2x, from_platform.AsBitmap()));
268 else
269 ADD_FAILURE() << "Unexpected platform scale factor.";
270 #else
271 EXPECT_TRUE(gt::IsEqual(bytes1x, from_platform.AsBitmap()));
272 #endif // defined(OS_IOS)
276 TEST_F(ImageTest, PlatformToPNGEncodeAndDecode) {
277 gfx::Image image(gt::CreatePlatformImage());
278 scoped_refptr<base::RefCountedMemory> png_data = image.As1xPNGBytes();
279 EXPECT_TRUE(png_data.get());
280 EXPECT_TRUE(png_data->size());
281 EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepPNG));
283 std::vector<gfx::ImagePNGRep> image_png_reps;
284 image_png_reps.push_back(gfx::ImagePNGRep(png_data, ui::SCALE_FACTOR_100P));
285 gfx::Image from_png(image_png_reps);
287 EXPECT_TRUE(from_png.HasRepresentation(gfx::Image::kImageRepPNG));
288 EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(from_png)));
291 // The platform types use the platform provided encoding/decoding of PNGs. Make
292 // sure these work with the Skia Encode/Decode.
293 TEST_F(ImageTest, PNGEncodeFromSkiaDecodeToPlatform) {
294 // Force the conversion sequence skia to png to platform_type.
295 ui::ScaleFactor ideal_scale_factor = ui::GetScaleFactorFromScale(1.0f);
297 gfx::Image from_bitmap = gfx::Image::CreateFrom1xBitmap(
298 gt::CreateBitmap(25, 25));
299 scoped_refptr<base::RefCountedMemory> png_bytes =
300 from_bitmap.As1xPNGBytes();
302 std::vector<gfx::ImagePNGRep> image_png_reps;
303 image_png_reps.push_back(gfx::ImagePNGRep(png_bytes, ideal_scale_factor));
304 gfx::Image from_png(image_png_reps);
306 gfx::Image from_platform(gt::CopyPlatformType(from_png));
308 EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(from_platform)));
309 EXPECT_TRUE(gt::IsEqual(png_bytes, from_platform.AsBitmap()));
312 TEST_F(ImageTest, PNGEncodeFromPlatformDecodeToSkia) {
313 // Force the conversion sequence platform_type to png to skia.
314 gfx::Image from_platform(gt::CreatePlatformImage());
315 scoped_refptr<base::RefCountedMemory> png_bytes =
316 from_platform.As1xPNGBytes();
317 std::vector<gfx::ImagePNGRep> image_png_reps;
318 image_png_reps.push_back(gfx::ImagePNGRep(png_bytes, ui::SCALE_FACTOR_100P));
319 gfx::Image from_png(image_png_reps);
321 EXPECT_TRUE(gt::IsEqual(from_platform.AsBitmap(), from_png.AsBitmap()));
324 TEST_F(ImageTest, PNGDecodeToSkiaFailure) {
325 scoped_refptr<base::RefCountedBytes> invalid_bytes(
326 new base::RefCountedBytes());
327 invalid_bytes->data().push_back('0');
328 std::vector<gfx::ImagePNGRep> image_png_reps;
329 image_png_reps.push_back(gfx::ImagePNGRep(
330 invalid_bytes, ui::SCALE_FACTOR_100P));
331 gfx::Image image(image_png_reps);
332 gt::CheckImageIndicatesPNGDecodeFailure(image);
335 TEST_F(ImageTest, PNGDecodeToPlatformFailure) {
336 scoped_refptr<base::RefCountedBytes> invalid_bytes(
337 new base::RefCountedBytes());
338 invalid_bytes->data().push_back('0');
339 std::vector<gfx::ImagePNGRep> image_png_reps;
340 image_png_reps.push_back(gfx::ImagePNGRep(
341 invalid_bytes, ui::SCALE_FACTOR_100P));
342 gfx::Image from_png(image_png_reps);
343 gfx::Image from_platform(gt::CopyPlatformType(from_png));
344 gt::CheckImageIndicatesPNGDecodeFailure(from_platform);
347 TEST_F(ImageTest, SkiaToPlatform) {
348 gfx::Image image(gt::CreateImageSkia(25, 25));
349 EXPECT_EQ(25, image.Width());
350 EXPECT_EQ(25, image.Height());
351 const size_t kRepCount = kUsesSkiaNatively ? 1U : 2U;
353 EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepSkia));
354 if (!kUsesSkiaNatively)
355 EXPECT_FALSE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
357 EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image)));
358 EXPECT_EQ(kRepCount, image.RepresentationCount());
360 const SkBitmap* bitmap = image.ToSkBitmap();
361 EXPECT_FALSE(bitmap->isNull());
362 EXPECT_EQ(kRepCount, image.RepresentationCount());
364 EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepSkia));
365 EXPECT_TRUE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
366 EXPECT_EQ(25, image.Width());
367 EXPECT_EQ(25, image.Height());
370 TEST_F(ImageTest, PlatformToSkia) {
371 gfx::Image image(gt::CreatePlatformImage());
372 EXPECT_EQ(25, image.Width());
373 EXPECT_EQ(25, image.Height());
374 const size_t kRepCount = kUsesSkiaNatively ? 1U : 2U;
376 EXPECT_TRUE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
377 if (!kUsesSkiaNatively)
378 EXPECT_FALSE(image.HasRepresentation(gfx::Image::kImageRepSkia));
380 const SkBitmap* bitmap = image.ToSkBitmap();
381 EXPECT_TRUE(bitmap);
382 EXPECT_FALSE(bitmap->isNull());
383 EXPECT_EQ(kRepCount, image.RepresentationCount());
385 EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image)));
386 EXPECT_EQ(kRepCount, image.RepresentationCount());
388 EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepSkia));
389 EXPECT_EQ(25, image.Width());
390 EXPECT_EQ(25, image.Height());
393 TEST_F(ImageTest, PlatformToPlatform) {
394 gfx::Image image(gt::CreatePlatformImage());
395 EXPECT_EQ(25, image.Width());
396 EXPECT_EQ(25, image.Height());
397 EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image)));
398 EXPECT_EQ(1U, image.RepresentationCount());
400 // Make sure double conversion doesn't happen.
401 EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image)));
402 EXPECT_EQ(1U, image.RepresentationCount());
404 EXPECT_TRUE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
405 if (!kUsesSkiaNatively)
406 EXPECT_FALSE(image.HasRepresentation(gfx::Image::kImageRepSkia));
407 EXPECT_EQ(25, image.Width());
408 EXPECT_EQ(25, image.Height());
411 TEST_F(ImageTest, PlatformToSkiaToCopy) {
412 const gfx::ImageSkia* image_skia = NULL;
414 gfx::Image image(gt::CreatePlatformImage());
415 image_skia = image.CopyImageSkia();
417 EXPECT_TRUE(image_skia);
418 EXPECT_FALSE(image_skia->isNull());
419 delete image_skia;
421 const SkBitmap* bitmap = NULL;
423 gfx::Image image(gt::CreatePlatformImage());
424 bitmap = image.CopySkBitmap();
427 EXPECT_TRUE(bitmap);
428 EXPECT_FALSE(bitmap->isNull());
429 delete bitmap;
432 #if defined(TOOLKIT_GTK)
433 TEST_F(ImageTest, SkiaToGdkCopy) {
434 GdkPixbuf* pixbuf;
437 gfx::Image image(gt::CreateImageSkia(25, 25));
438 pixbuf = image.CopyGdkPixbuf();
441 EXPECT_TRUE(pixbuf);
442 g_object_unref(pixbuf);
445 TEST_F(ImageTest, SkiaToCairoCreatesGdk) {
446 gfx::Image image(gt::CreateImageSkia(25, 25));
447 EXPECT_FALSE(image.HasRepresentation(gfx::Image::kImageRepGdk));
448 EXPECT_TRUE(image.ToCairo());
449 EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepGdk));
451 #endif
453 #if defined(OS_IOS)
454 TEST_F(ImageTest, SkiaToCocoaTouchCopy) {
455 UIImage* ui_image;
458 gfx::Image image(gt::CreateImageSkia(25, 25));
459 ui_image = image.CopyUIImage();
462 EXPECT_TRUE(ui_image);
463 base::mac::NSObjectRelease(ui_image);
465 #elif defined(OS_MACOSX)
466 TEST_F(ImageTest, SkiaToCocoaCopy) {
467 NSImage* ns_image;
470 gfx::Image image(gt::CreateImageSkia(25, 25));
471 ns_image = image.CopyNSImage();
474 EXPECT_TRUE(ns_image);
475 base::mac::NSObjectRelease(ns_image);
477 #endif
479 TEST_F(ImageTest, CheckSkiaColor) {
480 gfx::Image image(gt::CreatePlatformImage());
482 const SkBitmap* bitmap = image.ToSkBitmap();
483 SkAutoLockPixels auto_lock(*bitmap);
484 gt::CheckColors(bitmap->getColor(10, 10), SK_ColorGREEN);
487 TEST_F(ImageTest, SkBitmapConversionPreservesOrientation) {
488 const int width = 50;
489 const int height = 50;
490 SkBitmap bitmap;
491 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
492 bitmap.allocPixels();
493 bitmap.eraseRGB(0, 255, 0);
495 // Paint the upper half of the image in red (lower half is in green).
496 SkCanvas canvas(bitmap);
497 SkPaint red;
498 red.setColor(SK_ColorRED);
499 canvas.drawRect(SkRect::MakeWH(width, height / 2), red);
501 SCOPED_TRACE("Checking color of the initial SkBitmap");
502 gt::CheckColors(bitmap.getColor(10, 10), SK_ColorRED);
503 gt::CheckColors(bitmap.getColor(10, 40), SK_ColorGREEN);
506 // Convert from SkBitmap to a platform representation, then check the upper
507 // half of the platform image to make sure it is red, not green.
508 gfx::Image from_skbitmap = gfx::Image::CreateFrom1xBitmap(bitmap);
510 SCOPED_TRACE("Checking color of the platform image");
511 gt::CheckColors(
512 gt::GetPlatformImageColor(gt::ToPlatformType(from_skbitmap), 10, 10),
513 SK_ColorRED);
514 gt::CheckColors(
515 gt::GetPlatformImageColor(gt::ToPlatformType(from_skbitmap), 10, 40),
516 SK_ColorGREEN);
519 // Force a conversion back to SkBitmap and check that the upper half is red.
520 gfx::Image from_platform(gt::CopyPlatformType(from_skbitmap));
521 const SkBitmap* bitmap2 = from_platform.ToSkBitmap();
522 SkAutoLockPixels auto_lock(*bitmap2);
524 SCOPED_TRACE("Checking color after conversion back to SkBitmap");
525 gt::CheckColors(bitmap2->getColor(10, 10), SK_ColorRED);
526 gt::CheckColors(bitmap2->getColor(10, 40), SK_ColorGREEN);
530 TEST_F(ImageTest, SkBitmapConversionPreservesTransparency) {
531 const int width = 50;
532 const int height = 50;
533 SkBitmap bitmap;
534 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
535 bitmap.allocPixels();
536 bitmap.setIsOpaque(false);
537 bitmap.eraseARGB(0, 0, 255, 0);
539 // Paint the upper half of the image in red (lower half is transparent).
540 SkCanvas canvas(bitmap);
541 SkPaint red;
542 red.setColor(SK_ColorRED);
543 canvas.drawRect(SkRect::MakeWH(width, height / 2), red);
545 SCOPED_TRACE("Checking color of the initial SkBitmap");
546 gt::CheckColors(bitmap.getColor(10, 10), SK_ColorRED);
547 gt::CheckIsTransparent(bitmap.getColor(10, 40));
550 // Convert from SkBitmap to a platform representation, then check the upper
551 // half of the platform image to make sure it is red, not green.
552 gfx::Image from_skbitmap = gfx::Image::CreateFrom1xBitmap(bitmap);
554 SCOPED_TRACE("Checking color of the platform image");
555 gt::CheckColors(
556 gt::GetPlatformImageColor(gt::ToPlatformType(from_skbitmap), 10, 10),
557 SK_ColorRED);
558 gt::CheckIsTransparent(
559 gt::GetPlatformImageColor(gt::ToPlatformType(from_skbitmap), 10, 40));
562 // Force a conversion back to SkBitmap and check that the upper half is red.
563 gfx::Image from_platform(gt::CopyPlatformType(from_skbitmap));
564 const SkBitmap* bitmap2 = from_platform.ToSkBitmap();
565 SkAutoLockPixels auto_lock(*bitmap2);
567 SCOPED_TRACE("Checking color after conversion back to SkBitmap");
568 gt::CheckColors(bitmap2->getColor(10, 10), SK_ColorRED);
569 gt::CheckIsTransparent(bitmap.getColor(10, 40));
573 TEST_F(ImageTest, SwapRepresentations) {
574 const size_t kRepCount = kUsesSkiaNatively ? 1U : 2U;
576 gfx::Image image1(gt::CreateImageSkia(25, 25));
577 const gfx::ImageSkia* image_skia1 = image1.ToImageSkia();
578 EXPECT_EQ(1U, image1.RepresentationCount());
580 gfx::Image image2(gt::CreatePlatformImage());
581 const gfx::ImageSkia* image_skia2 = image2.ToImageSkia();
582 gt::PlatformImage platform_image = gt::ToPlatformType(image2);
583 EXPECT_EQ(kRepCount, image2.RepresentationCount());
585 image1.SwapRepresentations(&image2);
587 EXPECT_EQ(image_skia2, image1.ToImageSkia());
588 EXPECT_TRUE(gt::PlatformImagesEqual(platform_image,
589 gt::ToPlatformType(image1)));
590 EXPECT_EQ(image_skia1, image2.ToImageSkia());
591 EXPECT_EQ(kRepCount, image1.RepresentationCount());
592 EXPECT_EQ(1U, image2.RepresentationCount());
595 TEST_F(ImageTest, Copy) {
596 const size_t kRepCount = kUsesSkiaNatively ? 1U : 2U;
598 gfx::Image image1(gt::CreateImageSkia(25, 25));
599 EXPECT_EQ(25, image1.Width());
600 EXPECT_EQ(25, image1.Height());
601 gfx::Image image2(image1);
602 EXPECT_EQ(25, image2.Width());
603 EXPECT_EQ(25, image2.Height());
605 EXPECT_EQ(1U, image1.RepresentationCount());
606 EXPECT_EQ(1U, image2.RepresentationCount());
607 EXPECT_EQ(image1.ToImageSkia(), image2.ToImageSkia());
609 EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image2)));
610 EXPECT_EQ(kRepCount, image2.RepresentationCount());
611 EXPECT_EQ(kRepCount, image1.RepresentationCount());
614 TEST_F(ImageTest, Assign) {
615 gfx::Image image1(gt::CreatePlatformImage());
616 EXPECT_EQ(25, image1.Width());
617 EXPECT_EQ(25, image1.Height());
618 // Assignment must be on a separate line to the declaration in order to test
619 // assignment operator (instead of copy constructor).
620 gfx::Image image2;
621 image2 = image1;
622 EXPECT_EQ(25, image2.Width());
623 EXPECT_EQ(25, image2.Height());
625 EXPECT_EQ(1U, image1.RepresentationCount());
626 EXPECT_EQ(1U, image2.RepresentationCount());
627 EXPECT_EQ(image1.ToSkBitmap(), image2.ToSkBitmap());
630 TEST_F(ImageTest, MultiResolutionImageSkia) {
631 const int kWidth1x = 10;
632 const int kHeight1x = 12;
633 const int kWidth2x = 20;
634 const int kHeight2x = 24;
636 gfx::ImageSkia image_skia;
637 image_skia.AddRepresentation(gfx::ImageSkiaRep(
638 gt::CreateBitmap(kWidth1x, kHeight1x),
639 ui::SCALE_FACTOR_100P));
640 image_skia.AddRepresentation(gfx::ImageSkiaRep(
641 gt::CreateBitmap(kWidth2x, kHeight2x),
642 ui::SCALE_FACTOR_200P));
644 std::vector<ui::ScaleFactor> scale_factors;
645 scale_factors.push_back(ui::SCALE_FACTOR_100P);
646 scale_factors.push_back(ui::SCALE_FACTOR_200P);
647 EXPECT_TRUE(gt::ImageSkiaStructureMatches(image_skia, kWidth1x, kHeight1x,
648 scale_factors));
650 // Check that the image has a single representation.
651 gfx::Image image(image_skia);
652 EXPECT_EQ(1u, image.RepresentationCount());
653 EXPECT_EQ(kWidth1x, image.Width());
654 EXPECT_EQ(kHeight1x, image.Height());
657 TEST_F(ImageTest, RemoveFromMultiResolutionImageSkia) {
658 const int kWidth2x = 20;
659 const int kHeight2x = 24;
661 gfx::ImageSkia image_skia;
663 image_skia.AddRepresentation(gfx::ImageSkiaRep(
664 gt::CreateBitmap(kWidth2x, kHeight2x), ui::SCALE_FACTOR_200P));
665 EXPECT_EQ(1u, image_skia.image_reps().size());
667 image_skia.RemoveRepresentation(ui::SCALE_FACTOR_100P);
668 EXPECT_EQ(1u, image_skia.image_reps().size());
670 image_skia.RemoveRepresentation(ui::SCALE_FACTOR_200P);
671 EXPECT_EQ(0u, image_skia.image_reps().size());
674 // Tests that gfx::Image does indeed take ownership of the SkBitmap it is
675 // passed.
676 TEST_F(ImageTest, OwnershipTest) {
677 gfx::Image image;
679 SkBitmap bitmap(gt::CreateBitmap(10, 10));
680 EXPECT_TRUE(!bitmap.isNull());
681 image = gfx::Image(gfx::ImageSkia(
682 gfx::ImageSkiaRep(bitmap, ui::SCALE_FACTOR_100P)));
684 EXPECT_TRUE(!image.ToSkBitmap()->isNull());
687 // Integration tests with UI toolkit frameworks require linking against the
688 // Views library and cannot be here (ui_unittests doesn't include it). They
689 // instead live in /chrome/browser/ui/tests/ui_gfx_image_unittest.cc.
691 } // namespace