15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)#ifndef PRINTING_IMAGE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRINTING_IMAGE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/printing_export.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Metafile; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Lightweight raw-bitmap management. The image, once initialized, is immutable. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The main purpose is testing image contents. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PRINTING_EXPORT Image { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates the image from the given file on disk. Uses extension to 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // defer file type. PNG and EMF (on Windows) currently supported. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If image loading fails size().IsEmpty() will be true. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit Image(const base::FilePath& path); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates the image from the metafile. Deduces bounds based on bounds in 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // metafile. If loading fails size().IsEmpty() will be true. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Image(const Metafile& metafile); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy constructor. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Image(const Image& image); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Image(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size() const { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return a checksum of the image (MD5 over the internal data structure). 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string checksum() const; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save image as PNG. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool SaveToPng(const base::FilePath& filepath) const; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns % of pixels different 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double PercentageDifferent(const Image& rhs) const; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the 0x0RGB or 0xARGB value of the pixel at the given location. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 Color(uint32 color) const { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ignore_alpha_) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return color & 0xFFFFFF; // Strip out A. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return color; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 pixel_at(int x, int y) const { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(x >= 0 && x < size_.width()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(y >= 0 && y < size_.height()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32* data = reinterpret_cast<const uint32*>(&*data_.begin()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32* data_row = data + y * row_length_ / sizeof(uint32); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Color(data_row[x]); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct from metafile. This is kept internal since it's ambiguous what 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kind of data is used (png, bmp, metafile etc). 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Image(const void* data, size_t size); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool LoadPng(const std::string& compressed); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool LoadMetafile(const std::string& data); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool LoadMetafile(const Metafile& metafile); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pixel dimensions of the image. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Length of a line in bytes. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row_length_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actual bitmap data in arrays of RGBAs (so when loaded as uint32, it's 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0xABGR). 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flag to signal if the comparison functions should ignore the alpha channel. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool ignore_alpha_; // Currently always true. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent operator= (this function has no implementation) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Image& operator=(const Image& image); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace printing 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // PRINTING_IMAGE_H_ 102