1 #ifndef SkGLDevice_DEFINED 2 #define SkGLDevice_DEFINED 3 4 #include "SkDevice.h" 5 #include "SkGL.h" 6 #include "SkRegion.h" 7 8 struct SkGLDrawProcs; 9 10 class SkGLDevice : public SkDevice { 11 public: 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 66 protected: 67 /** Return the current glmatrix, from a previous call to setMatrixClip */ matrix()68 const SkMatrix& matrix() const { return fMatrix; } 69 /** Return the current clip, from a previous call to setMatrixClip */ clip()70 const SkRegion& clip() const { return fClip; } 71 72 private: 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: SkAutoLockTexCache(const SkBitmap & bitmap,GLuint * name,SkPoint * size)90 SkAutoLockTexCache(const SkBitmap& bitmap, GLuint* name, 91 SkPoint* size) { 92 fTex = SkGLDevice::LockTexCache(bitmap, name, size); 93 } ~SkAutoLockTexCache()94 ~SkAutoLockTexCache() { 95 if (fTex) { 96 SkGLDevice::UnlockTexCache(fTex); 97 } 98 } get()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 useTex()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 125