| Index: include/gpu/GrTextContext.h
|
| diff --git a/include/gpu/GrTextContext.h b/include/gpu/GrTextContext.h
|
| index b367cf228d57fd5c0103cbb77332bc7b7a0dd4ae..e2d7d9b973cde4ee6ec86e0cc70e7de051681ffd 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
|
|
|