~jaro/balkon

35a5cc75e3831fa3139ebb43dcf2e0948a76be16 — Jaro 10 months ago 2a2cdd5
Handle ancestor boxes in rich layout.
30 files changed, 524 insertions(+), 197 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 .golden/richParagraphLayout/mixedSizes.golden
M .golden/richParagraphLayout/nestedBoxes.golden
M CHANGELOG.md
M balkon.cabal
M src/Data/Text/ParagraphLayout/Internal/Layout.hs
A src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs
M .golden/paginatedParagraphLayout/loremIpsum20em.golden => .golden/paginatedParagraphLayout/loremIpsum20em.golden +22 -11
@@ 6,7 6,8 @@
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 55,7 56,8 @@
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 110,7 112,8 @@
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 164,7 167,8 @@
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 211,7 215,8 @@
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 265,7 270,8 @@
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 315,7 321,8 @@
            { fragmentUserData = ()
            , fragmentLine = 7
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 366,7 373,8 @@
            { fragmentUserData = ()
            , fragmentLine = 8
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 427,7 435,8 @@
            { fragmentUserData = ()
            , fragmentLine = 9
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 474,7 483,8 @@
            { fragmentUserData = ()
            , fragmentLine = 10
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 526,7 536,8 @@
            { fragmentUserData = ()
            , fragmentLine = 11
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paginatedParagraphLayout/spannedArabicFiller20em.golden => .golden/paginatedParagraphLayout/spannedArabicFiller20em.golden +28 -14
@@ 6,7 6,8 @@
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 37,7 38,8 @@
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 61,7 63,8 @@
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 93,7 96,8 @@
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 116,7 120,8 @@
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 145,7 150,8 @@
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 174,7 180,8 @@
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 233,7 240,8 @@
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 259,7 267,8 @@
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 10225, y_origin = 0, x_size = 4075, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 281,7 290,8 @@
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 3898, y_origin = 0, x_size = 6327, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 310,7 320,8 @@
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 328,7 339,8 @@
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 347,7 359,8 @@
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 5880, y_origin = -1500, x_size = 6358, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 377,7 390,8 @@
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5880, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =

M .golden/paragraphLayout/arabicFiller20em.golden => .golden/paragraphLayout/arabicFiller20em.golden +8 -4
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 64,7 65,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 18895, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 125,7 127,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 19162, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 181,7 184,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =

M .golden/paragraphLayout/czechHello.golden => .golden/paragraphLayout/czechHello.golden +2 -1
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/czechHelloParagraphNarrow.golden => .golden/paragraphLayout/czechHelloParagraphNarrow.golden +10 -5
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1234, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 18,7 19,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1089, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 31,7 33,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 948, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 43,7 46,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 961, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 55,7 59,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 835, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden => .golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden +22 -11
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 663, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 17,7 18,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 571, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 28,7 30,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 590, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 39,7 42,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 253, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 50,7 54,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 246, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 61,7 66,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 446, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 72,7 78,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 7
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 502, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 83,7 90,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 8
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 559, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 94,7 102,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 9
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 402, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 105,7 114,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 10
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 559, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 116,7 126,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 11
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 276, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/devanagari.golden => .golden/paragraphLayout/devanagari.golden +2 -1
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8640, y_size = -1630}
            , fragmentPen = (0, -1171)
            , fragmentGlyphs =

M .golden/paragraphLayout/devanagariAccent.golden => .golden/paragraphLayout/devanagariAccent.golden +2 -1
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 645, y_size = -1000}
            , fragmentPen = (0, -500)
            , fragmentGlyphs =

M .golden/paragraphLayout/devanagariPrefixedAccent.golden => .golden/paragraphLayout/devanagariPrefixedAccent.golden +2 -1
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 0, y_size = -1000}
            , fragmentPen = (0, -500)
            , fragmentGlyphs =

M .golden/paragraphLayout/hardBreaksLTR.golden => .golden/paragraphLayout/hardBreaksLTR.golden +18 -9
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1563, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 22,7 23,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3357, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 45,7 47,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1563, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 61,7 64,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 4305, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 76,7 80,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 861, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 87,7 92,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1563, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 103,7 109,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 7
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 0, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 113,7 120,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 8
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 3675, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 128,7 136,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 9
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 1722, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/hardBreaksRTL.golden => .golden/paragraphLayout/hardBreaksRTL.golden +18 -9
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 22,7 23,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5852, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 45,7 47,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 2808, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 61,7 64,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 4884, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 77,7 81,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -6000, x_size = 1211, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 88,7 93,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -7500, x_size = 2808, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 104,7 110,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 7
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -9000, x_size = 0, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 114,7 121,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 8
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -10500, x_size = 4156, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 129,7 137,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 9
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =

M .golden/paragraphLayout/ligature.golden => .golden/paragraphLayout/ligature.golden +2 -1
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/ligatureParagraphBreak1.golden => .golden/paragraphLayout/ligatureParagraphBreak1.golden +6 -3
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 20,7 21,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 35,7 37,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/ligatureParagraphBreak2.golden => .golden/paragraphLayout/ligatureParagraphBreak2.golden +6 -3
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 20,7 21,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 33,7 35,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/lineHeightLarger.golden => .golden/paragraphLayout/lineHeightLarger.golden +2 -1
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1600}
            , fragmentPen = (0, -1172)
            , fragmentGlyphs =

M .golden/paragraphLayout/lineHeightNormal.golden => .golden/paragraphLayout/lineHeightNormal.golden +2 -1
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/lineHeightSmaller.golden => .golden/paragraphLayout/lineHeightSmaller.golden +2 -1
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -599}
            , fragmentPen = (0, -671)
            , fragmentGlyphs =

