in platform/cc/shaper/TextLineRunHandler.hh [94:122]
sk_sp<TextLine> makeLine() {
SkASSERTF(fLines == 1, "TextLineRunHandler: Expected single line, got %d", fLines);
sk_sp<SkTextBlob> blob = fBuilder.make();
if (nullptr == blob.get())
return fLine;
SkTextBlob::Iter iter(*blob);
SkTextBlob::Iter::Run blobRun;
int runIdx = 0;
while (iter.next(&blobRun)) {
// from SkTextBlobPriv.h
// -----------------------------------------------------------------------------
// | SkTextBlob | RunRecord | Glyphs[] | Pos[] | RunRecord | Glyphs[] | Pos[] | ...
// -----------------------------------------------------------------------------
int glyphCount = blobRun.fGlyphCount;
const uint16_t* glyphIndices = blobRun.fGlyphIndices;
const SkPoint* positions = reinterpret_cast<const SkPoint*>(reinterpret_cast<const uint8_t*>(blobRun.fGlyphIndices) +
SkAlign4(glyphCount * sizeof(uint16_t)));
for (int consumed = 0; consumed < glyphCount;) {
auto& run = fLine->fRuns[runIdx];
run.fGlyphs = glyphIndices + consumed;
run.fPos = positions + consumed;
runIdx += 1;
consumed += run.fGlyphCount;
}
}
fLine->fBlob = blob;
return fLine;
}