blob: 8a3129bc80311f3af2296c546fb2a35f7003382a [file] [log] [blame]
fmalita00d5c2c2014-08-21 08:53:26 -07001/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Cary Clarkaf045512018-08-10 13:11:06 -04008/* Generated by tools/bookmaker from include/core/SkTextBlob.h and docs/SkTextBlob_Reference.bmh
9 on 2018-08-10 12:59:44. Additional documentation and examples can be found at:
10 https://skia.org/user/api/SkTextBlob_Reference
11
12 You may edit either file directly. Structural changes to public interfaces require
13 editing both files. After editing docs/SkTextBlob_Reference.bmh, run:
14 bookmaker -b docs -i include/core/SkTextBlob.h -p
15 to create an updated version of this file.
16 */
17
fmalita00d5c2c2014-08-21 08:53:26 -070018#ifndef SkTextBlob_DEFINED
19#define SkTextBlob_DEFINED
20
bungemanbf521ff2016-02-17 13:13:44 -080021#include "../private/SkTemplates.h"
Mike Reed3185f902018-10-26 16:33:00 -040022#include "SkFont.h"
fmalita00d5c2c2014-08-21 08:53:26 -070023#include "SkPaint.h"
halcanary4f0a23a2016-08-30 11:58:33 -070024#include "SkString.h"
fmalita00d5c2c2014-08-21 08:53:26 -070025#include "SkRefCnt.h"
Hal Canaryc2d0fb12018-09-19 10:28:59 -040026
Mike Klein015c8992018-08-09 12:23:19 -040027#include <atomic>
fmalita00d5c2c2014-08-21 08:53:26 -070028
Mike Reed30cf62b2018-12-20 11:18:24 -050029struct SkRSXform;
Mike Reed8e74cbc2017-12-08 13:20:01 -050030struct SkSerialProcs;
31struct SkDeserialProcs;
32
fmalita00d5c2c2014-08-21 08:53:26 -070033/** \class SkTextBlob
Cary Clarkaf045512018-08-10 13:11:06 -040034 SkTextBlob combines multiple text runs into an immutable container. Each text
35 run consists of glyphs, SkPaint, and position. Only parts of SkPaint related to
36 fonts and text rendering are used by run.
fmalita00d5c2c2014-08-21 08:53:26 -070037*/
Mike Klein408ef212018-10-30 15:23:00 +000038class SK_API SkTextBlob final : public SkNVRefCnt<SkTextBlob> {
fmalita00d5c2c2014-08-21 08:53:26 -070039public:
Cary Clarkaf045512018-08-10 13:11:06 -040040
41 /** Returns conservative bounding box. Uses SkPaint associated with each glyph to
42 determine glyph bounds, and unions all bounds. Returned bounds may be
43 larger than the bounds of all glyphs in runs.
44
45 @return conservative bounding box
46 */
fmalita00d5c2c2014-08-21 08:53:26 -070047 const SkRect& bounds() const { return fBounds; }
48
Cary Clarkaf045512018-08-10 13:11:06 -040049 /** Returns a non-zero value unique among all text blobs.
50
51 @return identifier for SkTextBlob
52 */
joshualitt2af85832015-03-25 13:40:13 -070053 uint32_t uniqueID() const { return fUniqueID; }
fmalita00d5c2c2014-08-21 08:53:26 -070054
Mike Reedae0d8602018-12-10 22:02:17 -050055 /** Returns the number of intervals that intersect bounds.
56 bounds describes a pair of lines parallel to the text advance.
57 The return count is zero or a multiple of two, and is at most twice the number of glyphs in
58 the the blob.
59
60 Pass nullptr for intervals to determine the size of the interval array.
61
Cary Clark811d0642018-12-20 17:06:34 -050062 Runs within the blob that contain SkRSXform are ignored when computing intercepts.
Mike Reed30cf62b2018-12-20 11:18:24 -050063
Mike Reedae0d8602018-12-10 22:02:17 -050064 @param bounds lower and upper line parallel to the advance
65 @param intervals returned intersections; may be nullptr
Cary Clark4f738832018-12-11 08:41:11 -050066 @param paint specifies stroking, SkPathEffect that affects the result; may be nullptr
Mike Reedae0d8602018-12-10 22:02:17 -050067 @return number of intersections; may be zero
68 */
69 int getIntercepts(const SkScalar bounds[2], SkScalar intervals[],
70 const SkPaint* paint = nullptr) const;
71
Mike Reed3185f902018-10-26 16:33:00 -040072 /** Creates SkTextBlob with a single run.
Cary Clarkaf045512018-08-10 13:11:06 -040073
Cary Clark77b3f3a2018-11-07 14:59:03 -050074 font contains attributes used to define the run text.
Cary Clarkaf045512018-08-10 13:11:06 -040075
76 @param text character code points or glyphs drawn
77 @param byteLength byte length of text array
Mike Reed3185f902018-10-26 16:33:00 -040078 @param font text size, typeface, text scale, and so on, used to draw
Cary Clarkaf045512018-08-10 13:11:06 -040079 @return SkTextBlob constructed from one run
80 */
Mike Reed3185f902018-10-26 16:33:00 -040081 static sk_sp<SkTextBlob> MakeFromText(const void* text, size_t byteLength, const SkFont& font,
Mike Reed97f3cc22018-12-03 09:45:17 -050082 SkTextEncoding encoding = kUTF8_SkTextEncoding);
Herb Derby4b3a5152018-07-17 16:10:30 -040083
Mike Reed97f3cc22018-12-03 09:45:17 -050084 /** Creates SkTextBlob with a single run. string meaning depends on SkTextEncoding;
Cary Clarkaf045512018-08-10 13:11:06 -040085 by default, string is encoded as UTF-8.
86
Cary Clark77b3f3a2018-11-07 14:59:03 -050087 font contains attributes used to define the run text.
Cary Clarkaf045512018-08-10 13:11:06 -040088
89 @param string character code points or glyphs drawn
Mike Reed3185f902018-10-26 16:33:00 -040090 @param font text size, typeface, text scale, and so on, used to draw
Cary Clarkaf045512018-08-10 13:11:06 -040091 @return SkTextBlob constructed from one run
92 */
Mike Reed3185f902018-10-26 16:33:00 -040093 static sk_sp<SkTextBlob> MakeFromString(const char* string, const SkFont& font,
Mike Reed97f3cc22018-12-03 09:45:17 -050094 SkTextEncoding encoding = kUTF8_SkTextEncoding) {
Cary Clarke12a0902018-08-09 10:07:33 -040095 if (!string) {
96 return nullptr;
97 }
Mike Reed3185f902018-10-26 16:33:00 -040098 return MakeFromText(string, strlen(string), font, encoding);
Cary Clarke12a0902018-08-09 10:07:33 -040099 }
100
Mike Reedefb518d2018-12-06 13:30:23 -0500101 /** Experimental.
102 Returns a textblob built from a single run of text with x-positions and a single y value.
103 This is equivalent to using SkTextBlobBuilder and calling allocRunPosH().
104 Returns nullptr if byteLength is zero.
105
106 @param text character code points or glyphs drawn (based on encoding)
107 @param byteLength byte length of text array
108 @param xpos array of x-positions, must contain values for all of the character points.
109 @param constY shared y-position for each character point, to be paired with each xpos.
110 @param font SkFont used for this run
111 @param encoding specifies the encoding of the text array.
112 @return new textblob or nullptr
113 */
114 static sk_sp<SkTextBlob> MakeFromPosTextH(const void* text, size_t byteLength,
115 const SkScalar xpos[], SkScalar constY, const SkFont& font,
116 SkTextEncoding encoding = kUTF8_SkTextEncoding);
117
118 /** Experimental.
119 Returns a textblob built from a single run of text with positions.
120 This is equivalent to using SkTextBlobBuilder and calling allocRunPos().
121 Returns nullptr if byteLength is zero.
122
123 @param text character code points or glyphs drawn (based on encoding)
124 @param byteLength byte length of text array
125 @param pos array of positions, must contain values for all of the character points.
126 @param font SkFont used for this run
127 @param encoding specifies the encoding of the text array.
128 @return new textblob or nullptr
129 */
130 static sk_sp<SkTextBlob> MakeFromPosText(const void* text, size_t byteLength,
131 const SkPoint pos[], const SkFont& font,
132 SkTextEncoding encoding = kUTF8_SkTextEncoding);
133
Mike Reed30cf62b2018-12-20 11:18:24 -0500134 // Experimental
135 static sk_sp<SkTextBlob> MakeFromRSXform(const void* text, size_t byteLength,
136 const SkRSXform xform[], const SkFont& font,
137 SkTextEncoding encoding = kUTF8_SkTextEncoding);
138
Cary Clarkaf045512018-08-10 13:11:06 -0400139 /** Writes data to allow later reconstruction of SkTextBlob. memory points to storage
140 to receive the encoded data, and memory_size describes the size of storage.
141 Returns bytes used if provided storage is large enough to hold all data;
142 otherwise, returns zero.
143
144 procs.fTypefaceProc permits supplying a custom function to encode SkTypeface.
145 If procs.fTypefaceProc is nullptr, default encoding is used. procs.fTypefaceCtx
146 may be used to provide user context to procs.fTypefaceProc; procs.fTypefaceProc
147 is called with a pointer to SkTypeface and user context.
148
Cary Clark82456492018-10-31 10:54:50 -0400149 @param procs custom serial data encoders; may be nullptr
150 @param memory storage for data
151 @param memory_size size of storage
152 @return bytes written, or zero if required storage is larger than memory_size
Cary Clarkaf045512018-08-10 13:11:06 -0400153 */
Khushal42f8bc42018-04-03 17:51:40 -0700154 size_t serialize(const SkSerialProcs& procs, void* memory, size_t memory_size) const;
155
Cary Clarkaf045512018-08-10 13:11:06 -0400156 /** Returns storage containing SkData describing SkTextBlob, using optional custom
157 encoders.
158
159 procs.fTypefaceProc permits supplying a custom function to encode SkTypeface.
160 If procs.fTypefaceProc is nullptr, default encoding is used. procs.fTypefaceCtx
161 may be used to provide user context to procs.fTypefaceProc; procs.fTypefaceProc
162 is called with a pointer to SkTypeface and user context.
163
164 @param procs custom serial data encoders; may be nullptr
165 @return storage containing serialized SkTextBlob
166 */
Cary Clark785586a2018-07-19 10:07:01 -0400167 sk_sp<SkData> serialize(const SkSerialProcs& procs) const;
Mike Reedaaa30562017-07-21 11:53:23 -0400168
Cary Clarkaf045512018-08-10 13:11:06 -0400169 /** Recreates SkTextBlob that was serialized into data. Returns constructed SkTextBlob
170 if successful; otherwise, returns nullptr. Fails if size is smaller than
171 required data length, or if data does not permit constructing valid SkTextBlob.
172
173 procs.fTypefaceProc permits supplying a custom function to decode SkTypeface.
174 If procs.fTypefaceProc is nullptr, default decoding is used. procs.fTypefaceCtx
175 may be used to provide user context to procs.fTypefaceProc; procs.fTypefaceProc
176 is called with a pointer to SkTypeface data, data byte length, and user context.
177
178 @param data pointer for serial data
179 @param size size of data
180 @param procs custom serial data decoders; may be nullptr
181 @return SkTextBlob constructed from data in memory
182 */
Cary Clark785586a2018-07-19 10:07:01 -0400183 static sk_sp<SkTextBlob> Deserialize(const void* data, size_t size,
184 const SkDeserialProcs& procs);
Mike Reed8e74cbc2017-12-08 13:20:01 -0500185
halcanary33779752015-10-27 14:01:05 -0700186private:
Mike Klein408ef212018-10-30 15:23:00 +0000187 friend class SkNVRefCnt<SkTextBlob>;
fmalita3c196de2014-09-20 05:40:22 -0700188 class RunRecord;
189
Florin Malitaab54e732018-07-27 09:47:15 -0400190 enum GlyphPositioning : uint8_t;
191
Florin Malita3a9a7a32017-03-13 09:03:24 -0400192 explicit SkTextBlob(const SkRect& bounds);
fmalita00d5c2c2014-08-21 08:53:26 -0700193
mtkleinb47cd4b2016-08-09 12:20:04 -0700194 ~SkTextBlob();
bsalomon07280312014-11-20 08:02:46 -0800195
196 // Memory for objects of this class is created with sk_malloc rather than operator new and must
197 // be freed with sk_free.
Yong-Hwan Baek688a8e52018-07-09 14:14:26 +0900198 void operator delete(void* p);
199 void* operator new(size_t);
200 void* operator new(size_t, void* p);
fmalita00d5c2c2014-08-21 08:53:26 -0700201
fmalitab7425172014-08-26 07:56:44 -0700202 static unsigned ScalarsPerGlyph(GlyphPositioning pos);
203
Florin Malita4a01ac92017-03-13 16:45:28 -0400204 // Call when this blob is part of the key to a cache entry. This allows the cache
205 // to know automatically those entries can be purged when this SkTextBlob is deleted.
Jim Van Verth474d6872017-12-14 13:00:05 -0500206 void notifyAddedToCache(uint32_t cacheID) const {
207 fCacheID.store(cacheID);
Florin Malita4a01ac92017-03-13 16:45:28 -0400208 }
209
Herb Derby8a6348e2018-07-12 15:30:35 -0400210 friend class SkGlyphRunList;
Florin Malita4a01ac92017-03-13 16:45:28 -0400211 friend class GrTextBlobCache;
fmalita00d5c2c2014-08-21 08:53:26 -0700212 friend class SkTextBlobBuilder;
Cary Clark53c87692018-07-17 08:59:34 -0400213 friend class SkTextBlobPriv;
halcanary33779752015-10-27 14:01:05 -0700214 friend class SkTextBlobRunIterator;
fmalita00d5c2c2014-08-21 08:53:26 -0700215
Mike Klein015c8992018-08-09 12:23:19 -0400216 const SkRect fBounds;
217 const uint32_t fUniqueID;
218 mutable std::atomic<uint32_t> fCacheID;
fmalita00d5c2c2014-08-21 08:53:26 -0700219
fmalita3c196de2014-09-20 05:40:22 -0700220 SkDEBUGCODE(size_t fStorageSize;)
fmalita00d5c2c2014-08-21 08:53:26 -0700221
fmalita3c196de2014-09-20 05:40:22 -0700222 // The actual payload resides in externally-managed storage, following the object.
223 // (see the .cpp for more details)
fmalita00d5c2c2014-08-21 08:53:26 -0700224
225 typedef SkRefCnt INHERITED;
226};
227
228/** \class SkTextBlobBuilder
Cary Clarkaf045512018-08-10 13:11:06 -0400229 Helper class for constructing SkTextBlob.
230*/
jbroman3053dfa2014-08-25 06:22:12 -0700231class SK_API SkTextBlobBuilder {
fmalita00d5c2c2014-08-21 08:53:26 -0700232public:
Cary Clarkaf045512018-08-10 13:11:06 -0400233
234 /** Constructs empty SkTextBlobBuilder. By default, SkTextBlobBuilder has no runs.
235
236 @return empty SkTextBlobBuilder
237 */
fmalita3c196de2014-09-20 05:40:22 -0700238 SkTextBlobBuilder();
fmalita00d5c2c2014-08-21 08:53:26 -0700239
Cary Clarkaf045512018-08-10 13:11:06 -0400240 /** Deletes data allocated internally by SkTextBlobBuilder.
241 */
fmalita00d5c2c2014-08-21 08:53:26 -0700242 ~SkTextBlobBuilder();
243
Cary Clarkaf045512018-08-10 13:11:06 -0400244 /** Returns SkTextBlob built from runs of glyphs added by builder. Returned
245 SkTextBlob is immutable; it may be copied, but its contents may not be altered.
246 Returns nullptr if no runs of glyphs were added by builder.
247
248 Resets SkTextBlobBuilder to its initial empty state, allowing it to be
249 reused to build a new set of runs.
250
251 @return SkTextBlob or nullptr
252 */
reed2ab90572016-08-10 14:16:41 -0700253 sk_sp<SkTextBlob> make();
254
Cary Clarkaf045512018-08-10 13:11:06 -0400255 /** \struct SkTextBlobBuilder::RunBuffer
256 RunBuffer supplies storage for glyphs and positions within a run.
257
Cary Clark77b3f3a2018-11-07 14:59:03 -0500258 A run is a sequence of glyphs sharing font metrics and positioning.
Cary Clarkaf045512018-08-10 13:11:06 -0400259 Each run may position its glyphs in one of three ways:
Cary Clark77b3f3a2018-11-07 14:59:03 -0500260 by specifying where the first glyph is drawn, and allowing font metrics to
Cary Clarkaf045512018-08-10 13:11:06 -0400261 determine the advance to subsequent glyphs; by specifying a baseline, and
262 the position on that baseline for each glyph in run; or by providing SkPoint
263 array, one per glyph.
264 */
fmalita00d5c2c2014-08-21 08:53:26 -0700265 struct RunBuffer {
Cary Clarkaf045512018-08-10 13:11:06 -0400266 SkGlyphID* glyphs; //!< storage for glyphs in run
267 SkScalar* pos; //!< storage for positions in run
268 char* utf8text; //!< reserved for future use
269 uint32_t* clusters; //!< reserved for future use
fmalita00d5c2c2014-08-21 08:53:26 -0700270 };
271
Cary Clarkaf045512018-08-10 13:11:06 -0400272 /** Returns run with storage for glyphs. Caller must write count glyphs to
Cary Clark77b3f3a2018-11-07 14:59:03 -0500273 RunBuffer::glyphs before next call to SkTextBlobBuilder.
Cary Clarkaf045512018-08-10 13:11:06 -0400274
Cary Clark77b3f3a2018-11-07 14:59:03 -0500275 RunBuffer::utf8text, and RunBuffer::clusters should be ignored.
Cary Clarkaf045512018-08-10 13:11:06 -0400276
Cary Clark77b3f3a2018-11-07 14:59:03 -0500277 Glyphs share metrics in font.
Cary Clarkaf045512018-08-10 13:11:06 -0400278
Cary Clark77b3f3a2018-11-07 14:59:03 -0500279 Glyphs are positioned on a baseline at (x, y), using font metrics to
Cary Clarkaf045512018-08-10 13:11:06 -0400280 determine their relative placement.
281
282 bounds defines an optional bounding box, used to suppress drawing when SkTextBlob
283 bounds does not intersect SkSurface bounds. If bounds is nullptr, SkTextBlob bounds
Cary Clark77b3f3a2018-11-07 14:59:03 -0500284 is computed from (x, y) and RunBuffer::glyphs metrics.
Cary Clarkaf045512018-08-10 13:11:06 -0400285
Cary Clark77b3f3a2018-11-07 14:59:03 -0500286 @param font SkFont used for this run
Cary Clarkaf045512018-08-10 13:11:06 -0400287 @param count number of glyphs
288 @param x horizontal offset within the blob
289 @param y vertical offset within the blob
290 @param bounds optional run bounding box
291 @return writable glyph buffer
292 */
Cary Clark77b3f3a2018-11-07 14:59:03 -0500293 const RunBuffer& allocRun(const SkFont& font, int count, SkScalar x, SkScalar y,
294 const SkRect* bounds = nullptr);
fmalita00d5c2c2014-08-21 08:53:26 -0700295
Cary Clarkaf045512018-08-10 13:11:06 -0400296 /** Returns run with storage for glyphs and positions along baseline. Caller must
Cary Clark77b3f3a2018-11-07 14:59:03 -0500297 write count glyphs to RunBuffer::glyphs, and count scalars to RunBuffer::pos;
298 before next call to SkTextBlobBuilder.
Cary Clarkaf045512018-08-10 13:11:06 -0400299
Cary Clark77b3f3a2018-11-07 14:59:03 -0500300 RunBuffer::utf8text, and RunBuffer::clusters should be ignored.
Cary Clarkaf045512018-08-10 13:11:06 -0400301
Cary Clark77b3f3a2018-11-07 14:59:03 -0500302 Glyphs share metrics in font.
Cary Clarkaf045512018-08-10 13:11:06 -0400303
304 Glyphs are positioned on a baseline at y, using x-axis positions written by
Cary Clark77b3f3a2018-11-07 14:59:03 -0500305 caller to RunBuffer::pos.
Cary Clarkaf045512018-08-10 13:11:06 -0400306
307 bounds defines an optional bounding box, used to suppress drawing when SkTextBlob
308 bounds does not intersect SkSurface bounds. If bounds is nullptr, SkTextBlob bounds
Cary Clark77b3f3a2018-11-07 14:59:03 -0500309 is computed from y, RunBuffer::pos, and RunBuffer::glyphs metrics.
Cary Clarkaf045512018-08-10 13:11:06 -0400310
Cary Clark77b3f3a2018-11-07 14:59:03 -0500311 @param font SkFont used for this run
Cary Clarkaf045512018-08-10 13:11:06 -0400312 @param count number of glyphs
313 @param y vertical offset within the blob
314 @param bounds optional run bounding box
315 @return writable glyph buffer and x-axis position buffer
316 */
Cary Clark77b3f3a2018-11-07 14:59:03 -0500317 const RunBuffer& allocRunPosH(const SkFont& font, int count, SkScalar y,
318 const SkRect* bounds = nullptr);
319
320 /** Returns run with storage for glyphs and SkPoint positions. Caller must
321 write count glyphs to RunBuffer::glyphs, and count SkPoint to RunBuffer::pos;
322 before next call to SkTextBlobBuilder.
323
324 RunBuffer::utf8text, and RunBuffer::clusters should be ignored.
325
326 Glyphs share metrics in font.
327
328 Glyphs are positioned using SkPoint written by caller to RunBuffer::pos, using
329 two scalar values for each SkPoint.
330
331 bounds defines an optional bounding box, used to suppress drawing when SkTextBlob
332 bounds does not intersect SkSurface bounds. If bounds is nullptr, SkTextBlob bounds
333 is computed from RunBuffer::pos, and RunBuffer::glyphs metrics.
334
335 @param font SkFont used for this run
336 @param count number of glyphs
337 @param bounds optional run bounding box
338 @return writable glyph buffer and SkPoint buffer
339 */
340 const RunBuffer& allocRunPos(const SkFont& font, int count,
341 const SkRect* bounds = nullptr);
342
Cary Clark811d0642018-12-20 17:06:34 -0500343 // Experimental, RunBuffer.pos points to SkRSXform array
Mike Reed30cf62b2018-12-20 11:18:24 -0500344 const RunBuffer& allocRunRSXform(const SkFont& font, int count);
345
fmalita00d5c2c2014-08-21 08:53:26 -0700346private:
Mike Reed6d595682018-12-05 17:28:14 -0500347 const RunBuffer& allocRunText(const SkFont& font,
Cary Clarke12a0902018-08-09 10:07:33 -0400348 int count,
349 SkScalar x,
350 SkScalar y,
351 int textByteCount,
352 SkString lang,
353 const SkRect* bounds = nullptr);
Mike Reed6d595682018-12-05 17:28:14 -0500354 const RunBuffer& allocRunTextPosH(const SkFont& font, int count, SkScalar y,
Cary Clarke12a0902018-08-09 10:07:33 -0400355 int textByteCount, SkString lang,
356 const SkRect* bounds = nullptr);
Mike Reed6d595682018-12-05 17:28:14 -0500357 const RunBuffer& allocRunTextPos(const SkFont& font, int count,
Cary Clarke12a0902018-08-09 10:07:33 -0400358 int textByteCount, SkString lang,
359 const SkRect* bounds = nullptr);
Mike Reed30cf62b2018-12-20 11:18:24 -0500360 const RunBuffer& allocRunRSXform(const SkFont& font, int count,
361 int textByteCount, SkString lang,
362 const SkRect* bounds = nullptr);
363
fmalita3c196de2014-09-20 05:40:22 -0700364 void reserve(size_t size);
Mike Reedb3f4aac2018-12-05 15:40:29 -0500365 void allocInternal(const SkFont& font, SkTextBlob::GlyphPositioning positioning,
halcanary4f0a23a2016-08-30 11:58:33 -0700366 int count, int textBytes, SkPoint offset, const SkRect* bounds);
Mike Reedb3f4aac2018-12-05 15:40:29 -0500367 bool mergeRun(const SkFont& font, SkTextBlob::GlyphPositioning positioning,
Florin Malitad923a712017-11-22 10:11:12 -0500368 uint32_t count, SkPoint offset);
fmalita00d5c2c2014-08-21 08:53:26 -0700369 void updateDeferredBounds();
370
fmalita3dc40ac2015-01-28 10:56:06 -0800371 static SkRect ConservativeRunBounds(const SkTextBlob::RunRecord&);
372 static SkRect TightRunBounds(const SkTextBlob::RunRecord&);
373
Cary Clarke12a0902018-08-09 10:07:33 -0400374 friend class SkTextBlobPriv;
375 friend class SkTextBlobBuilderPriv;
376
fmalita3c196de2014-09-20 05:40:22 -0700377 SkAutoTMalloc<uint8_t> fStorage;
378 size_t fStorageSize;
379 size_t fStorageUsed;
fmalita00d5c2c2014-08-21 08:53:26 -0700380
fmalita3c196de2014-09-20 05:40:22 -0700381 SkRect fBounds;
382 int fRunCount;
383 bool fDeferredBounds;
384 size_t fLastRun; // index into fStorage
fmalita00d5c2c2014-08-21 08:53:26 -0700385
fmalita3c196de2014-09-20 05:40:22 -0700386 RunBuffer fCurrentRunBuffer;
fmalita00d5c2c2014-08-21 08:53:26 -0700387};
388
389#endif // SkTextBlob_DEFINED