diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-01-30 16:41:23 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-01-30 16:41:23 +0000 |
commit | ddf2bfb190b2760ef6d28efe2cdc16c68287553d (patch) | |
tree | 90643f1dbc9fe0af09815553e67ad90f2c172c84 /src | |
parent | cf34bc06347dd2734a7fdaef5cf8853e92979d5e (diff) |
Move GrTextContext to private interface
NOTRY=true
R=bsalomon@google.com, reed@google.com
Author: jvanverth@google.com
Review URL: https://codereview.chromium.org/145073005
git-svn-id: http://skia.googlecode.com/svn/trunk@13239 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rwxr-xr-x | src/gpu/GrBitmapTextContext.h | 49 | ||||
-rwxr-xr-x | src/gpu/GrDistanceFieldTextContext.h | 52 | ||||
-rw-r--r-- | src/gpu/GrTextContext.h | 129 |
3 files changed, 230 insertions, 0 deletions
diff --git a/src/gpu/GrBitmapTextContext.h b/src/gpu/GrBitmapTextContext.h new file mode 100755 index 0000000000..6550e3c079 --- /dev/null +++ b/src/gpu/GrBitmapTextContext.h @@ -0,0 +1,49 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrBitmapTextContext_DEFINED +#define GrBitmapTextContext_DEFINED + +#include "GrTextContext.h" + +class GrTextStrike; + +/* + * This class implements GrTextContext using standard bitmap fonts + */ +class GrBitmapTextContext : public GrTextContext { +public: + GrBitmapTextContext(GrContext*, const GrPaint&, const SkPaint&, const SkDeviceProperties&); + virtual ~GrBitmapTextContext(); + + virtual void drawText(const char text[], size_t byteLength, SkScalar x, SkScalar y) SK_OVERRIDE; + virtual void drawPosText(const char text[], size_t byteLength, + const SkScalar pos[], SkScalar constY, + int scalarsPerPosition) SK_OVERRIDE; + + static bool CanDraw(const SkPaint& paint, const SkMatrix& ctm); + +private: + GrTextStrike* fStrike; + + void drawPackedGlyph(GrGlyph::PackedID, GrFixed left, GrFixed top, GrFontScaler*); + void flushGlyphs(); // automatically called by destructor + + enum { + kMinRequestedGlyphs = 1, + kDefaultRequestedGlyphs = 64, + kMinRequestedVerts = kMinRequestedGlyphs * 4, + kDefaultRequestedVerts = kDefaultRequestedGlyphs * 4, + }; + + SkPoint* fVertices; + int32_t fMaxVertices; + GrTexture* fCurrTexture; + int fCurrVertex; +}; + +#endif diff --git a/src/gpu/GrDistanceFieldTextContext.h b/src/gpu/GrDistanceFieldTextContext.h new file mode 100755 index 0000000000..8b94038b67 --- /dev/null +++ b/src/gpu/GrDistanceFieldTextContext.h @@ -0,0 +1,52 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrDistanceFieldTextContext_DEFINED +#define GrDistanceFieldTextContext_DEFINED + +#include "GrTextContext.h" + +class GrTextStrike; + +/* + * This class implements GrTextContext using distance field fonts + */ +class GrDistanceFieldTextContext : public GrTextContext { +public: + virtual void drawText(const char text[], size_t byteLength, SkScalar x, SkScalar y) SK_OVERRIDE; + virtual void drawPosText(const char text[], size_t byteLength, + const SkScalar pos[], SkScalar constY, + int scalarsPerPosition) SK_OVERRIDE; + + static bool CanDraw(const SkPaint& paint, const SkMatrix& ctm); + +private: + GrDistanceFieldTextContext(GrContext*, const GrPaint&, const SkPaint&, + const SkDeviceProperties&); + virtual ~GrDistanceFieldTextContext(); + friend class GrTTextContextManager<GrDistanceFieldTextContext>; + + GrTextStrike* fStrike; + SkScalar fTextRatio; + + void drawPackedGlyph(GrGlyph::PackedID, GrFixed left, GrFixed top, GrFontScaler*); + void flushGlyphs(); // automatically called by destructor + + enum { + kMinRequestedGlyphs = 1, + kDefaultRequestedGlyphs = 64, + kMinRequestedVerts = kMinRequestedGlyphs * 4, + kDefaultRequestedVerts = kDefaultRequestedGlyphs * 4, + }; + + SkPoint* fVertices; + int32_t fMaxVertices; + GrTexture* fCurrTexture; + int fCurrVertex; +}; + +#endif diff --git a/src/gpu/GrTextContext.h b/src/gpu/GrTextContext.h new file mode 100644 index 0000000000..c572d0d016 --- /dev/null +++ b/src/gpu/GrTextContext.h @@ -0,0 +1,129 @@ +/* + * Copyright 2010 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrTextContext_DEFINED +#define GrTextContext_DEFINED + +#include "GrPoint.h" +#include "GrGlyph.h" +#include "GrPaint.h" +#include "SkDeviceProperties.h" + +#include "SkPostConfig.h" + +class GrContext; +class GrDrawTarget; +class GrFontScaler; + +/* + * This class wraps the state for a single text render + */ +class GrTextContext { +public: + virtual ~GrTextContext() {} + virtual void drawText(const char text[], size_t byteLength, SkScalar x, SkScalar y) = 0; + virtual void drawPosText(const char text[], size_t byteLength, + const SkScalar pos[], SkScalar constY, + int scalarsPerPosition) = 0; + +protected: + GrTextContext(GrContext*, const GrPaint&, const SkPaint&, const SkDeviceProperties&); + + static GrFontScaler* GetGrFontScaler(SkGlyphCache* cache); + static void MeasureText(SkGlyphCache* cache, SkDrawCacheProc glyphCacheProc, + const char text[], size_t byteLength, SkVector* stopVector); + + GrContext* fContext; + GrPaint fPaint; + SkPaint fSkPaint; + SkDeviceProperties fDeviceProperties; + 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* grContext, const GrPaint& grPaint, + const SkPaint& skPaint, const SkDeviceProperties& props) = 0; + virtual bool canDraw(const SkPaint& paint, const SkMatrix& ctm) = 0; +}; + +template <class TextContextClass> +class GrTTextContextManager : public GrTextContextManager { +private: + class ManagedTextContext : public TextContextClass { + public: + virtual ~ManagedTextContext() {} + + ManagedTextContext(GrContext* grContext, + const GrPaint& grPaint, + const SkPaint& skPaint, + const SkDeviceProperties& properties, + GrTTextContextManager<TextContextClass>* manager) : + TextContextClass(grContext, grPaint, skPaint, properties) { + 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; + } + + virtual ~GrTTextContextManager() { + SkASSERT(!fUsed); + sk_free(fAllocation); + } + + virtual GrTextContext* create(GrContext* grContext, const GrPaint& grPaint, + const SkPaint& skPaint, const SkDeviceProperties& properties) + SK_OVERRIDE { + // add check for usePath here? + SkASSERT(!fUsed); + ManagedTextContext* obj = SkNEW_PLACEMENT_ARGS(fAllocation, ManagedTextContext, + (grContext, grPaint, skPaint, properties, + this)); + fUsed = true; + return obj; + } + + virtual bool canDraw(const SkPaint& paint, const SkMatrix& ctm) SK_OVERRIDE { + return TextContextClass::CanDraw(paint, ctm); + } + +private: + void recycle(GrTextContext* textContext) { + SkASSERT((void*)textContext == fAllocation); + SkASSERT(fUsed); + fUsed = false; + } + + void* fAllocation; + bool fUsed; +}; + +#endif |