sk_sp makeLine()

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;
    }