| #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 ## |