skia2/tools/PictureRenderer.h
keyar@chromium.org 4ea96c5e54 Dirty commit so Brian can see changes.
git-svn-id: http://skia.googlecode.com/svn/trunk@5171 2bbb7eff-a529-9590-31e7-b0007b416f81
2012-08-20 15:03:29 +00:00

154 lines
3.4 KiB
C++

/*
* 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 SkGLContext;
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();
}
void setUseBitmapDevice() {
fDeviceType=kBitmap_DeviceType;
}
#if SK_SUPPORT_GPU
void setUseGpuDevice() {
fDeviceType = kGPU_DeviceType;
}
#endif
PictureRenderer() : fPicture(NULL), fDeviceType(kBitmap_DeviceType){}
protected:
enum SkDeviceTypes {
kBitmap_DeviceType,
#if SK_SUPPORT_GPU
kGPU_DeviceType
#endif
};
SkAutoTUnref<SkCanvas> fCanvas;
SkPicture* fPicture;
SkDeviceTypes fDeviceType;
SkGLContext* fGLContext;
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<TileInfo> 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