1 // Copyright (c) 2011 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 #ifndef PRINTING_IMAGE_H_ 6 #define PRINTING_IMAGE_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/logging.h" 13 #include "printing/printing_export.h" 14 #include "ui/gfx/size.h" 15 16 namespace base { 17 class FilePath; 18 } 19 20 namespace printing { 21 22 class Metafile; 23 24 // Lightweight raw-bitmap management. The image, once initialized, is immutable. 25 // The main purpose is testing image contents. 26 class PRINTING_EXPORT Image { 27 public: 28 // Creates the image from the given file on disk. Uses extension to 29 // defer file type. PNG and EMF (on Windows) currently supported. 30 // If image loading fails size().IsEmpty() will be true. 31 explicit Image(const base::FilePath& path); 32 33 // Creates the image from the metafile. Deduces bounds based on bounds in 34 // metafile. If loading fails size().IsEmpty() will be true. 35 explicit Image(const Metafile& metafile); 36 37 // Copy constructor. 38 explicit Image(const Image& image); 39 40 ~Image(); 41 42 const gfx::Size& size() const { 43 return size_; 44 } 45 46 // Return a checksum of the image (MD5 over the internal data structure). 47 std::string checksum() const; 48 49 // Save image as PNG. 50 bool SaveToPng(const base::FilePath& filepath) const; 51 52 // Returns % of pixels different 53 double PercentageDifferent(const Image& rhs) const; 54 55 // Returns the 0x0RGB or 0xARGB value of the pixel at the given location. 56 uint32 Color(uint32 color) const { 57 if (ignore_alpha_) 58 return color & 0xFFFFFF; // Strip out A. 59 else 60 return color; 61 } 62 63 uint32 pixel_at(int x, int y) const { 64 DCHECK(x >= 0 && x < size_.width()); 65 DCHECK(y >= 0 && y < size_.height()); 66 const uint32* data = reinterpret_cast<const uint32*>(&*data_.begin()); 67 const uint32* data_row = data + y * row_length_ / sizeof(uint32); 68 return Color(data_row[x]); 69 } 70 71 private: 72 // Construct from metafile. This is kept internal since it's ambiguous what 73 // kind of data is used (png, bmp, metafile etc). 74 Image(const void* data, size_t size); 75 76 bool LoadPng(const std::string& compressed); 77 78 bool LoadMetafile(const std::string& data); 79 80 bool LoadMetafile(const Metafile& metafile); 81 82 // Pixel dimensions of the image. 83 gfx::Size size_; 84 85 // Length of a line in bytes. 86 int row_length_; 87 88 // Actual bitmap data in arrays of RGBAs (so when loaded as uint32, it's 89 // 0xABGR). 90 std::vector<unsigned char> data_; 91 92 // Flag to signal if the comparison functions should ignore the alpha channel. 93 const bool ignore_alpha_; // Currently always true. 94 95 // Prevent operator= (this function has no implementation) 96 Image& operator=(const Image& image); 97 }; 98 99 } // namespace printing 100 101 #endif // PRINTING_IMAGE_H_ 102