~jaro/balkon

9927e551b32660d4bc536bd0b5aa1b3222613c4b — Jaro 1 year, 6 months ago 278ffb6
Add line numbers to laid out fragments.
29 files changed, 359 insertions(+), 176 deletions(-)

M .golden/paginatedParagraphLayout/loremIpsum20em.golden
M .golden/paginatedParagraphLayout/spannedArabicFiller20em.golden
M .golden/paragraphLayout/arabicFiller20em.golden
M .golden/paragraphLayout/czechHello.golden
M .golden/paragraphLayout/czechHelloParagraphNarrow.golden
M .golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden
M .golden/paragraphLayout/devanagari.golden
M .golden/paragraphLayout/devanagariAccent.golden
M .golden/paragraphLayout/devanagariPrefixedAccent.golden
M .golden/paragraphLayout/hardBreaksLTR.golden
M .golden/paragraphLayout/hardBreaksRTL.golden
M .golden/paragraphLayout/ligature.golden
M .golden/paragraphLayout/ligatureParagraphBreak1.golden
M .golden/paragraphLayout/ligatureParagraphBreak2.golden
M .golden/paragraphLayout/lineHeightLarger.golden
M .golden/paragraphLayout/lineHeightNormal.golden
M .golden/paragraphLayout/lineHeightSmaller.golden
M .golden/paragraphLayout/loremIpsum100em.golden
M .golden/paragraphLayout/loremIpsum20em.golden
M .golden/paragraphLayout/manySpaces.golden
M .golden/paragraphLayout/mixedLanguageLTR.golden
M .golden/paragraphLayout/mixedScriptWords.golden
M .golden/paragraphLayout/spannedArabicFiller20em.golden
M .golden/paragraphLayout/spannedLoremIpsum20em.golden
M CHANGELOG.md
M lib/Data/Text/ParagraphLayout/Plain.hs
M src/Data/Text/ParagraphLayout/Internal/Fragment.hs
M src/Data/Text/ParagraphLayout/Internal/Plain.hs
M test/Data/Text/ParagraphLayout/PrettyShow.hs
M .golden/paginatedParagraphLayout/loremIpsum20em.golden => .golden/paginatedParagraphLayout/loremIpsum20em.golden +22 -11
@@ 3,7 3,8 @@
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 48,7 49,8 @@
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 99,7 101,8 @@
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 149,7 152,8 @@
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 56, cluster = 128, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 688, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 192,7 196,8 @@
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 166, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 242,7 247,8 @@
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 211, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 288,7 294,8 @@
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}
            { fragmentLine = 7
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 71, cluster = 252, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 335,7 342,8 @@
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}
            { fragmentLine = 8
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 294, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 392,7 400,8 @@
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}
            { fragmentLine = 9
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 40, cluster = 339, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 435,7 444,8 @@
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}
            { fragmentLine = 10
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 83, cluster = 377, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 483,7 493,8 @@
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}
            { fragmentLine = 11
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 80, cluster = 422, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paginatedParagraphLayout/spannedArabicFiller20em.golden => .golden/paginatedParagraphLayout/spannedArabicFiller20em.golden +28 -14
@@ 3,7 3,8 @@
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 30,7 31,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 702, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1248, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 50,7 52,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 283, cluster = 93, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 388, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 78,7 81,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 293, cluster = 113, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 97,7 101,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 145, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 122,7 127,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 293, cluster = 174, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 147,7 153,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 90, cluster = 191, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 272, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 202,7 209,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 216, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 224,7 232,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 10225, y_origin = 0, x_size = 4075, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 10225, y_origin = 0, x_size = 4075, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 1311, cluster = 232, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 575, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 242,7 251,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 3898, y_origin = 0, x_size = 6327, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 3898, y_origin = 0, x_size = 6327, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 264, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 267,7 277,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 935, cluster = 280, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 476, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 281,7 292,8 @@
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 935, cluster = 293, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 476, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 296,7 308,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 5880, y_origin = -1500, x_size = 6358, y_size = -1500}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 5880, y_origin = -1500, x_size = 6358, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 323, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 322,7 335,8 @@
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5880, y_size = -1500}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5880, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 90, cluster = 356, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 272, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/arabicFiller20em.golden => .golden/paragraphLayout/arabicFiller20em.golden +8 -4
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 283, cluster = 93, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 388, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 57,7 58,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 18895, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 18895, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 90, cluster = 191, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 272, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 114,7 116,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 19162, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 19162, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 935, cluster = 280, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 476, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 166,7 169,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 90, cluster = 356, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 272, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/czechHello.golden => .golden/paragraphLayout/czechHello.golden +2 -1
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 36, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 663, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/czechHelloParagraphNarrow.golden => .golden/paragraphLayout/czechHelloParagraphNarrow.golden +10 -5
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1234, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1234, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 36, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 663, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 11,7 12,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1089, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1089, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 82, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 20,7 22,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 948, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 948, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 86, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 28,7 31,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 961, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 961, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 246, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 36,7 40,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 835, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 835, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden => .golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden +22 -11
@@ 3,77 3,88 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 663, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 663, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 36, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 663, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 571, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 571, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 75, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 571, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 590, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 590, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 82, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 253, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 253, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 246, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 246, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 15, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 446, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 446, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 86, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 502, y_size = -1121}
            { fragmentLine = 7
            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 502, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 89, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 502, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 559, y_size = -1121}
            { fragmentLine = 8
            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 559, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 246, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 402, y_size = -1121}
            { fragmentLine = 9
            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 402, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 87, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 559, y_size = -1121}
            { fragmentLine = 10
            , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 559, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 276, y_size = -1121}
            { fragmentLine = 11
            , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 276, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 4, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 276, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/devanagari.golden => .golden/paragraphLayout/devanagari.golden +2 -1
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8640, y_size = -1630}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8640, y_size = -1630}
            , fragmentPen = (0, -1171)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 382, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 555, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/devanagariAccent.golden => .golden/paragraphLayout/devanagariAccent.golden +2 -1
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 645, y_size = -1000}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 645, y_size = -1000}
            , fragmentPen = (0, -500)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 529, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 645, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/devanagariPrefixedAccent.golden => .golden/paragraphLayout/devanagariPrefixedAccent.golden +2 -1
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 0, y_size = -1000}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 0, y_size = -1000}
            , fragmentPen = (0, -500)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 424, cluster = 1, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/hardBreaksLTR.golden => .golden/paragraphLayout/hardBreaksLTR.golden +18 -9
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1563, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1563, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 1, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 15,7 16,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3357, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3357, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 34,7 36,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1563, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1563, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 46,7 49,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 4305, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 4305, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 80, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 57,14 61,16 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 861, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 861, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 80, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1563, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1563, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 76,13 82,15 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 0, y_size = -1121}
            { fragmentLine = 7
            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 0, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                []
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 3675, y_size = -1121}
            { fragmentLine = 8
            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 3675, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 80, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 93,7 101,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 1722, y_size = -1121}
            { fragmentLine = 9
            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 1722, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 80, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/hardBreaksRTL.golden => .golden/paragraphLayout/hardBreaksRTL.golden +18 -9
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 642, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 468, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 15,7 16,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5852, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5852, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 642, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 468, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 34,7 36,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 2808, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 2808, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 642, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 468, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 46,7 49,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 4884, y_size = -1500}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 4884, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 359, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 827, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 58,14 62,16 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -6000, x_size = 1211, y_size = -1500}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 0, y_origin = -6000, x_size = 1211, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 687, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1211, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -7500, x_size = 2808, y_size = -1500}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 0, y_origin = -7500, x_size = 2808, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 642, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 468, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 77,13 83,15 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -9000, x_size = 0, y_size = -1500}
            { fragmentLine = 7
            , fragmentRect = Rect {x_origin = 0, y_origin = -9000, x_size = 0, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                []
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -10500, x_size = 4156, y_size = -1500}
            { fragmentLine = 8
            , fragmentRect = Rect {x_origin = 0, y_origin = -10500, x_size = 4156, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 687, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1211, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 94,7 102,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500}
            { fragmentLine = 9
            , fragmentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 687, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1211, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/ligature.golden => .golden/paragraphLayout/ligature.golden +2 -1
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 76, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/ligatureParagraphBreak1.golden => .golden/paragraphLayout/ligatureParagraphBreak1.golden +6 -3
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 76, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 13,7 14,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 76, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 24,7 26,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 87, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/ligatureParagraphBreak2.golden => .golden/paragraphLayout/ligatureParagraphBreak2.golden +6 -3
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 76, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 13,7 14,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 428, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 643, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 22,7 24,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/lineHeightLarger.golden => .golden/paragraphLayout/lineHeightLarger.golden +2 -1
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1600}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1600}
            , fragmentPen = (0, -1172)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 3, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/lineHeightNormal.golden => .golden/paragraphLayout/lineHeightNormal.golden +2 -1
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 3, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/lineHeightSmaller.golden => .golden/paragraphLayout/lineHeightSmaller.golden +2 -1
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -599}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -599}
            , fragmentPen = (0, -671)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 3, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/loremIpsum100em.golden => .golden/paragraphLayout/loremIpsum100em.golden +6 -3
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 95412, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 95412, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 221,7 222,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 98954, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 98954, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 70, cluster = 217, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 448,7 450,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 4041, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 4041, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 79, cluster = 441, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/loremIpsum20em.golden => .golden/paragraphLayout/loremIpsum20em.golden +22 -11
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 48,7 49,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 92,7 94,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 142,7 145,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 56, cluster = 128, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 688, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 185,7 189,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 166, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 235,7 240,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 211, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 281,7 287,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}
            { fragmentLine = 7
            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 71, cluster = 252, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 328,7 335,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}
            { fragmentLine = 8
            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 294, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 378,7 386,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}
            { fragmentLine = 9
            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 40, cluster = 339, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 421,7 430,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}
            { fragmentLine = 10
            , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 83, cluster = 377, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 469,7 479,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}
            { fragmentLine = 11
            , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 80, cluster = 422, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/manySpaces.golden => .golden/paragraphLayout/manySpaces.golden +8 -4
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3132, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3132, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 3, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 15,7 16,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3132, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3132, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 27,7 29,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 3132, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 3132, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 39,7 42,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3132, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3132, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/mixedLanguageLTR.golden => .golden/paragraphLayout/mixedLanguageLTR.golden +4 -2
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 23,7 24,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 0, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 500, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/mixedScriptWords.golden => .golden/paragraphLayout/mixedScriptWords.golden +46 -23
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 12,7 13,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 786, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 21,7 23,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 3112, y_origin = 0, x_size = 777, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 3112, y_origin = 0, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 30,7 33,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 777, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 39,7 43,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 777, y_origin = -1121, x_size = 2335, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 777, y_origin = -1121, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 786, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 48,7 53,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 3112, y_origin = -1121, x_size = 777, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 3112, y_origin = -1121, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 57,7 63,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 2335, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 786, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 66,7 73,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 2335, y_origin = -2242, x_size = 777, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 2335, y_origin = -2242, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 39, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 75,7 83,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 3112, y_origin = -2242, x_size = 2335, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 3112, y_origin = -2242, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 786, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 84,7 93,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 2335, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 786, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 93,7 103,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 2335, y_origin = -3363, x_size = 777, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 2335, y_origin = -3363, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 262, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 102,7 113,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 3112, y_origin = -3363, x_size = 2335, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 3112, y_origin = -3363, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 786, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 111,21 123,24 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 253, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 253, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 253, y_origin = -4484, x_size = 763, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 253, y_origin = -4484, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 763, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 1016, y_origin = -4484, x_size = 737, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 1016, y_origin = -4484, x_size = 737, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 134,14 149,16 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 1753, y_origin = -4484, x_size = 763, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 1753, y_origin = -4484, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 763, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 2516, y_origin = -4484, x_size = 484, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 2516, y_origin = -4484, x_size = 484, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 149,42 166,48 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 3000, y_origin = -4484, x_size = 763, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 3000, y_origin = -4484, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 763, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 3763, y_origin = -4484, x_size = 253, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 3763, y_origin = -4484, x_size = 253, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 4016, y_origin = -4484, x_size = 763, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 4016, y_origin = -4484, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 763, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 763, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 763, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 763, y_origin = -5605, x_size = 253, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 763, y_origin = -5605, x_size = 253, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 77, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 1016, y_origin = -5605, x_size = 763, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 1016, y_origin = -5605, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 758, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 763, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/spannedArabicFiller20em.golden => .golden/paragraphLayout/spannedArabicFiller20em.golden +28 -14
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 30,7 31,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 702, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1248, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 50,7 52,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 283, cluster = 93, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 388, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 78,7 81,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 293, cluster = 113, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 97,7 101,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 145, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 122,7 127,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 293, cluster = 174, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 147,7 153,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 90, cluster = 191, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 272, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 162,7 169,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 216, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 184,7 192,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 10225, y_origin = -3000, x_size = 4075, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 10225, y_origin = -3000, x_size = 4075, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 1311, cluster = 232, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 575, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 202,7 211,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 3898, y_origin = -3000, x_size = 6327, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 3898, y_origin = -3000, x_size = 6327, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 264, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 227,7 237,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 935, cluster = 280, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 476, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 241,7 252,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 935, cluster = 293, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 476, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 256,7 268,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 5880, y_origin = -4500, x_size = 6358, y_size = -1500}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 5880, y_origin = -4500, x_size = 6358, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 323, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 282,7 295,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 5880, y_size = -1500}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 5880, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 90, cluster = 356, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 272, y_advance = 0, x_offset = 0, y_offset = 0})

