Chromium Code Reviews| Index: include/core/SkTextBlob.h |
| diff --git a/include/core/SkTextBlob.h b/include/core/SkTextBlob.h |
| index 8e67723494fa54c2f22b002e1c2da4f4c082827c..52fe18a70c403275a753a30f0a838cf6852f5923 100644 |
| --- a/include/core/SkTextBlob.h |
| +++ b/include/core/SkTextBlob.h |
| @@ -53,6 +53,8 @@ private: |
| kFull_Positioning = 2 // Point positioning -- two scalars per glyph. |
| }; |
| + class RunRecord; |
| + |
| class RunIterator { |
| public: |
| RunIterator(const SkTextBlob* blob); |
| @@ -68,21 +70,16 @@ private: |
| GlyphPositioning positioning() const; |
| private: |
| - const SkTextBlob* fBlob; |
| - int fIndex; |
| - }; |
| + const RunRecord* fCurrentRun; |
| + int fRemainingRuns; |
| - // 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; |
| + SkDEBUGCODE(uint8_t* fStorageTop;) |
| }; |
| - SkTextBlob(uint16_t* glyphs, SkScalar* pos, const SkTArray<Run>* runs, const SkRect& bounds); |
| + SkTextBlob(int runCount, const SkRect& bounds); |
| + |
| + virtual ~SkTextBlob(); |
| + virtual void internal_dispose() const SK_OVERRIDE; |
| static unsigned ScalarsPerGlyph(GlyphPositioning pos); |
| @@ -90,14 +87,11 @@ private: |
| friend class SkTextBlobBuilder; |
| friend class TextBlobTester; |
| - const SkAutoTMalloc<uint16_t> fGlyphBuffer; |
| - const SkAutoTMalloc<SkScalar> fPosBuffer; |
| + const int fRunCount; |
| + const SkRect fBounds; |
| + mutable uint32_t fUniqueID; |
| - // SkTArray required here for run font destruction. |
| - SkAutoTDelete<const SkTArray<Run> > fRuns; |
| - const SkRect fBounds; |
| - |
| - mutable uint32_t fUniqueID; |
| + SkDEBUGCODE(size_t fStorageSize;) |
|
mtklein
2014/09/19 14:33:02
// There are more fields following this, see the .
f(malita)
2014/09/19 15:42:36
Done.
|
| typedef SkRefCnt INHERITED; |
| }; |
| @@ -108,11 +102,7 @@ private: |
| */ |
| class SK_API SkTextBlobBuilder { |
| public: |
| - /** |
| - * @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(); |
| ~SkTextBlobBuilder(); |
| @@ -180,20 +170,23 @@ public: |
| 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); |
| - void ensureRun(const SkPaint& font, SkTextBlob::GlyphPositioning positioning, |
| - const SkPoint& offset); |
| + bool mergeRun(const SkPaint& font, SkTextBlob::GlyphPositioning positioning, |
| + int count, SkPoint offset); |
| void updateDeferredBounds(); |
| - SkTDArray<uint16_t> fGlyphBuffer; |
| - SkTDArray<SkScalar> fPosBuffer; |
| - SkTArray<SkTextBlob::Run>* fRuns; |
| + SkAutoTMalloc<uint8_t> fStorage; |
| + size_t fStorageSize; |
| + size_t fStorageUsed; |
| - SkRect fBounds; |
| - bool fDeferredBounds; |
| + SkRect fBounds; |
| + int fRunCount; |
| + bool fDeferredBounds; |
| + size_t fLastRun; // index into fStorage |
| - RunBuffer fCurrentRunBuffer; |
| + RunBuffer fCurrentRunBuffer; |
| }; |
| #endif // SkTextBlob_DEFINED |