SkGpuDevice.h revision 8a0b0291ae4260ef2a46f4341c18a702c0ce3f8b
1
2/*
3 * Copyright 2010 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10
11#ifndef SkGpuDevice_DEFINED
12#define SkGpuDevice_DEFINED
13
14#include "SkGr.h"
15#include "SkBitmap.h"
16#include "SkDevice.h"
17#include "SkRegion.h"
18#include "GrContext.h"
19
20struct SkDrawProcs;
21struct GrSkDrawProcs;
22class GrTextContext;
23
24/**
25 *  Subclass of SkDevice, which directs all drawing to the GrGpu owned by the
26 *  canvas.
27 */
28class SK_API SkGpuDevice : public SkDevice {
29public:
30    /**
31     *  New device that will create an offscreen renderTarget based on the
32     *  config, width, height.
33     *
34     *  usage is a special flag that should only be set by SkCanvas
35     *  internally.
36     */
37    SkGpuDevice(GrContext*, SkBitmap::Config,
38                int width, int height,
39                SkDevice::Usage usage = SkDevice::kGeneral_Usage);
40
41    /**
42     *  New device that will render to the specified renderTarget.
43     */
44    SkGpuDevice(GrContext*, GrRenderTarget*);
45
46    /**
47     *  New device that will render to the texture (as a rendertarget).
48     *  The GrTexture's asRenderTarget() must be non-NULL or device will not
49     *  function.
50     */
51    SkGpuDevice(GrContext*, GrTexture*);
52
53    virtual ~SkGpuDevice();
54
55    GrContext* context() const { return fContext; }
56
57    /**
58     *  Override from SkGpuDevice, so we can set our FBO to be the render target
59     *  The canvas parameter must be a SkGpuCanvas
60     */
61    virtual void gainFocus(SkCanvas*, const SkMatrix&, const SkRegion&,
62                           const SkClipStack& clipStack);
63
64    virtual SkGpuRenderTarget* accessRenderTarget() {
65        return (SkGpuRenderTarget*)fRenderTarget;
66    }
67
68    // overrides from SkDevice
69
70    virtual void clear(SkColor color);
71    virtual bool readPixels(const SkIRect& srcRect, SkBitmap* bitmap);
72    virtual void writePixels(const SkBitmap& bitmap, int x, int y);
73
74    virtual void setMatrixClip(const SkMatrix& matrix, const SkRegion& clip,
75                               const SkClipStack&);
76
77    virtual void drawPaint(const SkDraw&, const SkPaint& paint);
78    virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
79                            const SkPoint[], const SkPaint& paint);
80    virtual void drawRect(const SkDraw&, const SkRect& r,
81                          const SkPaint& paint);
82    virtual void drawPath(const SkDraw&, const SkPath& path,
83                          const SkPaint& paint, const SkMatrix* prePathMatrix,
84                          bool pathIsMutable);
85    virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
86                            const SkIRect* srcRectOrNull,
87                            const SkMatrix& matrix, const SkPaint& paint);
88    virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
89                            int x, int y, const SkPaint& paint);
90    virtual void drawText(const SkDraw&, const void* text, size_t len,
91                          SkScalar x, SkScalar y, const SkPaint& paint);
92    virtual void drawPosText(const SkDraw&, const void* text, size_t len,
93                             const SkScalar pos[], SkScalar constY,
94                             int scalarsPerPos, const SkPaint& paint);
95    virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len,
96                                const SkPath& path, const SkMatrix* matrix,
97                                const SkPaint& paint);
98    virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
99                              const SkPoint verts[], const SkPoint texs[],
100                              const SkColor colors[], SkXfermode* xmode,
101                              const uint16_t indices[], int indexCount,
102                              const SkPaint& paint);
103    virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y,
104                            const SkPaint&);
105    virtual bool filterTextFlags(const SkPaint& paint, TextFlags*);
106
107    virtual void flush() { fContext->flush(false); }
108
109    /**
110     * Make's this device's rendertarget current in the underlying 3D API.
111     * Also implicitly flushes.
112     */
113    virtual void makeRenderTargetCurrent();
114
115protected:
116    typedef GrContext::TextureCacheEntry TexCache;
117    enum TexType {
118        kBitmap_TexType,
119        kDeviceRenderTarget_TexType,
120        kSaveLayerDeviceRenderTarget_TexType
121    };
122    TexCache lockCachedTexture(const SkBitmap& bitmap,
123                               const GrSamplerState& sampler,
124                               TexType type = kBitmap_TexType);
125    void unlockCachedTexture(TexCache);
126
127    class SkAutoCachedTexture {
128    public:
129        SkAutoCachedTexture();
130        SkAutoCachedTexture(SkGpuDevice* device,
131                            const SkBitmap& bitmap,
132                            const GrSamplerState& sampler,
133                            GrTexture** texture);
134        ~SkAutoCachedTexture();
135
136        GrTexture* set(SkGpuDevice*, const SkBitmap&, const GrSamplerState&);
137
138    private:
139        SkGpuDevice*    fDevice;
140        TexCache        fTex;
141    };
142    friend class SkAutoTexCache;
143
144private:
145    GrContext*      fContext;
146
147    GrSkDrawProcs*  fDrawProcs;
148
149    // state for our offscreen render-target
150    TexCache            fCache;
151    GrTexture*          fTexture;
152    GrRenderTarget*     fRenderTarget;
153    bool                fNeedClear;
154    bool                fNeedPrepareRenderTarget;
155
156    // called from rt and tex cons
157    void initFromRenderTarget(GrContext*, GrRenderTarget*);
158
159    // doesn't set the texture/sampler/matrix state
160    // caller needs to null out GrPaint's texture if
161    // non-textured drawing is desired.
162    // Set constantColor to true if a constant color
163    // will be used.  This is an optimization, and can
164    // always be set to false. constantColor should
165    // never be true if justAlpha is true.
166    bool skPaint2GrPaintNoShader(const SkPaint& skPaint,
167                                 bool justAlpha,
168                                 GrPaint* grPaint,
169                                 bool constantColor);
170
171    // uses the SkShader to setup paint, act used to
172    // hold lock on cached texture and free it when
173    // destroyed.
174    // If there is no shader, constantColor will
175    // be passed to skPaint2GrPaintNoShader.  Otherwise
176    // it is ignored.
177    bool skPaint2GrPaintShader(const SkPaint& skPaint,
178                               SkAutoCachedTexture* act,
179                               const SkMatrix& ctm,
180                               GrPaint* grPaint,
181                               bool constantColor);
182
183    // override from SkDevice
184    virtual SkDevice* onCreateCompatibleDevice(SkBitmap::Config config,
185                                               int width, int height,
186                                               bool isOpaque,
187                                               Usage usage);
188
189    SkDrawProcs* initDrawForText(GrTextContext*);
190    bool bindDeviceAsTexture(GrPaint* paint);
191
192    void prepareRenderTarget(const SkDraw&);
193    void internalDrawBitmap(const SkDraw&, const SkBitmap&,
194                            const SkIRect&, const SkMatrix&, GrPaint* grPaint);
195
196    typedef SkDevice INHERITED;
197};
198
199#endif
200
201