/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef PictureRenderer_DEFINED #define PictureRenderer_DEFINED #include "SkTypes.h" #include "SkTDArray.h" #include "SkRefCnt.h" class SkBitmap; class SkCanvas; class SkPicture; namespace sk_tools { class PictureRenderer : public SkRefCnt { public: virtual void init(SkPicture* pict); virtual void render() = 0; virtual void end(); SkCanvas* getCanvas() { return fCanvas.get(); } PictureRenderer() : fPicture(NULL){} protected: SkAutoTUnref fCanvas; SkPicture* fPicture; private: typedef SkRefCnt INHERITED; }; class PipePictureRenderer : public PictureRenderer { public: virtual void render() SK_OVERRIDE; private: typedef PictureRenderer INHERITED; }; class SimplePictureRenderer : public PictureRenderer { public: virtual void render () SK_OVERRIDE; private: typedef PictureRenderer INHERITED; }; class TiledPictureRenderer : public PictureRenderer { public: TiledPictureRenderer(); virtual void init(SkPicture* pict) SK_OVERRIDE; virtual void render() SK_OVERRIDE; virtual void end() SK_OVERRIDE; void drawTiles(); void setTileWidth(int width) { fTileWidth = width; } int getTileWidth() const { return fTileWidth; } void setTileHeight(int height) { fTileHeight = height; } int getTileHeight() const { return fTileHeight; } void setTileWidthPercentage(double percentage) { fTileWidthPercentage = percentage; } double getTileWidthPercentage() const { return fTileWidthPercentage; } void setTileHeightPercentage(double percentage) { fTileHeightPercentage = percentage; } double getTileHeightPercentage() const { return fTileHeightPercentage; } int numTiles() const { return fTiles.count(); } ~TiledPictureRenderer(); private: struct TileInfo { SkBitmap* fBitmap; SkCanvas* fCanvas; }; int fTileWidth; int fTileHeight; double fTileWidthPercentage; double fTileHeightPercentage; SkTDArray fTiles; // Clips the tile to an area that is completely in what the SkPicture says is the // drawn-to area. This is mostly important for tiles on the right and bottom edges // as they may go over this area and the picture may have some commands that // draw outside of this area and so should not actually be written. void clipTile(const TileInfo& tile); void addTile(int tile_x_start, int tile_y_start); void setupTiles(); // We manually delete the tiles instead of having a destructor on TileInfo as // the destructor on TileInfo will be during a realloc. This would result in // the canvases and bitmaps being prematurely deleted. void deleteTiles(); void copyTilesToCanvas(); typedef PictureRenderer INHERITED; }; } #endif // PictureRenderer_DEFINED