blob: 0e9dd584df4ff000e9256dc485025dd82822159b [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
Mike Reed22451cc2019-01-01 15:40:28 -0500270
271 SkPoint* points() const { return reinterpret_cast<SkPoint*>(pos); }
272 SkRSXform* xforms() const { return reinterpret_cast<SkRSXform*>(pos); }
fmalita00d5c2c2014-08-21 08:53:26 -0700273 };
274
Cary Clarkaf045512018-08-10 13:11:06 -0400275 /** Returns run with storage for glyphs. Caller must write count glyphs to
Cary Clark77b3f3a2018-11-07 14:59:03 -0500276 RunBuffer::glyphs before next call to SkTextBlobBuilder.
Cary Clarkaf045512018-08-10 13:11:06 -0400277
Cary Clark77b3f3a2018-11-07 14:59:03 -0500278 RunBuffer::utf8text, and RunBuffer::clusters should be ignored.
Cary Clarkaf045512018-08-10 13:11:06 -0400279
Cary Clark77b3f3a2018-11-07 14:59:03 -0500280 Glyphs share metrics in font.
Cary Clarkaf045512018-08-10 13:11:06 -0400281
Cary Clark77b3f3a2018-11-07 14:59:03 -0500282 Glyphs are positioned on a baseline at (x, y), using font metrics to
Cary Clarkaf045512018-08-10 13:11:06 -0400283 determine their relative placement.
284
285 bounds defines an optional bounding box, used to suppress drawing when SkTextBlob
286 bounds does not intersect SkSurface bounds. If bounds is nullptr, SkTextBlob bounds
Cary Clark77b3f3a2018-11-07 14:59:03 -0500287 is computed from (x, y) and RunBuffer::glyphs metrics.
Cary Clarkaf045512018-08-10 13:11:06 -0400288
Cary Clark77b3f3a2018-11-07 14:59:03 -0500289 @param font SkFont used for this run
Cary Clarkaf045512018-08-10 13:11:06 -0400290 @param count number of glyphs
291 @param x horizontal offset within the blob
292 @param y vertical offset within the blob
293 @param bounds optional run bounding box
294 @return writable glyph buffer
295 */
Cary Clark77b3f3a2018-11-07 14:59:03 -0500296 const RunBuffer& allocRun(const SkFont& font, int count, SkScalar x, SkScalar y,
297 const SkRect* bounds = nullptr);
fmalita00d5c2c2014-08-21 08:53:26 -0700298
Cary Clarkaf045512018-08-10 13:11:06 -0400299 /** Returns run with storage for glyphs and positions along baseline. Caller must
Cary Clark77b3f3a2018-11-07 14:59:03 -0500300 write count glyphs to RunBuffer::glyphs, and count scalars to RunBuffer::pos;
301 before next call to SkTextBlobBuilder.
Cary Clarkaf045512018-08-10 13:11:06 -0400302
Cary Clark77b3f3a2018-11-07 14:59:03 -0500303 RunBuffer::utf8text, and RunBuffer::clusters should be ignored.
Cary Clarkaf045512018-08-10 13:11:06 -0400304
Cary Clark77b3f3a2018-11-07 14:59:03 -0500305 Glyphs share metrics in font.
Cary Clarkaf045512018-08-10 13:11:06 -0400306
307 Glyphs are positioned on a baseline at y, using x-axis positions written by
Cary Clark77b3f3a2018-11-07 14:59:03 -0500308 caller to RunBuffer::pos.
Cary Clarkaf045512018-08-10 13:11:06 -0400309
310 bounds defines an optional bounding box, used to suppress drawing when SkTextBlob
311 bounds does not intersect SkSurface bounds. If bounds is nullptr, SkTextBlob bounds
Cary Clark77b3f3a2018-11-07 14:59:03 -0500312 is computed from y, RunBuffer::pos, and RunBuffer::glyphs metrics.
Cary Clarkaf045512018-08-10 13:11:06 -0400313
Cary Clark77b3f3a2018-11-07 14:59:03 -0500314 @param font SkFont used for this run
Cary Clarkaf045512018-08-10 13:11:06 -0400315 @param count number of glyphs
316 @param y vertical offset within the blob
317 @param bounds optional run bounding box
318 @return writable glyph buffer and x-axis position buffer
319 */
Cary Clark77b3f3a2018-11-07 14:59:03 -0500320 const RunBuffer& allocRunPosH(const SkFont& font, int count, SkScalar y,
321 const SkRect* bounds = nullptr);
322
323 /** Returns run with storage for glyphs and SkPoint positions. Caller must
324 write count glyphs to RunBuffer::glyphs, and count SkPoint to RunBuffer::pos;
325 before next call to SkTextBlobBuilder.
326
327 RunBuffer::utf8text, and RunBuffer::clusters should be ignored.
328
329 Glyphs share metrics in font.
330
331 Glyphs are positioned using SkPoint written by caller to RunBuffer::pos, using
332 two scalar values for each SkPoint.
333
334 bounds defines an optional bounding box, used to suppress drawing when SkTextBlob
335 bounds does not intersect SkSurface bounds. If bounds is nullptr, SkTextBlob bounds
336 is computed from RunBuffer::pos, and RunBuffer::glyphs metrics.
337
338 @param font SkFont used for this run
339 @param count number of glyphs
340 @param bounds optional run bounding box
341 @return writable glyph buffer and SkPoint buffer
342 */
343 const RunBuffer& allocRunPos(const SkFont& font, int count,
344 const SkRect* bounds = nullptr);
345
Cary Clark811d0642018-12-20 17:06:34 -0500346 // Experimental, RunBuffer.pos points to SkRSXform array
Mike Reed30cf62b2018-12-20 11:18:24 -0500347 const RunBuffer& allocRunRSXform(const SkFont& font, int count);
348
fmalita00d5c2c2014-08-21 08:53:26 -0700349private:
Mike Reed6d595682018-12-05 17:28:14 -0500350 const RunBuffer& allocRunText(const SkFont& font,
Cary Clarke12a0902018-08-09 10:07:33 -0400351 int count,
352 SkScalar x,
353 SkScalar y,
354 int textByteCount,
355 SkString lang,
356 const SkRect* bounds = nullptr);
Mike Reed6d595682018-12-05 17:28:14 -0500357 const RunBuffer& allocRunTextPosH(const SkFont& font, int count, SkScalar y,
Cary Clarke12a0902018-08-09 10:07:33 -0400358 int textByteCount, SkString lang,
359 const SkRect* bounds = nullptr);
Mike Reed6d595682018-12-05 17:28:14 -0500360 const RunBuffer& allocRunTextPos(const SkFont& font, int count,
Cary Clarke12a0902018-08-09 10:07:33 -0400361 int textByteCount, SkString lang,
362 const SkRect* bounds = nullptr);
Mike Reed30cf62b2018-12-20 11:18:24 -0500363 const RunBuffer& allocRunRSXform(const SkFont& font, int count,
364 int textByteCount, SkString lang,
365 const SkRect* bounds = nullptr);
366
fmalita3c196de2014-09-20 05:40:22 -0700367 void reserve(size_t size);
Mike Reedb3f4aac2018-12-05 15:40:29 -0500368 void allocInternal(const SkFont& font, SkTextBlob::GlyphPositioning positioning,
halcanary4f0a23a2016-08-30 11:58:33 -0700369 int count, int textBytes, SkPoint offset, const SkRect* bounds);
Mike Reedb3f4aac2018-12-05 15:40:29 -0500370 bool mergeRun(const SkFont& font, SkTextBlob::GlyphPositioning positioning,
Florin Malitad923a712017-11-22 10:11:12 -0500371 uint32_t count, SkPoint offset);
fmalita00d5c2c2014-08-21 08:53:26 -0700372 void updateDeferredBounds();
373
fmalita3dc40ac2015-01-28 10:56:06 -0800374 static SkRect ConservativeRunBounds(const SkTextBlob::RunRecord&);
375 static SkRect TightRunBounds(const SkTextBlob::RunRecord&);
376
Cary Clarke12a0902018-08-09 10:07:33 -0400377 friend class SkTextBlobPriv;
378 friend class SkTextBlobBuilderPriv;
379
fmalita3c196de2014-09-20 05:40:22 -0700380 SkAutoTMalloc<uint8_t> fStorage;
381 size_t fStorageSize;
382 size_t fStorageUsed;
fmalita00d5c2c2014-08-21 08:53:26 -0700383
fmalita3c196de2014-09-20 05:40:22 -0700384 SkRect fBounds;
385 int fRunCount;
386 bool fDeferredBounds;
387 size_t fLastRun; // index into fStorage
fmalita00d5c2c2014-08-21 08:53:26 -0700388
fmalita3c196de2014-09-20 05:40:22 -0700389 RunBuffer fCurrentRunBuffer;
fmalita00d5c2c2014-08-21 08:53:26 -0700390};
391
392#endif // SkTextBlob_DEFINED