diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-01-24 14:38:27 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-01-24 14:38:27 +0000 |
commit | cc40f06db77a3a27f3d685c222086d245399bc0a (patch) | |
tree | bdde781340379b0307e2129c5694919f203e8c73 /include/gpu | |
parent | 83d81c96de34950bdd84dc575997a250b685a3d6 (diff) |
Add factory class for generating various flavors of GrTextContext.
This is the first pass of making Gr*TextContext more generic and easily
subclassed. The next stage will be making GrBitmapTextContext and
GrDistanceFieldTextContext more similar by moving the SkDraw loop into
each subclass.
BUG=skia:2018
Committed: http://code.google.com/p/skia/source/detail?r=13142
R=bsalomon@google.com, reed@google.com
Author: jvanverth@google.com
Review URL: https://codereview.chromium.org/144283002
git-svn-id: http://skia.googlecode.com/svn/trunk@13165 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include/gpu')
-rwxr-xr-x | include/gpu/GrBitmapTextContext.h | 8 | ||||
-rwxr-xr-x | include/gpu/GrDistanceFieldTextContext.h | 8 | ||||
-rw-r--r-- | include/gpu/GrTextContext.h | 77 | ||||
-rw-r--r-- | include/gpu/SkGpuDevice.h | 4 |
4 files changed, 86 insertions, 11 deletions
diff --git a/include/gpu/GrBitmapTextContext.h b/include/gpu/GrBitmapTextContext.h index e0900ecd7d..e1b3d725a9 100755 --- a/include/gpu/GrBitmapTextContext.h +++ b/include/gpu/GrBitmapTextContext.h @@ -17,13 +17,14 @@ class GrTextStrike; */ class GrBitmapTextContext : public GrTextContext { public: - GrBitmapTextContext(GrContext*, const GrPaint&, SkColor); - virtual ~GrBitmapTextContext(); - virtual void drawPackedGlyph(GrGlyph::PackedID, GrFixed left, GrFixed top, GrFontScaler*) SK_OVERRIDE; private: + GrBitmapTextContext(GrContext*, const GrPaint&, const SkPaint&); + virtual ~GrBitmapTextContext(); + friend class GrTTextContextManager<GrBitmapTextContext>; + GrContext::AutoMatrix fAutoMatrix; GrTextStrike* fStrike; @@ -36,7 +37,6 @@ private: kDefaultRequestedVerts = kDefaultRequestedGlyphs * 4, }; - SkColor fSkPaintColor; SkPoint* fVertices; int32_t fMaxVertices; GrTexture* fCurrTexture; diff --git a/include/gpu/GrDistanceFieldTextContext.h b/include/gpu/GrDistanceFieldTextContext.h index 3e00ff2477..4fde6ceef8 100755 --- a/include/gpu/GrDistanceFieldTextContext.h +++ b/include/gpu/GrDistanceFieldTextContext.h @@ -17,9 +17,6 @@ class GrTextStrike; */ class GrDistanceFieldTextContext : public GrTextContext { public: - GrDistanceFieldTextContext(GrContext*, const GrPaint&, const SkPaint&); - virtual ~GrDistanceFieldTextContext(); - virtual void drawPackedGlyph(GrGlyph::PackedID, GrFixed left, GrFixed top, GrFontScaler*) SK_OVERRIDE; @@ -33,6 +30,10 @@ public: const SkPaint& getSkPaint() { return fSkPaint; } private: + GrDistanceFieldTextContext(GrContext*, const GrPaint&, const SkPaint&); + virtual ~GrDistanceFieldTextContext(); + friend class GrTTextContextManager<GrDistanceFieldTextContext>; + GrTextStrike* fStrike; SkScalar fTextRatio; @@ -45,7 +46,6 @@ private: kDefaultRequestedVerts = kDefaultRequestedGlyphs * 4, }; - SkPaint fSkPaint; SkPoint* fVertices; int32_t fMaxVertices; GrTexture* fCurrTexture; diff --git a/include/gpu/GrTextContext.h b/include/gpu/GrTextContext.h index b367cf228d..e2d7d9b973 100644 --- a/include/gpu/GrTextContext.h +++ b/include/gpu/GrTextContext.h @@ -12,6 +12,8 @@ #include "GrGlyph.h" #include "GrPaint.h" +#include "SkPostConfig.h" + class GrContext; class GrDrawTarget; class GrFontScaler; @@ -21,20 +23,91 @@ class GrFontScaler; */ class GrTextContext { public: + virtual ~GrTextContext() {} virtual void drawPackedGlyph(GrGlyph::PackedID, GrFixed left, GrFixed top, GrFontScaler*) = 0; protected: - GrTextContext(GrContext*, const GrPaint&); - virtual ~GrTextContext() {} + GrTextContext(GrContext*, const GrPaint&, const SkPaint&); GrPaint fPaint; + SkPaint fSkPaint; GrContext* fContext; GrDrawTarget* fDrawTarget; SkIRect fClipRect; +}; + +/* + * These classes wrap the creation of a single text context for a given GPU device. The + * assumption is that we'll only be using one text context at a time for that device. + */ +class GrTextContextManager { +public: + virtual ~GrTextContextManager() {} + virtual GrTextContext* create(GrContext* context, const GrPaint& grPaint, + const SkPaint& skPaint) = 0; +}; +template <class TextContextClass> +class GrTTextContextManager : public GrTextContextManager { private: + class ManagedTextContext : public TextContextClass { + public: + ~ManagedTextContext() {} + + ManagedTextContext(GrContext* context, + const GrPaint& grPaint, + const SkPaint& skPaint, + GrTTextContextManager<TextContextClass>* manager) : + TextContextClass(context, grPaint, skPaint) { + fManager = manager; + } + + static void operator delete(void* ptr) { + if (ptr == NULL) { + return; + } + ManagedTextContext* context = reinterpret_cast<ManagedTextContext*>(ptr); + context->fManager->recycle(context); + } + + static void operator delete(void*, void*) { + } + + GrTTextContextManager<TextContextClass>* fManager; + }; + +public: + GrTTextContextManager() { + fAllocation = sk_malloc_throw(sizeof(ManagedTextContext)); + fUsed = false; + } + + ~GrTTextContextManager() { + SkASSERT(!fUsed); + sk_free(fAllocation); + } + + GrTextContext* create(GrContext* context, const GrPaint& grPaint, + const SkPaint& skPaint) { + // add check for usePath here? + SkASSERT(!fUsed); + ManagedTextContext* obj = SkNEW_PLACEMENT_ARGS(fAllocation, ManagedTextContext, + (context, grPaint, skPaint, this)); + fUsed = true; + return obj; + } + +private: + void recycle(GrTextContext* textContext) { + SkASSERT((void*)textContext == fAllocation); + SkASSERT(fUsed); + fUsed = false; + } + + void* fAllocation; + bool fUsed; }; #endif diff --git a/include/gpu/SkGpuDevice.h b/include/gpu/SkGpuDevice.h index 9b7129fbf6..2888951e47 100644 --- a/include/gpu/SkGpuDevice.h +++ b/include/gpu/SkGpuDevice.h @@ -16,10 +16,10 @@ #include "SkBitmapDevice.h" #include "SkRegion.h" #include "GrContext.h" +#include "GrTextContext.h" struct SkDrawProcs; struct GrSkDrawProcs; -class GrTextContext; /** * Subclass of SkBitmapDevice, which directs all drawing to the GrGpu owned by the @@ -149,6 +149,8 @@ private: GrClipData fClipData; + GrTextContextManager* fTextContextManager; + // state for our render-target GrRenderTarget* fRenderTarget; bool fNeedClear; |