blob: 72cffcc9049c74249447505f005006936110ed9e [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Author: skerner@google.com (Sam Kerner)
#ifndef NET_INSTAWEB_SPRITER_IMAGE_LIBRARY_INTERFACE_H_
#define NET_INSTAWEB_SPRITER_IMAGE_LIBRARY_INTERFACE_H_
#include "net/instaweb/spriter/public/image_spriter.pb.h"
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/string.h"
// TODO(skerner): #include image_spriter.pb.h is needed to allow use of
// enum ImageFormat. Break this dependency and remove the include.
namespace net_instaweb {
namespace spriter {
// Class ImageLibraryInterface provides an abstract interface to manipulate
// images. This interface hides the details of any particular image
// processing library. This makes it easy to port to an environment
// where a different image processing library is preferred.
//
// Subclasses create methods that act on two types of objects:
// * Image: An imitable rectangular region of pixels.
// * Canvas: A mutable rectangular region of pixels.
class ImageLibraryInterface {
public:
// TODO(skerner): Chromium's base lib has a class FilePath that
// handles paths in a cross-platform way. Use it.
typedef GoogleString FilePath;
// Users of the image library interface provide a delegate which
// is informend of errors.
class Delegate {
public:
virtual void OnError(const GoogleString& error) const = 0;
virtual ~Delegate() {}
};
// Images are immutable rectangular regions of pixels.
class Image {
public:
// Get the width and height of an image.
virtual bool GetDimensions(int* out_width, int* out_height) const = 0;
virtual ~Image() {}
protected:
// Only methods of ImageLibraryInterface may create images.
explicit Image(ImageLibraryInterface* lib) : lib_(lib) {}
ImageLibraryInterface* lib_;
private:
DISALLOW_COPY_AND_ASSIGN(Image);
};
// Read an image from disk. Return NULL (after calling delegate
// method) on error. Caller owns the returned pointer.
virtual Image* ReadFromFile(const FilePath& path) = 0;
// Canvases are mutable rectangles onto which a program may draw.
// For now, we support stamping images into a canvas, and writing
// a canvas to a file.
class Canvas {
public:
virtual bool DrawImage(const Image* image, int x, int y) = 0;
virtual bool WriteToFile(
const FilePath& write_path, ImageFormat format) = 0;
virtual ~Canvas() {}
protected:
explicit Canvas(ImageLibraryInterface* lib) : lib_(lib) {}
ImageLibraryInterface* lib_;
private:
DISALLOW_COPY_AND_ASSIGN(Canvas);
};
virtual Canvas* CreateCanvas(int width, int height) = 0;
// Constructor for custom subclasses. Prefer to use
// ImageLibraryInterfaceFactory() if possible.
explicit ImageLibraryInterface(Delegate* delegate) : delegate_(delegate) {}
virtual ~ImageLibraryInterface() {}
// Use this factory method to get a usable image library object.
static ImageLibraryInterface* ImageLibraryInterfaceFactory(
const GoogleString& library_name);
protected:
// Use ImageLibraryInterfaceFactory() to access an image library.
ImageLibraryInterface(const FilePath& base_input_path,
const FilePath& base_output_path,
Delegate* delegate);
// Used by subclasses:
const FilePath& base_input_path() { return base_input_path_; }
const FilePath& base_output_path() { return base_output_path_; }
const Delegate* delegate() { return delegate_; }
private:
// File path under which all read operations (such as reading an image)
// are done.
FilePath base_input_path_;
// File path under which all write operations (such as writing a canvas)
// are done.
FilePath base_output_path_;
// |delegate_|'s methods are called when an exceptional event (such as an
// error) has occurred.
const Delegate* delegate_;
DISALLOW_COPY_AND_ASSIGN(ImageLibraryInterface);
};
} // namespace spriter
} // namespace net_instaweb
#endif // NET_INSTAWEB_SPRITER_IMAGE_LIBRARY_INTERFACE_H_