blob: 0fc9e4794156fd69dacce8065d638a77857ba556 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#ifndef SkGLDevice_DEFINED
2#define SkGLDevice_DEFINED
3
4#include "SkDevice.h"
5#include "SkGL.h"
6#include "SkRegion.h"
7
8struct SkGLDrawProcs;
9
10class SkGLDevice : public SkDevice {
11public:
12 SkGLDevice(const SkBitmap& bitmap, bool offscreen);
13 virtual ~SkGLDevice();
14
15 // used to identify GLTextCache data in the glyphcache
16 static void GlyphCacheAuxProc(void* data);
17
18 enum TexOrientation {
19 kNo_TexOrientation,
20 kTopToBottom_TexOrientation,
21 kBottomToTop_TexOrientation
22 };
23
24 /** Called when this device is no longer a candidate for a render target,
25 but will instead be used as a texture to be drawn. Be sure to call
26 the base impl if you override, as it will compute size and max.
27 */
28 virtual TexOrientation bindDeviceAsTexture();
29
30 // returns true if complex
31 SkGLClipIter* updateMatrixClip();
32 // call to set the clip to the specified rect
33 void scissor(const SkIRect&);
34
35 // overrides from SkDevice
36 virtual void gainFocus(SkCanvas*);
37 virtual void setMatrixClip(const SkMatrix& matrix, const SkRegion& clip);
38
39 virtual void drawPaint(const SkDraw&, const SkPaint& paint);
40 virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
41 const SkPoint[], const SkPaint& paint);
42 virtual void drawRect(const SkDraw&, const SkRect& r,
43 const SkPaint& paint);
44 virtual void drawPath(const SkDraw&, const SkPath& path,
45 const SkPaint& paint);
46 virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
47 const SkMatrix& matrix, const SkPaint& paint);
48 virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
49 int x, int y, const SkPaint& paint);
50 virtual void drawText(const SkDraw&, const void* text, size_t len,
51 SkScalar x, SkScalar y, const SkPaint& paint);
52 virtual void drawPosText(const SkDraw&, const void* text, size_t len,
53 const SkScalar pos[], SkScalar constY,
54 int scalarsPerPos, const SkPaint& paint);
55 virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len,
56 const SkPath& path, const SkMatrix* matrix,
57 const SkPaint& paint);
58 virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
59 const SkPoint verts[], const SkPoint texs[],
60 const SkColor colors[], SkXfermode* xmode,
61 const uint16_t indices[], int indexCount,
62 const SkPaint& paint);
63 virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y,
64 const SkPaint&);
65
66protected:
67 /** Return the current glmatrix, from a previous call to setMatrixClip */
68 const SkMatrix& matrix() const { return fMatrix; }
69 /** Return the current clip, from a previous call to setMatrixClip */
70 const SkRegion& clip() const { return fClip; }
71
72private:
73 SkGLMatrix fGLMatrix;
74 SkMatrix fMatrix;
75 SkRegion fClip;
76 bool fDirty;
77
78 SkGLClipIter fClipIter;
79 SkGLDrawProcs* fDrawProcs;
80
81 void setupForText(SkDraw* draw, const SkPaint& paint);
82
83 // global texture cache methods
84 class TexCache;
85 static TexCache* LockTexCache(const SkBitmap&, GLuint* name,
86 SkPoint* size);
87 static void UnlockTexCache(TexCache*);
88 class SkAutoLockTexCache {
89 public:
90 SkAutoLockTexCache(const SkBitmap& bitmap, GLuint* name,
91 SkPoint* size) {
92 fTex = SkGLDevice::LockTexCache(bitmap, name, size);
93 }
94 ~SkAutoLockTexCache() {
95 if (fTex) {
96 SkGLDevice::UnlockTexCache(fTex);
97 }
98 }
99 TexCache* get() const { return fTex; }
100 private:
101 TexCache* fTex;
102 };
103 friend class SkAutoTexCache;
104
105 // returns cache if the texture is bound for the shader
106 TexCache* setupGLPaintShader(const SkPaint& paint);
107
108 class AutoPaintShader {
109 public:
110 AutoPaintShader(SkGLDevice*, const SkPaint& paint);
111 ~AutoPaintShader();
112
113 bool useTex() const { return fTexCache != 0; }
114 private:
115 SkGLDevice* fDevice;
116 TexCache* fTexCache;
117 };
118 friend class AutoPaintShader;
119
120 typedef SkDevice INHERITED;
121};
122
123#endif
124