|  | #Topic Text_Blob_Builder | 
|  | #Alias Text_Blob_Builder_Reference ## | 
|  |  | 
|  | #Class SkTextBlobBuilder | 
|  |  | 
|  | #Code | 
|  | #Populate | 
|  | ## | 
|  |  | 
|  | Helper class for constructing SkTextBlob. | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Struct RunBuffer | 
|  | #Line # storage for Glyphs and Glyph positions ## | 
|  |  | 
|  | #Code | 
|  | struct RunBuffer { | 
|  | SkGlyphID* glyphs; | 
|  | SkScalar* pos; | 
|  | char* utf8text; | 
|  | uint32_t* clusters; | 
|  | }; | 
|  | ## | 
|  |  | 
|  | RunBuffer supplies storage for Glyphs and positions within a run. | 
|  |  | 
|  | A run is a sequence of Glyphs sharing Paint_Font_Metrics and positioning. | 
|  | Each run may position its Glyphs in one of three ways: | 
|  | by specifying where the first Glyph is drawn, and allowing Paint_Font_Metrics to | 
|  | determine the advance to subsequent Glyphs; by specifying a baseline, and | 
|  | the position on that baseline for each Glyph in run; or by providing Point | 
|  | array, one per Glyph. | 
|  |  | 
|  | #Member SkGlyphID* glyphs | 
|  | #Line # storage for Glyphs in run ## | 
|  | glyphs points to memory for one or more Glyphs. glyphs memory must be | 
|  | written to by the caller. | 
|  | ## | 
|  |  | 
|  | #Member SkScalar* pos | 
|  | #Line # storage for positions in run ## | 
|  | pos points to memory for Glyph positions. Depending on how RunBuffer | 
|  | is allocated, pos may point to zero bytes per Glyph, one Scalar per Glyph, | 
|  | or one Point per Glyph. | 
|  | ## | 
|  |  | 
|  | #Member char* utf8text | 
|  | #Line # reserved for future use ## | 
|  | Reserved for future use. utf8text should not be read or written. | 
|  | ## | 
|  |  | 
|  | #Member uint32_t* clusters | 
|  | #Line # reserved for future use ## | 
|  | Reserved for future use. clusters should not be read or written. | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocRun allocRunPos allocRunPosH | 
|  |  | 
|  | #Struct RunBuffer ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkTextBlobBuilder() | 
|  | #In Constructors | 
|  | #Line # constructs with default values ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkTextBlobBuilder builder; | 
|  | sk_sp<SkTextBlob> blob = builder.make(); | 
|  | SkDebugf("blob " "%s" " nullptr", blob == nullptr ? "equals" : "does not equal"); | 
|  | #StdOut | 
|  | blob equals nullptr | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso make SkTextBlob::MakeFromText | 
|  |  | 
|  | #Method ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method ~SkTextBlobBuilder() | 
|  | #In Constructors | 
|  | #Line # deletes storage ## | 
|  | #Populate | 
|  |  | 
|  | #NoExample | 
|  | ## | 
|  |  | 
|  | #SeeAlso SkTextBlobBuilder() | 
|  |  | 
|  | #Method ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method sk_sp<SkTextBlob> make() | 
|  | #In Constructors | 
|  | #Line # constructs Text_Blob from bulider ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkTextBlobBuilder builder; | 
|  | sk_sp<SkTextBlob> blob = builder.make(); | 
|  | SkDebugf("blob " "%s" " nullptr\n", blob == nullptr ? "equals" : "does not equal"); | 
|  | SkPaint paint; | 
|  | paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 
|  | SkFont font; | 
|  | paint.textToGlyphs("x", 1, builder.allocRun(font, 1, 20, 20).glyphs); | 
|  | blob = builder.make(); | 
|  | SkDebugf("blob " "%s" " nullptr\n", blob == nullptr ? "equals" : "does not equal"); | 
|  | blob = builder.make(); | 
|  | SkDebugf("blob " "%s" " nullptr\n", blob == nullptr ? "equals" : "does not equal"); | 
|  | #StdOut | 
|  | blob equals nullptr | 
|  | blob does not equal nullptr | 
|  | blob equals nullptr | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso SkTextBlob::MakeFromText | 
|  |  | 
|  | #Method ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method const RunBuffer& allocRun(const SkFont& font, int count, SkScalar x, SkScalar y, | 
|  | const SkRect* bounds = nullptr) | 
|  | #In Allocator | 
|  | #Line # returns writable glyph buffer at Point ## | 
|  |  | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 60 | 
|  | SkTextBlobBuilder builder; | 
|  | SkFont font; | 
|  | SkPaint paint; | 
|  | const SkTextBlobBuilder::RunBuffer& run = builder.allocRun(font, 5, 20, 20); | 
|  | paint.textToGlyphs("hello", 5, run.glyphs); | 
|  | canvas->drawRect({20, 20, 30, 30}, paint); | 
|  | canvas->drawTextBlob(builder.make(), 20, 20, paint); | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocRunPosH allocRunPos | 
|  |  | 
|  | #Method ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method const RunBuffer& allocRunPosH(const SkFont& font, int count, SkScalar y, | 
|  | const SkRect* bounds = nullptr) | 
|  | #In Allocator | 
|  | #Line # returns writable glyph and x-axis position buffers ## | 
|  |  | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 60 | 
|  | SkTextBlobBuilder builder; | 
|  | SkPaint paint; | 
|  | SkFont font; | 
|  | const SkTextBlobBuilder::RunBuffer& run = builder.allocRunPosH(font, 5, 20); | 
|  | paint.textToGlyphs("hello", 5, run.glyphs); | 
|  | SkScalar positions[] = {0, 10, 20, 40, 80}; | 
|  | memcpy(run.pos, positions, sizeof(positions)); | 
|  | canvas->drawTextBlob(builder.make(), 20, 20, paint); | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocRunPos allocRun | 
|  |  | 
|  | #Method ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method const RunBuffer& allocRunPos(const SkFont& font, int count, | 
|  | const SkRect* bounds = nullptr) | 
|  | #In Allocator | 
|  | #Line # returns writable glyph and Point buffers ## | 
|  |  | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 90 | 
|  | SkTextBlobBuilder builder; | 
|  | SkPaint paint; | 
|  | SkFont font; | 
|  | const SkTextBlobBuilder::RunBuffer& run = builder.allocRunPos(font, 5); | 
|  | paint.textToGlyphs("hello", 5, run.glyphs); | 
|  | SkPoint positions[] = {{0, 0}, {10, 10}, {20, 20}, {40, 40}, {80, 80}}; | 
|  | memcpy(run.pos, positions, sizeof(positions)); | 
|  | canvas->drawTextBlob(builder.make(), 20, 20, paint); | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocRunPosH allocRun | 
|  |  | 
|  | #Method ## | 
|  |  | 
|  | #Class SkTextBlobBuilder ## | 
|  |  | 
|  | #Topic Text_Blob_Builder ## |