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 "cc/test/pixel_test_utils.h" 6 7 #include <string> 8 #include <vector> 9 10 #include "base/file_util.h" 11 #include "base/logging.h" 12 #include "third_party/skia/include/core/SkBitmap.h" 13 #include "ui/gfx/codec/png_codec.h" 14 15 namespace cc { 16 17 bool WritePNGFile(const SkBitmap& bitmap, const base::FilePath& file_path, 18 bool discard_transparency) { 19 std::vector<unsigned char> png_data; 20 if (gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, 21 discard_transparency, 22 &png_data) && 23 base::CreateDirectory(file_path.DirName())) { 24 char* data = reinterpret_cast<char*>(&png_data[0]); 25 int size = static_cast<int>(png_data.size()); 26 return file_util::WriteFile(file_path, data, size) == size; 27 } 28 return false; 29 } 30 31 bool ReadPNGFile(const base::FilePath& file_path, SkBitmap* bitmap) { 32 DCHECK(bitmap); 33 std::string png_data; 34 return base::ReadFileToString(file_path, &png_data) && 35 gfx::PNGCodec::Decode(reinterpret_cast<unsigned char*>(&png_data[0]), 36 png_data.length(), 37 bitmap); 38 } 39 40 bool MatchesPNGFile(const SkBitmap& gen_bmp, base::FilePath ref_img_path, 41 const PixelComparator& comparator) { 42 SkBitmap ref_bmp; 43 if (!ReadPNGFile(ref_img_path, &ref_bmp)) { 44 LOG(ERROR) << "Cannot read reference image: " << ref_img_path.value(); 45 return false; 46 } 47 48 // Check if images size matches 49 if (gen_bmp.width() != ref_bmp.width() || 50 gen_bmp.height() != ref_bmp.height()) { 51 LOG(ERROR) 52 << "Dimensions do not match! " 53 << "Actual: " << gen_bmp.width() << "x" << gen_bmp.height() 54 << "; " 55 << "Expected: " << ref_bmp.width() << "x" << ref_bmp.height(); 56 return false; 57 } 58 59 // Shortcut for empty images. They are always equal. 60 if (gen_bmp.width() == 0 || gen_bmp.height() == 0) 61 return true; 62 63 return comparator.Compare(gen_bmp, ref_bmp); 64 } 65 66 } // namespace cc 67