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