Index: include/core/SkTextBlob.h |
diff --git a/include/core/SkTextBlob.h b/include/core/SkTextBlob.h |
index 8e67723494fa54c2f22b002e1c2da4f4c082827c..8ee1d1919628b10e0d3f3ca6085a02ad619a68b2 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,14 @@ 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; |
+ SkDEBUGCODE(size_t fStorageSize;) |
- mutable uint32_t fUniqueID; |
+ // The actual payload resides in externally-managed storage, following the object. |
+ // (see the .cpp for more details) |
typedef SkRefCnt INHERITED; |
}; |
@@ -108,11 +105,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 +173,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 |