M .golden/paragraphLayout/loremIpsum100em.golden => .golden/paragraphLayout/loremIpsum100em.golden +6 -3
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 95412, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 228,7 229,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 98954, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 459,7 461,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 4041, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/loremIpsum20em.golden => .golden/paragraphLayout/loremIpsum20em.golden +22 -11
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 55,7 56,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 103,7 105,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 157,7 160,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 204,7 208,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 258,7 263,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 308,7 314,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 7
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 359,7 366,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 8
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 413,7 421,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 9
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 460,7 469,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 10
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 512,7 522,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 11
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/manySpaces.golden => .golden/paragraphLayout/manySpaces.golden +8 -4
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3132, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 22,7 23,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3132, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 38,7 40,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 3132, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 54,7 57,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3132, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/mixedLanguageLTR.golden => .golden/paragraphLayout/mixedLanguageLTR.golden +4 -2
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 30,7 31,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/mixedScriptWords.golden => .golden/paragraphLayout/mixedScriptWords.golden +46 -23
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 19,7 20,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 32,7 34,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 3112, y_origin = 0, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 45,7 48,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 58,7 62,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 777, y_origin = -1121, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 71,7 76,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 3112, y_origin = -1121, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 84,7 90,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 97,7 104,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 2335, y_origin = -2242, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 110,7 118,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 3112, y_origin = -2242, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 123,7 132,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 136,7 146,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 2335, y_origin = -3363, x_size = 777, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 149,7 160,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 3112, y_origin = -3363, x_size = 2335, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 162,7 174,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 253, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 173,7 186,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 253, y_origin = -4484, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 184,7 198,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 1016, y_origin = -4484, x_size = 737, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 197,7 212,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 1753, y_origin = -4484, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 208,7 224,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 2516, y_origin = -4484, x_size = 484, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 220,7 237,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 3000, y_origin = -4484, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 231,7 249,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 3763, y_origin = -4484, x_size = 253, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 242,7 261,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 4016, y_origin = -4484, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 253,7 273,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 264,7 285,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Nothing, boxStartSpacing = Nothing, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 763, y_origin = -5605, x_size = 253, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 275,7 297,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 1016, y_origin = -5605, x_size = 763, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/paragraphLayout/spannedArabicFiller20em.golden => .golden/paragraphLayout/spannedArabicFiller20em.golden +28 -14
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 37,7 38,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 61,7 63,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 93,7 96,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 116,7 120,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 145,7 150,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 174,7 180,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 193,7 200,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 219,7 227,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 10225, y_origin = -3000, x_size = 4075, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 241,7 250,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 3898, y_origin = -3000, x_size = 6327, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 270,7 280,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 288,7 299,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 307,7 319,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 5880, y_origin = -4500, x_size = 6358, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =


