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