aboutsummaryrefslogtreecommitdiffstats
path: root/src/gl/SkGLDevice.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gl/SkGLDevice.h')
-rw-r--r--src/gl/SkGLDevice.h124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/gl/SkGLDevice.h b/src/gl/SkGLDevice.h
new file mode 100644
index 0000000..0fc9e47
--- /dev/null
+++ b/src/gl/SkGLDevice.h
@@ -0,0 +1,124 @@
+#ifndef SkGLDevice_DEFINED
+#define SkGLDevice_DEFINED
+
+#include "SkDevice.h"
+#include "SkGL.h"
+#include "SkRegion.h"
+
+struct SkGLDrawProcs;
+
+class SkGLDevice : public SkDevice {
+public:
+ SkGLDevice(const SkBitmap& bitmap, bool offscreen);
+ virtual ~SkGLDevice();
+
+ // used to identify GLTextCache data in the glyphcache
+ static void GlyphCacheAuxProc(void* data);
+
+ enum TexOrientation {
+ kNo_TexOrientation,
+ kTopToBottom_TexOrientation,
+ kBottomToTop_TexOrientation
+ };
+
+ /** Called when this device is no longer a candidate for a render target,
+ but will instead be used as a texture to be drawn. Be sure to call
+ the base impl if you override, as it will compute size and max.
+ */
+ virtual TexOrientation bindDeviceAsTexture();
+
+ // returns true if complex
+ SkGLClipIter* updateMatrixClip();
+ // call to set the clip to the specified rect
+ void scissor(const SkIRect&);
+
+ // overrides from SkDevice
+ virtual void gainFocus(SkCanvas*);
+ virtual void setMatrixClip(const SkMatrix& matrix, const SkRegion& clip);
+
+ virtual void drawPaint(const SkDraw&, const SkPaint& paint);
+ virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
+ const SkPoint[], const SkPaint& paint);
+ virtual void drawRect(const SkDraw&, const SkRect& r,
+ const SkPaint& paint);
+ virtual void drawPath(const SkDraw&, const SkPath& path,
+ const SkPaint& paint);
+ virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
+ const SkMatrix& matrix, const SkPaint& paint);
+ virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
+ int x, int y, const SkPaint& paint);
+ virtual void drawText(const SkDraw&, const void* text, size_t len,
+ SkScalar x, SkScalar y, const SkPaint& paint);
+ virtual void drawPosText(const SkDraw&, const void* text, size_t len,
+ const SkScalar pos[], SkScalar constY,
+ int scalarsPerPos, const SkPaint& paint);
+ virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len,
+ const SkPath& path, const SkMatrix* matrix,
+ const SkPaint& paint);
+ virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
+ const SkPoint verts[], const SkPoint texs[],
+ const SkColor colors[], SkXfermode* xmode,
+ const uint16_t indices[], int indexCount,
+ const SkPaint& paint);
+ virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y,
+ const SkPaint&);
+
+protected:
+ /** Return the current glmatrix, from a previous call to setMatrixClip */
+ const SkMatrix& matrix() const { return fMatrix; }
+ /** Return the current clip, from a previous call to setMatrixClip */
+ const SkRegion& clip() const { return fClip; }
+
+private:
+ SkGLMatrix fGLMatrix;
+ SkMatrix fMatrix;
+ SkRegion fClip;
+ bool fDirty;
+
+ SkGLClipIter fClipIter;
+ SkGLDrawProcs* fDrawProcs;
+
+ void setupForText(SkDraw* draw, const SkPaint& paint);
+
+ // global texture cache methods
+ class TexCache;
+ static TexCache* LockTexCache(const SkBitmap&, GLuint* name,
+ SkPoint* size);
+ static void UnlockTexCache(TexCache*);
+ class SkAutoLockTexCache {
+ public:
+ SkAutoLockTexCache(const SkBitmap& bitmap, GLuint* name,
+ SkPoint* size) {
+ fTex = SkGLDevice::LockTexCache(bitmap, name, size);
+ }
+ ~SkAutoLockTexCache() {
+ if (fTex) {
+ SkGLDevice::UnlockTexCache(fTex);
+ }
+ }
+ TexCache* get() const { return fTex; }
+ private:
+ TexCache* fTex;
+ };
+ friend class SkAutoTexCache;
+
+ // returns cache if the texture is bound for the shader
+ TexCache* setupGLPaintShader(const SkPaint& paint);
+
+ class AutoPaintShader {
+ public:
+ AutoPaintShader(SkGLDevice*, const SkPaint& paint);
+ ~AutoPaintShader();
+
+ bool useTex() const { return fTexCache != 0; }
+ private:
+ SkGLDevice* fDevice;
+ TexCache* fTexCache;
+ };
+ friend class AutoPaintShader;
+
+ typedef SkDevice INHERITED;
+};
+
+#endif
+