@@ 337,7 350,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 5880, y_size = -1500}
            , fragmentPen = (0, -1085)
            , fragmentGlyphs =

M .golden/paragraphLayout/spannedLoremIpsum20em.golden => .golden/paragraphLayout/spannedLoremIpsum20em.golden +60 -30
@@ 6,7 6,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8747, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 37,7 38,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 8747, y_origin = 0, x_size = 9563, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 71,7 73,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 8553, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 105,7 108,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 2
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 8553, y_origin = -1121, x_size = 8890, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 135,7 139,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 9114, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 169,7 174,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 9114, y_origin = -2242, x_size = 7467, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 197,7 203,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 3
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 16581, y_origin = -2242, x_size = 3210, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 215,7 222,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3799, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 236,7 244,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 3799, y_origin = -3363, x_size = 7878, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 265,7 274,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 4
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 11677, y_origin = -3363, x_size = 5885, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 288,7 298,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 5686, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 314,7 325,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 5686, y_origin = -4484, x_size = 8592, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 347,7 359,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 5
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 14278, y_origin = -4484, x_size = 4491, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 368,7 381,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1301, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 384,7 398,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 1301, y_origin = -5605, x_size = 11041, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 418,7 433,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 6
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 12342, y_origin = -5605, x_size = 6884, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 447,7 463,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 7
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 10089, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 482,7 499,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 7
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 10089, y_origin = -6726, x_size = 7884, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 514,7 532,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 8
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 8158, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 545,7 564,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 8
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 8158, y_origin = -7847, x_size = 6988, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 575,7 595,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 8
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 15146, y_origin = -7847, x_size = 3825, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 594,7 615,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 9
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 4594, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 616,7 638,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 9
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 4594, y_origin = -8968, x_size = 10907, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 654,7 677,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 9
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 15501, y_origin = -8968, x_size = 1738, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 667,7 691,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 10
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 6426, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 694,7 719,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 10
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 6426, y_origin = -10089, x_size = 5590, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 721,7 747,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 10
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 12016, y_origin = -10089, x_size = 7183, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 745,7 772,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 11
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 2652, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 764,7 792,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 11
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 2652, y_origin = -11210, x_size = 5383, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 790,7 819,8 @@ ParagraphLayout
            { fragmentUserData = ()
            , fragmentLine = 11
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = (), boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 8035, y_origin = -11210, x_size = 4041, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M .golden/richParagraphLayout/mixedSizes.golden => .golden/richParagraphLayout/mixedSizes.golden +4 -2
@@ 19,7 19,8 @@ ParagraphLayout
            { fragmentUserData = "smallText1"
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = "smallBox1", boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 1651, y_origin = 0, x_size = 1956, y_size = -841}
            , fragmentPen = (0, -699)
            , fragmentGlyphs =


@@ 49,7 50,8 @@ ParagraphLayout
            { fragmentUserData = "smallText2"
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = "smallBox2", boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 5258, y_origin = 0, x_size = 1956, y_size = -841}
            , fragmentPen = (0, -699)
            , fragmentGlyphs =

M .golden/richParagraphLayout/nestedBoxes.golden => .golden/richParagraphLayout/nestedBoxes.golden +5 -2
@@ 34,7 34,9 @@ ParagraphLayout
            { fragmentUserData = "text2"
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = "box3", boxLeftSpacing = Just 0, boxRightSpacing = Just 0, boxStartSpacing = Just 0, boxEndSpacing = Just 0}
                , AncestorBox {boxUserData = "box2", boxLeftSpacing = Just 0, boxRightSpacing = Nothing, boxStartSpacing = Just 0, boxEndSpacing = Nothing}
                ]
            , fragmentRect = Rect {x_origin = 8569, y_origin = 0, x_size = 3350, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =


@@ 51,7 53,8 @@ ParagraphLayout
            { fragmentUserData = "text3"
            , fragmentLine = 1
            , fragmentAncestorBoxes =
                []
                [ AncestorBox {boxUserData = "box2", boxLeftSpacing = Nothing, boxRightSpacing = Just 0, boxStartSpacing = Nothing, boxEndSpacing = Just 0}
                ]
            , fragmentRect = Rect {x_origin = 11919, y_origin = 0, x_size = 2657, y_size = -1121}
            , fragmentPen = (0, -932)
            , fragmentGlyphs =

M CHANGELOG.md => CHANGELOG.md +3 -0
@@ 7,6 7,9 @@
    * Supports multiple fonts in the same paragraph. Where line height varies,
      text will be aligned by its top edge.

    * Supports nested boxes, each with optional spacing applied to its left
      and right edge.

    * Requires user to set base text direction (LTR or RTL).

* Moved existing plain text interface into `Data.Text.ParagraphLayout.Plain`

M balkon.cabal => balkon.cabal +1 -0
@@ 139,6 139,7 @@ library balkon-internal
        Data.Text.ParagraphLayout.Internal.ParagraphExtents,
        Data.Text.ParagraphLayout.Internal.ParagraphLine,
        Data.Text.ParagraphLayout.Internal.ProtoFragment,
        Data.Text.ParagraphLayout.Internal.ProtoLine,
        Data.Text.ParagraphLayout.Internal.Script

    build-depends:

M src/Data/Text/ParagraphLayout/Internal/Layout.hs => src/Data/Text/ParagraphLayout/Internal/Layout.hs +107 -29
@@ 10,11 10,12 @@ import Data.Int (Int32)
import Data.List (mapAccumL)
import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty, (<|))
import qualified Data.List.NonEmpty as NonEmpty
import Data.Maybe (catMaybes)
import Data.Maybe (catMaybes, fromMaybe)
import Data.Text.Foreign (lengthWord8)
import Data.Text.Glyphize
    ( Buffer (..)
    , ContentType (ContentTypeUnicode)
    , Direction (DirLTR, DirRTL)
    , FontExtents (..)
    , GlyphInfo
    , GlyphPos


@@ 25,13 26,17 @@ import Data.Text.Glyphize
import qualified Data.Text.ICU as BreakStatus (Line (Hard))
import qualified Data.Text.Lazy as Lazy

import Data.Text.ParagraphLayout.Internal.AncestorBox
import Data.Text.ParagraphLayout.Internal.ApplyBoxes
import Data.Text.ParagraphLayout.Internal.BiDiReorder
import Data.Text.ParagraphLayout.Internal.Break
import Data.Text.ParagraphLayout.Internal.Fragment
import Data.Text.ParagraphLayout.Internal.LineHeight
import Data.Text.ParagraphLayout.Internal.ParagraphExtents
import qualified Data.Text.ParagraphLayout.Internal.ProtoFragment as PF
import qualified Data.Text.ParagraphLayout.Internal.ProtoLine as PL
import Data.Text.ParagraphLayout.Internal.Rect
import qualified Data.Text.ParagraphLayout.Internal.ResolvedBox as RB
import qualified Data.Text.ParagraphLayout.Internal.ResolvedSpan as RS
import Data.Text.ParagraphLayout.Internal.Run
import Data.Text.ParagraphLayout.Internal.TextContainer


@@ 43,6 48,7 @@ import Data.Text.ParagraphLayout.Internal.WithSpan
--       for the actual `spanUserData` before returning it to the user.
type ProtoFragmentWithSpan d = WithSpan d PF.ProtoFragment
type FragmentWithSpan d = WithSpan d (Fragment d)
type ProtoFragmentWithBoxes d = WithBoxes d (ProtoFragmentWithSpan d)

-- | Create a multi-line layout from the given runs, splitting them as
-- necessary to fit within the requested line width.


@@ 55,27 61,36 @@ layoutAndAlignLines maxWidth runs = frags
        frags = concatMap NonEmpty.toList fragsInLines
        (_, fragsInLines) = mapAccumL positionLineH originY numberedLines
        numberedLines = zip [1 ..] canonicalLines
        canonicalLines = fmap reorder logicalLines
        logicalLines = nonEmptyItems $ layoutLines maxWidth runs
        canonicalLines = fmap reorderProtoFragments logicalLines
        logicalLines = nonEmptyItems $ layoutLines maxWidth [] runs
        originY = paragraphOriginY

nonEmptyItems :: Foldable t => t [a] -> [NonEmpty a]
nonEmptyItems = catMaybes . map nonEmpty . toList
reorderProtoFragments :: PL.ProtoLine NonEmpty d -> PL.ProtoLine NonEmpty d
reorderProtoFragments pl@(PL.ProtoLine { PL.protoFragments = pfs }) =
    pl { PL.protoFragments = reorder pfs }

nonEmptyItems :: Foldable t =>
    t (PL.ProtoLine [] d) -> [PL.ProtoLine NonEmpty d]
nonEmptyItems = catMaybes . map PL.nonEmpty . toList

-- | Create a multi-line layout from the given runs, splitting them as
-- necessary to fit within the requested line width.
--
-- The output is a two-dimensional list of fragments positioned along the
-- horizontal axis.
layoutLines ::
    Int32 -> NonEmpty (WithSpan d Run) -> NonEmpty [ProtoFragmentWithSpan d]
layoutLines maxWidth runs = case nonEmpty rest of
layoutLines :: Int32 -> [RB.ResolvedBox d] -> NonEmpty (WithSpan d Run) ->
    NonEmpty (PL.ProtoLine [] d)
layoutLines maxWidth openBoxes runs = case nonEmpty rest of
        -- Everything fits. We are done.
        Nothing -> fitting :| []
        -- Something fits, the rest goes on the next line.
        Just rest' -> fitting <| layoutLines maxWidth rest'
        Just runs' -> fitting <| layoutLines maxWidth openBoxes' runs'
    where
        (fitting, rest) = layoutAndWrapRunsH maxWidth runs
        (fitting, rest) = layoutAndWrapRunsH maxWidth openBoxes runs
        -- Update the list of open boxes using the logically last run on this
        -- line, if there is one.
        openBoxes' =
            openBoxes `fromMaybe` lastSpanBoxes (PL.protoFragments fitting)

-- TODO: Allow a run across multiple spans (e.g. if they only differ by colour).



@@ 86,27 101,33 @@ layoutLines maxWidth runs = case nonEmpty rest of
-- @vertical-align: top@ in CSS.
--
-- TODO: For rich text, allow other types of vertical alignment.
positionLineH :: Int32 -> (Int, NonEmpty (ProtoFragmentWithSpan d)) ->
positionLineH :: Int32 -> (Int, PL.ProtoLine NonEmpty d) ->
    (Int32, NonEmpty (FragmentWithSpan d))
positionLineH originY (line, pfs) = (nextY, frags)
positionLineH originY (num, pl) = (nextY, frags)
    where
        nextY = maximum $ fmap y_min rects
        rects = fmap (\ (WithSpan _ r) -> fragmentRect r) frags
        (_, frags) = mapAccumL (positionFragmentH line originY) originX pfs
        (_, frags) = mapAccumL (positionFragmentH num originY) originX wpfs
        wpfs = PL.applyBoxes pl
        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 :: Int -> Int32 -> Int32 -> ProtoFragmentWithSpan d ->
positionFragmentH :: Int -> Int32 -> Int32 -> ProtoFragmentWithBoxes d ->
    (Int32, FragmentWithSpan d)
positionFragmentH line originY originX (WithSpan rs pf) =
positionFragmentH line originY originX (WithBoxes lbs (WithSpan rs pf) rbs) =
    (nextX, WithSpan rs frag)
    where
        nextX = originX + PF.advance pf
        frag = Fragment userData line [] rect (penX, penY) (PF.glyphs pf)
        nextX = contentX + contentWidth + rightSpacing
        contentX = originX + leftSpacing
        contentWidth = PF.advance pf
        leftSpacing = totalLeftSpacing bs
        rightSpacing = totalRightSpacing bs
        frag = Fragment userData line bs rect (penX, penY) (PF.glyphs pf)
        userData = RS.spanUserData rs
        rect = Rect originX originY (PF.advance pf) (-lineHeight)
        bs = ancestorBoxes lbs rbs rs
        rect = Rect contentX originY contentWidth (-lineHeight)
        penX = 0
        penY = descent + leading `div` 2 - lineHeight
        lineHeight = case textLineHeight opts of


@@ 119,22 140,83 @@ positionFragmentH line originY originX (WithSpan rs pf) =
        extents = fontExtentsForDir (textFont opts) (PF.direction pf)
        opts = RS.spanTextOptions rs

ancestorBoxes
    :: [RB.ResolvedBox d]
    -> [RB.ResolvedBox d]
    -> RS.ResolvedSpan d
    -> [AncestorBox d]
ancestorBoxes leftBoxes rightBoxes rs = map ancestorBox $ RS.spanBoxes rs
    where
        ancestorBox b = case RB.boxDirection b of
            DirLTR -> AncestorBox
                { boxUserData = RB.boxUserData b
                , boxLeftSpacing = leftSpacing b
                , boxRightSpacing = rightSpacing b
                , boxStartSpacing = leftSpacing b
                , boxEndSpacing = rightSpacing b
                }
            DirRTL -> AncestorBox
                { boxUserData = RB.boxUserData b
                , boxLeftSpacing = leftSpacing b
                , boxRightSpacing = rightSpacing b
                , boxStartSpacing = rightSpacing b
                , boxEndSpacing = leftSpacing b
                }
            _ -> AncestorBox
                { boxUserData = RB.boxUserData b
                , boxLeftSpacing = Nothing
                , boxRightSpacing = Nothing
                , boxStartSpacing = Nothing
                , boxEndSpacing = Nothing
                }
        leftSpacing b = if b `elem` leftBoxes
            then Just $ RB.boxLeftSpacing b
            else Nothing
        rightSpacing b = if b `elem` rightBoxes
            then Just $ RB.boxRightSpacing b
            else Nothing

-- | Calculate layout for multiple horizontal runs, breaking them as necessary
-- to fit as much content as possible without exceeding the maximum line width,
-- and return the remaining runs to be placed on other lines.
layoutAndWrapRunsH :: Int32 -> NonEmpty (WithSpan d Run) ->
    ([ProtoFragmentWithSpan d], [WithSpan d Run])
layoutAndWrapRunsH maxWidth runs = NonEmpty.head $ validLayouts
layoutAndWrapRunsH
    :: Int32
    -> [RB.ResolvedBox d]
    -> NonEmpty (WithSpan d Run)
    -> (PL.ProtoLine [] d, [WithSpan d Run])
layoutAndWrapRunsH maxWidth prevOpenBoxes runs = NonEmpty.head $ validProtoLines
    where
        validLayouts = dropWhile1 tooLong layouts
        tooLong (pfs, _) = totalAdvances pfs > maxWidth
        layouts = fmap layoutFst splits
        layoutFst (runs1, runs2) = (layoutRunsH runs1, runs2)
        validProtoLines = dropWhile1 tooLong layouts
        tooLong (pl, _) = PL.width pl > maxWidth
        layouts = fmap fstToProtoLine splits
        fstToProtoLine (runs1, runs2) =
            (protoLine prevOpenBoxes (layoutRunsH runs1) runs2, runs2)
        -- TODO: Consider optimising.
        --       We do not need to look for soft breaks further than the
        --       shortest hard break.
        splits = hardSplit runs :| softSplits runs

-- | Construct a `ProtoLine`, peeking at the text run on the following line
-- to determine `nextOpenBoxes`.
protoLine
    :: [RB.ResolvedBox d]
    -> [ProtoFragmentWithSpan d]
    -> [WithSpan d Run]
    -> PL.ProtoLine [] d
protoLine prev pfs rest = PL.ProtoLine pfs prev next
    where
        next = [] `fromMaybe` firstSpanBoxes rest

firstSpanBoxes :: [WithSpan d a] -> Maybe [RB.ResolvedBox d]
firstSpanBoxes xs = case xs of
    [] -> Nothing
    (WithSpan rs _) : _ -> Just $ RS.spanBoxes rs

lastSpanBoxes :: [WithSpan d a] -> Maybe [RB.ResolvedBox d]
lastSpanBoxes xs = case reverse xs of
    [] -> Nothing
    (WithSpan rs _) : _ -> Just $ RS.spanBoxes rs

-- | Treat a list of runs as a contiguous sequence, and split them into two
-- lists so that the first list contains as many non-whitespace characters as
-- possible without crossing a hard line break (typically after a newline


@@ 209,10 291,6 @@ dropWhile1 p list = case NonEmpty.uncons list of
layoutRunsH :: [WithSpan d Run] -> [ProtoFragmentWithSpan d]
layoutRunsH runs = map layoutRunH runs

-- | Sum of all advances within the given fragments.
totalAdvances :: [ProtoFragmentWithSpan d] -> Int32
totalAdvances pfs = sum $ map (\ (WithSpan _ pf) -> PF.advance pf) pfs

-- | Calculate layout for the given horizontal run and attach extra information.
layoutRunH :: WithSpan d Run -> ProtoFragmentWithSpan d
layoutRunH (WithSpan rs run) = WithSpan rs pf

A src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs => src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs +76 -0
@@ 0,0 1,76 @@
module Data.Text.ParagraphLayout.Internal.ProtoLine
    ( ProtoLine (..)
    , nonEmpty
    , width
    , applyBoxes
    )
where

import Data.Int (Int32)
import Data.List.NonEmpty (NonEmpty ((:|)))

import qualified Data.Text.ParagraphLayout.Internal.ApplyBoxes as Algo
import Data.Text.ParagraphLayout.Internal.ProtoFragment
import Data.Text.ParagraphLayout.Internal.ResolvedBox
import Data.Text.ParagraphLayout.Internal.WithSpan

-- | Contents of a line that have not been visually ordered or positioned yet.
data ProtoLine f d = ProtoLine

    { protoFragments :: f (WithSpan d ProtoFragment)
    -- ^ Fragments on the line, in logical order.
    -- Intended to be either a regular list or a non-empty list.

    , prevOpenBoxes :: [ResolvedBox d]
    -- ^ Boxes whose starts are located on preceding lines.
    -- The spacing for their start edge will not count towards this line.

    , nextOpenBoxes :: [ResolvedBox d]
    -- ^ Boxes whose ends are located on following lines.
    -- The spacing for their end edge will not count towards this line.

    }

-- | Covert a line with a regular list of fragments into `Just` a line with
-- a non-empty list of fragments, or `Nothing` if there are no fragments.
nonEmpty :: ProtoLine [] d -> Maybe (ProtoLine NonEmpty d)
nonEmpty (ProtoLine [] _ _) = Nothing
nonEmpty pl@(ProtoLine { protoFragments = (f : fs) }) =
    Just pl { protoFragments = f :| fs }

-- | Total width of the line (content and spacing).
width :: (Foldable f, Functor f) => ProtoLine f d -> Int32
width pl = totalAdvances pl + totalBoxesStart pl + totalBoxesEnd pl

-- | Determine which horizontal fragments are the leftmost and which are the
-- rightmost within their ancestor inline boxes.
--
-- The input must be ordered from left to right.
applyBoxes :: ProtoLine NonEmpty d ->
    NonEmpty (Algo.WithBoxes d (WithSpan d ProtoFragment))
applyBoxes pl = Algo.applyBoxes prevOpen nextOpen pfs
    where
        prevOpen = prevOpenBoxes pl
        nextOpen = nextOpenBoxes pl
        pfs = protoFragments pl

-- | Total glyph advances on the line.
totalAdvances :: (Foldable f, Functor f) => ProtoLine f d -> Int32
totalAdvances pl = sum $ fmap getAdvance $ protoFragments pl
    where getAdvance (WithSpan _ pf) = advance pf

-- | Total spacing for boxes starting on the line.
totalBoxesStart :: (Foldable f, Functor f) => ProtoLine f d -> Int32
totalBoxesStart pl = sum $ fmap boxStartSpacing $ boxesStart pl

-- | Total spacing for boxes ending on the line.
totalBoxesEnd :: (Foldable f, Functor f) => ProtoLine f d -> Int32
totalBoxesEnd pl = sum $ fmap boxEndSpacing $ boxesEnd pl

-- | Boxes that start on the given line.
boxesStart :: (Foldable f, Functor f) => ProtoLine f d -> [ResolvedBox d]
boxesStart pl = allBoxes (protoFragments pl) `diff` prevOpenBoxes pl

-- | Boxes that end on the given line.
boxesEnd :: (Foldable f, Functor f) => ProtoLine f d -> [ResolvedBox d]
boxesEnd pl = allBoxes (protoFragments pl) `diff` nextOpenBoxes pl