Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ui / gfx / image / image_unittest.cc
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 "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/gfx/image/image.h"
9 #include "ui/gfx/image/image_png_rep.h"
10 #include "ui/gfx/image/image_skia.h"
11 #include "ui/gfx/image/image_unittest_util.h"
12
13 #if defined(OS_IOS)
14 #include "base/mac/foundation_util.h"
15 #include "skia/ext/skia_utils_ios.h"
16 #elif defined(OS_MACOSX)
17 #include "base/mac/mac_util.h"
18 #include "skia/ext/skia_utils_mac.h"
19 #endif
20
21 namespace {
22
23 #if defined(OS_IOS) || defined(OS_MACOSX)
24 const bool kUsesSkiaNatively = false;
25 #else
26 const bool kUsesSkiaNatively = true;
27 #endif
28
29 class ImageTest : public testing::Test {
30  public:
31   ImageTest() {
32     std::vector<float> scales;
33     scales.push_back(1.0f);
34 #if !defined(OS_IOS)
35     scales.push_back(2.0f);
36 #endif
37     gfx::ImageSkia::SetSupportedScales(scales);
38   }
39 };
40
41 namespace gt = gfx::test;
42
43 TEST_F(ImageTest, EmptyImage) {
44   // Test the default constructor.
45   gfx::Image image;
46   EXPECT_EQ(0U, image.RepresentationCount());
47   EXPECT_TRUE(image.IsEmpty());
48   EXPECT_EQ(0, image.Width());
49   EXPECT_EQ(0, image.Height());
50
51   // Test the copy constructor.
52   gfx::Image imageCopy(image);
53   EXPECT_TRUE(imageCopy.IsEmpty());
54   EXPECT_EQ(0, imageCopy.Width());
55   EXPECT_EQ(0, imageCopy.Height());
56
57   // Test calling SwapRepresentations() with an empty image.
58   gfx::Image image2(gt::CreateImageSkia(25, 25));
59   EXPECT_FALSE(image2.IsEmpty());
60   EXPECT_EQ(25, image2.Width());
61   EXPECT_EQ(25, image2.Height());
62
63   image.SwapRepresentations(&image2);
64   EXPECT_FALSE(image.IsEmpty());
65   EXPECT_EQ(25, image.Width());
66   EXPECT_EQ(25, image.Height());
67   EXPECT_TRUE(image2.IsEmpty());
68   EXPECT_EQ(0, image2.Width());
69   EXPECT_EQ(0, image2.Height());
70 }
71
72 // Test constructing a gfx::Image from an empty PlatformImage.
73 TEST_F(ImageTest, EmptyImageFromEmptyPlatformImage) {
74 #if defined(OS_IOS) || defined(OS_MACOSX)
75   gfx::Image image1(NULL);
76   EXPECT_TRUE(image1.IsEmpty());
77   EXPECT_EQ(0, image1.Width());
78   EXPECT_EQ(0, image1.Height());
79   EXPECT_EQ(0U, image1.RepresentationCount());
80 #endif
81
82   // gfx::ImageSkia and gfx::ImagePNGRep are available on all platforms.
83   gfx::ImageSkia image_skia;
84   EXPECT_TRUE(image_skia.isNull());
85   gfx::Image image2(image_skia);
86   EXPECT_TRUE(image2.IsEmpty());
87   EXPECT_EQ(0, image2.Width());
88   EXPECT_EQ(0, image2.Height());
89   EXPECT_EQ(0U, image2.RepresentationCount());
90
91   std::vector<gfx::ImagePNGRep> image_png_reps;
92   gfx::Image image3(image_png_reps);
93   EXPECT_TRUE(image3.IsEmpty());
94   EXPECT_EQ(0, image3.Width());
95   EXPECT_EQ(0, image3.Height());
96   EXPECT_EQ(0U, image3.RepresentationCount());
97 }
98
99 // The resulting Image should be empty when it is created using obviously
100 // invalid data.
101 TEST_F(ImageTest, EmptyImageFromObviouslyInvalidPNGImage) {
102   std::vector<gfx::ImagePNGRep> image_png_reps1;
103   image_png_reps1.push_back(gfx::ImagePNGRep(NULL, 1.0f));
104   gfx::Image image1(image_png_reps1);
105   EXPECT_TRUE(image1.IsEmpty());
106   EXPECT_EQ(0U, image1.RepresentationCount());
107
108   std::vector<gfx::ImagePNGRep> image_png_reps2;
109   image_png_reps2.push_back(gfx::ImagePNGRep(
110       new base::RefCountedBytes(), 1.0f));
111   gfx::Image image2(image_png_reps2);
112   EXPECT_TRUE(image2.IsEmpty());
113   EXPECT_EQ(0U, image2.RepresentationCount());
114 }
115
116 // Test the Width, Height and Size of an empty and non-empty image.
117 TEST_F(ImageTest, ImageSize) {
118   gfx::Image image;
119   EXPECT_EQ(0, image.Width());
120   EXPECT_EQ(0, image.Height());
121   EXPECT_EQ(gfx::Size(0, 0), image.Size());
122
123   gfx::Image image2(gt::CreateImageSkia(10, 25));
124   EXPECT_EQ(10, image2.Width());
125   EXPECT_EQ(25, image2.Height());
126   EXPECT_EQ(gfx::Size(10, 25), image2.Size());
127 }
128
129 TEST_F(ImageTest, SkiaToSkia) {
130   gfx::Image image(gt::CreateImageSkia(25, 25));
131   EXPECT_EQ(25, image.Width());
132   EXPECT_EQ(25, image.Height());
133
134   // Test ToImageSkia().
135   const gfx::ImageSkia* image_skia1 = image.ToImageSkia();
136   EXPECT_TRUE(image_skia1);
137   EXPECT_FALSE(image_skia1->isNull());
138   EXPECT_EQ(1U, image.RepresentationCount());
139
140   // Make sure double conversion doesn't happen.
141   const gfx::ImageSkia* image_skia2 = image.ToImageSkia();
142   EXPECT_EQ(1U, image.RepresentationCount());
143
144   // ToImageSkia() should always return the same gfx::ImageSkia.
145   EXPECT_EQ(image_skia1, image_skia2);
146
147   // Test ToSkBitmap().
148   const SkBitmap* bitmap1 = image.ToSkBitmap();
149   const SkBitmap* bitmap2 = image.ToSkBitmap();
150   EXPECT_TRUE(bitmap1);
151   EXPECT_FALSE(bitmap1->isNull());
152   EXPECT_EQ(bitmap1, bitmap2);
153
154   EXPECT_EQ(1U, image.RepresentationCount());
155   EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepSkia));
156   if (!kUsesSkiaNatively)
157     EXPECT_FALSE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
158 }
159
160 TEST_F(ImageTest, EmptyImageToPNG) {
161   gfx::Image image;
162   scoped_refptr<base::RefCountedMemory> png_bytes = image.As1xPNGBytes();
163   EXPECT_TRUE(png_bytes.get());
164   EXPECT_FALSE(png_bytes->size());
165 }
166
167 // Check that getting the 1x PNG bytes from images which do not have a 1x
168 // representation returns NULL.
169 TEST_F(ImageTest, ImageNo1xToPNG) {
170   // Image with 2x only.
171   const int kSize2x = 50;
172   gfx::ImageSkia image_skia;
173   image_skia.AddRepresentation(gfx::ImageSkiaRep(gt::CreateBitmap(
174       kSize2x, kSize2x), 2.0f));
175   gfx::Image image1(image_skia);
176   scoped_refptr<base::RefCountedMemory> png_bytes1 = image1.As1xPNGBytes();
177   EXPECT_TRUE(png_bytes1.get());
178   EXPECT_FALSE(png_bytes1->size());
179
180   std::vector<gfx::ImagePNGRep> image_png_reps;
181   image_png_reps.push_back(gfx::ImagePNGRep(
182       gt::CreatePNGBytes(kSize2x), 2.0f));
183   gfx::Image image2(image_png_reps);
184   EXPECT_FALSE(image2.IsEmpty());
185   EXPECT_EQ(0, image2.Width());
186   EXPECT_EQ(0, image2.Height());
187   scoped_refptr<base::RefCountedMemory> png_bytes2 = image2.As1xPNGBytes();
188   EXPECT_TRUE(png_bytes2.get());
189   EXPECT_FALSE(png_bytes2->size());
190 }
191
192 // Check that for an image initialized with multi resolution PNG data,
193 // As1xPNGBytes() returns the 1x bytes.
194 TEST_F(ImageTest, CreateExtractPNGBytes) {
195   const int kSize1x = 25;
196   const int kSize2x = 50;
197
198   scoped_refptr<base::RefCountedMemory> bytes1x = gt::CreatePNGBytes(kSize1x);
199   std::vector<gfx::ImagePNGRep> image_png_reps;
200   image_png_reps.push_back(gfx::ImagePNGRep(bytes1x, 1.0f));
201   image_png_reps.push_back(gfx::ImagePNGRep(
202       gt::CreatePNGBytes(kSize2x), 2.0f));
203
204   gfx::Image image(image_png_reps);
205   EXPECT_FALSE(image.IsEmpty());
206   EXPECT_EQ(25, image.Width());
207   EXPECT_EQ(25, image.Height());
208
209   EXPECT_TRUE(std::equal(bytes1x->front(), bytes1x->front() + bytes1x->size(),
210                          image.As1xPNGBytes()->front()));
211 }
212
213 TEST_F(ImageTest, MultiResolutionImageSkiaToPNG) {
214   const int kSize1x = 25;
215   const int kSize2x = 50;
216
217   SkBitmap bitmap_1x = gt::CreateBitmap(kSize1x, kSize1x);
218   gfx::ImageSkia image_skia;
219   image_skia.AddRepresentation(gfx::ImageSkiaRep(bitmap_1x,
220                                                  1.0f));
221   image_skia.AddRepresentation(gfx::ImageSkiaRep(gt::CreateBitmap(
222       kSize2x, kSize2x), 2.0f));
223   gfx::Image image(image_skia);
224
225   EXPECT_TRUE(gt::IsEqual(image.As1xPNGBytes(), bitmap_1x));
226   EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepPNG));
227 }
228
229 TEST_F(ImageTest, MultiResolutionPNGToImageSkia) {
230   const int kSize1x = 25;
231   const int kSize2x = 50;
232
233   scoped_refptr<base::RefCountedMemory> bytes1x = gt::CreatePNGBytes(kSize1x);
234   scoped_refptr<base::RefCountedMemory> bytes2x = gt::CreatePNGBytes(kSize2x);
235
236   std::vector<gfx::ImagePNGRep> image_png_reps;
237   image_png_reps.push_back(gfx::ImagePNGRep(bytes1x, 1.0f));
238   image_png_reps.push_back(gfx::ImagePNGRep(bytes2x, 2.0f));
239   gfx::Image image(image_png_reps);
240
241   std::vector<float> scales;
242   scales.push_back(1.0f);
243   scales.push_back(2.0f);
244   gfx::ImageSkia image_skia = image.AsImageSkia();
245   EXPECT_TRUE(gt::IsEqual(bytes1x,
246       image_skia.GetRepresentation(1.0f).sk_bitmap()));
247   EXPECT_TRUE(gt::IsEqual(bytes2x,
248       image_skia.GetRepresentation(2.0f).sk_bitmap()));
249   EXPECT_TRUE(gt::ImageSkiaStructureMatches(image_skia, kSize1x, kSize1x,
250                                             scales));
251 #if !defined(OS_IOS)
252   // IOS does not support arbitrary scale factors.
253   gfx::ImageSkiaRep rep_1_6x = image_skia.GetRepresentation(1.6f);
254   ASSERT_FALSE(rep_1_6x.is_null());
255   ASSERT_EQ(1.6f, rep_1_6x.scale());
256   EXPECT_EQ("40x40", rep_1_6x.pixel_size().ToString());
257
258   gfx::ImageSkiaRep rep_0_8x = image_skia.GetRepresentation(0.8f);
259   ASSERT_FALSE(rep_0_8x.is_null());
260   ASSERT_EQ(0.8f, rep_0_8x.scale());
261   EXPECT_EQ("20x20", rep_0_8x.pixel_size().ToString());
262 #endif
263 }
264
265 TEST_F(ImageTest, MultiResolutionPNGToPlatform) {
266   const int kSize1x = 25;
267   const int kSize2x = 50;
268
269   scoped_refptr<base::RefCountedMemory> bytes1x = gt::CreatePNGBytes(kSize1x);
270   scoped_refptr<base::RefCountedMemory> bytes2x = gt::CreatePNGBytes(kSize2x);
271   std::vector<gfx::ImagePNGRep> image_png_reps;
272   image_png_reps.push_back(gfx::ImagePNGRep(bytes1x, 1.0f));
273   image_png_reps.push_back(gfx::ImagePNGRep(bytes2x, 2.0f));
274
275   gfx::Image from_png(image_png_reps);
276   gfx::Image from_platform(gt::CopyPlatformType(from_png));
277 #if defined(OS_IOS)
278   // On iOS the platform type (UIImage) only supports one resolution.
279   std::vector<float> scales = gfx::ImageSkia::GetSupportedScales();
280   EXPECT_EQ(scales.size(), 1U);
281   if (scales[0] == 1.0f)
282     EXPECT_TRUE(gt::IsEqual(bytes1x, from_platform.AsBitmap()));
283   else if (scales[0] == 2.0f)
284     EXPECT_TRUE(gt::IsEqual(bytes2x, from_platform.AsBitmap()));
285   else
286     ADD_FAILURE() << "Unexpected platform scale factor.";
287 #else
288   EXPECT_TRUE(gt::IsEqual(bytes1x, from_platform.AsBitmap()));
289 #endif  // defined(OS_IOS)
290 }
291
292
293 TEST_F(ImageTest, PlatformToPNGEncodeAndDecode) {
294   gfx::Image image(gt::CreatePlatformImage());
295   scoped_refptr<base::RefCountedMemory> png_data = image.As1xPNGBytes();
296   EXPECT_TRUE(png_data.get());
297   EXPECT_TRUE(png_data->size());
298   EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepPNG));
299
300   std::vector<gfx::ImagePNGRep> image_png_reps;
301   image_png_reps.push_back(gfx::ImagePNGRep(png_data, 1.0f));
302   gfx::Image from_png(image_png_reps);
303
304   EXPECT_TRUE(from_png.HasRepresentation(gfx::Image::kImageRepPNG));
305   EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(from_png)));
306 }
307
308 // The platform types use the platform provided encoding/decoding of PNGs. Make
309 // sure these work with the Skia Encode/Decode.
310 TEST_F(ImageTest, PNGEncodeFromSkiaDecodeToPlatform) {
311   // Force the conversion sequence skia to png to platform_type.
312   gfx::Image from_bitmap = gfx::Image::CreateFrom1xBitmap(
313       gt::CreateBitmap(25, 25));
314   scoped_refptr<base::RefCountedMemory> png_bytes =
315       from_bitmap.As1xPNGBytes();
316
317   std::vector<gfx::ImagePNGRep> image_png_reps;
318   image_png_reps.push_back(gfx::ImagePNGRep(png_bytes, 1.0f));
319   gfx::Image from_png(image_png_reps);
320
321   gfx::Image from_platform(gt::CopyPlatformType(from_png));
322
323   EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(from_platform)));
324   EXPECT_TRUE(gt::IsEqual(png_bytes, from_platform.AsBitmap()));
325 }
326
327 TEST_F(ImageTest, PNGEncodeFromPlatformDecodeToSkia) {
328   // Force the conversion sequence platform_type to png to skia.
329   gfx::Image from_platform(gt::CreatePlatformImage());
330   scoped_refptr<base::RefCountedMemory> png_bytes =
331       from_platform.As1xPNGBytes();
332   std::vector<gfx::ImagePNGRep> image_png_reps;
333   image_png_reps.push_back(gfx::ImagePNGRep(png_bytes, 1.0f));
334   gfx::Image from_png(image_png_reps);
335
336   EXPECT_TRUE(gt::IsEqual(from_platform.AsBitmap(), from_png.AsBitmap()));
337 }
338
339 TEST_F(ImageTest, PNGDecodeToSkiaFailure) {
340   scoped_refptr<base::RefCountedBytes> invalid_bytes(
341       new base::RefCountedBytes());
342   invalid_bytes->data().push_back('0');
343   std::vector<gfx::ImagePNGRep> image_png_reps;
344   image_png_reps.push_back(gfx::ImagePNGRep(
345       invalid_bytes, 1.0f));
346   gfx::Image image(image_png_reps);
347   gt::CheckImageIndicatesPNGDecodeFailure(image);
348 }
349
350 TEST_F(ImageTest, PNGDecodeToPlatformFailure) {
351   scoped_refptr<base::RefCountedBytes> invalid_bytes(
352       new base::RefCountedBytes());
353   invalid_bytes->data().push_back('0');
354   std::vector<gfx::ImagePNGRep> image_png_reps;
355   image_png_reps.push_back(gfx::ImagePNGRep(
356       invalid_bytes, 1.0f));
357   gfx::Image from_png(image_png_reps);
358   gfx::Image from_platform(gt::CopyPlatformType(from_png));
359   gt::CheckImageIndicatesPNGDecodeFailure(from_platform);
360 }
361
362 TEST_F(ImageTest, SkiaToPlatform) {
363   gfx::Image image(gt::CreateImageSkia(25, 25));
364   EXPECT_EQ(25, image.Width());
365   EXPECT_EQ(25, image.Height());
366   const size_t kRepCount = kUsesSkiaNatively ? 1U : 2U;
367
368   EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepSkia));
369   if (!kUsesSkiaNatively)
370     EXPECT_FALSE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
371
372   EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image)));
373   EXPECT_EQ(kRepCount, image.RepresentationCount());
374
375   const SkBitmap* bitmap = image.ToSkBitmap();
376   EXPECT_FALSE(bitmap->isNull());
377   EXPECT_EQ(kRepCount, image.RepresentationCount());
378
379   EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepSkia));
380   EXPECT_TRUE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
381   EXPECT_EQ(25, image.Width());
382   EXPECT_EQ(25, image.Height());
383 }
384
385 TEST_F(ImageTest, PlatformToSkia) {
386   gfx::Image image(gt::CreatePlatformImage());
387   EXPECT_EQ(25, image.Width());
388   EXPECT_EQ(25, image.Height());
389   const size_t kRepCount = kUsesSkiaNatively ? 1U : 2U;
390
391   EXPECT_TRUE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
392   if (!kUsesSkiaNatively)
393     EXPECT_FALSE(image.HasRepresentation(gfx::Image::kImageRepSkia));
394
395   const SkBitmap* bitmap = image.ToSkBitmap();
396   EXPECT_TRUE(bitmap);
397   EXPECT_FALSE(bitmap->isNull());
398   EXPECT_EQ(kRepCount, image.RepresentationCount());
399
400   EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image)));
401   EXPECT_EQ(kRepCount, image.RepresentationCount());
402
403   EXPECT_TRUE(image.HasRepresentation(gfx::Image::kImageRepSkia));
404   EXPECT_EQ(25, image.Width());
405   EXPECT_EQ(25, image.Height());
406 }
407
408 TEST_F(ImageTest, PlatformToPlatform) {
409   gfx::Image image(gt::CreatePlatformImage());
410   EXPECT_EQ(25, image.Width());
411   EXPECT_EQ(25, image.Height());
412   EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image)));
413   EXPECT_EQ(1U, image.RepresentationCount());
414
415   // Make sure double conversion doesn't happen.
416   EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image)));
417   EXPECT_EQ(1U, image.RepresentationCount());
418
419   EXPECT_TRUE(image.HasRepresentation(gt::GetPlatformRepresentationType()));
420   if (!kUsesSkiaNatively)
421     EXPECT_FALSE(image.HasRepresentation(gfx::Image::kImageRepSkia));
422   EXPECT_EQ(25, image.Width());
423   EXPECT_EQ(25, image.Height());
424 }
425
426 TEST_F(ImageTest, PlatformToSkiaToCopy) {
427   const gfx::ImageSkia* image_skia = NULL;
428   {
429     gfx::Image image(gt::CreatePlatformImage());
430     image_skia = image.CopyImageSkia();
431   }
432   EXPECT_TRUE(image_skia);
433   EXPECT_FALSE(image_skia->isNull());
434   delete image_skia;
435
436   const SkBitmap* bitmap = NULL;
437   {
438     gfx::Image image(gt::CreatePlatformImage());
439     bitmap = image.CopySkBitmap();
440   }
441
442   EXPECT_TRUE(bitmap);
443   EXPECT_FALSE(bitmap->isNull());
444   delete bitmap;
445 }
446
447 #if defined(OS_IOS)
448 TEST_F(ImageTest, SkiaToCocoaTouchCopy) {
449   UIImage* ui_image;
450
451   {
452     gfx::Image image(gt::CreateImageSkia(25, 25));
453     ui_image = image.CopyUIImage();
454   }
455
456   EXPECT_TRUE(ui_image);
457   base::mac::NSObjectRelease(ui_image);
458 }
459 #elif defined(OS_MACOSX)
460 TEST_F(ImageTest, SkiaToCocoaCopy) {
461   NSImage* ns_image;
462
463   {
464     gfx::Image image(gt::CreateImageSkia(25, 25));
465     ns_image = image.CopyNSImage();
466   }
467
468   EXPECT_TRUE(ns_image);
469   base::mac::NSObjectRelease(ns_image);
470 }
471 #endif
472
473 TEST_F(ImageTest, CheckSkiaColor) {
474   gfx::Image image(gt::CreatePlatformImage());
475
476   const SkBitmap* bitmap = image.ToSkBitmap();
477   SkAutoLockPixels auto_lock(*bitmap);
478   gt::CheckColors(bitmap->getColor(10, 10), SK_ColorGREEN);
479 }
480
481 TEST_F(ImageTest, SkBitmapConversionPreservesOrientation) {
482   const int width = 50;
483   const int height = 50;
484   SkBitmap bitmap;
485   bitmap.allocN32Pixels(width, height);
486   bitmap.eraseARGB(255, 0, 255, 0);
487
488   // Paint the upper half of the image in red (lower half is in green).
489   SkCanvas canvas(bitmap);
490   SkPaint red;
491   red.setColor(SK_ColorRED);
492   canvas.drawRect(SkRect::MakeWH(width, height / 2), red);
493   {
494     SCOPED_TRACE("Checking color of the initial SkBitmap");
495     gt::CheckColors(bitmap.getColor(10, 10), SK_ColorRED);
496     gt::CheckColors(bitmap.getColor(10, 40), SK_ColorGREEN);
497   }
498
499   // Convert from SkBitmap to a platform representation, then check the upper
500   // half of the platform image to make sure it is red, not green.
501   gfx::Image from_skbitmap = gfx::Image::CreateFrom1xBitmap(bitmap);
502   {
503     SCOPED_TRACE("Checking color of the platform image");
504     gt::CheckColors(
505         gt::GetPlatformImageColor(gt::ToPlatformType(from_skbitmap), 10, 10),
506         SK_ColorRED);
507     gt::CheckColors(
508         gt::GetPlatformImageColor(gt::ToPlatformType(from_skbitmap), 10, 40),
509         SK_ColorGREEN);
510   }
511
512   // Force a conversion back to SkBitmap and check that the upper half is red.
513   gfx::Image from_platform(gt::CopyPlatformType(from_skbitmap));
514   const SkBitmap* bitmap2 = from_platform.ToSkBitmap();
515   SkAutoLockPixels auto_lock(*bitmap2);
516   {
517     SCOPED_TRACE("Checking color after conversion back to SkBitmap");
518     gt::CheckColors(bitmap2->getColor(10, 10), SK_ColorRED);
519     gt::CheckColors(bitmap2->getColor(10, 40), SK_ColorGREEN);
520   }
521 }
522
523 TEST_F(ImageTest, SkBitmapConversionPreservesTransparency) {
524   const int width = 50;
525   const int height = 50;
526   SkBitmap bitmap;
527   bitmap.allocN32Pixels(width, height);
528   bitmap.eraseARGB(0, 0, 255, 0);
529
530   // Paint the upper half of the image in red (lower half is transparent).
531   SkCanvas canvas(bitmap);
532   SkPaint red;
533   red.setColor(SK_ColorRED);
534   canvas.drawRect(SkRect::MakeWH(width, height / 2), red);
535   {
536     SCOPED_TRACE("Checking color of the initial SkBitmap");
537     gt::CheckColors(bitmap.getColor(10, 10), SK_ColorRED);
538     gt::CheckIsTransparent(bitmap.getColor(10, 40));
539   }
540
541   // Convert from SkBitmap to a platform representation, then check the upper
542   // half of the platform image to make sure it is red, not green.
543   gfx::Image from_skbitmap = gfx::Image::CreateFrom1xBitmap(bitmap);
544   {
545     SCOPED_TRACE("Checking color of the platform image");
546     gt::CheckColors(
547         gt::GetPlatformImageColor(gt::ToPlatformType(from_skbitmap), 10, 10),
548         SK_ColorRED);
549     gt::CheckIsTransparent(
550         gt::GetPlatformImageColor(gt::ToPlatformType(from_skbitmap), 10, 40));
551   }
552
553   // Force a conversion back to SkBitmap and check that the upper half is red.
554   gfx::Image from_platform(gt::CopyPlatformType(from_skbitmap));
555   const SkBitmap* bitmap2 = from_platform.ToSkBitmap();
556   SkAutoLockPixels auto_lock(*bitmap2);
557   {
558     SCOPED_TRACE("Checking color after conversion back to SkBitmap");
559     gt::CheckColors(bitmap2->getColor(10, 10), SK_ColorRED);
560     gt::CheckIsTransparent(bitmap.getColor(10, 40));
561   }
562 }
563
564 TEST_F(ImageTest, SwapRepresentations) {
565   const size_t kRepCount = kUsesSkiaNatively ? 1U : 2U;
566
567   gfx::Image image1(gt::CreateImageSkia(25, 25));
568   const gfx::ImageSkia* image_skia1 = image1.ToImageSkia();
569   EXPECT_EQ(1U, image1.RepresentationCount());
570
571   gfx::Image image2(gt::CreatePlatformImage());
572   const gfx::ImageSkia* image_skia2 = image2.ToImageSkia();
573   gt::PlatformImage platform_image = gt::ToPlatformType(image2);
574   EXPECT_EQ(kRepCount, image2.RepresentationCount());
575
576   image1.SwapRepresentations(&image2);
577
578   EXPECT_EQ(image_skia2, image1.ToImageSkia());
579   EXPECT_TRUE(gt::PlatformImagesEqual(platform_image,
580                                       gt::ToPlatformType(image1)));
581   EXPECT_EQ(image_skia1, image2.ToImageSkia());
582   EXPECT_EQ(kRepCount, image1.RepresentationCount());
583   EXPECT_EQ(1U, image2.RepresentationCount());
584 }
585
586 TEST_F(ImageTest, Copy) {
587   const size_t kRepCount = kUsesSkiaNatively ? 1U : 2U;
588
589   gfx::Image image1(gt::CreateImageSkia(25, 25));
590   EXPECT_EQ(25, image1.Width());
591   EXPECT_EQ(25, image1.Height());
592   gfx::Image image2(image1);
593   EXPECT_EQ(25, image2.Width());
594   EXPECT_EQ(25, image2.Height());
595
596   EXPECT_EQ(1U, image1.RepresentationCount());
597   EXPECT_EQ(1U, image2.RepresentationCount());
598   EXPECT_EQ(image1.ToImageSkia(), image2.ToImageSkia());
599
600   EXPECT_TRUE(gt::IsPlatformImageValid(gt::ToPlatformType(image2)));
601   EXPECT_EQ(kRepCount, image2.RepresentationCount());
602   EXPECT_EQ(kRepCount, image1.RepresentationCount());
603 }
604
605 TEST_F(ImageTest, Assign) {
606   gfx::Image image1(gt::CreatePlatformImage());
607   EXPECT_EQ(25, image1.Width());
608   EXPECT_EQ(25, image1.Height());
609   // Assignment must be on a separate line to the declaration in order to test
610   // assignment operator (instead of copy constructor).
611   gfx::Image image2;
612   image2 = image1;
613   EXPECT_EQ(25, image2.Width());
614   EXPECT_EQ(25, image2.Height());
615
616   EXPECT_EQ(1U, image1.RepresentationCount());
617   EXPECT_EQ(1U, image2.RepresentationCount());
618   EXPECT_EQ(image1.ToSkBitmap(), image2.ToSkBitmap());
619 }
620
621 TEST_F(ImageTest, MultiResolutionImageSkia) {
622   const int kWidth1x = 10;
623   const int kHeight1x = 12;
624   const int kWidth2x = 20;
625   const int kHeight2x = 24;
626
627   gfx::ImageSkia image_skia;
628   image_skia.AddRepresentation(gfx::ImageSkiaRep(
629       gt::CreateBitmap(kWidth1x, kHeight1x),
630       1.0f));
631   image_skia.AddRepresentation(gfx::ImageSkiaRep(
632       gt::CreateBitmap(kWidth2x, kHeight2x),
633       2.0f));
634
635   std::vector<float> scales;
636   scales.push_back(1.0f);
637   scales.push_back(2.0f);
638   EXPECT_TRUE(gt::ImageSkiaStructureMatches(image_skia, kWidth1x, kHeight1x,
639                                             scales));
640
641   // Check that the image has a single representation.
642   gfx::Image image(image_skia);
643   EXPECT_EQ(1u, image.RepresentationCount());
644   EXPECT_EQ(kWidth1x, image.Width());
645   EXPECT_EQ(kHeight1x, image.Height());
646 }
647
648 TEST_F(ImageTest, RemoveFromMultiResolutionImageSkia) {
649   const int kWidth2x = 20;
650   const int kHeight2x = 24;
651
652   gfx::ImageSkia image_skia;
653
654   image_skia.AddRepresentation(gfx::ImageSkiaRep(
655       gt::CreateBitmap(kWidth2x, kHeight2x), 2.0f));
656   EXPECT_EQ(1u, image_skia.image_reps().size());
657
658   image_skia.RemoveRepresentation(1.0f);
659   EXPECT_EQ(1u, image_skia.image_reps().size());
660
661   image_skia.RemoveRepresentation(2.0f);
662   EXPECT_EQ(0u, image_skia.image_reps().size());
663 }
664
665 // Tests that gfx::Image does indeed take ownership of the SkBitmap it is
666 // passed.
667 TEST_F(ImageTest, OwnershipTest) {
668   gfx::Image image;
669   {
670     SkBitmap bitmap(gt::CreateBitmap(10, 10));
671     EXPECT_TRUE(!bitmap.isNull());
672     image = gfx::Image(gfx::ImageSkia(
673         gfx::ImageSkiaRep(bitmap, 1.0f)));
674   }
675   EXPECT_TRUE(!image.ToSkBitmap()->isNull());
676 }
677
678 // Integration tests with UI toolkit frameworks require linking against the
679 // Views library and cannot be here (ui_unittests doesn't include it). They
680 // instead live in /chrome/browser/ui/tests/ui_gfx_image_unittest.cc.
681
682 }  // namespace