2008-12-17 15:59:43 +00:00
|
|
|
#ifndef SkGLDevice_DEFINED
|
|
|
|
#define SkGLDevice_DEFINED
|
|
|
|
|
|
|
|
#include "SkDevice.h"
|
|
|
|
#include "SkGL.h"
|
|
|
|
#include "SkRegion.h"
|
|
|
|
|
2010-10-13 22:13:05 +00:00
|
|
|
#ifdef SK_BUILD_FOR_MAC
|
|
|
|
#include <OpenGL/gl.h>
|
|
|
|
#elif defined(ANDROID)
|
|
|
|
#include <GLES/gl.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
class SkGLDeviceFactory : public SkDeviceFactory {
|
|
|
|
public:
|
|
|
|
virtual SkDevice* newDevice(SkBitmap::Config config, int width, int height,
|
|
|
|
bool isOpaque, bool isForLayer);
|
|
|
|
virtual uint32_t getDeviceCapabilities() { return kGL_Capability; }
|
|
|
|
};
|
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
struct SkGLDrawProcs;
|
|
|
|
|
|
|
|
class SkGLDevice : public SkDevice {
|
|
|
|
public:
|
|
|
|
SkGLDevice(const SkBitmap& bitmap, bool offscreen);
|
|
|
|
virtual ~SkGLDevice();
|
|
|
|
|
2010-10-13 22:13:05 +00:00
|
|
|
virtual SkDeviceFactory* getDeviceFactory() {
|
|
|
|
return SkNEW(SkGLDeviceFactory);
|
|
|
|
}
|
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
// 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&);
|
|
|
|
|
2010-10-13 22:13:05 +00:00
|
|
|
// settings for the global texture cache
|
|
|
|
|
|
|
|
static size_t GetTextureCacheMaxCount();
|
|
|
|
static void SetTextureCacheMaxCount(size_t count);
|
|
|
|
|
|
|
|
static size_t GetTextureCacheMaxSize();
|
|
|
|
static void SetTextureCacheMaxSize(size_t size);
|
|
|
|
|
|
|
|
/** Call glDeleteTextures for all textures (including those for text)
|
|
|
|
This should be called while the gl-context is still valid. Its purpose
|
|
|
|
is to free up gl resources. Note that if a bitmap or text is drawn after
|
|
|
|
this call, new caches will be created.
|
|
|
|
*/
|
|
|
|
static void DeleteAllTextures();
|
|
|
|
|
|
|
|
/** Forget all textures without calling delete (including those for text).
|
|
|
|
This should be called if the gl-context has changed, and the texture
|
|
|
|
IDs that have been cached are no longer valid.
|
|
|
|
*/
|
|
|
|
static void AbandonAllTextures();
|
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
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
|
|
|
|
|