Chromium Code Reviews

Unified Diff: include/gpu/GrTextContext.h

Issue 144283002: Add factory class for generating various flavors of GrTextContext. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Revise GrTextContext destruction. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: include/gpu/GrTextContext.h
diff --git a/include/gpu/GrTextContext.h b/include/gpu/GrTextContext.h
index b367cf228d57fd5c0103cbb77332bc7b7a0dd4ae..54c2d1f18affbb177199246545c826c51feba43d 100644
--- a/include/gpu/GrTextContext.h
+++ b/include/gpu/GrTextContext.h
@@ -15,26 +15,83 @@
class GrContext;
class GrDrawTarget;
class GrFontScaler;
+class GrTextContext;
+
+/*
+ * 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 GrTextContextFactory {
+public:
+ virtual ~GrTextContextFactory() {}
+ virtual GrTextContext* Create(GrContext* context, const GrPaint& grPaint,
+ const SkPaint& skPaint) = 0;
+ virtual void Recycle(GrTextContext* textContext) = 0;
+};
+
+template <class TextContextClass>
+class GrTTextContextFactory : public GrTextContextFactory {
+public:
+ GrTTextContextFactory() {
+ fAllocation = sk_malloc_throw(sizeof(TextContextClass));
+ fUsed = false;
+ }
+
+ ~GrTTextContextFactory() {
+ SkASSERT(!fUsed);
+ sk_free(fAllocation);
+ }
+
+ GrTextContext* Create(GrContext* context, const GrPaint& grPaint,
bsalomon 2014/01/22 19:13:36 nit: since Create and Destroy are not static they
jvanverth1 2014/01/22 20:28:40 Done.
+ const SkPaint& skPaint) {
+ // add check for usePath here?
+ SkASSERT(!fUsed);
+ TextContextClass* obj = new(fAllocation) TextContextClass(context, grPaint, skPaint);
+ obj->fFactory = this;
+ fUsed = true;
+ return obj;
+ }
+
+ void Recycle(GrTextContext* textContext) {
+ SkASSERT((void*)textContext == fAllocation);
+ SkASSERT(fUsed);
+ fUsed = false;
+ }
+
+private:
+ void* fAllocation;
+ bool fUsed;
+};
/*
* This class wraps the state for a single text render
*/
class GrTextContext {
public:
+ virtual ~GrTextContext() {}
+
virtual void drawPackedGlyph(GrGlyph::PackedID, GrFixed left, GrFixed top,
GrFontScaler*) = 0;
-
+
+ static void operator delete(void* ptr) throw() {
bsalomon 2014/01/22 19:13:36 Do we need the throw here? We build without except
jvanverth1 2014/01/22 20:28:40 Done.
+ if (ptr == NULL) {
+ return;
+ }
+ GrTextContext* context = reinterpret_cast<GrTextContext*>(ptr);
+ context->fFactory->Recycle(context);
+ }
+
protected:
- GrTextContext(GrContext*, const GrPaint&);
- virtual ~GrTextContext() {}
-
+ GrTextContext(GrContext*, const GrPaint&, const SkPaint&);
+
GrPaint fPaint;
+ SkPaint fSkPaint;
GrContext* fContext;
GrDrawTarget* fDrawTarget;
-
+
SkIRect fClipRect;
-
-private:
+
+ GrTextContextFactory* fFactory;
};
#endif

Powered by Google App Engine