| Index: include/core/SkTextBlob.h
|
| diff --git a/include/core/SkTextBlob.h b/include/core/SkTextBlob.h
|
| index 8ee1d1919628b10e0d3f3ca6085a02ad619a68b2..8e67723494fa54c2f22b002e1c2da4f4c082827c 100644
|
| --- a/include/core/SkTextBlob.h
|
| +++ b/include/core/SkTextBlob.h
|
| @@ -53,8 +53,6 @@
|
| kFull_Positioning = 2 // Point positioning -- two scalars per glyph.
|
| };
|
|
|
| - class RunRecord;
|
| -
|
| class RunIterator {
|
| public:
|
| RunIterator(const SkTextBlob* blob);
|
| @@ -70,16 +68,21 @@
|
| GlyphPositioning positioning() const;
|
|
|
| private:
|
| - const RunRecord* fCurrentRun;
|
| - int fRemainingRuns;
|
| -
|
| - SkDEBUGCODE(uint8_t* fStorageTop;)
|
| + const SkTextBlob* fBlob;
|
| + int fIndex;
|
| };
|
|
|
| - SkTextBlob(int runCount, const SkRect& bounds);
|
| + // A run is a sequence of glyphs sharing the same font metrics and positioning mode.
|
| + struct Run {
|
| + uint32_t count;
|
| + uint32_t glyphStart; // index into fGlyphBuffer
|
| + uint32_t posStart; // index into fPosBuffer
|
| + SkPoint offset; // run offset (unsued for fully positioned glyphs)
|
| + SkPaint font;
|
| + GlyphPositioning positioning;
|
| + };
|
|
|
| - virtual ~SkTextBlob();
|
| - virtual void internal_dispose() const SK_OVERRIDE;
|
| + SkTextBlob(uint16_t* glyphs, SkScalar* pos, const SkTArray<Run>* runs, const SkRect& bounds);
|
|
|
| static unsigned ScalarsPerGlyph(GlyphPositioning pos);
|
|
|
| @@ -87,14 +90,14 @@
|
| friend class SkTextBlobBuilder;
|
| friend class TextBlobTester;
|
|
|
| - const int fRunCount;
|
| - const SkRect fBounds;
|
| - mutable uint32_t fUniqueID;
|
| + const SkAutoTMalloc<uint16_t> fGlyphBuffer;
|
| + const SkAutoTMalloc<SkScalar> fPosBuffer;
|
|
|
| - SkDEBUGCODE(size_t fStorageSize;)
|
| + // SkTArray required here for run font destruction.
|
| + SkAutoTDelete<const SkTArray<Run> > fRuns;
|
| + const SkRect fBounds;
|
|
|
| - // The actual payload resides in externally-managed storage, following the object.
|
| - // (see the .cpp for more details)
|
| + mutable uint32_t fUniqueID;
|
|
|
| typedef SkRefCnt INHERITED;
|
| };
|
| @@ -105,7 +108,11 @@
|
| */
|
| class SK_API SkTextBlobBuilder {
|
| public:
|
| - SkTextBlobBuilder();
|
| + /**
|
| + * @param runs The number of runs to be added, if known. This is a storage hint and
|
| + * not a limit.
|
| + */
|
| + SkTextBlobBuilder(unsigned runs = 0);
|
|
|
| ~SkTextBlobBuilder();
|
|
|
| @@ -173,23 +180,20 @@
|
| const RunBuffer& allocRunPos(const SkPaint& font, int count, const SkRect* bounds = NULL);
|
|
|
| private:
|
| - void reserve(size_t size);
|
| void allocInternal(const SkPaint& font, SkTextBlob::GlyphPositioning positioning,
|
| int count, SkPoint offset, const SkRect* bounds);
|
| - bool mergeRun(const SkPaint& font, SkTextBlob::GlyphPositioning positioning,
|
| - int count, SkPoint offset);
|
| + void ensureRun(const SkPaint& font, SkTextBlob::GlyphPositioning positioning,
|
| + const SkPoint& offset);
|
| void updateDeferredBounds();
|
|
|
| - SkAutoTMalloc<uint8_t> fStorage;
|
| - size_t fStorageSize;
|
| - size_t fStorageUsed;
|
| + SkTDArray<uint16_t> fGlyphBuffer;
|
| + SkTDArray<SkScalar> fPosBuffer;
|
| + SkTArray<SkTextBlob::Run>* fRuns;
|
|
|
| - SkRect fBounds;
|
| - int fRunCount;
|
| - bool fDeferredBounds;
|
| - size_t fLastRun; // index into fStorage
|
| + SkRect fBounds;
|
| + bool fDeferredBounds;
|
|
|
| - RunBuffer fCurrentRunBuffer;
|
| + RunBuffer fCurrentRunBuffer;
|
| };
|
|
|
| #endif // SkTextBlob_DEFINED
|
|
|