M .golden/paragraphLayout/spannedLoremIpsum20em.golden => .golden/paragraphLayout/spannedLoremIpsum20em.golden +60 -30
@@ 3,7 3,8 @@ ParagraphLayout
    , spanLayouts = [
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8747, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8747, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 30,7 31,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 8747, y_origin = 0, x_size = 9563, y_size = -1121}
            { fragmentLine = 1
            , fragmentRect = Rect {x_origin = 8747, y_origin = 0, x_size = 9563, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 86, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 60,7 62,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 8553, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 8553, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 90,7 93,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 8553, y_origin = -1121, x_size = 8890, y_size = -1121}
            { fragmentLine = 2
            , fragmentRect = Rect {x_origin = 8553, y_origin = -1121, x_size = 8890, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 71, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 116,7 120,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 9114, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 9114, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 146,7 151,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 9114, y_origin = -2242, x_size = 7467, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 9114, y_origin = -2242, x_size = 7467, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 104, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 170,7 176,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 16581, y_origin = -2242, x_size = 3210, y_size = -1121}
            { fragmentLine = 3
            , fragmentRect = Rect {x_origin = 16581, y_origin = -2242, x_size = 3210, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 119, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 184,7 191,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3799, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3799, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 56, cluster = 128, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 688, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 201,7 209,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 3799, y_origin = -3363, x_size = 7878, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 3799, y_origin = -3363, x_size = 7878, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 68, cluster = 136, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 226,7 235,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 11677, y_origin = -3363, x_size = 5885, y_size = -1121}
            { fragmentLine = 4
            , fragmentRect = Rect {x_origin = 11677, y_origin = -3363, x_size = 5885, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 152, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 245,7 255,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 5686, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 5686, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 166, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 267,7 278,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 5686, y_origin = -4484, x_size = 8592, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 5686, y_origin = -4484, x_size = 8592, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 88, cluster = 179, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 296,7 308,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 14278, y_origin = -4484, x_size = 4491, y_size = -1121}
            { fragmentLine = 5
            , fragmentRect = Rect {x_origin = 14278, y_origin = -4484, x_size = 4491, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 199, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 313,7 326,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1301, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1301, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 211, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 325,7 339,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 1301, y_origin = -5605, x_size = 11041, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 1301, y_origin = -5605, x_size = 11041, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 214, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 355,7 370,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 12342, y_origin = -5605, x_size = 6884, y_size = -1121}
            { fragmentLine = 6
            , fragmentRect = Rect {x_origin = 12342, y_origin = -5605, x_size = 6884, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 235, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 380,7 396,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 10089, y_size = -1121}
            { fragmentLine = 7
            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 10089, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 71, cluster = 252, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 411,7 428,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 10089, y_origin = -6726, x_size = 7884, y_size = -1121}
            { fragmentLine = 7
            , fragmentRect = Rect {x_origin = 10089, y_origin = -6726, x_size = 7884, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 274, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 439,7 457,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 8158, y_size = -1121}
            { fragmentLine = 8
            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 8158, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 72, cluster = 294, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 466,7 485,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 8158, y_origin = -7847, x_size = 6988, y_size = -1121}
            { fragmentLine = 8
            , fragmentRect = Rect {x_origin = 8158, y_origin = -7847, x_size = 6988, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 312, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 492,7 512,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 15146, y_origin = -7847, x_size = 3825, y_size = -1121}
            { fragmentLine = 8
            , fragmentRect = Rect {x_origin = 15146, y_origin = -7847, x_size = 3825, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 83, cluster = 329, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 507,7 528,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 4594, y_size = -1121}
            { fragmentLine = 9
            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 4594, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 40, cluster = 339, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 525,7 547,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 4594, y_origin = -8968, x_size = 10907, y_size = -1121}
            { fragmentLine = 9
            , fragmentRect = Rect {x_origin = 4594, y_origin = -8968, x_size = 10907, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 348, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 559,7 582,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 15501, y_origin = -8968, x_size = 1738, y_size = -1121}
            { fragmentLine = 9
            , fragmentRect = Rect {x_origin = 15501, y_origin = -8968, x_size = 1738, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 81, cluster = 373, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 568,7 592,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 6426, y_size = -1121}
            { fragmentLine = 10
            , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 6426, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 83, cluster = 377, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 591,7 616,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 6426, y_origin = -10089, x_size = 5590, y_size = -1121}
            { fragmentLine = 10
            , fragmentRect = Rect {x_origin = 6426, y_origin = -10089, x_size = 5590, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 391, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 614,7 640,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 12016, y_origin = -10089, x_size = 7183, y_size = -1121}
            { fragmentLine = 10
            , fragmentRect = Rect {x_origin = 12016, y_origin = -10089, x_size = 7183, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 82, cluster = 405, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 634,7 661,8 @@ ParagraphLayout
                ]
            }
        , Fragment
            { fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 2652, y_size = -1121}
            { fragmentLine = 11
            , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 2652, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 80, cluster = 422, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 649,7 677,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 2652, y_origin = -11210, x_size = 5383, y_size = -1121}
            { fragmentLine = 11
            , fragmentRect = Rect {x_origin = 2652, y_origin = -11210, x_size = 5383, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 3, cluster = 428, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})


@@ 671,7 700,8 @@ ParagraphLayout
        ,
        SpanLayout
        [ Fragment
            { fragmentRect = Rect {x_origin = 8035, y_origin = -11210, x_size = 4041, y_size = -1121}
            { fragmentLine = 11
            , fragmentRect = Rect {x_origin = 8035, y_origin = -11210, x_size = 4041, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =
                [ (GlyphInfo {codepoint = 79, cluster = 441, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})

M CHANGELOG.md => CHANGELOG.md +2 -0
@@ 8,6 8,8 @@
* Future-proofed `ParagraphOptions` and `SpanOptions` by hiding their
  constructors. Use `defaultParagraphOptions` and `defaultSpanOptions` instead.

* Added line numbers to laid out fragments.

## 0.3.0.1 -- TBD

* Increased font size for the "shaped runs" output so that it better fits

M lib/Data/Text/ParagraphLayout/Plain.hs => lib/Data/Text/ParagraphLayout/Plain.hs +7 -1
@@ 30,7 30,13 @@ module Data.Text.ParagraphLayout.Plain
    , layoutPlain
    , ParagraphLayout (ParagraphLayout, paragraphRect, spanLayouts)
    , SpanLayout (SpanLayout)
    , Fragment (Fragment, fragmentPen, fragmentRect, fragmentGlyphs)
    , Fragment
        ( Fragment
        , fragmentLine
        , fragmentRect
        , fragmentPen
        , fragmentGlyphs
        )
    )
where


M src/Data/Text/ParagraphLayout/Internal/Fragment.hs => src/Data/Text/ParagraphLayout/Internal/Fragment.hs +6 -1
@@ 19,7 19,12 @@ import Data.Text.ParagraphLayout.Internal.Rect
-- or because it contains glyphs from multiple scripts.
data Fragment = Fragment

    { fragmentRect :: Rect Int32
    { fragmentLine :: Int
    -- ^ Logical number of the line box holding the fragment, starting at 1.
    -- Fragments with the same line number are on the same line and will not be
    -- separated by page breaks.

    , fragmentRect :: Rect Int32
    -- ^ Physical position of the fragment within the paragraph, calculated
    -- using all glyph advances in this fragment and the calculated line height.
    --

M src/Data/Text/ParagraphLayout/Internal/Plain.hs => src/Data/Text/ParagraphLayout/Internal/Plain.hs +10 -8
@@ 70,7 70,8 @@ layoutAndAlignLines :: Int32 -> NonEmpty (WithSpan Run) -> [WithSpan Fragment]
layoutAndAlignLines maxWidth runs = frags
    where
        frags = concatMap NonEmpty.toList fragsInLines
        (_, fragsInLines) = mapAccumL positionLineH originY canonicalLines
        (_, fragsInLines) = mapAccumL positionLineH originY numberedLines
        numberedLines = zip [1 ..] canonicalLines
        canonicalLines = fmap reorder logicalLines
        logicalLines = nonEmptyItems $ layoutLines maxWidth runs
        originY = paragraphOriginY


@@ 102,24 103,25 @@ layoutLines maxWidth runs = case nonEmpty rest of
-- @vertical-align: top@ in CSS.
--
-- TODO: For rich text, allow other types of vertical alignment.
positionLineH :: Int32 -> NonEmpty (WithSpan PF.ProtoFragment) ->
positionLineH :: Int32 -> (Int, NonEmpty (WithSpan PF.ProtoFragment)) ->
    (Int32, NonEmpty (WithSpan Fragment))
positionLineH originY pfs = (nextY, frags)
positionLineH originY (line, pfs) = (nextY, frags)
    where
        nextY = maximum $ fmap y_min rects
        rects = fmap (\ (WithSpan _ r) -> fragmentRect r) frags
        (_, frags) = mapAccumL (positionFragmentH originY) originX pfs
        (_, frags) = mapAccumL (positionFragmentH line originY) originX pfs
        originX = paragraphOriginX

-- | Position the given horizontal fragment on a line,
-- using @originY@ as its top edge and @originX@ as its left edge,
-- returning the X coordinate of its right edge for continuation.
positionFragmentH ::
    Int32 -> Int32 -> WithSpan PF.ProtoFragment -> (Int32, WithSpan Fragment)
positionFragmentH originY originX (WithSpan rs pf) = (nextX, WithSpan rs frag)
positionFragmentH :: Int -> Int32 -> Int32 -> WithSpan PF.ProtoFragment ->
    (Int32, WithSpan Fragment)
positionFragmentH line originY originX (WithSpan rs pf) =
    (nextX, WithSpan rs frag)
    where
        nextX = originX + PF.advance pf
        frag = Fragment rect (penX, penY) (PF.glyphs pf)
        frag = Fragment line rect (penX, penY) (PF.glyphs pf)
        rect = Rect originX originY (PF.advance pf) (-lineHeight)
        penX = 0
        penY = descent + leading `div` 2 - lineHeight

M test/Data/Text/ParagraphLayout/PrettyShow.hs => test/Data/Text/ParagraphLayout/PrettyShow.hs +6 -2
@@ 82,11 82,15 @@ instance PrettyShow Plain.SpanLayout where
        ]

instance PrettyShow Plain.Fragment where
    prettyShow (Plain.Fragment r pen glyphs) = concat
    prettyShow (Plain.Fragment l r pen glyphs) = concat
        [ "Fragment"
        , newline
        , indent3
        , "{ fragmentRect = "
        , "{ fragmentLine = "
        , show l
        , newline
        , indent3
        , ", fragmentRect = "
        , show r
        , newline
        , indent3