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 683