aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/PictureRenderer.h
blob: f9b4c260ef7b562f56f75109f7391d1a8a278487 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * 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<SkCanvas> 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<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