15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Because the unit tests for gfx::Image are spread across multiple 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation files, this header contains the reusable components. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_unittest_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cmath> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/codec/png_codec.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_IOS) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/foundation_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_cftyperef.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/skia_utils_ios.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/mac_util.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/skia_utils_mac.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ColorComponentsClose(SkColor component1, SkColor component2) { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int c1 = static_cast<int>(component1); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int c2 = static_cast<int>(component2); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::abs(c1 - c2) <= 40; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ColorsClose(SkColor color1, SkColor color2) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Be tolerant of floating point rounding and lossy color space conversions. 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ColorComponentsClose(SkColorGetR(color1), SkColorGetR(color2)) && 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ColorComponentsClose(SkColorGetG(color1), SkColorGetG(color2)) && 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ColorComponentsClose(SkColorGetB(color1), SkColorGetB(color2)) && 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ColorComponentsClose(SkColorGetA(color1), SkColorGetA(color2)); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::vector<float> Get1xAnd2xScales() { 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<float> scales; 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scales.push_back(1.0f); 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scales.push_back(2.0f); 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return scales; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkBitmap CreateBitmap(int width, int height) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bitmap; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bitmap.allocN32Pixels(width, height); 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bitmap.eraseARGB(255, 0, 255, 0); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bitmap; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::ImageSkia CreateImageSkia(int width, int height) { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::ImageSkia::CreateFrom1xBitmap(CreateBitmap(width, height)); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<base::RefCountedMemory> CreatePNGBytes(int edge_size) { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap bitmap = CreateBitmap(edge_size, edge_size); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes()); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PNGCodec::EncodeBGRASkBitmap(bitmap, false, &bytes->data()); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bytes; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Image CreateImage() { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateImage(100, 50); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Image CreateImage(int width, int height) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Image::CreateFrom1xBitmap(CreateBitmap(width, height)); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsEqual(const gfx::Image& img1, const gfx::Image& img2) { 826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) img1.AsImageSkia().EnsureRepsForSupportedScales(); 836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) img2.AsImageSkia().EnsureRepsForSupportedScales(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<gfx::ImageSkiaRep> img1_reps = img1.AsImageSkia().image_reps(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia image_skia2 = img2.AsImageSkia(); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (image_skia2.image_reps().size() != img1_reps.size()) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < img1_reps.size(); ++i) { 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) float scale = img1_reps[i].scale(); 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::ImageSkiaRep& image_rep2 = image_skia2.GetRepresentation(scale); 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (image_rep2.scale() != scale || 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !IsEqual(img1_reps[i].sk_bitmap(), image_rep2.sk_bitmap())) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsEqual(const SkBitmap& bmp1, const SkBitmap& bmp2) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (bmp1.isNull() && bmp2.isNull()) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bmp1.width() != bmp2.width() || 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bmp1.height() != bmp2.height() || 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bmp1.colorType() != kN32_SkColorType || 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bmp2.colorType() != kN32_SkColorType) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkAutoLockPixels lock1(bmp1); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkAutoLockPixels lock2(bmp2); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bmp1.getPixels() || !bmp2.getPixels()) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < bmp1.height(); ++y) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < bmp1.width(); ++x) { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ColorsClose(bmp1.getColor(x,y), bmp2.getColor(x,y))) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsEqual(const scoped_refptr<base::RefCountedMemory>& bytes, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkBitmap& bitmap) { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap decoded; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!bytes.get() || 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !PNGCodec::Decode(bytes->front(), bytes->size(), &decoded)) { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bitmap.isNull(); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IsEqual(bitmap, decoded); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckImageIndicatesPNGDecodeFailure(const gfx::Image& image) { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap bitmap = image.AsBitmap(); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(bitmap.isNull()); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(16, bitmap.width()); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(16, bitmap.height()); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkAutoLockPixels auto_lock(bitmap); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckColors(bitmap.getColor(10, 10), SK_ColorRED); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ImageSkiaStructureMatches( 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::ImageSkia& image_skia, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int width, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int height, 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::vector<float>& scales) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (image_skia.isNull() || 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_skia.width() != width || 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_skia.height() != height || 15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) image_skia.image_reps().size() != scales.size()) { 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (size_t i = 0; i < scales.size(); ++i) { 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkiaRep image_rep = 16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) image_skia.GetRepresentation(scales[i]); 16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (image_rep.is_null() || image_rep.scale() != scales[i]) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (image_rep.pixel_width() != static_cast<int>(width * scales[i]) || 16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) image_rep.pixel_height() != static_cast<int>(height * scales[i])) { 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsEmpty(const gfx::Image& image) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap& bmp = *image.ToSkBitmap(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bmp.isNull() || 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (bmp.width() == 0 && bmp.height() == 0); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformImage CreatePlatformImage() { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap bitmap(CreateBitmap(25, 25)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) float scale = ImageSkia::GetMaxSupportedScale(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::ScopedCFTypeRef<CGColorSpaceRef> color_space( 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CGColorSpaceCreateDeviceRGB()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UIImage* image = 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::SkBitmapToUIImageWithColorSpace(bitmap, scale, color_space); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRetain(image); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NSImage* image = gfx::SkBitmapToNSImage(bitmap); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::NSObjectRetain(image); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::ImageSkia::CreateFrom1xBitmap(bitmap); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Image::RepresentationType GetPlatformRepresentationType() { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Image::kImageRepCocoaTouch; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Image::kImageRepCocoa; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Image::kImageRepSkia; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformImage ToPlatformType(const gfx::Image& image) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image.ToUIImage(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image.ToNSImage(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return image.AsImageSkia(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformImage CopyPlatformType(const gfx::Image& image) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image.CopyUIImage(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image.CopyNSImage(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return image.AsImageSkia(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defined in image_unittest_util_mac.mm. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor GetPlatformImageColor(PlatformImage image, int x, int y) { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap bitmap = *image.bitmap(); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkAutoLockPixels auto_lock(bitmap); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bitmap.getColor(x, y); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckColors(SkColor color1, SkColor color2) { 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ColorsClose(color1, color2)); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckIsTransparent(SkColor color) { 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LT(SkColorGetA(color) / 255.0, 0.05); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsPlatformImageValid(PlatformImage image) { 247a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_MACOSX) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image != NULL; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !image.isNull(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PlatformImagesEqual(PlatformImage image1, PlatformImage image2) { 255a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_MACOSX) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image1 == image2; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return image1.BackedBySameObjectAs(image2); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gfx 264