Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: include/core/SkTextBlob.h

Issue 581173003: Souped-up SkTextBlob (reland) (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: updated assert + extra build-time validation Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/core/SkTextBlob.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkTextBlob_DEFINED 8 #ifndef SkTextBlob_DEFINED
9 #define SkTextBlob_DEFINED 9 #define SkTextBlob_DEFINED
10 10
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 */ 46 */
47 static const SkTextBlob* CreateFromBuffer(SkReadBuffer&); 47 static const SkTextBlob* CreateFromBuffer(SkReadBuffer&);
48 48
49 private: 49 private:
50 enum GlyphPositioning { 50 enum GlyphPositioning {
51 kDefault_Positioning = 0, // Default glyph advances -- zero scalars per glyph. 51 kDefault_Positioning = 0, // Default glyph advances -- zero scalars per glyph.
52 kHorizontal_Positioning = 1, // Horizontal positioning -- one scalar p er glyph. 52 kHorizontal_Positioning = 1, // Horizontal positioning -- one scalar p er glyph.
53 kFull_Positioning = 2 // Point positioning -- two scalars per g lyph. 53 kFull_Positioning = 2 // Point positioning -- two scalars per g lyph.
54 }; 54 };
55 55
56 class RunRecord;
57
56 class RunIterator { 58 class RunIterator {
57 public: 59 public:
58 RunIterator(const SkTextBlob* blob); 60 RunIterator(const SkTextBlob* blob);
59 61
60 bool done() const; 62 bool done() const;
61 void next(); 63 void next();
62 64
63 uint32_t glyphCount() const; 65 uint32_t glyphCount() const;
64 const uint16_t* glyphs() const; 66 const uint16_t* glyphs() const;
65 const SkScalar* pos() const; 67 const SkScalar* pos() const;
66 const SkPoint& offset() const; 68 const SkPoint& offset() const;
67 void applyFontToPaint(SkPaint*) const; 69 void applyFontToPaint(SkPaint*) const;
68 GlyphPositioning positioning() const; 70 GlyphPositioning positioning() const;
69 71
70 private: 72 private:
71 const SkTextBlob* fBlob; 73 const RunRecord* fCurrentRun;
72 int fIndex; 74 int fRemainingRuns;
75
76 SkDEBUGCODE(uint8_t* fStorageTop;)
73 }; 77 };
74 78
75 // A run is a sequence of glyphs sharing the same font metrics and positioni ng mode. 79 SkTextBlob(int runCount, const SkRect& bounds);
76 struct Run {
77 uint32_t count;
78 uint32_t glyphStart; // index into fGlyphBuffer
79 uint32_t posStart; // index into fPosBuffer
80 SkPoint offset; // run offset (unsued for fully positioned glyphs)
81 SkPaint font;
82 GlyphPositioning positioning;
83 };
84 80
85 SkTextBlob(uint16_t* glyphs, SkScalar* pos, const SkTArray<Run>* runs, const SkRect& bounds); 81 virtual ~SkTextBlob();
82 virtual void internal_dispose() const SK_OVERRIDE;
86 83
87 static unsigned ScalarsPerGlyph(GlyphPositioning pos); 84 static unsigned ScalarsPerGlyph(GlyphPositioning pos);
88 85
89 friend class SkBaseDevice; 86 friend class SkBaseDevice;
90 friend class SkTextBlobBuilder; 87 friend class SkTextBlobBuilder;
91 friend class TextBlobTester; 88 friend class TextBlobTester;
92 89
93 const SkAutoTMalloc<uint16_t> fGlyphBuffer; 90 const int fRunCount;
94 const SkAutoTMalloc<SkScalar> fPosBuffer; 91 const SkRect fBounds;
92 mutable uint32_t fUniqueID;
95 93
96 // SkTArray required here for run font destruction. 94 SkDEBUGCODE(size_t fStorageSize;)
97 SkAutoTDelete<const SkTArray<Run> > fRuns;
98 const SkRect fBounds;
99 95
100 mutable uint32_t fUniqueID; 96 // The actual payload resides in externally-managed storage, following the o bject.
97 // (see the .cpp for more details)
101 98
102 typedef SkRefCnt INHERITED; 99 typedef SkRefCnt INHERITED;
103 }; 100 };
104 101
105 /** \class SkTextBlobBuilder 102 /** \class SkTextBlobBuilder
106 103
107 Helper class for constructing SkTextBlobs. 104 Helper class for constructing SkTextBlobs.
108 */ 105 */
109 class SK_API SkTextBlobBuilder { 106 class SK_API SkTextBlobBuilder {
110 public: 107 public:
111 /** 108 SkTextBlobBuilder();
112 * @param runs The number of runs to be added, if known. This is a storage hint and
113 * not a limit.
114 */
115 SkTextBlobBuilder(unsigned runs = 0);
116 109
117 ~SkTextBlobBuilder(); 110 ~SkTextBlobBuilder();
118 111
119 /** 112 /**
120 * Returns an immutable SkTextBlob for the current runs/glyphs. The builder is reset and 113 * Returns an immutable SkTextBlob for the current runs/glyphs. The builder is reset and
121 * can be reused. 114 * can be reused.
122 */ 115 */
123 const SkTextBlob* build(); 116 const SkTextBlob* build();
124 117
125 /** 118 /**
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 * @param bounds Optional run bounding box. If known in advance (!= NULL), it will 166 * @param bounds Optional run bounding box. If known in advance (!= NULL), it will
174 * be used when computing the blob bounds, to avoid re-measur ing. 167 * be used when computing the blob bounds, to avoid re-measur ing.
175 * 168 *
176 * @return Writable glyph and position buffers, valid until the next allocRun() 169 * @return Writable glyph and position buffers, valid until the next allocRun()
177 * or build() call. The glyph buffer and position buffer are 170 * or build() call. The glyph buffer and position buffer are
178 * guaranteed to hold @count@ and 2 * @count@ elements, respe ctively. 171 * guaranteed to hold @count@ and 2 * @count@ elements, respe ctively.
179 */ 172 */
180 const RunBuffer& allocRunPos(const SkPaint& font, int count, const SkRect* b ounds = NULL); 173 const RunBuffer& allocRunPos(const SkPaint& font, int count, const SkRect* b ounds = NULL);
181 174
182 private: 175 private:
176 void reserve(size_t size);
183 void allocInternal(const SkPaint& font, SkTextBlob::GlyphPositioning positio ning, 177 void allocInternal(const SkPaint& font, SkTextBlob::GlyphPositioning positio ning,
184 int count, SkPoint offset, const SkRect* bounds); 178 int count, SkPoint offset, const SkRect* bounds);
185 void ensureRun(const SkPaint& font, SkTextBlob::GlyphPositioning positioning , 179 bool mergeRun(const SkPaint& font, SkTextBlob::GlyphPositioning positioning,
186 const SkPoint& offset); 180 int count, SkPoint offset);
187 void updateDeferredBounds(); 181 void updateDeferredBounds();
188 182
189 SkTDArray<uint16_t> fGlyphBuffer; 183 SkAutoTMalloc<uint8_t> fStorage;
190 SkTDArray<SkScalar> fPosBuffer; 184 size_t fStorageSize;
191 SkTArray<SkTextBlob::Run>* fRuns; 185 size_t fStorageUsed;
192 186
193 SkRect fBounds; 187 SkRect fBounds;
194 bool fDeferredBounds; 188 int fRunCount;
189 bool fDeferredBounds;
190 size_t fLastRun; // index into fStorage
195 191
196 RunBuffer fCurrentRunBuffer; 192 RunBuffer fCurrentRunBuffer;
197 }; 193 };
198 194
199 #endif // SkTextBlob_DEFINED 195 #endif // SkTextBlob_DEFINED
OLDNEW
« no previous file with comments | « no previous file | src/core/SkTextBlob.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698