| Index: src/gpu/GrStencilAndCoverTextContext.h
|
| diff --git a/src/gpu/GrStencilAndCoverTextContext.h b/src/gpu/GrStencilAndCoverTextContext.h
|
| index 9e85e89c8820a1c9576f12abac0452f72799f1fb..008f61ee5fde11859e84a27c57c003591f25daef 100644
|
| --- a/src/gpu/GrStencilAndCoverTextContext.h
|
| +++ b/src/gpu/GrStencilAndCoverTextContext.h
|
| @@ -11,6 +11,9 @@
|
| #include "GrTextContext.h"
|
| #include "GrDrawTarget.h"
|
| #include "GrStrokeInfo.h"
|
| +#include "SkTHash.h"
|
| +#include "SkTInternalLList.h"
|
| +#include "SkTLList.h"
|
|
|
| class GrTextStrike;
|
| class GrPath;
|
| @@ -31,19 +34,24 @@ public:
|
| private:
|
| GrStencilAndCoverTextContext(GrContext*, const SkSurfaceProps&);
|
|
|
| - bool canDraw(const GrRenderTarget*, const GrClip&, const GrPaint&,
|
| - const SkPaint&, const SkMatrix& viewMatrix) override;
|
| + bool canDraw(const GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint& skPaint,
|
| + const SkMatrix&) override { return this->internalCanDraw(skPaint); }
|
| +
|
| + bool internalCanDraw(const SkPaint&);
|
|
|
| void onDrawText(GrDrawContext*, GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&,
|
| const SkMatrix& viewMatrix,
|
| const char text[], size_t byteLength,
|
| - SkScalar x, SkScalar y, const SkIRect& regionClipBounds) override;
|
| + SkScalar x, SkScalar y, const SkIRect& clipBounds) override;
|
| void onDrawPosText(GrDrawContext*, GrRenderTarget*,
|
| const GrClip&, const GrPaint&, const SkPaint&,
|
| const SkMatrix& viewMatrix,
|
| const char text[], size_t byteLength,
|
| const SkScalar pos[], int scalarsPerPosition,
|
| - const SkPoint& offset, const SkIRect& regionClipBounds) override;
|
| + const SkPoint& offset, const SkIRect& clipBounds) override;
|
| + void drawTextBlob(GrDrawContext*, GrRenderTarget*, const GrClip&, const SkPaint&,
|
| + const SkMatrix& viewMatrix, const SkTextBlob*, SkScalar x, SkScalar y,
|
| + SkDrawFilter*, const SkIRect& clipBounds) override;
|
|
|
| class FallbackBlobBuilder;
|
|
|
| @@ -59,9 +67,11 @@ private:
|
| const SkScalar pos[], int scalarsPerPosition, const SkPoint& offset,
|
| GrContext*, const SkSurfaceProps*);
|
|
|
| - void draw(GrDrawContext*, GrRenderTarget*, const GrClip&, const GrPaint&, const SkMatrix&,
|
| - const SkIRect& regionClipBounds, GrTextContext* fallbackTextContext,
|
| - const SkPaint& originalSkPaint) const;
|
| + void draw(GrDrawContext*, GrPipelineBuilder*, GrColor, const SkMatrix&,
|
| + SkScalar x, SkScalar y, const SkIRect& clipBounds,
|
| + GrTextContext* fallbackTextContext, const SkPaint& originalSkPaint) const;
|
| +
|
| + int cpuMemorySize() const;
|
|
|
| private:
|
| GrPathRange* createGlyphs(GrContext*, SkGlyphCache*);
|
| @@ -72,12 +82,59 @@ private:
|
| SkPaint fFont;
|
| SkScalar fTextRatio;
|
| float fTextInverseRatio;
|
| - SkMatrix fLocalMatrix;
|
| bool fUsingRawGlyphPaths;
|
| + int fTotalGlyphCount;
|
| SkAutoTUnref<GrPathRangeDraw> fDraw;
|
| SkAutoTUnref<const SkTextBlob> fFallbackTextBlob;
|
| + mutable SkMatrix fLocalMatrixTemplate;
|
| + };
|
| +
|
| + // Text blobs/caches.
|
| +
|
| + class TextBlob : public SkTLList<TextRun> {
|
| + public:
|
| + typedef SkTArray<uint32_t, true> Key;
|
| +
|
| + static const Key& GetKey(const TextBlob* blob) { return blob->key(); }
|
| +
|
| + static uint32_t Hash(const Key& key) {
|
| + SkASSERT(key.count() > 1); // 1-length keys should be using the blob-id hash map.
|
| + return SkChecksum::Murmur3(key.begin(), sizeof(uint32_t) * key.count());
|
| + }
|
| +
|
| + TextBlob(uint32_t blobId, const SkTextBlob* skBlob, const SkPaint& skPaint,
|
| + GrContext* ctx, const SkSurfaceProps* props)
|
| + : fKey(&blobId, 1) { this->init(skBlob, skPaint, ctx, props); }
|
| +
|
| + TextBlob(const Key& key, const SkTextBlob* skBlob, const SkPaint& skPaint,
|
| + GrContext* ctx, const SkSurfaceProps* props)
|
| + : fKey(key) {
|
| + // 1-length keys are unterstood to be the blob id and must use the other constructor.
|
| + SkASSERT(fKey.count() > 1);
|
| + this->init(skBlob, skPaint, ctx, props);
|
| + }
|
| +
|
| + const Key& key() const { return fKey; }
|
| +
|
| + int cpuMemorySize() const { return fCpuMemorySize; }
|
| +
|
| + private:
|
| + void init(const SkTextBlob*, const SkPaint&, GrContext*, const SkSurfaceProps*);
|
| +
|
| + const SkSTArray<1, uint32_t, true> fKey;
|
| + int fCpuMemorySize;
|
| +
|
| + SK_DECLARE_INTERNAL_LLIST_INTERFACE(TextBlob);
|
| };
|
|
|
| + const TextBlob& findOrCreateTextBlob(const SkTextBlob*, const SkPaint&);
|
| + void purgeToFit(const TextBlob&);
|
| +
|
| + SkTHashMap<uint32_t, TextBlob*> fBlobIdCache;
|
| + SkTHashTable<TextBlob*, const TextBlob::Key&, TextBlob> fBlobKeyCache;
|
| + SkTInternalLList<TextBlob> fLRUList;
|
| + int fCacheSize;
|
| +
|
| typedef GrTextContext INHERITED;
|
| };
|
|
|
|
|