balkon 1.1.0.0 → 1.2.0.0
raw patch · 90 files changed
+3921/−382 lines, 90 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Data.Text.ParagraphLayout.Plain: [fragmentAncestorBoxes] :: Fragment d -> [AncestorBox d]
- Data.Text.ParagraphLayout.Plain: [fragmentGlyphs] :: Fragment d -> [(GlyphInfo, GlyphPos)]
- Data.Text.ParagraphLayout.Plain: [fragmentLine] :: Fragment d -> Int
- Data.Text.ParagraphLayout.Plain: [fragmentPen] :: Fragment d -> (Int32, Int32)
- Data.Text.ParagraphLayout.Plain: [fragmentRect] :: Fragment d -> Rect Int32
- Data.Text.ParagraphLayout.Plain: [fragmentUserData] :: Fragment d -> d
- Data.Text.ParagraphLayout.Rich: paragraphLineHeight :: ParagraphOptions -> LineHeight
+ Data.Text.ParagraphLayout.Rect: HH :: Bias
+ Data.Text.ParagraphLayout.Rect: HL :: Bias
+ Data.Text.ParagraphLayout.Rect: LH :: Bias
+ Data.Text.ParagraphLayout.Rect: LL :: Bias
+ Data.Text.ParagraphLayout.Rect: data Bias
+ Data.Text.ParagraphLayout.Rect: union :: (Num a, Ord a) => Bias -> Rect a -> Rect a -> Rect a
+ Data.Text.ParagraphLayout.Rect: unionMany :: (Num a, Ord a) => Bias -> [Rect a] -> Maybe (Rect a)
+ Data.Text.ParagraphLayout.Rect: unionMany1 :: (Num a, Ord a) => Bias -> NonEmpty (Rect a) -> Rect a
+ Data.Text.ParagraphLayout.Rich: AlignCentreH :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AlignEnd :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AlignLeft :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AlignRight :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AlignStart :: ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: AllowBoxCollapse :: BoxCollapse
+ Data.Text.ParagraphLayout.Rich: AvoidBoxCollapse :: BoxCollapse
+ Data.Text.ParagraphLayout.Rich: [fragmentContentRect] :: Fragment d -> Rect Int32
+ Data.Text.ParagraphLayout.Rich: activateBoxSpacing :: BoxSpacing -> BoxOptions -> BoxOptions
+ Data.Text.ParagraphLayout.Rich: boxCollapse :: BoxOptions -> BoxCollapse
+ Data.Text.ParagraphLayout.Rich: class EmptyText t
+ Data.Text.ParagraphLayout.Rich: data BoxCollapse
+ Data.Text.ParagraphLayout.Rich: data ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: paragraphAlignment :: ParagraphOptions -> ParagraphAlignment
+ Data.Text.ParagraphLayout.Rich: paragraphSafeWidth :: ParagraphLayout d -> Int32
+ Data.Text.ParagraphLayout.Rich: strut :: EmptyText t => d -> RootNode t d -> RootNode t d
- Data.Text.ParagraphLayout.Plain: Fragment :: d -> Int -> [AncestorBox d] -> Rect Int32 -> (Int32, Int32) -> [(GlyphInfo, GlyphPos)] -> Fragment d
+ Data.Text.ParagraphLayout.Plain: Fragment :: d -> Int -> [AncestorBox d] -> Rect Int32 -> Rect Int32 -> (Int32, Int32) -> [(GlyphInfo, GlyphPos)] -> Fragment d
- Data.Text.ParagraphLayout.Rich: Fragment :: d -> Int -> [AncestorBox d] -> Rect Int32 -> (Int32, Int32) -> [(GlyphInfo, GlyphPos)] -> Fragment d
+ Data.Text.ParagraphLayout.Rich: Fragment :: d -> Int -> [AncestorBox d] -> Rect Int32 -> Rect Int32 -> (Int32, Int32) -> [(GlyphInfo, GlyphPos)] -> Fragment d
Files
- .golden/paginatedParagraphLayout/loremIpsum20em.golden +11/−0
- .golden/paginatedParagraphLayout/spannedArabicFiller20em.golden +14/−0
- .golden/paginatedRichParagraphLayout/loremIpsum20em.golden +11/−0
- .golden/paragraphLayout/arabicFiller20em.golden +4/−0
- .golden/paragraphLayout/arabicHelloParagraphUltraNarrow.golden +183/−0
- .golden/paragraphLayout/czechHello.golden +1/−0
- .golden/paragraphLayout/czechHelloParagraphNarrow.golden +5/−0
- .golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden +11/−0
- .golden/paragraphLayout/devanagari.golden +1/−0
- .golden/paragraphLayout/devanagariAccent.golden +1/−0
- .golden/paragraphLayout/devanagariPrefixedAccent.golden +1/−0
- .golden/paragraphLayout/hardBreaksLTR.golden +9/−0
- .golden/paragraphLayout/hardBreaksRTL.golden +9/−0
- .golden/paragraphLayout/ligature.golden +1/−0
- .golden/paragraphLayout/ligatureParagraphBreak1.golden +3/−0
- .golden/paragraphLayout/ligatureParagraphBreak2.golden +3/−0
- .golden/paragraphLayout/lineHeightLarger.golden +1/−0
- .golden/paragraphLayout/lineHeightNormal.golden +1/−0
- .golden/paragraphLayout/lineHeightSmaller.golden +1/−0
- .golden/paragraphLayout/loremIpsum100em.golden +3/−0
- .golden/paragraphLayout/loremIpsum20em.golden +11/−0
- .golden/paragraphLayout/manySpaces.golden +4/−0
- .golden/paragraphLayout/mixedLanguageLTR.golden +2/−0
- .golden/paragraphLayout/mixedScriptWords.golden +23/−0
- .golden/paragraphLayout/spannedArabicFiller20em.golden +14/−0
- .golden/paragraphLayout/spannedLoremIpsum20em.golden +56/−2
- .golden/richParagraphLayout/emptyBoxMiddle.golden +49/−0
- .golden/richParagraphLayout/hardBoxBreakLTR.golden +4/−0
- .golden/richParagraphLayout/hardBoxBreakRTL.golden +9/−5
- .golden/richParagraphLayout/loremIpsum20em.golden +11/−0
- .golden/richParagraphLayout/loremIpsum20emCentre.golden +559/−0
- .golden/richParagraphLayout/loremIpsum20emRight.golden +559/−0
- .golden/richParagraphLayout/mixedDirectionComplexLTR.golden +7/−0
- .golden/richParagraphLayout/mixedDirectionComplexRTL.golden +15/−8
- .golden/richParagraphLayout/mixedDirectionSimpleLTR.golden +3/−0
- .golden/richParagraphLayout/mixedDirectionSimpleRTL.golden +7/−4
- .golden/richParagraphLayout/mixedLineHeight.golden +306/−0
- .golden/richParagraphLayout/mixedScript.golden +9/−0
- .golden/richParagraphLayout/mixedScriptWrap.golden +11/−0
- .golden/richParagraphLayout/mixedSizes.golden +5/−0
- .golden/richParagraphLayout/nestedBoxes.golden +3/−0
- .golden/richParagraphLayout/neutralDirectionLTR.golden +1/−0
- .golden/richParagraphLayout/neutralDirectionRTL.golden +3/−2
- .golden/richParagraphLayout/newline1Paragraph.golden +16/−0
- .golden/richParagraphLayout/newline1TextParagraph.golden +28/−0
- .golden/richParagraphLayout/newline2Paragraph.golden +27/−0
- .golden/richParagraphLayout/newline2TextParagraph.golden +39/−0
- .golden/richParagraphLayout/spaceBoxCollapsed.golden +101/−0
- .golden/richParagraphLayout/spaceBoxMiddle.golden +48/−0
- .golden/richParagraphLayout/spaceBoxPreserved.golden +113/−0
- .golden/shapedRuns/intraWordBreak.fontInfo +1/−0
- .golden/shapedRuns/intraWordBreak.golden +19/−0
- .golden/shapedRuns/mixedDirectionComplexRTL.golden +23/−22
- CHANGELOG.md +33/−0
- balkon.cabal +6/−3
- lib/Data/Text/ParagraphLayout/Rect.hs +4/−0
- lib/Data/Text/ParagraphLayout/Rich.hs +16/−1
- src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs +27/−18
- src/Data/Text/ParagraphLayout/Internal/BoxOptions.hs +60/−1
- src/Data/Text/ParagraphLayout/Internal/Break.hs +22/−0
- src/Data/Text/ParagraphLayout/Internal/Fragment.hs +25/−1
- src/Data/Text/ParagraphLayout/Internal/Layout.hs +121/−56
- src/Data/Text/ParagraphLayout/Internal/LineNumbers.hs +23/−0
- src/Data/Text/ParagraphLayout/Internal/Paginable.hs +2/−1
- src/Data/Text/ParagraphLayout/Internal/ParagraphAlignment.hs +40/−0
- src/Data/Text/ParagraphLayout/Internal/ParagraphExtents.hs +10/−2
- src/Data/Text/ParagraphLayout/Internal/ParagraphLine.hs +29/−26
- src/Data/Text/ParagraphLayout/Internal/ParagraphOptions.hs +13/−1
- src/Data/Text/ParagraphLayout/Internal/Plain/ParagraphLayout.hs +8/−2
- src/Data/Text/ParagraphLayout/Internal/ProtoFragment.hs +5/−3
- src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs +19/−0
- src/Data/Text/ParagraphLayout/Internal/Rect.hs +64/−14
- src/Data/Text/ParagraphLayout/Internal/Rich.hs +21/−7
- src/Data/Text/ParagraphLayout/Internal/Rich/ParagraphLayout.hs +27/−0
- src/Data/Text/ParagraphLayout/Internal/Run.hs +21/−1
- src/Data/Text/ParagraphLayout/Internal/SplitList.hs +58/−0
- src/Data/Text/ParagraphLayout/Internal/TextContainer.hs +38/−72
- src/Data/Text/ParagraphLayout/Internal/TextOptions.hs +0/−1
- src/Data/Text/ParagraphLayout/Internal/Tree.hs +34/−0
- test/Data/Text/ParagraphLayout/Internal/ApplyBoxesSpec.hs +1/−1
- test/Data/Text/ParagraphLayout/Internal/BiDiLevelsSpec.hs +4/−3
- test/Data/Text/ParagraphLayout/Internal/RunSpec.hs +38/−5
- test/Data/Text/ParagraphLayout/Internal/TextContainerSpec.hs +150/−43
- test/Data/Text/ParagraphLayout/Internal/TreeSpec.hs +109/−47
- test/Data/Text/ParagraphLayout/Plain/ParagraphData.hs +10/−0
- test/Data/Text/ParagraphLayout/PlainSpec.hs +5/−0
- test/Data/Text/ParagraphLayout/PrettyShow.hs +5/−1
- test/Data/Text/ParagraphLayout/RectSpec.hs +118/−13
- test/Data/Text/ParagraphLayout/Rich/ParagraphData.hs +129/−1
- test/Data/Text/ParagraphLayout/RichSpec.hs +266/−15
.golden/paginatedParagraphLayout/loremIpsum20em.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -58,6 +59,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -114,6 +116,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -169,6 +172,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -217,6 +221,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -272,6 +277,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -323,6 +329,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -375,6 +382,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -437,6 +445,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -485,6 +494,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -538,6 +548,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paginatedParagraphLayout/spannedArabicFiller20em.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500} , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -40,6 +41,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500} , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -65,6 +67,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -98,6 +101,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500} , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -122,6 +126,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500} , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -152,6 +157,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500} , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -182,6 +188,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -242,6 +249,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500} , fragmentRect = Rect {x_origin = 14300, y_origin = 0, x_size = 4862, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -269,6 +277,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 10225, y_origin = 0, x_size = 4075, y_size = -1500} , fragmentRect = Rect {x_origin = 10225, y_origin = 0, x_size = 4075, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -292,6 +301,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 3898, y_origin = 0, x_size = 6327, y_size = -1500} , fragmentRect = Rect {x_origin = 3898, y_origin = 0, x_size = 6327, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -322,6 +332,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3898, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -341,6 +352,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500} , fragmentRect = Rect {x_origin = 12238, y_origin = -1500, x_size = 2357, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -361,6 +373,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 5880, y_origin = -1500, x_size = 6358, y_size = -1500} , fragmentRect = Rect {x_origin = 5880, y_origin = -1500, x_size = 6358, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -392,6 +405,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5880, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5880, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =
.golden/paginatedRichParagraphLayout/loremIpsum20em.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -55,6 +56,7 @@ , fragmentLine = 2 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -109,6 +111,7 @@ , fragmentLine = 3 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19791, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -163,6 +166,7 @@ , fragmentLine = 4 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17562, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -210,6 +214,7 @@ , fragmentLine = 5 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 18769, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -264,6 +269,7 @@ , fragmentLine = 6 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 19226, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -314,6 +320,7 @@ , fragmentLine = 7 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 17973, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -365,6 +372,7 @@ , fragmentLine = 8 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 18971, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -425,6 +433,7 @@ , fragmentLine = 9 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 17239, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -472,6 +481,7 @@ , fragmentLine = 10 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 19199, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -524,6 +534,7 @@ , fragmentLine = 11 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 12076, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/arabicFiller20em.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 19850, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -67,6 +68,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 18895, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 18895, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -129,6 +131,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 19162, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 19162, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -186,6 +189,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 14595, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =
+ .golden/paragraphLayout/arabicHelloParagraphUltraNarrow.golden view
@@ -0,0 +1,183 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = -727, y_origin = 0, x_size = 827, y_size = -19500}+ , spanLayouts = [+ SpanLayout+ [ Fragment+ { fragmentUserData = ()+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -124, y_origin = 0, x_size = 224, y_size = -1500}+ , fragmentRect = Rect {x_origin = -124, y_origin = 0, x_size = 224, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 302, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 224, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -169, y_origin = -1500, x_size = 269, y_size = -1500}+ , fragmentRect = Rect {x_origin = -169, y_origin = -1500, x_size = 269, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 477, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 269, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 3+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -727, y_origin = -3000, x_size = 827, y_size = -1500}+ , fragmentRect = Rect {x_origin = -727, y_origin = -3000, x_size = 827, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 1665, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 303, y_offset = -40})+ , (GlyphInfo {codepoint = 359, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 827, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 4+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -214, y_origin = -4500, x_size = 314, y_size = -1500}+ , fragmentRect = Rect {x_origin = -214, y_origin = -4500, x_size = 314, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 1588, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 26, y_offset = 451})+ , (GlyphInfo {codepoint = 381, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 314, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 5+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -170, y_origin = -6000, x_size = 270, y_size = -1500}+ , fragmentRect = Rect {x_origin = -170, y_origin = -6000, x_size = 270, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 293, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 6+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -455, y_origin = -7500, x_size = 555, y_size = -1500}+ , fragmentRect = Rect {x_origin = -455, y_origin = -7500, x_size = 555, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 1641, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 185, y_offset = 120})+ , (GlyphInfo {codepoint = 906, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 555, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 7+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -379, y_origin = -9000, x_size = 479, y_size = -1500}+ , fragmentRect = Rect {x_origin = -379, y_origin = -9000, x_size = 479, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 1588, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 99, y_offset = 170})+ , (GlyphInfo {codepoint = 770, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 479, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 8+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -214, y_origin = -10500, x_size = 314, y_size = -1500}+ , fragmentRect = Rect {x_origin = -214, y_origin = -10500, x_size = 314, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 1588, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 26, y_offset = 451})+ , (GlyphInfo {codepoint = 381, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 314, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 9+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -210, y_origin = -12000, x_size = 310, y_size = -1500}+ , fragmentRect = Rect {x_origin = -210, y_origin = -12000, x_size = 310, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 1563, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 42, y_offset = 40})+ , (GlyphInfo {codepoint = 336, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 310, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 10+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -352, y_origin = -13500, x_size = 452, y_size = -1500}+ , fragmentRect = Rect {x_origin = -352, y_origin = -13500, x_size = 452, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 1641, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 4, y_offset = 379})+ , (GlyphInfo {codepoint = 840, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 11+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -424, y_origin = -15000, x_size = 524, y_size = -1500}+ , fragmentRect = Rect {x_origin = -424, y_origin = -15000, x_size = 524, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 1588, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 0, y_advance = 0, x_offset = 131, y_offset = 80})+ , (GlyphInfo {codepoint = 916, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 524, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 12+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = -170, y_origin = -16500, x_size = 270, y_size = -1500}+ , fragmentRect = Rect {x_origin = -170, y_origin = -16500, x_size = 270, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 293, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 270, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = ()+ , fragmentLine = 13+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0}+ ]+ , fragmentContentRect = Rect {x_origin = -184, y_origin = -18000, x_size = 284, y_size = -1500}+ , fragmentRect = Rect {x_origin = -184, y_origin = -18000, x_size = 284, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 108, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 284, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ ]}
.golden/paragraphLayout/czechHello.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/czechHelloParagraphNarrow.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1234, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1234, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -21,6 +22,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1089, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1089, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -35,6 +37,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 948, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 948, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -48,6 +51,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 961, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 961, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -61,6 +65,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 835, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 835, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/czechHelloParagraphUltraNarrow.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 663, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 663, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -20,6 +21,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 571, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 571, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -32,6 +34,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 590, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 590, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -44,6 +47,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 253, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 253, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -56,6 +60,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 246, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 246, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -68,6 +73,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 446, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 446, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -80,6 +86,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 502, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 502, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -92,6 +99,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 559, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 559, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -104,6 +112,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 402, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 402, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -116,6 +125,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 559, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 559, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -128,6 +138,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 276, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 276, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/devanagari.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8640, y_size = -1630} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8640, y_size = -1630} , fragmentPen = (0, -1171) , fragmentGlyphs =
.golden/paragraphLayout/devanagariAccent.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 645, y_size = -1630} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 645, y_size = -1630} , fragmentPen = (0, -1171) , fragmentGlyphs =
.golden/paragraphLayout/devanagariPrefixedAccent.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 0, y_size = -1630} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 0, y_size = -1630} , fragmentPen = (0, -1171) , fragmentGlyphs =
.golden/paragraphLayout/hardBreaksLTR.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1563, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1563, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -25,6 +26,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3357, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3357, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -49,6 +51,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1563, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1563, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -66,6 +69,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 4305, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 4305, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -82,6 +86,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 861, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 861, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -94,6 +99,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1563, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1563, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -111,6 +117,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 0, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 0, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -122,6 +129,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 3675, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 3675, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -138,6 +146,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 1722, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 1722, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/hardBreaksRTL.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2808, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -25,6 +26,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5852, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 5852, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -49,6 +51,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 2808, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 2808, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -66,6 +69,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 4884, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 4884, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -83,6 +87,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -6000, x_size = 1211, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -6000, x_size = 1211, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -95,6 +100,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -7500, x_size = 2808, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -7500, x_size = 2808, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -112,6 +118,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -9000, x_size = 0, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -9000, x_size = 0, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -123,6 +130,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -10500, x_size = 4156, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -10500, x_size = 4156, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -139,6 +147,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -12000, x_size = 1960, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =
.golden/paragraphLayout/ligature.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/ligatureParagraphBreak1.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -23,6 +24,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -39,6 +41,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/ligatureParagraphBreak2.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -23,6 +24,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -37,6 +39,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/lineHeightLarger.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -240, x_size = 522, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1600} , fragmentPen = (0, -1172) , fragmentGlyphs =
.golden/paragraphLayout/lineHeightNormal.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/lineHeightSmaller.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 261, x_size = 522, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 522, y_size = -599} , fragmentPen = (0, -671) , fragmentGlyphs =
.golden/paragraphLayout/loremIpsum100em.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 95412, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 95412, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -231,6 +232,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 98954, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 98954, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -463,6 +465,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 4041, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 4041, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/loremIpsum20em.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -58,6 +59,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -107,6 +109,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -162,6 +165,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -210,6 +214,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -265,6 +270,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -316,6 +322,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -368,6 +375,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -423,6 +431,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -471,6 +480,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -524,6 +534,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/manySpaces.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3132, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3132, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -25,6 +26,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3132, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 3132, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -42,6 +44,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 3132, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 3132, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -59,6 +62,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3132, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3132, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/mixedLanguageLTR.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -33,6 +34,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = -1121} , fragmentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/mixedScriptWords.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -22,6 +23,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -36,6 +38,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3112, y_origin = 0, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 3112, y_origin = 0, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -50,6 +53,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -64,6 +68,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 777, y_origin = -1121, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 777, y_origin = -1121, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -78,6 +83,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3112, y_origin = -1121, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 3112, y_origin = -1121, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -92,6 +98,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -106,6 +113,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 2335, y_origin = -2242, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 2335, y_origin = -2242, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -120,6 +128,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3112, y_origin = -2242, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 3112, y_origin = -2242, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -134,6 +143,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -148,6 +158,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 2335, y_origin = -3363, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 2335, y_origin = -3363, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -162,6 +173,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3112, y_origin = -3363, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 3112, y_origin = -3363, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -176,6 +188,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 253, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 253, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -188,6 +201,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 253, y_origin = -4484, x_size = 763, y_size = -1121} , fragmentRect = Rect {x_origin = 253, y_origin = -4484, x_size = 763, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -200,6 +214,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 1016, y_origin = -4484, x_size = 737, y_size = -1121} , fragmentRect = Rect {x_origin = 1016, y_origin = -4484, x_size = 737, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -214,6 +229,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 1753, y_origin = -4484, x_size = 763, y_size = -1121} , fragmentRect = Rect {x_origin = 1753, y_origin = -4484, x_size = 763, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -226,6 +242,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 2516, y_origin = -4484, x_size = 484, y_size = -1121} , fragmentRect = Rect {x_origin = 2516, y_origin = -4484, x_size = 484, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -239,6 +256,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3000, y_origin = -4484, x_size = 763, y_size = -1121} , fragmentRect = Rect {x_origin = 3000, y_origin = -4484, x_size = 763, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -251,6 +269,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3763, y_origin = -4484, x_size = 253, y_size = -1121} , fragmentRect = Rect {x_origin = 3763, y_origin = -4484, x_size = 253, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -263,6 +282,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 4016, y_origin = -4484, x_size = 763, y_size = -1121} , fragmentRect = Rect {x_origin = 4016, y_origin = -4484, x_size = 763, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -275,6 +295,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 763, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 763, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -287,6 +308,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 763, y_origin = -5605, x_size = 253, y_size = -1121} , fragmentRect = Rect {x_origin = 763, y_origin = -5605, x_size = 253, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -299,6 +321,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 1016, y_origin = -5605, x_size = 763, y_size = -1121} , fragmentRect = Rect {x_origin = 1016, y_origin = -5605, x_size = 763, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/paragraphLayout/spannedArabicFiller20em.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500} , fragmentRect = Rect {x_origin = 12652, y_origin = 0, x_size = 7198, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -40,6 +41,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500} , fragmentRect = Rect {x_origin = 7060, y_origin = 0, x_size = 5592, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -65,6 +67,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 7060, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -98,6 +101,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500} , fragmentRect = Rect {x_origin = 14850, y_origin = -1500, x_size = 4045, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -122,6 +126,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500} , fragmentRect = Rect {x_origin = 9168, y_origin = -1500, x_size = 5682, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -152,6 +157,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500} , fragmentRect = Rect {x_origin = 3213, y_origin = -1500, x_size = 5955, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -182,6 +188,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 3213, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -202,6 +209,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500} , fragmentRect = Rect {x_origin = 14300, y_origin = -3000, x_size = 4862, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -229,6 +237,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 10225, y_origin = -3000, x_size = 4075, y_size = -1500} , fragmentRect = Rect {x_origin = 10225, y_origin = -3000, x_size = 4075, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -252,6 +261,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 3898, y_origin = -3000, x_size = 6327, y_size = -1500} , fragmentRect = Rect {x_origin = 3898, y_origin = -3000, x_size = 6327, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -282,6 +292,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -3000, x_size = 3898, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -301,6 +312,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500} , fragmentRect = Rect {x_origin = 12238, y_origin = -4500, x_size = 2357, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -321,6 +333,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 5880, y_origin = -4500, x_size = 6358, y_size = -1500} , fragmentRect = Rect {x_origin = 5880, y_origin = -4500, x_size = 6358, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -352,6 +365,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 5880, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = -4500, x_size = 5880, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =
.golden/paragraphLayout/spannedLoremIpsum20em.golden view
@@ -8,6 +8,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8747, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8747, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -40,6 +41,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 8747, y_origin = 0, x_size = 9563, y_size = -1121} , fragmentRect = Rect {x_origin = 8747, y_origin = 0, x_size = 9563, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -71,10 +73,23 @@ SpanLayout [ Fragment { fragmentUserData = ()+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = 18310, y_origin = 0, x_size = 0, y_size = -1121}+ , fragmentRect = Rect {x_origin = 18310, y_origin = 0, x_size = 0, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = () , fragmentLine = 2 , fragmentAncestorBoxes =- [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 8553, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 8553, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -110,6 +125,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 8553, y_origin = -1121, x_size = 8890, y_size = -1121} , fragmentRect = Rect {x_origin = 8553, y_origin = -1121, x_size = 8890, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -137,10 +153,23 @@ SpanLayout [ Fragment { fragmentUserData = ()+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge}+ ]+ , fragmentContentRect = Rect {x_origin = 17443, y_origin = -1121, x_size = 0, y_size = -1121}+ , fragmentRect = Rect {x_origin = 17443, y_origin = -1121, x_size = 0, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = () , fragmentLine = 3 , fragmentAncestorBoxes =- [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 9114, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 9114, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -176,6 +205,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 9114, y_origin = -2242, x_size = 7467, y_size = -1121} , fragmentRect = Rect {x_origin = 9114, y_origin = -2242, x_size = 7467, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -205,6 +235,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 16581, y_origin = -2242, x_size = 3210, y_size = -1121} , fragmentRect = Rect {x_origin = 16581, y_origin = -2242, x_size = 3210, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -224,6 +255,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3799, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 3799, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -246,6 +278,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 3799, y_origin = -3363, x_size = 7878, y_size = -1121} , fragmentRect = Rect {x_origin = 3799, y_origin = -3363, x_size = 7878, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -276,6 +309,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 11677, y_origin = -3363, x_size = 5885, y_size = -1121} , fragmentRect = Rect {x_origin = 11677, y_origin = -3363, x_size = 5885, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -300,6 +334,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 5686, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 5686, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -327,6 +362,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 5686, y_origin = -4484, x_size = 8592, y_size = -1121} , fragmentRect = Rect {x_origin = 5686, y_origin = -4484, x_size = 8592, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -361,6 +397,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 14278, y_origin = -4484, x_size = 4491, y_size = -1121} , fragmentRect = Rect {x_origin = 14278, y_origin = -4484, x_size = 4491, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -383,6 +420,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1301, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 1301, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -400,6 +438,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 1301, y_origin = -5605, x_size = 11041, y_size = -1121} , fragmentRect = Rect {x_origin = 1301, y_origin = -5605, x_size = 11041, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -435,6 +474,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 12342, y_origin = -5605, x_size = 6884, y_size = -1121} , fragmentRect = Rect {x_origin = 12342, y_origin = -5605, x_size = 6884, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -465,6 +505,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 10089, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 10089, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -501,6 +542,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 10089, y_origin = -6726, x_size = 7884, y_size = -1121} , fragmentRect = Rect {x_origin = 10089, y_origin = -6726, x_size = 7884, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -534,6 +576,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 8158, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 8158, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -566,6 +609,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 8158, y_origin = -7847, x_size = 6988, y_size = -1121} , fragmentRect = Rect {x_origin = 8158, y_origin = -7847, x_size = 6988, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -597,6 +641,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 15146, y_origin = -7847, x_size = 3825, y_size = -1121} , fragmentRect = Rect {x_origin = 15146, y_origin = -7847, x_size = 3825, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -617,6 +662,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 4594, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 4594, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -640,6 +686,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 4594, y_origin = -8968, x_size = 10907, y_size = -1121} , fragmentRect = Rect {x_origin = 4594, y_origin = -8968, x_size = 10907, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -679,6 +726,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 15501, y_origin = -8968, x_size = 1738, y_size = -1121} , fragmentRect = Rect {x_origin = 15501, y_origin = -8968, x_size = 1738, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -693,6 +741,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 6426, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 6426, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -721,6 +770,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 6426, y_origin = -10089, x_size = 5590, y_size = -1121} , fragmentRect = Rect {x_origin = 6426, y_origin = -10089, x_size = 5590, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -749,6 +799,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 12016, y_origin = -10089, x_size = 7183, y_size = -1121} , fragmentRect = Rect {x_origin = 12016, y_origin = -10089, x_size = 7183, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -774,6 +825,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 2652, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 2652, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -794,6 +846,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 2652, y_origin = -11210, x_size = 5383, y_size = -1121} , fragmentRect = Rect {x_origin = 2652, y_origin = -11210, x_size = 5383, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -821,6 +874,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = (), boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 8035, y_origin = -11210, x_size = 4041, y_size = -1121} , fragmentRect = Rect {x_origin = 8035, y_origin = -11210, x_size = 4041, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
+ .golden/richParagraphLayout/emptyBoxMiddle.golden view
@@ -0,0 +1,49 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 5193, y_size = -1121}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3139, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3139, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 72, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 92, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 497, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "emptyText"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 50, boxEndEdge = SpacedEdge 100}+ ]+ , fragmentContentRect = Rect {x_origin = 3189, y_origin = 0, x_size = 0, y_size = -1121}+ , fragmentRect = Rect {x_origin = 3189, y_origin = 0, x_size = 0, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "text2"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 3289, y_origin = 0, x_size = 1904, y_size = -1121}+ , fragmentRect = Rect {x_origin = 3289, y_origin = 0, x_size = 1904, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 3, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 69, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 573, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 91, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ }
.golden/richParagraphLayout/hardBoxBreakLTR.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3333, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3333, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -24,6 +25,7 @@ [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 150, boxEndEdge = NoEdge} , AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 50, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3533, y_origin = 0, x_size = 2222, y_size = -1121} , fragmentRect = Rect {x_origin = 3533, y_origin = 0, x_size = 2222, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -40,6 +42,7 @@ [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 200} , AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 100} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2222, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2222, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -54,6 +57,7 @@ , fragmentLine = 2 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 2522, y_origin = -1121, x_size = 3333, y_size = -1121} , fragmentRect = Rect {x_origin = 2522, y_origin = -1121, x_size = 3333, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/richParagraphLayout/hardBoxBreakRTL.golden view
@@ -1,5 +1,5 @@ ParagraphLayout- { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 3455, y_size = -3000}+ { paragraphRect = Rect {x_origin = 999996545, y_origin = 0, x_size = 3455, y_size = -3000} , paragraphFragments = [ Fragment { fragmentUserData = "text2"@@ -8,7 +8,8 @@ [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = SpacedEdge 200, boxEndEdge = NoEdge} , AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 100, boxEndEdge = NoEdge} ]- , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1632, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999996545, y_origin = 0, x_size = 1632, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999996545, y_origin = 0, x_size = 1632, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 512, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 839, y_advance = 0, x_offset = 0, y_offset = 0})@@ -22,7 +23,8 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 1932, y_origin = 0, x_size = 1523, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999998477, y_origin = 0, x_size = 1523, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999998477, y_origin = 0, x_size = 1523, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 389, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})@@ -38,7 +40,8 @@ , fragmentLine = 2 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 0, y_origin = -1500, x_size = 2155, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999996645, y_origin = -1500, x_size = 2155, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999996645, y_origin = -1500, x_size = 2155, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 512, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 839, y_advance = 0, x_offset = 0, y_offset = 0})@@ -56,7 +59,8 @@ [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 150} , AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 50} ]- , fragmentRect = Rect {x_origin = 2355, y_origin = -1500, x_size = 1000, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999999000, y_origin = -1500, x_size = 1000, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999999000, y_origin = -1500, x_size = 1000, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 389, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})
.golden/richParagraphLayout/loremIpsum20em.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 18310, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -55,6 +56,7 @@ , fragmentLine = 2 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 17443, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -103,6 +105,7 @@ , fragmentLine = 3 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 19791, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -157,6 +160,7 @@ , fragmentLine = 4 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 17562, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -204,6 +208,7 @@ , fragmentLine = 5 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 18769, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -258,6 +263,7 @@ , fragmentLine = 6 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 19226, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -308,6 +314,7 @@ , fragmentLine = 7 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 17973, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -359,6 +366,7 @@ , fragmentLine = 8 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 18971, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -413,6 +421,7 @@ , fragmentLine = 9 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 17239, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -460,6 +469,7 @@ , fragmentLine = 10 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -10089, x_size = 19199, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -512,6 +522,7 @@ , fragmentLine = 11 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -11210, x_size = 12076, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
+ .golden/richParagraphLayout/loremIpsum20emCentre.golden view
@@ -0,0 +1,559 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 104, y_origin = 0, x_size = 19791, y_size = -12331}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 845, y_origin = 0, x_size = 18310, y_size = -1121}+ , fragmentRect = Rect {x_origin = 845, y_origin = 0, x_size = 18310, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 15, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 31, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 32, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 35, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 36, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 39, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 40, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 41, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1278, y_origin = -1121, x_size = 17443, y_size = -1121}+ , fragmentRect = Rect {x_origin = 1278, y_origin = -1121, x_size = 17443, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 68, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 52, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 53, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 54, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 15, cluster = 59, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 70, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 3+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 104, y_origin = -2242, x_size = 19791, y_size = -1121}+ , fragmentRect = Rect {x_origin = 104, y_origin = -2242, x_size = 19791, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 85, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 86, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 87, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 88, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 89, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 91, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 92, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 93, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 94, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 96, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 97, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 98, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 69, cluster = 99, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 100, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 101, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 102, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 103, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 104, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 105, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 106, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 107, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 108, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 109, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 110, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 111, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 112, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 113, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 114, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 115, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 116, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 117, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 118, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 119, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 120, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 121, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 122, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 123, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 124, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 125, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 17, cluster = 126, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 4+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1219, y_origin = -3363, x_size = 17562, y_size = -1121}+ , fragmentRect = Rect {x_origin = 1219, y_origin = -3363, x_size = 17562, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 56, cluster = 128, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 688, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 129, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 130, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 131, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 132, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 133, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 134, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 135, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 136, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 137, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 138, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 139, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 140, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 141, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 142, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 143, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 144, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 89, cluster = 145, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 146, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 147, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 148, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 149, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 150, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 15, cluster = 151, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 152, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 153, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 154, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 155, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 156, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 157, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 158, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 159, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 160, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 161, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 162, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 163, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 164, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 5+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 615, y_origin = -4484, x_size = 18769, y_size = -1121}+ , fragmentRect = Rect {x_origin = 615, y_origin = -4484, x_size = 18769, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 72, cluster = 166, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 91, cluster = 167, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 168, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 169, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 170, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 171, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 172, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 173, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 174, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 175, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 176, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 177, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 178, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 179, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 180, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 181, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 182, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 183, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 184, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 185, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 186, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 187, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 188, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 69, cluster = 189, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 190, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 191, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 192, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 193, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 194, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 195, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 196, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 197, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 198, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 199, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 200, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 201, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 202, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 203, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 204, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 205, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 206, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 207, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 208, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 209, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 6+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 387, y_origin = -5605, x_size = 19226, y_size = -1121}+ , fragmentRect = Rect {x_origin = 387, y_origin = -5605, x_size = 19226, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 72, cluster = 211, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 91, cluster = 212, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 213, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 214, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 215, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 216, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 217, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 218, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 219, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 220, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 221, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 222, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 223, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 224, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 225, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 226, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 227, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 228, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 229, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 230, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 231, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 232, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 233, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 17, cluster = 234, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 235, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 39, cluster = 236, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 713, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 237, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 238, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 239, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 240, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 241, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 242, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 243, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 244, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 245, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 246, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 247, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 248, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 249, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 250, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 7+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1013, y_origin = -6726, x_size = 17973, y_size = -1121}+ , fragmentRect = Rect {x_origin = 1013, y_origin = -6726, x_size = 17973, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 71, cluster = 252, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 253, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 254, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 255, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 256, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 257, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 258, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 259, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 260, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 261, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 262, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 263, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 264, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 265, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 75, cluster = 266, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 571, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 267, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 268, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 269, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 270, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 271, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 272, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 273, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 274, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 275, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 276, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 277, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 89, cluster = 278, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 279, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 280, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 281, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 282, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 283, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 284, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 285, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 286, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 287, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 89, cluster = 288, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 289, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 290, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 291, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 292, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 8+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 514, y_origin = -7847, x_size = 18971, y_size = -1121}+ , fragmentRect = Rect {x_origin = 514, y_origin = -7847, x_size = 18971, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 72, cluster = 294, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 295, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 296, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 297, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 298, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 299, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 300, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 301, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 302, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 303, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 304, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 305, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 306, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 307, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 308, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 309, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 310, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 311, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 312, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 313, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 314, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 315, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 73, cluster = 316, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 317, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 318, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 319, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 320, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 321, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 322, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 323, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 324, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 325, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 326, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 327, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 328, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 329, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 330, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 331, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 332, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 333, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 334, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 335, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 336, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 331, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 17, cluster = 337, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 9+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1380, y_origin = -8968, x_size = 17239, y_size = -1121}+ , fragmentRect = Rect {x_origin = 1380, y_origin = -8968, x_size = 17239, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 40, cluster = 339, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 91, cluster = 340, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 341, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 342, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 343, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 344, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 345, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 346, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 347, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 348, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 349, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 350, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 351, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 352, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 353, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 354, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 355, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 356, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 357, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 358, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 359, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 360, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 361, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 362, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 363, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 364, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 365, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 366, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 367, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 368, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 369, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 370, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 371, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 372, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 373, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 374, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 375, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 10+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 400, y_origin = -10089, x_size = 19199, y_size = -1121}+ , fragmentRect = Rect {x_origin = 400, y_origin = -10089, x_size = 19199, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 83, cluster = 377, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 378, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 379, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 380, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 381, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 382, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 383, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 384, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 15, cluster = 385, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 386, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 387, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 388, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 389, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 390, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 391, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 392, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 393, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 394, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 395, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 396, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 397, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 398, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 399, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 400, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 401, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 402, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 403, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 404, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 405, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 431, cluster = 406, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1033, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 409, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 410, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 411, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 412, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 413, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 414, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 415, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 416, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 417, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 418, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 419, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 420, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 11+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 3962, y_origin = -11210, x_size = 12076, y_size = -1121}+ , fragmentRect = Rect {x_origin = 3962, y_origin = -11210, x_size = 12076, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 80, cluster = 422, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 423, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 424, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 425, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 426, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 427, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 428, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 429, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 430, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 431, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 432, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 433, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 434, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 435, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 436, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 437, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 438, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 439, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 440, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 441, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 442, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 69, cluster = 443, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 444, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 445, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 446, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 447, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 17, cluster = 448, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ }
+ .golden/richParagraphLayout/loremIpsum20emRight.golden view
@@ -0,0 +1,559 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 209, y_origin = 0, x_size = 19791, y_size = -12331}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1690, y_origin = 0, x_size = 18310, y_size = -1121}+ , fragmentRect = Rect {x_origin = 1690, y_origin = 0, x_size = 18310, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 47, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 507, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 15, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 31, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 32, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 35, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 36, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 38, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 39, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 40, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 41, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 2557, y_origin = -1121, x_size = 17443, y_size = -1121}+ , fragmentRect = Rect {x_origin = 2557, y_origin = -1121, x_size = 17443, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 68, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 52, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 53, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 54, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 15, cluster = 59, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 70, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 3+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 209, y_origin = -2242, x_size = 19791, y_size = -1121}+ , fragmentRect = Rect {x_origin = 209, y_origin = -2242, x_size = 19791, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 85, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 86, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 87, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 88, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 89, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 91, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 92, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 93, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 94, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 96, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 97, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 98, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 69, cluster = 99, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 100, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 101, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 102, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 103, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 104, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 105, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 106, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 107, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 108, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 109, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 110, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 111, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 112, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 113, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 114, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 115, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 116, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 117, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 118, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 119, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 120, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 121, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 122, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 123, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 124, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 125, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 17, cluster = 126, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 4+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 2438, y_origin = -3363, x_size = 17562, y_size = -1121}+ , fragmentRect = Rect {x_origin = 2438, y_origin = -3363, x_size = 17562, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 56, cluster = 128, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 688, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 129, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 130, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 131, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 132, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 133, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 134, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 135, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 136, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 137, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 138, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 139, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 140, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 141, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 142, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 143, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 144, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 89, cluster = 145, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 146, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 147, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 148, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 149, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 150, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 15, cluster = 151, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 152, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 153, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 154, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 155, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 156, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 157, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 158, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 159, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 160, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 161, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 162, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 163, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 164, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 5+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1231, y_origin = -4484, x_size = 18769, y_size = -1121}+ , fragmentRect = Rect {x_origin = 1231, y_origin = -4484, x_size = 18769, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 72, cluster = 166, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 91, cluster = 167, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 168, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 169, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 170, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 171, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 172, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 173, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 174, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 175, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 176, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 177, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 178, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 179, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 180, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 181, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 182, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 183, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 184, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 185, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 186, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 187, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 188, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 69, cluster = 189, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 190, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 191, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 192, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 193, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 194, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 195, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 196, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 197, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 198, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 199, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 200, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 201, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 202, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 203, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 204, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 205, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 206, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 207, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 208, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 209, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 6+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 774, y_origin = -5605, x_size = 19226, y_size = -1121}+ , fragmentRect = Rect {x_origin = 774, y_origin = -5605, x_size = 19226, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 72, cluster = 211, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 91, cluster = 212, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 213, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 214, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 215, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 216, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 217, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 218, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 219, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 220, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 221, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 222, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 223, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 224, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 225, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 452, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 226, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 227, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 228, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 229, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 230, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 231, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 232, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 233, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 17, cluster = 234, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 235, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 39, cluster = 236, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 713, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 237, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 238, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 239, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 240, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 241, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 242, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 243, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 244, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 245, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 246, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 247, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 248, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 249, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 250, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 7+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 2027, y_origin = -6726, x_size = 17973, y_size = -1121}+ , fragmentRect = Rect {x_origin = 2027, y_origin = -6726, x_size = 17973, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 71, cluster = 252, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 253, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 254, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 255, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 256, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 257, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 258, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 259, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 260, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 261, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 262, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 263, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 264, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 265, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 75, cluster = 266, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 571, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 267, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 268, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 269, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 270, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 271, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 272, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 273, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 274, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 275, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 276, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 277, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 89, cluster = 278, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 279, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 280, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 281, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 282, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 283, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 284, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 285, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 286, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 287, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 89, cluster = 288, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 488, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 289, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 290, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 291, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 292, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 8+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1029, y_origin = -7847, x_size = 18971, y_size = -1121}+ , fragmentRect = Rect {x_origin = 1029, y_origin = -7847, x_size = 18971, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 72, cluster = 294, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 295, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 296, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 297, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 298, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 299, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 300, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 301, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 302, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 303, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 304, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 305, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 306, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 307, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 308, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 309, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 310, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 311, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 312, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 313, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 314, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 315, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 73, cluster = 316, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 317, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 318, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 319, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 320, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 321, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 322, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 323, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 324, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 325, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 326, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 327, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 328, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 329, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 330, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 331, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 332, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 333, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 334, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 335, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 336, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 331, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 17, cluster = 337, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 9+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 2761, y_origin = -8968, x_size = 17239, y_size = -1121}+ , fragmentRect = Rect {x_origin = 2761, y_origin = -8968, x_size = 17239, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 40, cluster = 339, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 91, cluster = 340, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 490, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 341, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 342, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 343, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 344, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 392, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 345, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 346, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 347, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 348, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 349, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 350, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 351, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 352, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 353, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 354, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 355, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 356, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 357, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 358, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 359, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 360, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 361, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 362, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 363, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 364, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 365, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 366, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 367, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 368, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 369, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 370, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 371, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 372, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 373, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 374, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 375, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 10+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 801, y_origin = -10089, x_size = 19199, y_size = -1121}+ , fragmentRect = Rect {x_origin = 801, y_origin = -10089, x_size = 19199, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 83, cluster = 377, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 378, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 379, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 380, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 381, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 382, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 383, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 384, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 413, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 15, cluster = 385, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 386, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 387, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 388, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 389, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 390, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 391, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 392, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 393, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 394, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 395, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 396, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 397, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 398, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 399, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 400, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 84, cluster = 401, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 402, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 403, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 404, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 405, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 431, cluster = 406, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1033, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 409, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 410, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 411, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 412, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 413, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 414, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 415, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 416, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 417, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 418, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 419, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 420, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 11+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 7924, y_origin = -11210, x_size = 12076, y_size = -1121}+ , fragmentRect = Rect {x_origin = 7924, y_origin = -11210, x_size = 12076, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 80, cluster = 422, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 423, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 424, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 425, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 426, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 427, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 428, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 429, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 81, cluster = 430, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 431, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 432, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 433, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 434, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 435, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 436, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 437, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 86, cluster = 438, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 87, cluster = 439, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 440, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 441, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 442, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 69, cluster = 443, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 444, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 445, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 446, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 447, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 17, cluster = 448, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ }
.golden/richParagraphLayout/mixedDirectionComplexLTR.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 6732, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 6732, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -35,6 +36,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 6732, y_origin = 0, x_size = 1580, y_size = -1500} , fragmentRect = Rect {x_origin = 6732, y_origin = 0, x_size = 1580, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -51,6 +53,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 8312, y_origin = 0, x_size = 3166, y_size = -1500} , fragmentRect = Rect {x_origin = 8312, y_origin = 0, x_size = 3166, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -71,6 +74,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 11478, y_origin = 0, x_size = 6578, y_size = -1500} , fragmentRect = Rect {x_origin = 11478, y_origin = 0, x_size = 6578, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -100,6 +104,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 18056, y_origin = 0, x_size = 1580, y_size = -1500} , fragmentRect = Rect {x_origin = 18056, y_origin = 0, x_size = 1580, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -115,6 +120,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 19636, y_origin = 0, x_size = 3577, y_size = -1500} , fragmentRect = Rect {x_origin = 19636, y_origin = 0, x_size = 3577, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -134,6 +140,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 23213, y_origin = 0, x_size = 1344, y_size = -1500} , fragmentRect = Rect {x_origin = 23213, y_origin = 0, x_size = 1344, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =
.golden/richParagraphLayout/mixedDirectionComplexRTL.golden view
@@ -1,12 +1,13 @@ ParagraphLayout- { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 24557, y_size = -1500}+ { paragraphRect = Rect {x_origin = 999975443, y_origin = 0, x_size = 24557, y_size = -1500} , paragraphFragments = [ Fragment { fragmentUserData = "text3" , fragmentLine = 1 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 6501, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999975443, y_origin = 0, x_size = 6501, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999975443, y_origin = 0, x_size = 6501, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 147, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 600, y_advance = 0, x_offset = 0, y_offset = 0})@@ -35,7 +36,8 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]- , fragmentRect = Rect {x_origin = 6501, y_origin = 0, x_size = 1580, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999981944, y_origin = 0, x_size = 1580, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999981944, y_origin = 0, x_size = 1580, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 3, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})@@ -51,7 +53,8 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]- , fragmentRect = Rect {x_origin = 8081, y_origin = 0, x_size = 3418, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999983524, y_origin = 0, x_size = 3418, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999983524, y_origin = 0, x_size = 3418, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 26, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 351, y_advance = 0, x_offset = 0, y_offset = 0})@@ -71,7 +74,8 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]- , fragmentRect = Rect {x_origin = 11499, y_origin = 0, x_size = 6326, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999986942, y_origin = 0, x_size = 6326, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999986942, y_origin = 0, x_size = 6326, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 3, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})@@ -100,7 +104,8 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 17825, y_origin = 0, x_size = 1580, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999993268, y_origin = 0, x_size = 1580, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999993268, y_origin = 0, x_size = 1580, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 3, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})@@ -115,7 +120,8 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 19405, y_origin = 0, x_size = 3808, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999994848, y_origin = 0, x_size = 3808, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999994848, y_origin = 0, x_size = 3808, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 4, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 534, y_advance = 0, x_offset = 0, y_offset = 0})@@ -134,7 +140,8 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 23213, y_origin = 0, x_size = 1344, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999998656, y_origin = 0, x_size = 1344, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999998656, y_origin = 0, x_size = 1344, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 3, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 236, y_advance = 0, x_offset = 0, y_offset = 0})
.golden/richParagraphLayout/mixedDirectionSimpleLTR.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3397, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3397, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -23,6 +24,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 3397, y_origin = 0, x_size = 1578, y_size = -1500} , fragmentRect = Rect {x_origin = 3397, y_origin = 0, x_size = 1578, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =@@ -35,6 +37,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 4975, y_origin = 0, x_size = 2979, y_size = -1500} , fragmentRect = Rect {x_origin = 4975, y_origin = 0, x_size = 2979, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =
.golden/richParagraphLayout/mixedDirectionSimpleRTL.golden view
@@ -1,12 +1,13 @@ ParagraphLayout- { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 7954, y_size = -1500}+ { paragraphRect = Rect {x_origin = 999992046, y_origin = 0, x_size = 7954, y_size = -1500} , paragraphFragments = [ Fragment { fragmentUserData = "text" , fragmentLine = 1 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2979, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999992046, y_origin = 0, x_size = 2979, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999992046, y_origin = 0, x_size = 2979, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 17, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 517, y_advance = 0, x_offset = 0, y_offset = 0})@@ -22,7 +23,8 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 2979, y_origin = 0, x_size = 1578, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999995025, y_origin = 0, x_size = 1578, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999995025, y_origin = 0, x_size = 1578, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 1143, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 1095, y_advance = 0, x_offset = 0, y_offset = 0})@@ -34,7 +36,8 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 4557, y_origin = 0, x_size = 3397, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999996603, y_origin = 0, x_size = 3397, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999996603, y_origin = 0, x_size = 3397, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 6, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 580, y_advance = 0, x_offset = 0, y_offset = 0})
+ .golden/richParagraphLayout/mixedLineHeight.golden view
@@ -0,0 +1,306 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 16708, y_size = -9400}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "mediumText"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -90, x_size = 3928, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 3928, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 80, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "smallText"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ ]+ , fragmentContentRect = Rect {x_origin = 3928, y_origin = 160, x_size = 2606, y_size = -1121}+ , fragmentRect = Rect {x_origin = 3928, y_origin = 0, x_size = 2606, y_size = -800}+ , fragmentPen = (0, -772)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 86, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 16, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "mediumText"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 6534, y_origin = -90, x_size = 3928, y_size = -1121}+ , fragmentRect = Rect {x_origin = 6534, y_origin = 0, x_size = 3928, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 80, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "largeText"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ ]+ , fragmentContentRect = Rect {x_origin = 10462, y_origin = -290, x_size = 2549, y_size = -1121}+ , fragmentRect = Rect {x_origin = 10462, y_origin = 0, x_size = 2549, y_size = -1700}+ , fragmentPen = (0, -1222)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 79, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 27, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 29, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 30, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 31, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "mediumText"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 13011, y_origin = -90, x_size = 3697, y_size = -1121}+ , fragmentRect = Rect {x_origin = 13011, y_origin = 0, x_size = 3697, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 80, cluster = 32, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 33, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 34, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 35, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 36, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 37, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "lineBreak"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 16708, y_origin = -90, x_size = 0, y_size = -1121}+ , fragmentRect = Rect {x_origin = 16708, y_origin = 0, x_size = 0, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "smallText"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1540, x_size = 2606, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -1700, x_size = 2606, y_size = -800}+ , fragmentPen = (0, -772)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 86, cluster = 40, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 41, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 42, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 43, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 44, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "mediumText"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 2606, y_origin = -1790, x_size = 3928, y_size = -1121}+ , fragmentRect = Rect {x_origin = 2606, y_origin = -1700, x_size = 3928, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 80, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 51, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 52, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "largeText"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ ]+ , fragmentContentRect = Rect {x_origin = 6534, y_origin = -1990, x_size = 2318, y_size = -1121}+ , fragmentRect = Rect {x_origin = 6534, y_origin = -1700, x_size = 2318, y_size = -1700}+ , fragmentPen = (0, -1222)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 79, cluster = 53, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 54, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "lineBreak"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 8852, y_origin = -1790, x_size = 0, y_size = -1121}+ , fragmentRect = Rect {x_origin = 8852, y_origin = -1700, x_size = 0, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "mediumText"+ , fragmentLine = 3+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3490, x_size = 3928, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -3400, x_size = 3928, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 80, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "smallText"+ , fragmentLine = 3+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ ]+ , fragmentContentRect = Rect {x_origin = 3928, y_origin = -3240, x_size = 2375, y_size = -1121}+ , fragmentRect = Rect {x_origin = 3928, y_origin = -3400, x_size = 2375, y_size = -800}+ , fragmentPen = (0, -772)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 86, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 68, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 70, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "lineBreak"+ , fragmentLine = 3+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 6303, y_origin = -3490, x_size = 0, y_size = -1121}+ , fragmentRect = Rect {x_origin = 6303, y_origin = -3400, x_size = 0, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "largeText"+ , fragmentLine = 4+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4990, x_size = 2549, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -4700, x_size = 2549, y_size = -1700}+ , fragmentPen = (0, -1222)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 79, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 77, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 79, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "mediumText"+ , fragmentLine = 4+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 2549, y_origin = -4790, x_size = 3697, y_size = -1121}+ , fragmentRect = Rect {x_origin = 2549, y_origin = -4700, x_size = 3697, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 80, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 71, cluster = 82, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 76, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 88, cluster = 84, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 85, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "lineBreak"+ , fragmentLine = 4+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 6246, y_origin = -4790, x_size = 0, y_size = -1121}+ , fragmentRect = Rect {x_origin = 6246, y_origin = -4700, x_size = 0, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "smallText"+ , fragmentLine = 5+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "smallBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -6240, x_size = 2375, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -6400, x_size = 2375, y_size = -800}+ , fragmentPen = (0, -772)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 86, cluster = 88, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 80, cluster = 89, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 861, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 90, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 91, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 79, cluster = 92, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "lineBreak"+ , fragmentLine = 5+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 2375, y_origin = -6490, x_size = 0, y_size = -1121}+ , fragmentRect = Rect {x_origin = 2375, y_origin = -6400, x_size = 0, y_size = -1300}+ , fragmentPen = (0, -1022)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "largeText"+ , fragmentLine = 6+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "largeBox", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0}+ ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -7990, x_size = 2318, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -7700, x_size = 2318, y_size = -1700}+ , fragmentPen = (0, -1222)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 79, cluster = 95, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 273, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 96, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 85, cluster = 97, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 74, cluster = 98, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 578, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 99, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ }
.golden/richParagraphLayout/mixedScript.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -19,6 +20,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -33,6 +35,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 50, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -47,6 +50,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 100} ]+ , fragmentContentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -60,6 +64,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 6374, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 6374, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -74,6 +79,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 150, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 8859, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 8859, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -88,6 +94,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 11194, y_origin = 0, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 11194, y_origin = 0, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -102,6 +109,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 200} ]+ , fragmentContentRect = Rect {x_origin = 11971, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 11971, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -115,6 +123,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 14506, y_origin = 0, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 14506, y_origin = 0, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/richParagraphLayout/mixedScriptWrap.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -19,6 +20,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 777, y_origin = 0, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -33,6 +35,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 50, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 3162, y_origin = 0, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -47,6 +50,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 763, y_size = -1121} , fragmentRect = Rect {x_origin = 3939, y_origin = 0, x_size = 763, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -59,6 +63,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box1", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 100, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 100} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1549, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1549, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -71,6 +76,7 @@ , fragmentLine = 2 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 1649, y_origin = -1121, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 1649, y_origin = -1121, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -85,6 +91,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 150, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 150, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 4134, y_origin = -1121, x_size = 763, y_size = -1121} , fragmentRect = Rect {x_origin = 4134, y_origin = -1121, x_size = 763, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -97,6 +104,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1549, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1549, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -110,6 +118,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = NoEdge, boxStartEdge = NoEdge, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 1549, y_origin = -2242, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 1549, y_origin = -2242, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -124,6 +133,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 200, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 200} ]+ , fragmentContentRect = Rect {x_origin = 2326, y_origin = -2242, x_size = 2335, y_size = -1121} , fragmentRect = Rect {x_origin = 2326, y_origin = -2242, x_size = 2335, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -137,6 +147,7 @@ , fragmentLine = 4 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 777, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 777, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/richParagraphLayout/mixedSizes.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1651, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1651, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -21,6 +22,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "smallBox1", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 1651, y_origin = 0, x_size = 1956, y_size = -841} , fragmentRect = Rect {x_origin = 1651, y_origin = 0, x_size = 1956, y_size = -841} , fragmentPen = (0, -699) , fragmentGlyphs =@@ -37,6 +39,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 3607, y_origin = 0, x_size = 1651, y_size = -1121} , fragmentRect = Rect {x_origin = 3607, y_origin = 0, x_size = 1651, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -52,6 +55,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "smallBox2", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 5258, y_origin = 0, x_size = 1956, y_size = -841} , fragmentRect = Rect {x_origin = 5258, y_origin = 0, x_size = 1956, y_size = -841} , fragmentPen = (0, -699) , fragmentGlyphs =@@ -68,6 +72,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 7214, y_origin = 0, x_size = 1420, y_size = -1121} , fragmentRect = Rect {x_origin = 7214, y_origin = 0, x_size = 1420, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/richParagraphLayout/nestedBoxes.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8569, y_size = -1121} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 8569, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -37,6 +38,7 @@ [ AncestorBox {boxUserData = "box3", boxLeftEdge = SpacedEdge 0, boxRightEdge = SpacedEdge 0, boxStartEdge = SpacedEdge 0, boxEndEdge = SpacedEdge 0} , AncestorBox {boxUserData = "box2", boxLeftEdge = SpacedEdge 0, boxRightEdge = NoEdge, boxStartEdge = SpacedEdge 0, boxEndEdge = NoEdge} ]+ , fragmentContentRect = Rect {x_origin = 8569, y_origin = 0, x_size = 3350, y_size = -1121} , fragmentRect = Rect {x_origin = 8569, y_origin = 0, x_size = 3350, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =@@ -55,6 +57,7 @@ , fragmentAncestorBoxes = [ AncestorBox {boxUserData = "box2", boxLeftEdge = NoEdge, boxRightEdge = SpacedEdge 0, boxStartEdge = NoEdge, boxEndEdge = SpacedEdge 0} ]+ , fragmentContentRect = Rect {x_origin = 11919, y_origin = 0, x_size = 2657, y_size = -1121} , fragmentRect = Rect {x_origin = 11919, y_origin = 0, x_size = 2657, y_size = -1121} , fragmentPen = (0, -932) , fragmentGlyphs =
.golden/richParagraphLayout/neutralDirectionLTR.golden view
@@ -6,6 +6,7 @@ , fragmentLine = 1 , fragmentAncestorBoxes = []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500} , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs =
.golden/richParagraphLayout/neutralDirectionRTL.golden view
@@ -1,12 +1,13 @@ ParagraphLayout- { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}+ { paragraphRect = Rect {x_origin = 999997997, y_origin = 0, x_size = 2003, y_size = -1500} , paragraphFragments = [ Fragment { fragmentUserData = "text" , fragmentLine = 1 , fragmentAncestorBoxes = []- , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2003, y_size = -1500}+ , fragmentContentRect = Rect {x_origin = 999997997, y_origin = 0, x_size = 2003, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999997997, y_origin = 0, x_size = 2003, y_size = -1500} , fragmentPen = (0, -1085) , fragmentGlyphs = [ (GlyphInfo {codepoint = 147, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 600, y_advance = 0, x_offset = 0, y_offset = 0})
+ .golden/richParagraphLayout/newline1Paragraph.golden view
@@ -0,0 +1,16 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+ , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ []+ }+ ]+ }
+ .golden/richParagraphLayout/newline1TextParagraph.golden view
@@ -0,0 +1,28 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 999999649, y_origin = 0, x_size = 351, y_size = -3000}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+ , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 999999649, y_origin = -1500, x_size = 351, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999999649, y_origin = -1500, x_size = 351, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 26, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 351, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ }
+ .golden/richParagraphLayout/newline2Paragraph.golden view
@@ -0,0 +1,27 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -3000}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+ , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}+ , fragmentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ []+ }+ ]+ }
+ .golden/richParagraphLayout/newline2TextParagraph.golden view
@@ -0,0 +1,39 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 999999649, y_origin = 0, x_size = 351, y_size = -4500}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+ , fragmentRect = Rect {x_origin = 1000000000, y_origin = 0, x_size = 0, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}+ , fragmentRect = Rect {x_origin = 1000000000, y_origin = -1500, x_size = 0, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "text"+ , fragmentLine = 3+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 999999649, y_origin = -3000, x_size = 351, y_size = -1500}+ , fragmentRect = Rect {x_origin = 999999649, y_origin = -3000, x_size = 351, y_size = -1500}+ , fragmentPen = (0, -1085)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 26, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 351, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ }
+ .golden/richParagraphLayout/spaceBoxCollapsed.golden view
@@ -0,0 +1,101 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 590, y_size = -8968}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 86, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 83, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 3+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 68, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 4+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 70, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 5+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 72, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text3"+ , fragmentLine = 6+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 589, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -5605, x_size = 589, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 69, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text3"+ , fragmentLine = 7+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 590, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 590, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 82, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text3"+ , fragmentLine = 8+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 511, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 511, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 91, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ }
+ .golden/richParagraphLayout/spaceBoxMiddle.golden view
@@ -0,0 +1,48 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 4635, y_size = -1121}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2581, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2581, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 86, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 83, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 68, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 70, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 72, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text2"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 50, boxEndEdge = SpacedEdge 100}+ ]+ , fragmentContentRect = Rect {x_origin = 2631, y_origin = 0, x_size = 231, y_size = -1121}+ , fragmentRect = Rect {x_origin = 2631, y_origin = 0, x_size = 231, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 3, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text3"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 2962, y_origin = 0, x_size = 1673, y_size = -1121}+ , fragmentRect = Rect {x_origin = 2962, y_origin = 0, x_size = 1673, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 69, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 82, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 573, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 91, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ }
+ .golden/richParagraphLayout/spaceBoxPreserved.golden view
@@ -0,0 +1,113 @@+ParagraphLayout+ { paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 590, y_size = -10089}+ , paragraphFragments =+ [ Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 1+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 446, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 86, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 2+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 589, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 83, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 3+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 522, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 68, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 522, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 4+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -3363, x_size = 465, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 70, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text1"+ , fragmentLine = 5+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -4484, x_size = 559, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 72, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text2"+ , fragmentLine = 6+ , fragmentAncestorBoxes =+ [ AncestorBox {boxUserData = "box1", boxLeftEdge = SpacedEdge 50, boxRightEdge = SpacedEdge 100, boxStartEdge = SpacedEdge 50, boxEndEdge = SpacedEdge 100}+ ]+ , fragmentContentRect = Rect {x_origin = 50, y_origin = -5605, x_size = 0, y_size = -1121}+ , fragmentRect = Rect {x_origin = 50, y_origin = -5605, x_size = 0, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ []+ }+ , Fragment+ { fragmentUserData = "text3"+ , fragmentLine = 7+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 589, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -6726, x_size = 589, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 69, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 589, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text3"+ , fragmentLine = 8+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 590, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -7847, x_size = 590, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 82, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ , Fragment+ { fragmentUserData = "text3"+ , fragmentLine = 9+ , fragmentAncestorBoxes =+ []+ , fragmentContentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 511, y_size = -1121}+ , fragmentRect = Rect {x_origin = 0, y_origin = -8968, x_size = 511, y_size = -1121}+ , fragmentPen = (0, -932)+ , fragmentGlyphs =+ [ (GlyphInfo {codepoint = 91, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 511, y_advance = 0, x_offset = 0, y_offset = 0})+ ]+ }+ ]+ }
+ .golden/shapedRuns/intraWordBreak.fontInfo view
@@ -0,0 +1,1 @@+assets/fonts/plex/IBMPlexSansArabic-Regular.ttf 0 32,32 32,32
+ .golden/shapedRuns/intraWordBreak.golden view
@@ -0,0 +1,19 @@+[ (3, -35, + [ (GlyphInfo {codepoint = 373, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 24, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 971, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 407, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 89, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 1363, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 31, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 373, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 24, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 971, cluster = 2, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 407, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+ ])+, (18, -83, + [ (GlyphInfo {codepoint = 1363, cluster = 28, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 31, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 373, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 24, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 971, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 407, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 89, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 1363, cluster = 17, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 31, y_advance = 0, x_offset = 0, y_offset = 0})+ ])+]
.golden/shapedRuns/mixedDirectionComplexRTL.golden view
@@ -1,31 +1,17 @@-[ (0, -35, - [ (GlyphInfo {codepoint = 147, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 3, cluster = 82, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 90, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 3, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 517, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 27, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 955, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 15, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 147, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 3, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 90, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 3, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 971, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 394, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 3, cluster = 66, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})- , (GlyphInfo {codepoint = 147, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})+[ (7, -35, + [ (GlyphInfo {codepoint = 147, cluster = 65, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 64, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 90, cluster = 63, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 62, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) ])-, (212, -35, +, (51, -35, [ (GlyphInfo {codepoint = 3, cluster = 61, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 147, cluster = 60, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 59, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 90, cluster = 58, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 57, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) ])-, (264, -35, +, (103, -35, [ (GlyphInfo {codepoint = 26, cluster = 48, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 11, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 27, cluster = 49, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 50, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})@@ -36,7 +22,7 @@ , (GlyphInfo {codepoint = 27, cluster = 55, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 18, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 26, cluster = 56, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 11, y_advance = 0, x_offset = 0, y_offset = 0}) ])-, (374, -35, +, (213, -35, [ (GlyphInfo {codepoint = 3, cluster = 47, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 147, cluster = 46, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 45, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})@@ -57,14 +43,14 @@ , (GlyphInfo {codepoint = 90, cluster = 26, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 25, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) ])-, (581, -35, +, (420, -35, [ (GlyphInfo {codepoint = 3, cluster = 24, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 147, cluster = 23, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 22, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 90, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 20, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) ])-, (633, -35, +, (472, -35, [ (GlyphInfo {codepoint = 4, cluster = 11, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 17, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 6, cluster = 12, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})@@ -75,10 +61,25 @@ , (GlyphInfo {codepoint = 6, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 4, cluster = 19, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 17, y_advance = 0, x_offset = 0, y_offset = 0}) ])-, (757, -35, +, (596, -35, [ (GlyphInfo {codepoint = 3, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 147, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 3, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) , (GlyphInfo {codepoint = 90, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})+ ])+, (480, -83, + [ (GlyphInfo {codepoint = 147, cluster = 83, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 82, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 90, cluster = 81, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 80, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 517, cluster = 78, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 27, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 955, cluster = 76, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 15, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 75, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 147, cluster = 74, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 19, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 73, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 90, cluster = 72, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 9, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 3, cluster = 71, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 971, cluster = 69, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 14, y_advance = 0, x_offset = 0, y_offset = 0})+ , (GlyphInfo {codepoint = 394, cluster = 67, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False}, GlyphPos {x_advance = 8, y_advance = 0, x_offset = 0, y_offset = 0}) ]) ]
CHANGELOG.md view
@@ -1,5 +1,38 @@ # Revision history for Balkón +## 1.2.0.0 -- 2023-06-28++* Added options for horizontal paragraph alignment:+ start, end, left, right, centre.++ * For backwards compatibility, left alignment remains the default.+ Consider updating your code to use start alignment instead.++* Added option to prevent making boxes invisible when they contain no glyphs+ and no forced (hard) line breaks.++* Added `fragmentContentRect` to provide a popular (though unstandardised)+ way of determining the content area of inline elements.++* Added function `paragraphSafeWidth` to help calculating max-content width+ for CSS.++* Trimmed white space at the beginning and end of lines may now generate+ fragments with zero glyphs, to more closely match CSS behaviour.+ These fragments may affect line height and/or the start edge of boxes.++* Text will now overflow the end edge of the paragraph according to the+ text direction of the root box, instead of always overflowing the right edge.++* Fixed a bug where only the height of the shortest fragment on a line+ would be considered when positioning the following line.++* Removed `paragraphLineHeight` from the rich text interface+ after it was included by mistake.+ Rich text needs to use `textLineHeight` instead.++* Exposed functions for calculating rectangle unions.+ ## 1.1.0.0 -- 2023-05-31 * Updated support for bidirectional text:
balkon.cabal view
@@ -14,7 +14,7 @@ -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change-version: 1.1.0.0+version: 1.2.0.0 stability: experimental @@ -114,7 +114,9 @@ Data.Text.ParagraphLayout.Internal.LineHeight, Data.Text.ParagraphLayout.Internal.LinePagination, Data.Text.ParagraphLayout.Internal.Paginable,+ Data.Text.ParagraphLayout.Internal.ParagraphAlignment, Data.Text.ParagraphLayout.Internal.ParagraphConstruction,+ Data.Text.ParagraphLayout.Internal.ParagraphLine, Data.Text.ParagraphLayout.Internal.ParagraphOptions, Data.Text.ParagraphLayout.Internal.Plain, Data.Text.ParagraphLayout.Internal.Plain.Paragraph,@@ -136,12 +138,13 @@ -- Modules used purely internally and not in any tests. other-modules: Data.Text.ParagraphLayout.Internal.Layout,+ Data.Text.ParagraphLayout.Internal.LineNumbers, Data.Text.ParagraphLayout.Internal.ParagraphExtents,- Data.Text.ParagraphLayout.Internal.ParagraphLine, Data.Text.ParagraphLayout.Internal.ProtoFragment, Data.Text.ParagraphLayout.Internal.ProtoLine, Data.Text.ParagraphLayout.Internal.ProtoRun,- Data.Text.ParagraphLayout.Internal.Script+ Data.Text.ParagraphLayout.Internal.Script,+ Data.Text.ParagraphLayout.Internal.SplitList build-depends: base >=4.12 && < 4.16,
lib/Data/Text/ParagraphLayout/Rect.hs view
@@ -10,6 +10,10 @@ , y_max , y_min , y_terminus+ , union+ , unionMany+ , unionMany1+ , Bias (LL, LH, HL, HH) ) where
lib/Data/Text/ParagraphLayout/Rich.hs view
@@ -5,6 +5,14 @@ -- * Input paragraph ( Paragraph (Paragraph) , constructParagraph+ , ParagraphAlignment+ ( AlignStart+ , AlignEnd+ , AlignLeft+ , AlignRight+ , AlignCentreH+ )+ , BoxCollapse (AllowBoxCollapse, AvoidBoxCollapse) , BoxSpacing (BoxSpacingLeftRight) , LineHeight (Absolute, Normal) , ParagraphOptions@@ -12,7 +20,7 @@ -- ** Paragraph options -- | These are record selectors that can be used for reading -- as well as updating specific option fields.- , paragraphLineHeight+ , paragraphAlignment , paragraphMaxWidth -- NOTE: `paragraphFont` is only used by the legacy plain text interface, -- and is therefore not exported here.@@ -20,6 +28,8 @@ , RootNode (RootBox) , InnerNode (InlineBox, TextSequence) , Box (Box)+ , EmptyText+ , strut , BoxOptions , defaultBoxOptions , TextOptions@@ -28,6 +38,8 @@ -- | These are record selectors that can be used for reading -- as well as updating specific option fields. , boxSpacing+ , boxCollapse+ , activateBoxSpacing -- ** Text options -- | These are record selectors that can be used for reading -- as well as updating specific option fields.@@ -42,11 +54,13 @@ -- * Output layout , layoutRich , ParagraphLayout (ParagraphLayout, paragraphRect, paragraphFragments)+ , paragraphSafeWidth , Fragment ( Fragment , fragmentUserData , fragmentLine , fragmentAncestorBoxes+ , fragmentContentRect , fragmentRect , fragmentPen , fragmentGlyphs@@ -68,6 +82,7 @@ import Data.Text.ParagraphLayout.Internal.BoxOptions import Data.Text.ParagraphLayout.Internal.Fragment import Data.Text.ParagraphLayout.Internal.LineHeight+import Data.Text.ParagraphLayout.Internal.ParagraphAlignment import Data.Text.ParagraphLayout.Internal.ParagraphOptions import Data.Text.ParagraphLayout.Internal.Rich import Data.Text.ParagraphLayout.Internal.Rich.Paragraph
src/Data/Text/ParagraphLayout/Internal/BiDiLevels.hs view
@@ -2,6 +2,8 @@ ( Level , TextLevels (TextLevels) , WithLevel+ , baseLevel+ , directionLevel , dropLevels , firstStrongDirection , headLevel@@ -27,22 +29,28 @@ class WithLevel a where level :: a -> Level --- | BiDi levels for each character from a given input text.+-- | BiDi levels for each character from a given input text,+-- plus the base level (for safe handling of empty text runs). -- -- This wrapper is meant to ease the transition to a different internal -- representation, if required when integrating with the ICU.-newtype TextLevels = TextLevels [Level]+data TextLevels = TextLevels [Level] Level deriving (Eq, Show) headLevel :: TextLevels -> Level-headLevel (TextLevels xs) = head xs+headLevel (TextLevels xs base) = case xs of+ [] -> base+ (x : _) -> x tailLevels :: TextLevels -> TextLevels-tailLevels (TextLevels xs) = TextLevels (tail xs)+tailLevels (TextLevels xs base) = TextLevels (tail xs) base dropLevels :: Int -> TextLevels -> TextLevels-dropLevels n (TextLevels xs) = TextLevels (drop n xs)+dropLevels n (TextLevels xs base) = TextLevels (drop n xs) base +baseLevel :: TextLevels -> Level+baseLevel (TextLevels _ base) = base+ -- | Determine the BiDi level of each character in the input text -- using a simplified algorithm with the following main limitations: --@@ -56,25 +64,26 @@ -- -- TODO: Use Haskell bindings to the ICU BiDi implementation once available. textLevels :: Direction -> Text -> TextLevels-textLevels baseDir txt = TextLevels $ textLevels' baseLevel baseLevel 0 txt+textLevels baseDir txt =+ TextLevels (textLevels' base base 0 txt) base where- baseLevel = directionLevel 0 baseDir+ base = directionLevel 0 baseDir -- | Determine the BiDi level of each character in the input text -- using a simplified algorithm. textLevels' :: Level -> Level -> Int -> Text -> [Level]-textLevels' baseLevel previousLevel neutrals txt = case uncons txt of- Just (char, rest) -> case charLevel baseLevel char of+textLevels' base previousLevel neutrals txt = case uncons txt of+ Just (char, rest) -> case charLevel base char of Just currentLevel ->- replicate neutrals (mergeLevel baseLevel previousLevel currentLevel)+ replicate neutrals (mergeLevel base previousLevel currentLevel) ++ currentLevel :- textLevels' baseLevel currentLevel 0 rest+ textLevels' base currentLevel 0 rest Nothing ->- textLevels' baseLevel previousLevel (neutrals + 1) rest+ textLevels' base previousLevel (neutrals + 1) rest Nothing ->- replicate neutrals baseLevel+ replicate neutrals base -- | Determine the level of a neutral character based on its surrounding levels. mergeLevel :: Level -> Level -> Level -> Level@@ -94,12 +103,12 @@ -- | Determine the BiDi level of one character -- using a simplified algorithm. charLevel :: Level -> Char -> Maybe Level-charLevel baseLevel c = case simpleType c of- StrongLTR -> Just $ directionLevel baseLevel DirLTR- StrongRTL -> Just $ directionLevel baseLevel DirRTL- Number -> Just $ directionLevel (baseLevel + 1) DirLTR+charLevel base c = case simpleType c of+ StrongLTR -> Just $ directionLevel base DirLTR+ StrongRTL -> Just $ directionLevel base DirRTL+ Number -> Just $ directionLevel (base + 1) DirLTR Neutral -> Nothing- Reset -> Just baseLevel+ Reset -> Just base -- | Reduce the character's BiDi class into a simpler category -- for the purposes of the simplified algorithm.
src/Data/Text/ParagraphLayout/Internal/BoxOptions.hs view
@@ -1,6 +1,8 @@ module Data.Text.ParagraphLayout.Internal.BoxOptions- ( BoxOptions (..)+ ( BoxCollapse (..)+ , BoxOptions (..) , BoxSpacing (..)+ , activateBoxSpacing , defaultBoxOptions ) where@@ -20,7 +22,16 @@ -- -- This can be used to reserve space for a left margin, border, -- and/or padding.+ --+ -- In order to get CSS-compliant behaviour, consider using+ -- `activateBoxSpacing` instead. + , boxCollapse :: BoxCollapse+ -- ^ Determines how this box affects the height of a line that would+ -- otherwise be empty.++ -- TODO: textVerticalAlign+ } deriving (Eq) @@ -45,8 +56,56 @@ deriving (Eq, Show, Read) +-- | Determines how an inline box affects the height of a line that would+-- otherwise be empty.+--+-- Note that for this setting to have any effect, the box must be the ancestor+-- of at least one (possibly empty) text sequence, so that it can generate+-- a `Data.Text.ParagraphLayout.Rich.Fragment`.+--+-- For CSS-compliant behaviour:+--+-- - Ensure that empty boxes contain empty text sequences as mentioned above.+-- This can be achieved using the `Data.Text.ParagraphLayout.Rich.strut`+-- function.+--+-- - Set `AllowBoxCollapse` for boxes with zero margins, padding,+-- and borders.+--+-- - Set `AvoidBoxCollapse` for boxes with non-zero margins, padding,+-- or borders.+--+-- Note that `BoxSpacing` may contain zero values even when calculated from+-- non-zero CSS values, because of rounding to integer values and/or because+-- of adding together positive and negative values that cancel out. You should+-- therefore compare the individual computed values for margins, padding, and+-- borders with zero, and set `boxCollapse` to `AllowBoxCollapse` if and only+-- if all these values are equal to zero.+data BoxCollapse++ = AllowBoxCollapse+ -- ^ The box should disappear when possible to make empty lines invisible.++ | AvoidBoxCollapse+ -- ^ The box should be preserved when possible, making lines visible+ -- even when they would otherwise be empty.++ deriving (Eq, Read, Show)+ -- | `BoxOptions` with default values. defaultBoxOptions :: BoxOptions defaultBoxOptions = BoxOptions { boxSpacing = BoxSpacingLeftRight 0 0+ , boxCollapse = AllowBoxCollapse+ }++-- | Shorthand for updating `boxSpacing` and setting `boxCollapse`+-- to `AvoidBoxCollapse`.+--+-- Can be used to activate CSS-compliant rendering of empty boxes whose+-- spacing is calculated from non-zero values.+activateBoxSpacing :: BoxSpacing -> BoxOptions -> BoxOptions+activateBoxSpacing spacing boxOptions = boxOptions+ { boxSpacing = spacing+ , boxCollapse = AvoidBoxCollapse }
src/Data/Text/ParagraphLayout/Internal/Break.hs view
@@ -8,6 +8,7 @@ module Data.Text.ParagraphLayout.Internal.Break ( LineBreak (..) , locale+ , breaksAsc , breaksDesc , subOffsetsDesc )@@ -19,7 +20,9 @@ ( Break , Breaker , LocaleName (Locale)+ , breaks , breaksRight+ , brkBreak , brkPrefix , brkStatus )@@ -49,6 +52,16 @@ -- This filter is here just to stop syntactically incorrect input. clean = takeWhile (`elem` ['A' .. 'Z'] ++ ['a' .. 'z'] ++ "_-") +-- | List of all breaks in the given text, with offsets in ascending order,+-- including the status of the break if applicable.+--+-- Excludes the start of the text (with offset 0).+--+-- Includes the end of the text (with offset equal to the text length)+-- as the last list item.+breaksAsc :: Breaker a -> Text -> [(Int, a)]+breaksAsc breaker input = map brkEndOffsetStatus $ breaks breaker input+ -- | List of all breaks in the given text, with offsets in descending order, -- including the status of the break if applicable. --@@ -61,11 +74,20 @@ brkStartOffsetStatus :: Break a -> (Int, a) brkStartOffsetStatus brk = (brkStartOffset brk, brkStatus brk) +brkEndOffsetStatus :: Break a -> (Int, a)+brkEndOffsetStatus brk = (brkEndOffset brk, brkStatus brk)+ -- | The ICU library returns "breaks" as slices of text with two boundaries. -- This gives the smaller of the two distances from the start of the text -- to the boundaries of the break. brkStartOffset :: Break a -> Int brkStartOffset brk = lengthWord8 (brkPrefix brk)++-- | The ICU library returns "breaks" as slices of text with two boundaries.+-- This gives the larger of the two distances from the start of the text+-- to the boundaries of the break.+brkEndOffset :: Break a -> Int+brkEndOffset brk = lengthWord8 (brkPrefix brk) + lengthWord8 (brkBreak brk) -- | Given a list of offsets into a text in descending order, produce a list of -- corresponding offsets into a slice of the text starting at a given offset.
src/Data/Text/ParagraphLayout/Internal/Fragment.hs view
@@ -3,6 +3,7 @@ , ShapedRun , fragmentSpacedRect , shapedRun+ , shiftFragment ) where @@ -36,6 +37,15 @@ -- (starting from the nearest ancestor and continuing upwards through the -- tree, up to but excluding the root) and the spacing required by them. + , fragmentContentRect :: Rect Int32+ -- ^ Physical position of the fragment within the paragraph, calculated+ -- using all glyph advances in this fragment and the used font's ascent+ -- and descent metrics.+ --+ -- This is commonly used as the /content area/ of inline elements in+ -- web browsers, although this behaviour is not specified in CSS 2+ -- nor in CSS Inline Layout Module Level 3.+ , fragmentRect :: Rect Int32 -- ^ Physical position of the fragment within the paragraph, calculated -- using all glyph advances in this fragment and the calculated line height.@@ -52,7 +62,10 @@ -- -- The origin coordinates are relative to the paragraph. --- -- This is the CSS equivalent of /content box/, before adding box spacing.+ -- The vertical extent of this rectangle is the equivalent of+ -- /layout bounds/ defined by CSS.+ --+ -- Box spacing is not included. , fragmentPen :: (Int32, Int32) -- ^ Coordinates of the initial pen position, from which the first glyph@@ -95,4 +108,15 @@ y = y_origin r + py g = fragmentGlyphs f (px, py) = fragmentPen f+ r = fragmentRect f++-- | Add @dx@ and @dy@ to the fragment's `x_origin` and `y_origin`,+-- respectively.+shiftFragment :: Int32 -> Int32 -> Fragment d -> Fragment d+shiftFragment dx dy f = f'+ where+ f' = f { fragmentContentRect = cr', fragmentRect = r' }+ cr' = cr { x_origin = x_origin r + dx, y_origin = y_origin r + dy }+ cr = fragmentContentRect f+ r' = r { x_origin = x_origin r + dx, y_origin = y_origin r + dy } r = fragmentRect f
src/Data/Text/ParagraphLayout/Internal/Layout.hs view
@@ -10,12 +10,12 @@ import Data.List (mapAccumL) import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty, (<|)) import qualified Data.List.NonEmpty as NonEmpty-import Data.Maybe (catMaybes, fromMaybe)+import Data.Maybe (fromMaybe) import Data.Text.Foreign (lengthWord8) import Data.Text.Glyphize ( Buffer (..) , ContentType (ContentTypeUnicode)- , Direction (DirLTR, DirRTL)+ , Direction (DirLTR, DirRTL, DirTTB, DirBTT) , FontExtents (..) , GlyphInfo , GlyphPos@@ -32,6 +32,7 @@ import Data.Text.ParagraphLayout.Internal.Break import Data.Text.ParagraphLayout.Internal.Fragment import Data.Text.ParagraphLayout.Internal.LineHeight+import Data.Text.ParagraphLayout.Internal.ParagraphAlignment import Data.Text.ParagraphLayout.Internal.ParagraphExtents import qualified Data.Text.ParagraphLayout.Internal.ProtoFragment as PF import qualified Data.Text.ParagraphLayout.Internal.ProtoLine as PL@@ -39,6 +40,7 @@ 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.SplitList import Data.Text.ParagraphLayout.Internal.TextContainer import Data.Text.ParagraphLayout.Internal.TextOptions import Data.Text.ParagraphLayout.Internal.WithSpan@@ -54,32 +56,34 @@ -- necessary to fit within the requested line width. -- -- The output is a flat list of fragments positioned in both dimensions.-layoutAndAlignLines :: Int32 -> NonEmpty (WithSpan d Run) ->- [FragmentWithSpan d]-layoutAndAlignLines maxWidth runs = frags+layoutAndAlignLines+ :: Direction+ -> ParagraphAlignment+ -> Int32+ -> NonEmpty (WithSpan d Run)+ -> [FragmentWithSpan d]+layoutAndAlignLines dir align maxWidth runs = frags where- frags = concatMap NonEmpty.toList fragsInLines- (_, fragsInLines) = mapAccumL positionLineH originY numberedLines+ frags = concatMap toList fragsInLines+ (_, fragsInLines) = mapAccumL positionLine originY numberedLines+ positionLine = positionLineH dir align maxWidth numberedLines = zip [1 ..] canonicalLines- canonicalLines = fmap reorderProtoFragments logicalLines- logicalLines = nonEmptyItems $ layoutLines maxWidth [] runs+ canonicalLines = fmap reorderProtoFragments visibleLines+ visibleLines = filter PL.visible logicalLines+ logicalLines = toList $ layoutLines maxWidth [] runs originY = paragraphOriginY 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 -> [RB.ResolvedBox d] -> NonEmpty (WithSpan d Run) ->- NonEmpty (PL.ProtoLine [] d)+ NonEmpty (PL.ProtoLine NonEmpty d) layoutLines maxWidth openBoxes runs = case nonEmpty rest of -- Everything fits. We are done. Nothing -> fitting :| []@@ -87,12 +91,9 @@ Just runs' -> fitting <| layoutLines maxWidth openBoxes' runs' where (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).+ -- Update the list of open boxes using the logically last run+ -- on this line.+ openBoxes' = lastSpanBoxes $ PL.protoFragments fitting -- | Position all the given horizontal fragments on the same line, -- using @originY@ as its top edge, and return the bottom edge for continuation.@@ -101,16 +102,58 @@ -- @vertical-align: top@ in CSS. -- -- TODO: For rich text, allow other types of vertical alignment.-positionLineH :: Int32 -> (Int, PL.ProtoLine NonEmpty d) ->- (Int32, NonEmpty (FragmentWithSpan d))-positionLineH originY (num, pl) = (nextY, frags)+positionLineH+ :: Direction+ -> ParagraphAlignment+ -> Int32+ -> Int32+ -> (Int, PL.ProtoLine NonEmpty d)+ -> (Int32, NonEmpty (FragmentWithSpan d))+positionLineH dir align maxWidth originY (num, pl) = (nextY, frags) where- nextY = maximum $ fmap y_min rects+ nextY = minimum $ fmap y_min rects rects = fmap (\ (WithSpan _ r) -> fragmentRect r) frags (_, frags) = mapAccumL (positionFragmentH num originY) originX wpfs wpfs = PL.applyBoxes pl- originX = paragraphOriginX+ originX = paragraphOriginX + if lineWidth > maxWidth+ then overflowingLineOffset dir (lineWidth - maxWidth)+ else fittingLineOffset align dir (maxWidth - lineWidth)+ lineWidth = PL.width pl +-- | Inline offset of the first fragment on a line that overflows.+overflowingLineOffset :: Direction -> Int32 -> Int32+overflowingLineOffset DirLTR _ = 0+overflowingLineOffset DirTTB _ = 0+overflowingLineOffset DirRTL excess = -excess+-- TODO: Check if the sign needs to be flipped for vertical text.+overflowingLineOffset DirBTT excess = -excess++-- | Inline offset of the first fragment on a line with extra blank space.+fittingLineOffset :: ParagraphAlignment -> Direction -> Int32 -> Int32+fittingLineOffset AlignLeft _ = leftAlignOffset+fittingLineOffset AlignRight _ = rightAlignOffset+fittingLineOffset AlignCentreH _ = centreAlignOffset+fittingLineOffset AlignStart DirLTR = leftAlignOffset+fittingLineOffset AlignEnd DirLTR = rightAlignOffset+fittingLineOffset AlignStart DirRTL = rightAlignOffset+fittingLineOffset AlignEnd DirRTL = leftAlignOffset+-- For completeness, treat vertical directions as horizontal directions+-- rotated 90° clockwise, thus left becomes top and right becomes bottom.+-- TODO: Verify this when vertical text is implemented.+fittingLineOffset AlignStart DirTTB = leftAlignOffset+fittingLineOffset AlignEnd DirTTB = rightAlignOffset+fittingLineOffset AlignStart DirBTT = rightAlignOffset+fittingLineOffset AlignEnd DirBTT = leftAlignOffset++leftAlignOffset :: Int32 -> Int32+leftAlignOffset _ = 0++rightAlignOffset :: Int32 -> Int32+rightAlignOffset slack = slack++centreAlignOffset :: Int32 -> Int32+centreAlignOffset slack = slack `div` 2+ -- | 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.@@ -124,9 +167,19 @@ contentWidth = PF.advance pf leftSpacing = totalLeftSpacing bs rightSpacing = totalRightSpacing bs- frag = Fragment userData line bs rect (penX, penY) (PF.glyphs pf)+ frag = Fragment+ { fragmentUserData = userData+ , fragmentLine = line+ , fragmentAncestorBoxes = bs+ , fragmentContentRect = contentRect+ , fragmentRect = rect+ , fragmentPen = (penX, penY)+ , fragmentGlyphs = (PF.glyphs pf)+ } userData = RS.spanUserData rs bs = ancestorBoxes lbs rbs rs+ contentRect = Rect contentX contentY contentWidth (-normalLineHeight)+ contentY = originY + penY + ascent rect = Rect contentX originY contentWidth (-lineHeight) penX = 0 penY = descent + leading `div` 2 - lineHeight@@ -183,7 +236,7 @@ :: Int32 -> [RB.ResolvedBox d] -> NonEmpty (WithSpan d Run)- -> (PL.ProtoLine [] d, [WithSpan d Run])+ -> (PL.ProtoLine NonEmpty d, [WithSpan d Run]) layoutAndWrapRunsH maxWidth prevOpenBoxes runs = NonEmpty.head $ validProtoLines where validProtoLines = dropWhile1 tooLong layouts@@ -202,9 +255,9 @@ -- to determine `PL.nextOpenBoxes`. protoLine :: [RB.ResolvedBox d]- -> [ProtoFragmentWithSpan d]+ -> NonEmpty (ProtoFragmentWithSpan d) -> [WithSpan d Run]- -> PL.ProtoLine [] d+ -> PL.ProtoLine NonEmpty d protoLine prev pfs rest = PL.ProtoLine pfs prev next where next = [] `fromMaybe` firstSpanBoxes rest@@ -214,10 +267,9 @@ [] -> 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+lastSpanBoxes :: NonEmpty (WithSpan d a) -> [RB.ResolvedBox d]+lastSpanBoxes xs = case NonEmpty.last xs of+ WithSpan rs _ -> 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@@ -228,25 +280,39 @@ -- output list will contain a run of zero characters. This can be used to -- correctly size an empty line. --+-- If there is a hard line break in the input, the run containing it will have+-- its `runHardBreak` set to `True`.+-- -- If there is no hard line break in the input, the first output list will -- contain the whole input, and the second output list will be empty.-hardSplit :: NonEmpty (WithSpan d Run) -> ([WithSpan d Run], [WithSpan d Run])-hardSplit runs = allowFstEmpty $ trimFst $ NonEmpty.last $ splits+hardSplit :: NonEmpty (WithSpan d Run) ->+ (NonEmpty (WithSpan d Run), [WithSpan d Run])+hardSplit runs = case reverse hSplits of+ [] -> noSplit+ (splitRuns : _) -> forcedSplit splitRuns where- trimFst (runs1, runs2) = (trim runs1, runs2)+ noSplit = (trim runs, [])+ forcedSplit (runs1, runs2) = (markHard $ trim runs1, runs2)+ markHard = mapLast markHard'+ markHard' (WithSpan rs x) = WithSpan rs x { runHardBreak = True } trim- = trimTextsStartPreserve isStartSpace- . trimTextsEndPreserve isEndSpace- . trimTextsEndPreserve isNewline+ = dropWhileStartCascade isStartSpace+ . dropWhileEndCascade isEndSpace+ . dropWhileEndCascade isNewline -- TODO: Consider optimising. -- We do not need to look for any line breaks further than the -- shortest hard break.- splits = noSplit :| map allowSndEmpty hSplits- noSplit = (runs, [])- hSplits = -- from longest to shortest+ hSplits = nonEmptyFsts $+ -- from longest to shortest splitTextsBy (map fst . filter isHard . runLineBreaks) runs isHard (_, status) = status == BreakStatus.Hard +-- | Apply a function to the last element of the non-empty list.+mapLast :: (a -> a) -> NonEmpty a -> NonEmpty a+mapLast f xs = case NonEmpty.uncons xs of+ (x, Nothing) -> f x :| []+ (x, Just rest) -> NonEmpty.cons x $ mapLast f rest+ -- | Treat a list of runs as a contiguous sequence, -- and find all possible ways to split them into two non-empty lists, -- using soft line break opportunities (typically after words) and then@@ -260,23 +326,21 @@ -- closer to the start of the list are preferred for line breaking, but without -- considering overflows. softSplits :: NonEmpty (WithSpan d Run) ->- [([WithSpan d Run], [WithSpan d Run])]+ [(NonEmpty (WithSpan d Run), [WithSpan d Run])] softSplits runs = map (allowSndEmpty . trimFst) splits where trimFst (runs1, runs2) = (trim runs1, runs2)- trim = trimTextsStart isStartSpace . trimTextsEnd isEndSpace+ trim+ = dropWhileStartCascade isStartSpace+ . dropWhileEndCascade isEndSpace splits = lSplits ++ cSplits- lSplits = splitTextsBy (map fst . runLineBreaks) runs+ lSplits = nonEmptyPairs $+ splitTextsBy (map fst . runLineBreaks) runs -- TODO: Consider optimising. -- We do not need to look for character breaks further than the -- shortest line break.- cSplits = splitTextsBy (map fst . runCharacterBreaks) runs--allowFstEmpty :: (NonEmpty a, b) -> ([a], b)-allowFstEmpty (a, b) = (NonEmpty.toList a, b)--allowSndEmpty :: (a, NonEmpty b) -> (a, [b])-allowSndEmpty (a, b) = (a, NonEmpty.toList b)+ cSplits = nonEmptyPairs $+ splitTextsBy (map fst . runCharacterBreaks) runs -- | The suffix remaining after removing the longest prefix of the list for -- which the predicate holds, except always including at least the last element@@ -290,17 +354,18 @@ -- | Calculate layout for multiple horizontal runs on the same line, without -- any breaking.-layoutRunsH :: [WithSpan d Run] -> [ProtoFragmentWithSpan d]-layoutRunsH runs = map layoutRunH runs+layoutRunsH :: Functor f => f (WithSpan d Run) -> f (ProtoFragmentWithSpan d)+layoutRunsH runs = fmap layoutRunH runs -- | Calculate layout for the given horizontal run and attach extra information. layoutRunH :: WithSpan d Run -> ProtoFragmentWithSpan d layoutRunH (WithSpan rs run) = WithSpan rs pf where- pf = PF.protoFragmentH dir lvl glyphs+ pf = PF.protoFragmentH dir lvl glyphs hard glyphs = shapeRun (WithSpan rs run) dir = runDirection run lvl = runLevel run+ hard = runHardBreak run -- | Calculate layout for the given run independently of its position. shapeRun :: WithSpan d Run -> [(GlyphInfo, GlyphPos)]@@ -341,7 +406,7 @@ runBreaksFromSpan run spanBreaks = dropWhile (not . valid) $ subOffsetsDesc (runOffsetInSpan run) spanBreaks where- valid (off, _) = off < runLength+ valid (off, _) = off <= runLength runLength = lengthWord8 $ getText run -- | Predicate for characters that can be potentially removed from the
+ src/Data/Text/ParagraphLayout/Internal/LineNumbers.hs view
@@ -0,0 +1,23 @@+module Data.Text.ParagraphLayout.Internal.LineNumbers+ ( LineNumbers+ , lineNumbers+ , lineNumbersWithDuplication+ )+where++import qualified Data.List.NonEmpty as NonEmpty++-- | Data types that contain numbered lines.+class LineNumbers ml where++ -- | A list of all line numbers in ascending order,+ -- with possible duplicates.+ lineNumbersWithDuplication :: ml -> [Int]++-- | A list of all unique line numbers, in ascending order.+lineNumbers :: (LineNumbers ml) => ml -> [Int]+lineNumbers ml = dedupe $ lineNumbersWithDuplication ml++-- | Remove duplicates from a sorted list.+dedupe :: Eq a => [a] -> [a]+dedupe xs = map NonEmpty.head $ NonEmpty.group xs
src/Data/Text/ParagraphLayout/Internal/Paginable.hs view
@@ -8,6 +8,7 @@ import Data.Int (Int32) +import Data.Text.ParagraphLayout.Internal.LineNumbers import Data.Text.ParagraphLayout.Internal.LinePagination import Data.Text.ParagraphLayout.Internal.ParagraphLine import qualified Data.Text.ParagraphLayout.Internal.Plain.ParagraphLayout@@ -86,7 +87,7 @@ instance Paginable (Rich.ParagraphLayout d) where paginate = paginateLayout -paginateLayout :: (Line a, GenericLayout a) =>+paginateLayout :: (Line a, LineNumbers a, GenericLayout a) => PageOptions -> a -> (PageContinuity, a, Maybe a) paginateLayout opts pl = case paginate opts (cutLines pl) of
+ src/Data/Text/ParagraphLayout/Internal/ParagraphAlignment.hs view
@@ -0,0 +1,40 @@+module Data.Text.ParagraphLayout.Internal.ParagraphAlignment+ ( ParagraphAlignment (..)+ )+where++-- | Determines how the contents of the paragraph should be aligned+-- horizontally, that is, how should fragments be stacked inside each line+-- when there is space available.+--+-- This has no effect on lines with overflowing content.+data ParagraphAlignment++ = AlignStart+ -- ^ Behave like `AlignLeft` when the base direction of the paragraph+ -- is LTR, and like `AlignRight` when the base direction is RTL.++ | AlignEnd+ -- ^ Behave like `AlignLeft` when the base direction of the paragraph+ -- is RTL, and like `AlignRight` when the base direction is LTR.++ | AlignLeft+ -- ^ Stack fragments to the left edge of each line,+ -- leaving free space on the right side.+ --+ -- The leftmost fragment on each non-overflowing line will have its+ -- `Data.Text.ParagraphLayout.Rect.x_min` equal to @0@.++ | AlignRight+ -- ^ Stack fragments to the right edge of each line,+ -- leaving free space on the left side.+ --+ -- The rightmost fragment on each non-overflowing line will have its+ -- `Data.Text.ParagraphLayout.Rect.x_max` equal to+ -- `Data.Text.ParagraphLayout.Rich.paragraphMaxWidth`.++ | AlignCentreH+ -- ^ Stack fragments to the horizontal centre of each line,+ -- leaving free space split evenly between each side.++ deriving (Eq, Read, Show)
src/Data/Text/ParagraphLayout/Internal/ParagraphExtents.hs view
@@ -6,14 +6,20 @@ ) where +import Data.Maybe (fromMaybe)+ import Data.Text.ParagraphLayout.Internal.Rect +-- | X coordinate used as the left edge of every paragraph. paragraphOriginX :: (Num a) => a paragraphOriginX = 0 +-- | Y coordinate used as the top edge of every paragraph. paragraphOriginY :: (Num a) => a paragraphOriginY = 0 +-- | A `Rect` located at the top left corner of a paragraph,+-- with zero size in each dimension. emptyRect :: (Num a) => Rect a emptyRect = Rect { x_origin = paragraphOriginX@@ -22,5 +28,7 @@ , y_size = 0 } -containRects :: (Ord a, Num a) => [Rect a] -> Rect a-containRects = foldr union emptyRect+-- | Smallest rectangle containing the given rectangles,+-- or `emptyRect` if none are given.+containRects :: (Num a, Ord a) => [Rect a] -> Rect a+containRects rects = fromMaybe emptyRect $ unionMany LH rects
src/Data/Text/ParagraphLayout/Internal/ParagraphLine.hs view
@@ -3,13 +3,14 @@ ( GenericLayout , cutLines , mergeLines+ , forceLeftAlign ) where import Data.Int (Int32)-import qualified Data.List.NonEmpty as NonEmpty import Data.Text.ParagraphLayout.Internal.Fragment+import Data.Text.ParagraphLayout.Internal.LineNumbers import qualified Data.Text.ParagraphLayout.Internal.Plain.ParagraphLayout as P import qualified Data.Text.ParagraphLayout.Internal.Rich.ParagraphLayout as R import Data.Text.ParagraphLayout.Internal.Rect@@ -22,17 +23,20 @@ -- | Rectangle surrounding the layout, to be used for appending. rect :: pl -> Rect Int32 - -- | Actual distance between the paragraph origin and the nearest fragment.+ -- | Actual distance between the paragraph origin and the nearest fragment+ -- on the Y axis. topDistance :: pl -> Int32 - -- | A list of all unique line numbers that have laid out content.- lineNumbers :: pl -> [Int]+ -- | Actual distance between the paragraph origin and the nearest fragment+ -- on the X axis.+ leftDistance :: pl -> Int32 -- | Keep only fragments with the given line number. limitFragments :: Int -> pl -> pl - -- | Add @dy@ to each fragment's `y_origin`.- shiftFragments :: Int32 -> pl -> pl+ -- | Add @dx@ and @dy@ to each fragment's `x_origin` and `y_origin`,+ -- respectively.+ shiftFragments :: Int32 -> Int32 -> pl -> pl -- | Combine fragments from two layouts into one, -- without any adjustment of coordinates.@@ -42,22 +46,22 @@ empty = P.emptyParagraphLayout rect = P.paragraphRect topDistance pl = topFragmentOrigin $ P.paragraphFragments pl- lineNumbers pl = uniqueFragmentLines $ P.paragraphFragments pl+ leftDistance pl = leftmostFragmentOrigin $ P.paragraphFragments pl limitFragments n = P.filterFragments (fragmentIsOnLine n)- shiftFragments dy = P.mapFragments (shiftFragment dy)+ shiftFragments dx dy = P.mapFragments (shiftFragment dx dy) appendFragments = P.appendFragments instance GenericLayout (R.ParagraphLayout d) where empty = R.emptyParagraphLayout rect = R.paragraphRect topDistance pl = topFragmentOrigin $ R.paragraphFragments pl- lineNumbers pl = uniqueFragmentLines $ R.paragraphFragments pl+ leftDistance pl = leftmostFragmentOrigin $ R.paragraphFragments pl limitFragments n = R.filterFragments (fragmentIsOnLine n)- shiftFragments dy = R.mapFragments (shiftFragment dy)+ shiftFragments dx dy = R.mapFragments (shiftFragment dx dy) appendFragments = R.appendFragments -- | Split the given paragraph layout into single-line layouts.-cutLines :: GenericLayout pl => pl -> [pl]+cutLines :: (GenericLayout pl, LineNumbers pl) => pl -> [pl] cutLines pl = map (\ n -> cutLine n pl) (lineNumbers pl) -- | Reduce the given paragraph layout to fragments with the given line number.@@ -66,17 +70,17 @@ -- | Add a constant to each fragment's `y_origin` so that their maximum is zero. trimTop :: GenericLayout pl => pl -> pl-trimTop pl = shiftFragments (-topDistance pl) pl+trimTop pl = shiftFragments 0 (-topDistance pl) pl +-- | Add a constant to each fragment's `x_origin` so that their minimum is zero.+trimLeft :: GenericLayout pl => pl -> pl+trimLeft pl = shiftFragments (-leftDistance pl) 0 pl+ topFragmentOrigin :: [Fragment d] -> Int32 topFragmentOrigin frags = maximum $ map (y_origin . fragmentRect) frags -uniqueFragmentLines :: [Fragment d] -> [Int]-uniqueFragmentLines frags = dedupe $ map fragmentLine frags---- | Remove duplicates from a sorted list.-dedupe :: Eq a => [a] -> [a]-dedupe xs = map NonEmpty.head $ NonEmpty.group xs+leftmostFragmentOrigin :: [Fragment d] -> Int32+leftmostFragmentOrigin frags = minimum $ map (x_origin . fragmentRect) frags -- | Put the given paragraph layouts together as a vertically contiguous -- sequence.@@ -87,15 +91,14 @@ mergeLine pl nextLine = pl' where -- Quadratic time complexity. TODO: Consider optimising.- pl' = appendFragments pl $ shiftFragments y nextLine+ pl' = appendFragments pl $ shiftFragments 0 y nextLine y = y_terminus $ rect pl -shiftFragment :: Int32 -> Fragment d -> Fragment d-shiftFragment dy f = f'- where- f' = f { fragmentRect = r' }- r' = r { y_origin = y_origin r + dy }- r = fragmentRect f- fragmentIsOnLine :: Int -> Fragment d -> Bool fragmentIsOnLine n frag = n == fragmentLine frag++-- | Rearrange fragments on each line so that they are stacked from the left.+--+-- Intended for comparing paragraph layouts of different maximum widths.+forceLeftAlign :: (GenericLayout pl, LineNumbers pl) => pl -> pl+forceLeftAlign pl = mergeLines $ map trimLeft $ cutLines pl
src/Data/Text/ParagraphLayout/Internal/ParagraphOptions.hs view
@@ -8,12 +8,17 @@ import Data.Text.Glyphize (Font, emptyFont) import Data.Text.ParagraphLayout.Internal.LineHeight+import Data.Text.ParagraphLayout.Internal.ParagraphAlignment -- | Defines options relevant to the entire paragraph. -- -- This record type is likely to be extended in the future. -- Use `defaultParagraphOptions` and update it with specific record selectors -- instead of constructing `ParagraphOptions` directly.+--+-- In order to get CSS defaults, use:+--+-- > defaultParagraphOptions { paragraphAlignment = AlignStart } data ParagraphOptions = ParagraphOptions { paragraphFont :: Font@@ -24,6 +29,9 @@ , paragraphLineHeight :: LineHeight -- ^ Preferred line height of the resulting fragments. + , paragraphAlignment :: ParagraphAlignment+ -- ^ Alignment of non-overflowing lines within the paragraph.+ , paragraphMaxWidth :: Int32 -- ^ Line width at which line breaking should occur. -- Lines will be broken at language-appropriate boundaries.@@ -34,10 +42,14 @@ } deriving (Eq) --- | `ParagraphOptions` with default values.+-- | `ParagraphOptions` with backwards-compatible values.+--+-- Note that this sets `paragraphAlignment` to `AlignLeft`,+-- whereas the CSS default should be `AlignStart`. defaultParagraphOptions :: ParagraphOptions defaultParagraphOptions = ParagraphOptions { paragraphFont = emptyFont , paragraphLineHeight = Normal+ , paragraphAlignment = AlignLeft , paragraphMaxWidth = maxBound }
src/Data/Text/ParagraphLayout/Internal/Plain/ParagraphLayout.hs view
@@ -13,6 +13,7 @@ import Data.Int (Int32) import Data.Text.ParagraphLayout.Internal.Fragment+import Data.Text.ParagraphLayout.Internal.LineNumbers import Data.Text.ParagraphLayout.Internal.LinePagination import Data.Text.ParagraphLayout.Internal.ParagraphExtents import Data.Text.ParagraphLayout.Internal.Rect@@ -26,6 +27,9 @@ } deriving (Eq, Read, Show) +instance LineNumbers (ParagraphLayout d) where+ lineNumbersWithDuplication pl = map fragmentLine $ paragraphFragments pl+ instance Line (ParagraphLayout d) where lineHeight pl = height $ paragraphRect pl @@ -77,6 +81,8 @@ paragraphFragments :: ParagraphLayout d -> [Fragment d] paragraphFragments pl = concat $ map spanFragments $ spanLayouts pl --- | Return all shaped runs in the paragraph.+-- | Return all non-empty shaped runs in the paragraph. shapedRuns :: ParagraphLayout d -> [ShapedRun]-shapedRuns pl = map shapedRun $ paragraphFragments pl+shapedRuns pl = map shapedRun $ filter hasGlyphs $ paragraphFragments pl+ where+ hasGlyphs = not . null . fragmentGlyphs
src/Data/Text/ParagraphLayout/Internal/ProtoFragment.hs view
@@ -1,5 +1,5 @@ module Data.Text.ParagraphLayout.Internal.ProtoFragment- ( ProtoFragment (direction, advance, glyphs)+ ( ProtoFragment (direction, advance, glyphs, hardBreak) , protoFragmentH ) where@@ -20,13 +20,15 @@ -- ^ Total advance of glyphs in this fragment, -- depending on the text direction. , glyphs :: [(GlyphInfo, GlyphPos)]+ , hardBreak :: Bool+ -- ^ Marks fragment that ends with a forced line break. } -- | Construct a `ProtoFragment`, automatically calculating the total advance -- for a horizontal text direction.-protoFragmentH :: Direction -> BiDi.Level -> [(GlyphInfo, GlyphPos)] ->+protoFragmentH :: Direction -> BiDi.Level -> [(GlyphInfo, GlyphPos)] -> Bool -> ProtoFragment-protoFragmentH dir lvl gs = ProtoFragment dir lvl adv gs+protoFragmentH dir lvl gs hard = ProtoFragment dir lvl adv gs hard where adv = sum $ map (x_advance . snd) gs
src/Data/Text/ParagraphLayout/Internal/ProtoLine.hs view
@@ -1,6 +1,7 @@ module Data.Text.ParagraphLayout.Internal.ProtoLine ( ProtoLine (..) , nonEmpty+ , visible , width , applyBoxes )@@ -10,8 +11,10 @@ import Data.List.NonEmpty (NonEmpty ((:|))) import qualified Data.Text.ParagraphLayout.Internal.ApplyBoxes as Algo+import Data.Text.ParagraphLayout.Internal.BoxOptions import Data.Text.ParagraphLayout.Internal.ProtoFragment import Data.Text.ParagraphLayout.Internal.ResolvedBox+import Data.Text.ParagraphLayout.Internal.ResolvedSpan import Data.Text.ParagraphLayout.Internal.WithSpan -- | Contents of a line that have not been visually ordered or positioned yet.@@ -37,6 +40,22 @@ nonEmpty (ProtoLine [] _ _) = Nothing nonEmpty pl@(ProtoLine { protoFragments = (f : fs) }) = Just pl { protoFragments = f :| fs }++-- | `True` if this line should generate a visible line box,+-- or `False` if this line should generate an /invisible line box/+-- as defined by <https://www.w3.org/TR/css-inline-3/#invisible-line-boxes>.+visible :: Foldable f => ProtoLine f d -> Bool+visible pl = any visibleProtoFragment $ protoFragments pl++visibleProtoFragment :: WithSpan d ProtoFragment -> Bool+visibleProtoFragment (WithSpan rs pf) =+ hasGlyphs || hasHardBreak || hasNonCollapsibleBoxes+ where+ hasGlyphs = not $ null $ glyphs pf+ hasHardBreak = hardBreak pf+ hasNonCollapsibleBoxes =+ any (== AvoidBoxCollapse) $ map (boxCollapse . boxOptions) boxes+ boxes = spanBoxes rs -- | Total width of the line (content and spacing). width :: (Foldable f, Functor f) => ProtoLine f d -> Int32
src/Data/Text/ParagraphLayout/Internal/Rect.hs view
@@ -1,9 +1,12 @@ -- | Representation of an axis-aligned rectangle on a 2D plane, with one of its -- corners being a designated origin point. module Data.Text.ParagraphLayout.Internal.Rect- ( Rect (Rect, x_origin, y_origin, x_size, y_size)+ ( Bias (LL, LH, HL, HH)+ , Rect (Rect, x_origin, y_origin, x_size, y_size) , height , union+ , unionMany+ , unionMany1 , width , x_max , x_min@@ -14,6 +17,8 @@ ) where +import Data.List.NonEmpty (NonEmpty, nonEmpty)+ -- | An axis-aligned rectangle on a 2D plane. data Rect a = Rect { x_origin :: a@@ -59,17 +64,62 @@ y_max :: (Num a, Ord a) => Rect a -> a y_max r = y_origin r `max` y_terminus r --- | Calculate the smallest rectangle that completely contains the given two--- rectangles.+-- | Determines which corner of a calculated rectangle should be its origin.+data Bias+ = LL+ -- ^ Set the origin as the corner with low X and low Y coordinates.+ | LH+ -- ^ Set the origin as the corner with low X and high Y coordinates.+ | HL+ -- ^ Set the origin as the corner with high X and low Y coordinates.+ | HH+ -- ^ Set the origin as the corner with high X and high Y coordinates.++-- | The smallest rectangle completely containing the given two rectangles. ----- The origin of the resulting rectangle will be the corner with the lowest--- X coordinate and the highest Y coordinate, regardless of the origin of the--- input rectangles.-union :: (Num a, Ord a) => Rect a -> Rect a -> Rect a-union a b = Rect x_low y_high dx (-dy) where- x_low = x_min a `min` x_min b- y_low = y_min a `min` y_min b- x_high = x_max a `max` x_max b- y_high = y_max a `max` y_max b- dx = x_high - x_low- dy = y_high - y_low+-- The origin of the output rectangle will be set according to `Bias`,+-- regardless of which corners of the input rectangles are designated+-- as their origins.+--+-- Note that this operation has no identity element. A rectangle whose+-- `x_size` and/or `y_size` are zero is not considered null or neutral,+-- but effectively acts as a point, which will be contained in the union.+--+-- You can use `Nothing` as an identity element if you lift this operation+-- over the `Maybe` applicative functor:+--+-- @+-- `Control.Applicative.liftA2` (`union` bias)+-- @+union :: (Num a, Ord a) => Bias -> Rect a -> Rect a -> Rect a+union bias a b =+ case bias of+ LL -> Rect lx ly dx dy+ LH -> Rect lx hy dx (-dy)+ HL -> Rect hx ly (-dx) dy+ HH -> Rect hx hy (-dx) (-dy)+ where+ lx = x_min a `min` x_min b+ ly = y_min a `min` y_min b+ hx = x_max a `max` x_max b+ hy = y_max a `max` y_max b+ dx = hx - lx+ dy = hy - ly++-- | `Just` the `union` of all given rectangles, or `Nothing` if none are given.+unionMany :: (Num a, Ord a) => Bias -> [Rect a] -> Maybe (Rect a)+unionMany bias rects = unionMany1 bias <$> nonEmpty rects++-- | The `union` of all given rectangles, where at least one must be given.+--+-- Note that adding a default value to the input list to make it non-empty+-- will probably not do what you want, since the `union` operation has no+-- identity element.+--+-- If you need a default output value for empty inputs, consider using:+--+-- @+-- `Data.Maybe.fromMaybe` yourDefaultValue $ `unionMany` bias rects+-- @+unionMany1 :: (Num a, Ord a) => Bias -> NonEmpty (Rect a) -> Rect a+unionMany1 bias rects = foldr1 (union bias) rects
src/Data/Text/ParagraphLayout/Internal/Rich.hs view
@@ -23,14 +23,22 @@ -- | Lay out a rich text paragraph. layoutRich :: Paragraph d -> ParagraphLayout d-layoutRich p@(Paragraph _ _ _ opts) = paragraphLayout $ map unwrap frags+layoutRich p = paragraphLayout $ map unwrap frags where+ Paragraph _ _ root opts = p+ RootBox (Box _ rootTextOpts) = root unwrap (WithSpan rs frag) = frag { fragmentUserData = RS.spanUserData rs } frags = case nonEmpty wrappedRuns of- Just xs -> layoutAndAlignLines maxWidth xs+ Just xs -> layoutAndAlignLines dir align maxWidth xs Nothing -> [] wrappedRuns = spansToRunsWrapped spans+ -- TODO: To support @unicode-bidi: plaintext@ as in CSS, allow ignoring+ -- the text direction of the root box, and instead use the BiDi+ -- rules P2 and P3 to determine the base directionality, which+ -- may differ between lines.+ dir = textDirection rootTextOpts+ align = paragraphAlignment opts maxWidth = paragraphMaxWidth opts spans = resolveSpans p @@ -63,8 +71,8 @@ let lang = textLanguage textOpts -- TODO: Allow BiDi embedding/isolation for inner nodes. let pLevels = textLevels (textDirection rootTextOpts) pText- let lBreaks = paragraphBreaks breakLine pText lang- let cBreaks = paragraphBreaks breakCharacter pText lang+ let lBreaks = paragraphBreaksDesc breakLine pText lang+ let cBreaks = paragraphBreaksDesc breakCharacter pText lang -- TODO: Optimise. This has time complexity O(n*s), where n is number of -- characters and s is number of resolved spans. -- Maybe include byte offsets in the TextLevels data structure?@@ -82,6 +90,12 @@ , RS.spanCharacterBreaks = subOffsetsDesc (sStart - pStart) cBreaks } -paragraphBreaks :: (LocaleName -> Breaker a) -> Text -> String -> [(Int, a)]-paragraphBreaks breakFunc txt lang =- breaksDesc (breakFunc (locale lang LBAuto)) txt+paragraphBreaksDesc :: (LocaleName -> Breaker a) -> Text -> String -> [(Int, a)]+paragraphBreaksDesc breakFunc txt lang =+ -- Workaround: We are interested in the type of the end-of-text break+ -- (if it is hard, that line needs to be always visible),+ -- but `breaksDesc` does not provide it.+ --+ -- TODO: Consider optimising by creating a custom reimplementation+ -- of `Data.Text.ICU.breaksRight`.+ reverse $ breaksAsc (breakFunc (locale lang LBAuto)) txt
src/Data/Text/ParagraphLayout/Internal/Rich/ParagraphLayout.hs view
@@ -7,6 +7,7 @@ , paragraphLayout , paragraphOriginX , paragraphOriginY+ , paragraphSafeWidth , shapedRuns ) where@@ -14,6 +15,7 @@ import Data.Int (Int32) import Data.Text.ParagraphLayout.Internal.Fragment+import Data.Text.ParagraphLayout.Internal.LineNumbers import Data.Text.ParagraphLayout.Internal.LinePagination import Data.Text.ParagraphLayout.Internal.ParagraphExtents import Data.Text.ParagraphLayout.Internal.Rect@@ -29,6 +31,9 @@ } deriving (Eq, Read, Show) +instance LineNumbers (ParagraphLayout d) where+ lineNumbersWithDuplication pl = map fragmentLine $ paragraphFragments pl+ instance Line (ParagraphLayout d) where lineHeight pl = height $ paragraphRect pl @@ -68,3 +73,25 @@ -- | Return all shaped runs in the paragraph. shapedRuns :: ParagraphLayout d -> [ShapedRun] shapedRuns pl = map shapedRun $ paragraphFragments pl++-- | Width of the widest line, including spacing.+--+-- This is the smallest `Data.Text.ParagraphLayout.Rich.paragraphMaxWidth`+-- that will not introduce new line breaks.+--+-- When `Data.Text.ParagraphLayout.Rich.paragraphMaxWidth` is set to `maxBound`,+-- `paragraphSafeWidth` can be used to determine the @max-content@ width of the+-- paragraph for CSS.+paragraphSafeWidth :: ParagraphLayout d -> Int32+paragraphSafeWidth pl = maximum $ map (lineWidth pl) $ lineNumbers pl++lineWidth :: ParagraphLayout d -> Int -> Int32+lineWidth pl line = sum $ map fragmentWidth $ lineFragments pl line++fragmentWidth :: Fragment d -> Int32+fragmentWidth f = width $ fragmentSpacedRect f++lineFragments :: ParagraphLayout d -> Int -> [Fragment d]+lineFragments pl line = filter byLine $ paragraphFragments pl+ where+ byLine frag = line == fragmentLine frag
src/Data/Text/ParagraphLayout/Internal/Run.hs view
@@ -25,6 +25,10 @@ , runLevel :: Level , runDirection :: Direction , runScript :: Maybe ScriptCode+ , runHardBreak :: Bool+ -- ^ Marks run that ends with a forced line break.+ -- Those should prevent creation of invisible line boxes+ -- according to <https://www.w3.org/TR/css-inline-3/#invisible-line-boxes>. } deriving (Eq, Show) @@ -74,8 +78,23 @@ data Merged a = Incompatible | Merged a spanToRuns :: ResolvedSpan d -> [Run]-spanToRuns s = snd $ mapAccumL run 0 $ protoRuns zipper levels+spanToRuns s+ | Text.null (spanText s) = [emptyRun]+ | otherwise = spanToRuns' s where+ emptyRun = Run+ { runOffsetInSpan = 0+ , runText = Text.empty+ , runLevel = defaultLevel+ , runDirection = levelDirectionH defaultLevel+ , runScript = Nothing+ , runHardBreak = False+ }+ defaultLevel = baseLevel $ spanBiDiLevels s++spanToRuns' :: ResolvedSpan d -> [Run]+spanToRuns' s = snd $ mapAccumL run 0 $ protoRuns zipper levels+ where wholeText = spanText s zipper = start wholeText levels = spanBiDiLevels s@@ -87,6 +106,7 @@ , runLevel = PR.level pr , runDirection = levelDirectionH $ PR.level pr , runScript = Just $ PR.script pr+ , runHardBreak = False } )
+ src/Data/Text/ParagraphLayout/Internal/SplitList.hs view
@@ -0,0 +1,58 @@+-- | Utility functions to work with pairs of lists, which may be non-empty.+module Data.Text.ParagraphLayout.Internal.SplitList+ ( allowFstEmpty+ , allowSndEmpty+ , nonEmptyPairs+ , nonEmptyFsts+ , nonEmptySnds+ )+where++import Data.List.NonEmpty (NonEmpty, nonEmpty, toList)+import Data.Maybe (catMaybes)++-- | Generalise the first component of a pair from a non-empty list+-- to a regular list.+allowFstEmpty :: (NonEmpty a, b) -> ([a], b)+allowFstEmpty (a, b) = (toList a, b)++-- | Generalise the second component of a pair from a non-empty list+-- to a regular list.+allowSndEmpty :: (a, NonEmpty b) -> (a, [b])+allowSndEmpty (a, b) = (a, toList b)++-- | Turn pairs of normal lists into pairs of `NonEmpty` lists,+-- removing pairs in which either list is empty.+nonEmptyPairs :: [([a], [b])] -> [(NonEmpty a, NonEmpty b)]+nonEmptyPairs = catMaybes . map nonEmptyPair++-- | Turn a pair of normal lists into `Just` a pair of `NonEmpty` lists,+-- or `Nothing` if either list is empty.+nonEmptyPair :: ([a], [b]) -> Maybe (NonEmpty a, NonEmpty b)+nonEmptyPair (xs, ys) = case (nonEmpty xs, nonEmpty ys) of+ (Just xs1, Just ys1) -> Just (xs1, ys1)+ (_, _) -> Nothing++-- | Turn pairs of normal lists into pairs where the first list is `NonEmpty`,+-- removing pairs in which the first list is empty.+nonEmptyFsts :: [([a], [b])] -> [(NonEmpty a, [b])]+nonEmptyFsts = catMaybes . map nonEmptyFst++-- | Turn a pair of normal lists into `Just` a pair where the first list is+-- `NonEmpty`, or `Nothing` if the first list is empty.+nonEmptyFst :: ([a], [b]) -> Maybe (NonEmpty a, [b])+nonEmptyFst (xs, ys) = case nonEmpty xs of+ Just xs1 -> Just (xs1, ys)+ Nothing -> Nothing++-- | Turn pairs of normal lists into pairs where the second list is `NonEmpty`,+-- removing pairs in which the second list is empty.+nonEmptySnds :: [([a], [b])] -> [([a], NonEmpty b)]+nonEmptySnds = catMaybes . map nonEmptySnd++-- | Turn a pair of normal lists into `Just` a pair where the second list is+-- `NonEmpty`, or `Nothing` if the second list is empty.+nonEmptySnd :: ([a], [b]) -> Maybe ([a], NonEmpty b)+nonEmptySnd (xs, ys) = case nonEmpty ys of+ Just ys1 -> Just (xs, ys1)+ Nothing -> Nothing
src/Data/Text/ParagraphLayout/Internal/TextContainer.hs view
@@ -2,21 +2,18 @@ ( SeparableTextContainer , TextContainer , dropWhileEnd+ , dropWhileEndCascade , dropWhileStart+ , dropWhileStartCascade , getText , splitTextAt8 , splitTextsBy- , trimTextsEnd- , trimTextsEndPreserve- , trimTextsStart- , trimTextsStartPreserve ) where import Data.Foldable (toList)-import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty)-import qualified Data.List.NonEmpty as NonEmpty-import Data.Maybe (catMaybes)+import Data.List (mapAccumL, mapAccumR)+import Data.List.NonEmpty (NonEmpty ((:|))) import Data.Text (Text) import qualified Data.Text as Text import Data.Text.Foreign (dropWord8, takeWord8)@@ -57,16 +54,16 @@ dropWhileEnd = Text.dropWhileEnd -- | Treat a list of text containers as a contiguous sequence,--- and find all possible ways to split them into two non-empty lists,+-- and find all possible ways to split them into two lists, -- using the given function to find valid split offsets in `Data.Word.Word8` -- units from the beginning of each container. -- -- The results in the form (prefix, suffix) will be ordered from the longest -- prefix to shortest. splitTextsBy :: (SeparableTextContainer a, Foldable f) =>- (a -> [Int]) -> f a -> [(NonEmpty a, NonEmpty a)]+ (a -> [Int]) -> f a -> [([a], [a])] splitTextsBy breakFunc tcs =- nonEmptyPairs $ splitTextsBy' breakFunc [] $ reverse $ toList tcs+ splitTextsBy' breakFunc [] $ reverse $ toList tcs splitTextsBy' :: SeparableTextContainer a => (a -> [Int]) -> [a] -> [a] -> [([a], [a])]@@ -80,18 +77,6 @@ tcSplits = map (\ i -> splitTextAt8 i tc) tcBreakOffsets tcBreakOffsets = breakFunc tc --- | Turn pairs of normal lists into pairs of `NonEmpty` lists,--- removing pairs in which either list is empty.-nonEmptyPairs :: [([a], [b])] -> [(NonEmpty a, NonEmpty b)]-nonEmptyPairs = catMaybes . map nonEmptyPair---- | Turn a pair of normal lists into `Just` a pair of `NonEmpty` lists,--- or `Nothing` if either list is empty.-nonEmptyPair :: ([a], [b]) -> Maybe (NonEmpty a, NonEmpty b)-nonEmptyPair (xs, ys) = case (nonEmpty xs, nonEmpty ys) of- (Just xs1, Just ys1) -> Just (xs1, ys1)- (_, _) -> Nothing- -- | If the first container in the list is empty, remove it. collapse :: SeparableTextContainer a => NonEmpty a -> [a] collapse (tc :| tcs)@@ -101,61 +86,42 @@ -- | Treat a list of text containers as a contiguous sequence, -- and remove a prefix of characters that match the given predicate. ----- Empty text containers are removed from the output, so the result may--- potentially be an empty list.-trimTextsStart :: (SeparableTextContainer a, Foldable f) =>- (Char -> Bool) -> f a -> [a]-trimTextsStart p tcs = trimTextsStart' p $ toList tcs---- | Treat a list of text containers as a contiguous sequence,--- and remove a prefix of characters that match the given predicate.------ Empty text containers are removed from the output except the first one,--- which is instead truncated to zero length.-trimTextsStartPreserve :: SeparableTextContainer a =>- (Char -> Bool) -> NonEmpty a -> NonEmpty a-trimTextsStartPreserve p tcs =- case nonEmpty $ trimTextsStart p $ NonEmpty.toList tcs of- Nothing -> truncateText (NonEmpty.head tcs) :| []- Just out -> out+-- All text containers are preserved but their contents may end up having+-- zero length.+dropWhileStartCascade :: (SeparableTextContainer a, Traversable t) =>+ (Char -> Bool) -> t a -> t a+dropWhileStartCascade p tcs = trimTextsStartCascade (dropWhileStart p) tcs -- | Treat a list of text containers as a contiguous sequence, -- and remove a suffix of characters that match the given predicate. ----- Empty text containers are removed from the output, so the result may--- potentially be an empty list.-trimTextsEnd :: (SeparableTextContainer a, Foldable f) =>- (Char -> Bool) -> f a -> [a]-trimTextsEnd p tcs = trimTextsEnd' p $ reverse $ toList tcs+-- All text containers are preserved but their contents may end up having+-- zero length.+dropWhileEndCascade :: (SeparableTextContainer a, Traversable t) =>+ (Char -> Bool) -> t a -> t a+dropWhileEndCascade p tcs = trimTextsEndCascade (dropWhileEnd p) tcs --- | Treat a list of text containers as a contiguous sequence,--- and remove a suffix of characters that match the given predicate.------ Empty text containers are removed from the output except the first one,--- which is instead truncated to zero length.-trimTextsEndPreserve :: SeparableTextContainer a =>- (Char -> Bool) -> NonEmpty a -> NonEmpty a-trimTextsEndPreserve p tcs =- case nonEmpty $ trimTextsEnd p $ NonEmpty.toList tcs of- Nothing -> truncateText (NonEmpty.head tcs) :| []- Just out -> out+-- | Traverse the given structure from start to end, applying the given+-- text trimming function to each text container until a non-empty container+-- is produced.+trimTextsStartCascade :: (SeparableTextContainer a, Traversable t) =>+ (a -> a) -> t a -> t a+trimTextsStartCascade trimFunc tcs =+ snd $ mapAccumL (cascadingTrim trimFunc) True tcs -trimTextsStart' :: SeparableTextContainer a => (Char -> Bool) -> [a] -> [a]-trimTextsStart' _ [] = []-trimTextsStart' p (tc : tcs)- | Text.null (getText trimmed) = trimTextsStart' p tcs- | otherwise = trimmed : tcs- where- trimmed = dropWhileStart p tc+-- | Traverse the given structure from end to start, applying the given+-- text trimming function to each text container until a non-empty container+-- is produced.+trimTextsEndCascade :: (SeparableTextContainer a, Traversable t) =>+ (a -> a) -> t a -> t a+trimTextsEndCascade trimFunc tcs =+ snd $ mapAccumR (cascadingTrim trimFunc) True tcs -trimTextsEnd' :: SeparableTextContainer a => (Char -> Bool) -> [a] -> [a]-trimTextsEnd' _ [] = []-trimTextsEnd' p (tc : tcs)- | Text.null (getText trimmed) = trimTextsEnd' p tcs- | otherwise = reverse $ trimmed : tcs+-- | Wraps a text trimming function in a controlled cascade.+-- When the trim produces an empty text, the cascade continues.+cascadingTrim :: SeparableTextContainer a => (a -> a) -> Bool -> a -> (Bool, a)+cascadingTrim _ False tc = (False, tc)+cascadingTrim trimFunc True tc = (continue, trimmed) where- trimmed = dropWhileEnd p tc---- | Discard all text from the container by creating a prefix of length 0.-truncateText :: SeparableTextContainer a => a -> a-truncateText tc = fst $ splitTextAt8 0 tc+ trimmed = trimFunc tc+ continue = Text.null $ getText trimmed
src/Data/Text/ParagraphLayout/Internal/TextOptions.hs view
@@ -40,7 +40,6 @@ -- When applied to the root box in a paragraph, this is also used to -- determine the base direction of the paragraph. - -- TODO: textVerticalAlign -- TODO: textLetterSpacing -- TODO: textWordSpacing -- TODO: textFontFeatures
src/Data/Text/ParagraphLayout/Internal/Tree.hs view
@@ -19,12 +19,15 @@ , InnerNode (..) , Box (..) , Leaf (..)+ , EmptyText , flatten , glue+ , strut ) where import Data.Text (Text)+import qualified Data.Text as Text import Data.Text.Foreign (lengthWord8) import qualified Data.Text.Lazy as Lazy (toStrict) import qualified Data.Text.Internal.Lazy as Lazy (Text, chunk, empty)@@ -68,6 +71,13 @@ [InnerNode t d] -- ^ Text nodes and other boxes contained by this box.+ --+ -- Please note that boxes which are not the ancestors of any leaf nodes+ -- will have no effect on the output.+ --+ -- To ensure that all boxes are represented in the output, as would be+ -- expected for DOM elements in HTML, an empty text sequence must be added+ -- to otherwise empty boxes. This can be done by using the `strut` function. TextOptions -- ^ Style options to apply to text sequences directly contained@@ -91,6 +101,30 @@ (BoxPath d) -- ^ Inline boxes found on the path from this text sequence to the root -- of the original tree.++-- | Data types that can represent an empty text sequence in a `Tree`.+class EmptyText t where+ empty :: t++instance EmptyText Int where+ empty = 0++instance EmptyText Text where+ empty = Text.empty++-- | Insert an empty text sequence with the given user data into each empty box.+strut :: EmptyText t => d -> RootNode t d -> RootNode t d+strut d (RootBox (Box ns textOpts)) = RootBox $ Box (strutNodes d ns) textOpts++strutNodes :: EmptyText t => d -> [InnerNode t d] -> [InnerNode t d]+strutNodes d ns = map (strutNode d) ns++strutNode :: EmptyText t => d -> InnerNode t d -> InnerNode t d+strutNode _ x@(TextSequence _ _) = x+strutNode d (InlineBox boxData (Box [] textOpts) boxOpts) =+ InlineBox boxData (Box [TextSequence d empty] textOpts) boxOpts+strutNode d (InlineBox boxData (Box ns textOpts) boxOpts) =+ InlineBox boxData (Box (strutNodes d ns) textOpts) boxOpts -- | Convert the tree to a flat list of its leaf nodes (text sequences). flatten :: RootNode t d -> [Leaf t d]
test/Data/Text/ParagraphLayout/Internal/ApplyBoxesSpec.hs view
@@ -24,7 +24,7 @@ , spanText = empty , spanTextOptions = defaultTextOptions dir , spanBoxes = bs- , spanBiDiLevels = TextLevels []+ , spanBiDiLevels = TextLevels [] (directionLevel 0 dir) , spanLineBreaks = [] , spanCharacterBreaks = [] }
test/Data/Text/ParagraphLayout/Internal/BiDiLevelsSpec.hs view
@@ -11,11 +11,12 @@ -- | Test that `textLevels` produces the levels of the lengths given in -- "Data.Text.ParagraphLayout.TextData" and values given here. shouldHaveLevels :: (Direction, a, Text, [Int]) -> [Level] -> SpecWith ()-shouldHaveLevels (dir, _, text, lens) levels = it description $- result `shouldBe` TextLevels (runLengthDecode rls)+shouldHaveLevels (dir, _, text, runLens) runLevels = it description $+ actualLevels `shouldBe` runLengthDecode rls where+ TextLevels actualLevels _ = result result = textLevels dir text- rls = zip lens levels+ rls = zip runLens runLevels description = case rls of [] -> "should be empty" [(_, lvl)] -> "should all have level " ++ show lvl
test/Data/Text/ParagraphLayout/Internal/RunSpec.hs view
@@ -1,6 +1,6 @@ module Data.Text.ParagraphLayout.Internal.RunSpec (spec) where -import Data.Text (Text, pack)+import Data.Text (Text, empty, pack) import Data.Text.Glyphize (Direction (..), emptyFont) import Test.Hspec@@ -35,13 +35,13 @@ } allLTR :: TextLevels-allLTR = TextLevels $ repeat 0+allLTR = TextLevels (repeat 0) 0 allRTL :: TextLevels-allRTL = TextLevels $ repeat 1+allRTL = TextLevels (repeat 1) 1 levelsRLE :: [(Int, Level)] -> TextLevels-levelsRLE rls = TextLevels $ runLengthDecode rls+levelsRLE rls = TextLevels (runLengthDecode rls) undefined spec :: Spec spec = do@@ -49,7 +49,16 @@ it "handles span with no text" $ do let inputSpan = sampleSpan englishEmpty allLTR let runs = spanToRuns inputSpan- runs `shouldBe` []+ runs `shouldBe`+ [ Run+ { runOffsetInSpan = 0+ , runText = empty+ , runLevel = 0+ , runDirection = DirLTR+ , runScript = Nothing+ , runHardBreak = False+ }+ ] it "handles Czech hello" $ do let inputSpan = sampleSpan czechHello allLTR let runs = spanToRuns inputSpan@@ -60,6 +69,7 @@ , runLevel = 0 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } ] it "handles Arabic hello" $ do@@ -72,6 +82,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Arab"+ , runHardBreak = False } ] it "handles Serbian with mixed script" $ do@@ -85,6 +96,7 @@ , runLevel = 0 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } , Run { runOffsetInSpan = 12@@ -92,6 +104,7 @@ , runLevel = 0 , runDirection = DirLTR , runScript = Just "Cyrl"+ , runHardBreak = False } ] it "handles mixed direction with base LTR" $ do@@ -105,6 +118,7 @@ , runLevel = 0 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } , Run { runOffsetInSpan = 7@@ -112,6 +126,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Arab"+ , runHardBreak = False } , Run { runOffsetInSpan = 13@@ -119,6 +134,7 @@ , runLevel = 0 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } ] it "handles mixed direction with base RTL" $ do@@ -132,6 +148,7 @@ , runLevel = 2 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } , Run { runOffsetInSpan = 7@@ -139,6 +156,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Arab"+ , runHardBreak = False } , Run { runOffsetInSpan = 13@@ -146,6 +164,7 @@ , runLevel = 2 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } ] it "handles Arabic text with English inside" $ do@@ -159,6 +178,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Arab"+ , runHardBreak = False } , Run { runOffsetInSpan = 5@@ -166,6 +186,7 @@ , runLevel = 2 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } , Run { runOffsetInSpan = 14@@ -173,6 +194,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Arab"+ , runHardBreak = False } , Run { runOffsetInSpan = 79@@ -180,6 +202,7 @@ , runLevel = 2 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } , Run { runOffsetInSpan = 82@@ -187,6 +210,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Zyyy"+ , runHardBreak = False } ] it "handles English text with Arabic inside" $ do@@ -200,6 +224,7 @@ , runLevel = 0 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } , Run { runOffsetInSpan = 13@@ -207,6 +232,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Arab"+ , runHardBreak = False } , Run { runOffsetInSpan = 47@@ -214,6 +240,7 @@ , runLevel = 0 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } ] -- Unrealistic example where text changes direction@@ -229,6 +256,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Latn"+ , runHardBreak = False } -- direction change , Run@@ -237,6 +265,7 @@ , runLevel = 2 , runDirection = DirLTR , runScript = Just "Latn"+ , runHardBreak = False } -- direction change , Run@@ -245,6 +274,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Latn"+ , runHardBreak = False } -- script change , Run@@ -253,6 +283,7 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Cyrl"+ , runHardBreak = False } -- direction change , Run@@ -261,6 +292,7 @@ , runLevel = 2 , runDirection = DirLTR , runScript = Just "Cyrl"+ , runHardBreak = False } -- direction change , Run@@ -269,5 +301,6 @@ , runLevel = 1 , runDirection = DirRTL , runScript = Just "Cyrl"+ , runHardBreak = False } ]
test/Data/Text/ParagraphLayout/Internal/TextContainerSpec.hs view
@@ -1,15 +1,11 @@ module Data.Text.ParagraphLayout.Internal.TextContainerSpec (spec) where -import qualified Data.List.NonEmpty import Data.Text (Text, empty, pack) import Data.Text.Foreign (lengthWord8) import Test.Hspec import Data.Text.ParagraphLayout.Internal.TextContainer -ne :: [a] -> Data.List.NonEmpty.NonEmpty a-ne = Data.List.NonEmpty.fromList- data ExampleContainer = Contain { cText :: Text, cOffset :: Int } deriving (Show, Eq) @@ -43,7 +39,8 @@ [ -- Out of bounds. Should not generate any splits. 999, 50,- -- End of last text. Should not generate a split.+ -- End of last text.+ -- Should only generate a split for end-biased breaks. 43, -- Word and syllable bounds in the second text, -- similar to hyphenation rules. Each should generate a corresponding split.@@ -54,79 +51,189 @@ -- Word and syllable bounds in the first text. -- Each should generate a corresponding split. 18, 16, 14, 12,- -- Start of first text. Should not generate a split.+ -- Start of first text.+ -- Should only generate a split for start-biased breaks. 10, -- Out of bounds. Should not generate any splits. 5, 0, -1 ] -exampleBreakPoints :: ExampleContainer -> [Int]-exampleBreakPoints c =+-- | Bound `exampleBreaks` to the given text container and adjust offsets,+-- including start of text but excluding end of text.+--+-- Container boundaries should therefore only generate one split,+-- and all splits should have a non-empty prefix.+startBiasedBreakPoints :: ExampleContainer -> [Int]+startBiasedBreakPoints c = dropWhile (>= l) $ takeWhile (>= 0) $ map (subtract d) $ exampleBreaks where l = lengthWord8 $ cText c d = cOffset c +-- | Bound `exampleBreaks` to the given text container and adjust offsets,+-- excluding start of text but including end of text.+--+-- Container boundaries should therefore only generate one split,+-- and all splits should have a non-empty prefix.+endBiasedBreakPoints :: ExampleContainer -> [Int]+endBiasedBreakPoints c =+ dropWhile (> l) $ takeWhile (> 0) $ map (subtract d) $ exampleBreaks+ where+ l = lengthWord8 $ cText c+ d = cOffset c+ isSpace :: Char -> Bool isSpace = (== ' ') spec :: Spec spec = do+ describe "splitTextsBy" $ do- it "splits example text containers" $ do- splitTextsBy exampleBreakPoints exampleContainers `shouldBe`- [ ( ne [ contain "Vikipedija " 10, contain "(Википеди" 21 ]- , ne [ contain "ја)" 38 ]++ it "splits example text containers (start bias)" $ do+ splitTextsBy startBiasedBreakPoints exampleContainers `shouldBe`+ [ ( [ contain "Vikipedija " 10, contain "(Википеди" 21 ]+ , [ contain "ја)" 38 ] )- , ( ne [ contain "Vikipedija " 10, contain "(Википе" 21 ]- , ne [ contain "дија)" 34 ]+ , ( [ contain "Vikipedija " 10, contain "(Википе" 21 ]+ , [ contain "дија)" 34 ] )- , ( ne [ contain "Vikipedija " 10, contain "(Вики" 21 ]- , ne [ contain "педија)" 30 ]+ , ( [ contain "Vikipedija " 10, contain "(Вики" 21 ]+ , [ contain "педија)" 30 ] )- , ( ne [ contain "Vikipedija " 10, contain "(Ви" 21 ]- , ne [ contain "кипедија)" 26 ]+ , ( [ contain "Vikipedija " 10, contain "(Ви" 21 ]+ , [ contain "кипедија)" 26 ] )- , ( ne [ contain "Vikipedija " 10 ]- , ne [ contain "(Википедија)" 21 ]+ , ( [ contain "Vikipedija " 10 ]+ , [ contain "(Википедија)" 21 ] )- , ( ne [ contain "Vikipedi" 10 ]- , ne [ contain "ja " 18, contain "(Википедија)" 21 ]+ , ( [ contain "Vikipedi" 10 ]+ , [ contain "ja " 18, contain "(Википедија)" 21 ] )- , ( ne [ contain "Vikipe" 10 ]- , ne [ contain "dija " 16, contain "(Википедија)" 21 ]+ , ( [ contain "Vikipe" 10 ]+ , [ contain "dija " 16, contain "(Википедија)" 21 ] )- , ( ne [ contain "Viki" 10 ]- , ne [ contain "pedija " 14, contain "(Википедија)" 21 ]+ , ( [ contain "Viki" 10 ]+ , [ contain "pedija " 14, contain "(Википедија)" 21 ] )- , ( ne [ contain "Vi" 10 ]- , ne [ contain "kipedija " 12, contain "(Википедија)" 21 ]+ , ( [ contain "Vi" 10 ]+ , [ contain "kipedija " 12, contain "(Википедија)" 21 ] )+ , ( []+ , [ contain "Vikipedija " 10, contain "(Википедија)" 21 ]+ ) ]- describe "trimTextsEnd" $ do++ it "splits example text containers (end bias)" $ do+ splitTextsBy endBiasedBreakPoints exampleContainers `shouldBe`+ [ ( [ contain "Vikipedija " 10, contain "(Википедија)" 21 ]+ , []+ )+ , ( [ contain "Vikipedija " 10, contain "(Википеди" 21 ]+ , [ contain "ја)" 38 ]+ )+ , ( [ contain "Vikipedija " 10, contain "(Википе" 21 ]+ , [ contain "дија)" 34 ]+ )+ , ( [ contain "Vikipedija " 10, contain "(Вики" 21 ]+ , [ contain "педија)" 30 ]+ )+ , ( [ contain "Vikipedija " 10, contain "(Ви" 21 ]+ , [ contain "кипедија)" 26 ]+ )+ , ( [ contain "Vikipedija " 10 ]+ , [ contain "(Википедија)" 21 ]+ )+ , ( [ contain "Vikipedi" 10 ]+ , [ contain "ja " 18, contain "(Википедија)" 21 ]+ )+ , ( [ contain "Vikipe" 10 ]+ , [ contain "dija " 16, contain "(Википедија)" 21 ]+ )+ , ( [ contain "Viki" 10 ]+ , [ contain "pedija " 14, contain "(Википедија)" 21 ]+ )+ , ( [ contain "Vi" 10 ]+ , [ contain "kipedija " 12, contain "(Википедија)" 21 ]+ )+ ]++ describe "dropWhileStartCascade" $ do+ describe "isSpace" $ do+ it "does nothing on an empty list" $ do let inputTexts = [] :: [Text]- trimTextsEnd isSpace inputTexts `shouldBe` inputTexts- it "does nothing when last run does not end with space" $ do+ dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts++ it "does nothing on list of empty texts" $ do+ let inputTexts = [empty, empty, empty]+ dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts++ it "does nothing when first run does not start with space" $ do let inputTexts = [pack "some ", pack "text"]- trimTextsEnd isSpace inputTexts `shouldBe` inputTexts- it "trims empty texts down to an empty list" $ do+ dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts++ it "does nothing when first non-empty run does not start with space" $ do+ let inputTexts = [empty, empty, pack "some ", pack "text"]+ dropWhileStartCascade isSpace inputTexts `shouldBe` inputTexts++ it "trims spaces from first text" $ do+ let inputTexts = [pack " some ", pack "text"]+ dropWhileStartCascade isSpace inputTexts `shouldBe`+ [pack "some ", pack "text"]++ it "trims texts containing only spaces to empty" $ do+ let inputTexts = [pack " ", pack "some ", pack "text"]+ dropWhileStartCascade isSpace inputTexts `shouldBe`+ [empty, pack "some ", pack "text"]++ it "trims first text that contains non-spaces" $ do+ let inputTexts = [pack " ", pack " some ", pack "text "]+ dropWhileStartCascade isSpace inputTexts `shouldBe`+ [empty, pack "some ", pack "text "]++ it "trims space-only input down to empty texts" $ do+ let inputTexts = [pack " ", pack " ", pack " "]+ dropWhileStartCascade isSpace inputTexts `shouldBe`+ [empty, empty, empty]++ describe "dropWhileEndCascade" $ do++ describe "isSpace" $ do++ it "does nothing on an empty list" $ do+ let inputTexts = [] :: [Text]+ dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts++ it "does nothing on list of empty texts" $ do let inputTexts = [empty, empty, empty]- trimTextsEnd isSpace inputTexts `shouldBe` []- it "trims empty texts from a list" $ do+ dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts++ it "does nothing when last run does not end with space" $ do+ let inputTexts = [pack "some ", pack "text"]+ dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts++ it "does nothing when last non-empty run does not end with space" $ do let inputTexts = [pack "some ", pack "text", empty, empty]- trimTextsEnd isSpace inputTexts `shouldBe`- [pack "some ", pack "text"]+ dropWhileEndCascade isSpace inputTexts `shouldBe` inputTexts+ it "trims spaces from last text" $ do let inputTexts = [pack "some ", pack "text "]- trimTextsEnd isSpace inputTexts `shouldBe`+ dropWhileEndCascade isSpace inputTexts `shouldBe` [pack "some ", pack "text"]- it "trims texts containing only spaces" $ do++ it "trims texts containing only spaces to empty" $ do let inputTexts = [pack "some ", pack "text", pack " "]- trimTextsEnd isSpace inputTexts `shouldBe`- [pack "some ", pack "text"]+ dropWhileEndCascade isSpace inputTexts `shouldBe`+ [pack "some ", pack "text", empty]+ it "trims last text that contains non-spaces" $ do let inputTexts = [pack "some ", pack "text ", pack " "]- trimTextsEnd isSpace inputTexts `shouldBe`- [pack "some ", pack "text"]+ dropWhileEndCascade isSpace inputTexts `shouldBe`+ [pack "some ", pack "text", empty]++ it "trims space-only input down to empty texts" $ do+ let inputTexts = [pack " ", pack " ", pack " "]+ dropWhileEndCascade isSpace inputTexts `shouldBe`+ [empty, empty, empty]
test/Data/Text/ParagraphLayout/Internal/TreeSpec.hs view
@@ -83,6 +83,48 @@ ] t +sparseTree :: RootNode Int String+sparseTree = RootBox $ Box+ [ TextSequence "a" 1+ , InlineBox+ "empty box level 1 of 1"+ (Box+ []+ t+ )+ defaultBoxOptions+ , InlineBox+ "empty box level 1 of 2"+ (Box+ [ InlineBox+ "empty box level 2 of 2"+ (Box+ []+ t+ )+ defaultBoxOptions+ ]+ t+ )+ defaultBoxOptions+ , InlineBox+ "non-empty box"+ (Box+ [ TextSequence "b" 1+ , InlineBox+ "empty box in non-empty box"+ (Box+ []+ t+ )+ defaultBoxOptions+ ]+ t+ )+ defaultBoxOptions+ ]+ t+ leafData :: Leaf t d -> d leafData (TextLeaf d _ _ _) = d @@ -102,57 +144,77 @@ spec = do describe "flatten" $ do- let leaves = flatten complexTree - it "should have one leaf per text sequence" $- length leaves `shouldBe` 13+ describe "complex tree" $ do+ let leaves = flatten complexTree - it "leaves should have expected data" $ do- map leafData leaves `shouldBe`- map (: []) ['a' .. 'm']+ it "should have one leaf per text sequence" $+ length leaves `shouldBe` 13 - it "leaves should have expected depths" $ do- map leafDepth leaves `shouldBe`- [0, 1, 1, 2, 2, 1, 2, 3, 2, 2, 2, 3, 1]+ it "leaves should have expected data" $ do+ map leafData leaves `shouldBe`+ map (: []) ['a' .. 'm'] - it "leaves should have expected ancestor data" $ do- map leafPathData leaves `shouldBe`- [ []- , ["box1"]- , ["box1"]- , ["box2", "box1"]- , ["box2", "box1"]- , ["box1"]- , ["box3", "box1"]- , ["box4", "box3", "box1"]- , ["box3", "box1"]- , ["box6", "box5"]- , ["box6", "box5"]- , ["box8", "box7", "box5"]- , ["box5"]- ]+ it "leaves should have expected depths" $ do+ map leafDepth leaves `shouldBe`+ [0, 1, 1, 2, 2, 1, 2, 3, 2, 2, 2, 3, 1] - it "leaves should have expected ancestor indexes" $ do- map leafPathIndexes leaves `shouldBe`- [ []- , [0]- , [0]- , [1, 0]- , [1, 0]- , [0]- , [2, 0]- , [3, 2, 0]- , [2, 0]- , [5, 4]- , [5, 4]- , [7, 6, 4]- , [4]- ]+ it "leaves should have expected ancestor data" $ do+ map leafPathData leaves `shouldBe`+ [ []+ , ["box1"]+ , ["box1"]+ , ["box2", "box1"]+ , ["box2", "box1"]+ , ["box1"]+ , ["box3", "box1"]+ , ["box4", "box3", "box1"]+ , ["box3", "box1"]+ , ["box6", "box5"]+ , ["box6", "box5"]+ , ["box8", "box7", "box5"]+ , ["box5"]+ ] - it "leaves 'c' and 'f' should have the same parent" $- leafPath (leaves !! 2) !! 0 ==- leafPath (leaves !! 5) !! 0 `shouldBe` True+ it "leaves should have expected ancestor indexes" $ do+ map leafPathIndexes leaves `shouldBe`+ [ []+ , [0]+ , [0]+ , [1, 0]+ , [1, 0]+ , [0]+ , [2, 0]+ , [3, 2, 0]+ , [2, 0]+ , [5, 4]+ , [5, 4]+ , [7, 6, 4]+ , [4]+ ] - it "leaves 'e' and 'i' should have a different parent" $- leafPath (leaves !! 4) !! 0 ==- leafPath (leaves !! 8) !! 0 `shouldBe` False+ it "leaves 'c' and 'f' should have the same parent" $+ leafPath (leaves !! 2) !! 0 ==+ leafPath (leaves !! 5) !! 0 `shouldBe` True++ it "leaves 'e' and 'i' should have a different parent" $+ leafPath (leaves !! 4) !! 0 ==+ leafPath (leaves !! 8) !! 0 `shouldBe` False++ describe "unstrutted sparse tree with empty boxes" $ do+ let leaves = flatten sparseTree++ it "should have one leaf per text sequence" $+ length leaves `shouldBe` 2++ it "leaves should have expected data" $ do+ map leafData leaves `shouldBe` ["a", "b"]++ describe "strutted sparse tree with empty boxes" $ do+ let leaves = flatten $ strut "d" sparseTree++ it "should have one leaf per text sequence" $+ length leaves `shouldBe` 5++ it "leaves should have expected data" $ do+ map leafData leaves `shouldBe` ["a", "d", "d", "b", "d"]
test/Data/Text/ParagraphLayout/Plain/ParagraphData.hs view
@@ -1,6 +1,7 @@ {-# OPTIONS_GHC -fno-warn-deprecations #-} module Data.Text.ParagraphLayout.Plain.ParagraphData ( arabicFillerParagraph+ , arabicHelloParagraph , czechHelloParagraph , devanagariAccentParagraph , devanagariParagraph@@ -29,6 +30,10 @@ ) import Data.Text.ParagraphLayout.ParagraphConstruction +-- | Span with text in the Arabic language.+ar :: String -> (SpanOptions, String)+ar = (,) defaultSpanOptions { spanLanguage = "ar" }+ -- | Span with text in the Czech language. cs :: String -> (SpanOptions, String) cs = (,) defaultSpanOptions { spanLanguage = "cs" }@@ -79,6 +84,11 @@ spannedLoremIpsumParagraph :: ParagraphOptions -> Paragraph () spannedLoremIpsumParagraph = "xxxx" |< zxx "Lorem ipsum dolor " >|< zxx "sit amet, consectetur" >|< zxx " adipiscing elit, sed " >|< zxx "do eiusmod tempor" >|< zxx " incididunt ut labore " >|< zxx "et dolore magna" >|< zxx " aliqua. Ut enim " >|< zxx "ad minim veniam," >|< zxx " quis nostrud exercitation " >|< zxx "ullamco laboris nisi" >|< zxx " ut aliquip ex " >|< zxx "ea commodo consequat." >|< zxx " Duis aute irure " >|< zxx "dolor in reprehenderit" >|< zxx " in voluptate velit " >|< zxx "esse cillum dolore" >|< zxx " eu fugiat nulla " >|< zxx "pariatur. Excepteur" >|< zxx " sint occaecat cupidatat " >|< zxx "non proident, sunt" >|< zxx " in culpa qui " >|< zxx "officia deserunt mollit" >|< zxx " anim id est " >|< zxx "laborum." >| "z"++-- | Source:+-- <https://en.wikipedia.org/w/index.php?title=As-salamu_alaykum&oldid=1158575357>+arabicHelloParagraph :: ParagraphOptions -> Paragraph ()+arabicHelloParagraph = "xxxxx" |< ar "ٱلسَّلَامُ عَلَيْكُمَا!" >| "zz" czechHelloParagraph :: ParagraphOptions -> Paragraph () czechHelloParagraph = "xxxxx" |< cs "Ahoj, světe!" >| "zz"
test/Data/Text/ParagraphLayout/PlainSpec.hs view
@@ -36,6 +36,11 @@ let result = layoutPlain $ emptyParagraph opts result `shouldBe` emptyLayout + it "wraps by characters when line is ultra narrow" $ do+ let opts = opts_ { paragraphMaxWidth = 100 }+ let result = layoutPlain $ arabicHelloParagraph opts+ result `shouldBeGolden` "arabicHelloParagraphUltraNarrow"+ it "wraps filler text at 20em" $ do let opts = opts_ { paragraphMaxWidth = 20000 } let result = layoutPlain $ arabicFillerParagraph opts
test/Data/Text/ParagraphLayout/PrettyShow.hs view
@@ -109,7 +109,7 @@ ] instance Show d => PrettyShow (Fragment d) where- prettyShow (Fragment d l bs r pen glyphs) = concat+ prettyShow (Fragment d l bs cr r pen glyphs) = concat [ "Fragment" , newline , indent3@@ -124,6 +124,10 @@ , ", fragmentAncestorBoxes =" , newline , concat $ commaFirstList indent4 $ map show bs+ , newline+ , indent3+ , ", fragmentContentRect = "+ , show cr , newline , indent3 , ", fragmentRect = "
test/Data/Text/ParagraphLayout/RectSpec.hs view
@@ -1,6 +1,7 @@ module Data.Text.ParagraphLayout.RectSpec (spec) where import Data.Int (Int32)+import Data.List.NonEmpty (NonEmpty ((:|))) import Test.Hspec import Data.Text.ParagraphLayout.Internal.Rect@@ -13,17 +14,121 @@ spec :: Spec spec = do+ describe "union of two rects" $ do- let r = union positiveRect negativeRect- it "has origin at 50,-60" $- (x_origin r, y_origin r) `shouldBe` (50, -60)- it "has minimum coordinates at at 50,-90" $- (x_min r, y_min r) `shouldBe` (50, -90)- it "has terminus at 80,-90" $- (x_terminus r, y_terminus r) `shouldBe` (80, -90)- it "has maximum coordinates at 80,-60" $- (x_max r, y_max r) `shouldBe` (80, -60)- it "has size 30,-30" $- (x_size r, y_size r) `shouldBe` (30, -30)- it "has absolute size 30,30" $- (width r, height r) `shouldBe` (30, 30)++ describe "low X, low Y" $+ llSpec $ union LL positiveRect negativeRect++ describe "low X, high Y" $+ lhSpec $ union LH positiveRect negativeRect++ describe "high X, low Y" $+ hlSpec $ union HL positiveRect negativeRect++ describe "high X, high Y" $+ hhSpec $ union HH positiveRect negativeRect++ describe "union of list" $ do++ describe "when empty" $+ it "should be Nothing" $ do+ unionMany LL []+ `shouldBe` (Nothing :: Maybe (Rect Int32))++ describe "with single item" $ do++ describe "matching LL origin" $+ it "should be identity" $+ unionMany LL [positiveRect]+ `shouldBe` Just positiveRect++ describe "matching HH origin" $+ it "should be identity" $+ unionMany HH [negativeRect]+ `shouldBe` Just negativeRect++ describe "with single item repeated" $ do++ describe "matching LL origin" $+ it "should be equal to item" $+ unionMany LL (replicate 2 positiveRect)+ `shouldBe` Just positiveRect++ describe "matching HH origin" $+ it "should be equal to item" $+ unionMany HH (replicate 7 negativeRect)+ `shouldBe` Just negativeRect++ describe "with two items" $+ it "should behave the same as binary function" $+ unionMany LL [positiveRect, negativeRect]+ `shouldBe` Just (union LL positiveRect negativeRect)++ describe "union of non-empty list" $ do++ describe "with single item" $ do++ describe "matching LL origin" $+ it "should be identity" $+ unionMany1 LL (positiveRect :| [])+ `shouldBe` positiveRect++ describe "matching HH origin" $+ it "should be identity" $+ unionMany1 HH (negativeRect :| [])+ `shouldBe` negativeRect++ describe "with two items" $+ it "should behave the same as binary function" $+ unionMany1 LL (positiveRect :| [negativeRect])+ `shouldBe` union LL positiveRect negativeRect++llSpec :: Rect Int32 -> SpecWith ()+llSpec r = do+ commonSpec r+ it "has origin at 50,-90" $+ (x_origin r, y_origin r) `shouldBe` (50, -90)+ it "has terminus at 80,-60" $+ (x_terminus r, y_terminus r) `shouldBe` (80, -60)+ it "has size 30,30" $+ (x_size r, y_size r) `shouldBe` (30, 30)++lhSpec :: Rect Int32 -> SpecWith ()+lhSpec r = do+ commonSpec r+ it "has origin at 50,-60" $+ (x_origin r, y_origin r) `shouldBe` (50, -60)+ it "has terminus at 80,-90" $+ (x_terminus r, y_terminus r) `shouldBe` (80, -90)+ it "has size 30,-30" $+ (x_size r, y_size r) `shouldBe` (30, -30)++hlSpec :: Rect Int32 -> SpecWith ()+hlSpec r = do+ commonSpec r+ it "has origin at 80,-90" $+ (x_origin r, y_origin r) `shouldBe` (80, -90)+ it "has terminus at 50,-60" $+ (x_terminus r, y_terminus r) `shouldBe` (50, -60)+ it "has size -30,30" $+ (x_size r, y_size r) `shouldBe` (-30, 30)++hhSpec :: Rect Int32 -> SpecWith ()+hhSpec r = do+ commonSpec r+ it "has origin at 80,-60" $+ (x_origin r, y_origin r) `shouldBe` (80, -60)+ it "has terminus at 50,-90" $+ (x_terminus r, y_terminus r) `shouldBe` (50, -90)+ it "has size -30,-30" $+ (x_size r, y_size r) `shouldBe` (-30, -30)++commonSpec :: Rect Int32 -> SpecWith ()+commonSpec r = do+ it "has minimum coordinates at at 50,-90" $+ (x_min r, y_min r) `shouldBe` (50, -90)+ it "has maximum coordinates at 80,-60" $+ (x_max r, y_max r) `shouldBe` (80, -60)+ it "has absolute size 30,30" $+ (width r, height r) `shouldBe` (30, 30)
test/Data/Text/ParagraphLayout/Rich/ParagraphData.hs view
@@ -1,14 +1,22 @@ module Data.Text.ParagraphLayout.Rich.ParagraphData- ( hardBoxBreakLTRParagraph+ ( emptyBoxParagraph+ , hardBoxBreakLTRParagraph , hardBoxBreakRTLParagraph+ , intraWordBreakParagraph , loremIpsumParagraph , mixedDirectionComplexParagraph , mixedDirectionSimpleParagraph+ , mixedLineHeightParagraph , mixedScriptParagraph , mixedSizesParagraph , nestedBoxesParagraph , neutralDirectionParagraph+ , newline1Paragraph+ , newline1TextParagraph+ , newline2Paragraph+ , newline2TextParagraph , softBreakParagraph+ , spaceBoxParagraph ) where @@ -21,6 +29,7 @@ import Data.Text.ParagraphLayout.Internal.Rich.Paragraph import Data.Text.ParagraphLayout.Internal.TextOptions import Data.Text.ParagraphLayout.Internal.Tree+import Data.Text.ParagraphLayout.Rich import Data.Text.ParagraphLayout.TextData tLTR :: TextOptions@@ -41,6 +50,22 @@ text :: d -> String -> InnerNode Text d text label contents = TextSequence label (pack contents) +emptyBoxParagraph :: Font -> ParagraphOptions -> Paragraph String+emptyBoxParagraph font = constructParagraph+ (pack "prefix")+ (rootBox t+ [ text "text1" "empty "+ , box "box1" b t+ [ text "emptyText" ""+ ]+ , text "text2" " box"+ ]+ )+ (pack "suffix")+ where+ b = b_ { boxSpacing = BoxSpacingLeftRight 50 100 }+ t = tLTR { textFont = font, textLanguage = "en" }+ hardBoxBreakLTRParagraph :: Font -> ParagraphOptions -> Paragraph String hardBoxBreakLTRParagraph font = constructParagraph (pack "prefix")@@ -79,6 +104,19 @@ b2 = b_ { boxSpacing = BoxSpacingLeftRight 150 200 } t = tRTL { textFont = font, textLanguage = "zxx" } +-- | For testing that soft wrap preserves the form of Arabic characters.+-- Source: <https://www.w3.org/TR/css-text-3/#word-break-shaping>+intraWordBreakParagraph :: Font -> ParagraphOptions -> Paragraph String+intraWordBreakParagraph font = constructParagraph+ empty+ (rootBox t+ [ text "text" "نوشتن_نوشتن_نوشتن"+ ]+ )+ empty+ where+ t = tRTL { textFont = font, textLanguage = "fa" }+ -- | Filler text using the Latin script. -- Source: <https://www.lipsum.com/> loremIpsumParagraph :: Font -> ParagraphOptions -> Paragraph String@@ -133,6 +171,45 @@ t = (defaultTextOptions dir) { textFont = font, textLanguage = lang } (_, lang, textContents, _) = mixedDirectionSimple dir +mixedLineHeightParagraph :: (Int32, Int32, Int32) -> Font -> ParagraphOptions ->+ Paragraph String+mixedLineHeightParagraph (lhSmall, lhMedium, lhLarge) font = constructParagraph+ (pack "prefix")+ (rootBox tMedium+ -- Line 1: all 3 heights, with medium height prevailing.+ [ text "mediumText" "medium "+ , box "smallBox" b_ tSmall [text "smallText" "small "]+ , text "mediumText" "medium "+ , box "largeBox" b_ tLarge [text "largeText" "large "]+ , text "mediumText" "medium "+ , text "lineBreak" "\n"+ -- Line 2: all 3 line heights, with medium only in the middle.+ , box "smallBox" b_ tSmall [text "smallText" "small "]+ , text "mediumText" "medium "+ , box "largeBox" b_ tLarge [text "largeText" "large "]+ , text "lineBreak" "\n"+ -- Line 3: asymmetric, medium changing into small.+ , text "mediumText" "medium "+ , box "smallBox" b_ tSmall [text "smallText" "small "]+ , text "lineBreak" "\n"+ -- Line 4: asymmetric, large changing into medium.+ , box "largeBox" b_ tLarge [text "largeText" "large "]+ , text "mediumText" "medium "+ , text "lineBreak" "\n"+ -- Line 5: small only.+ , box "smallBox" b_ tSmall [text "smallText" "small "]+ , text "lineBreak" "\n"+ -- Line 6: large only.+ , box "largeBox" b_ tLarge [text "largeText" "large "]+ ]+ )+ (pack "suffix")+ where+ tLarge = t { textLineHeight = Absolute lhLarge }+ tMedium = t { textLineHeight = Absolute lhMedium }+ tSmall = t { textLineHeight = Absolute lhSmall }+ t = tLTR { textFont = font, textLanguage = "en" }+ mixedScriptParagraph :: Font -> ParagraphOptions -> Paragraph String mixedScriptParagraph font = constructParagraph (pack "prefix")@@ -206,6 +283,38 @@ where t = (defaultTextOptions dir) { textFont = font, textLanguage = "zxx" } +newline1Paragraph :: Font -> ParagraphOptions -> Paragraph String+newline1Paragraph font = constructParagraph+ (pack "prefix")+ (rootBox t [ text "text" "\n" ])+ (pack "suffix")+ where+ t = tRTL { textFont = font, textLanguage = "zxx" }++newline1TextParagraph :: Font -> ParagraphOptions -> Paragraph String+newline1TextParagraph font = constructParagraph+ (pack "prefix")+ (rootBox t [ text "text" "\nt" ])+ (pack "suffix")+ where+ t = tRTL { textFont = font, textLanguage = "zxx" }++newline2Paragraph :: Font -> ParagraphOptions -> Paragraph String+newline2Paragraph font = constructParagraph+ (pack "prefix")+ (rootBox t [ text "text" "\n\n" ])+ (pack "suffix")+ where+ t = tRTL { textFont = font, textLanguage = "zxx" }++newline2TextParagraph :: Font -> ParagraphOptions -> Paragraph String+newline2TextParagraph font = constructParagraph+ (pack "prefix")+ (rootBox t [ text "text" "\n\nt" ])+ (pack "suffix")+ where+ t = tRTL { textFont = font, textLanguage = "zxx" }+ softBreakParagraph :: Int32 -> Font -> ParagraphOptions -> Paragraph String softBreakParagraph spacing font = constructParagraph (pack "prefix")@@ -222,4 +331,23 @@ (pack "suffix") where b = b_ { boxSpacing = BoxSpacingLeftRight spacing spacing }+ t = tLTR { textFont = font, textLanguage = "en" }++spaceBoxParagraph :: BoxCollapse -> Font -> ParagraphOptions -> Paragraph String+spaceBoxParagraph collapse font = constructParagraph+ (pack "prefix")+ (rootBox t+ [ text "text1" "space"+ , box "box1" b t+ [ text "text2" " "+ ]+ , text "text3" "box"+ ]+ )+ (pack "suffix")+ where+ b = b_+ { boxCollapse = collapse+ , boxSpacing = BoxSpacingLeftRight 50 100+ } t = tLTR { textFont = font, textLanguage = "en" }
test/Data/Text/ParagraphLayout/RichSpec.hs view
@@ -1,13 +1,15 @@ module Data.Text.ParagraphLayout.RichSpec (spec) where import Data.Int (Int32)-import Data.Text.Glyphize (Direction (DirLTR, DirRTL))+import Data.Word (Word32)+import Data.Text.Glyphize (Direction (DirLTR, DirRTL), codepoint) import Test.Hspec import System.FilePath ((</>)) import Data.Text.ParagraphLayout import Data.Text.ParagraphLayout.FontLoader import Data.Text.ParagraphLayout.Internal.Paginable (paginateAll)+import Data.Text.ParagraphLayout.Internal.ParagraphLine (forceLeftAlign) import Data.Text.ParagraphLayout.Internal.Rich.ParagraphLayout (shapedRuns) import Data.Text.ParagraphLayout.PrettyShow import Data.Text.ParagraphLayout.PrettyShow.Golden@@ -19,6 +21,28 @@ fragmentRects p = map toItem $ paragraphFragments p where toItem (Fragment { fragmentUserData = d, fragmentRect = r }) = (d, r) +glyphRuns :: ParagraphLayout d -> [[Word32]]+glyphRuns = map (map (codepoint . fst) . fragmentGlyphs) . paragraphFragments++-- | A sufficiently large number to prevent line breaking,+-- while being round so that coordinates in test results are easy to read.+largeWidth :: Int32+largeWidth = 1000000000++-- | Expect two paragraph layouts to contain the same fragments,+-- except possibly shifted left or right.+shouldBeWrappedLike :: (Show d, Eq d) =>+ ParagraphLayout d -> ParagraphLayout d -> Expectation+shouldBeWrappedLike a b =+ forceLeftAlign a `shouldBe` forceLeftAlign b++-- | Expect two paragraph layouts to not contain the same fragments,+-- even if ignoring a possible shift to the left or to the right.+shouldNotBeWrappedLike :: (Show d, Eq d) =>+ ParagraphLayout d -> ParagraphLayout d -> Expectation+shouldNotBeWrappedLike a b =+ forceLeftAlign a `shouldNotBe` forceLeftAlign b+ spec :: Spec spec = do @@ -31,38 +55,167 @@ font <- runIO $ loadFont latinFont 0 testingOptions fontSmall <- runIO $ loadFont latinFont 0 testingOptionsSmall - it "wraps lorem ipsum at 20em" $ do- let opts = defaultParagraphOptions { paragraphMaxWidth = 20000 }- let input = loremIpsumParagraph font opts+ let commonWrapWidth = 20000+ let expectedSafeWidth = 19791++ describe "lorem ipsum at 20em, left aligned" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignLeft+ }+ let input w = loremIpsumParagraph font $+ opts { paragraphMaxWidth = w }+ let result20em = layoutRich $ input commonWrapWidth+ let resultSafe = layoutRich $ input expectedSafeWidth+ let resultUnsafe = layoutRich $ input (expectedSafeWidth - 1)++ it "wraps correctly" $+ result20em `shouldBeGolden` "loremIpsum20em"++ it "gives correct safe width" $+ paragraphSafeWidth result20em `shouldBe` expectedSafeWidth++ it "wraps the same at safe width" $+ resultSafe `shouldBeWrappedLike` result20em++ it "does not wrap the same at smaller width" $+ resultUnsafe `shouldNotBeWrappedLike` result20em++ describe "lorem ipsum at 20em, right aligned" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignRight+ }+ let input w = loremIpsumParagraph font $+ opts { paragraphMaxWidth = w }+ let result20em = layoutRich $ input commonWrapWidth+ let resultSafe = layoutRich $ input expectedSafeWidth+ let resultUnsafe = layoutRich $ input (expectedSafeWidth - 1)++ it "wraps correctly" $+ result20em `shouldBeGolden` "loremIpsum20emRight"++ it "gives correct safe width" $+ paragraphSafeWidth result20em `shouldBe` expectedSafeWidth++ it "wraps the same at safe width" $+ resultSafe `shouldBeWrappedLike` result20em++ it "does not wrap the same at smaller width" $+ resultUnsafe `shouldNotBeWrappedLike` result20em++ describe "lorem ipsum at 20em, centred" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignCentreH+ }+ let input w = loremIpsumParagraph font $+ opts { paragraphMaxWidth = w }+ let result20em = layoutRich $ input commonWrapWidth+ let resultSafe = layoutRich $ input expectedSafeWidth+ let resultUnsafe = layoutRich $ input (expectedSafeWidth - 1)+ let resultUnsafe2 = layoutRich $ input (expectedSafeWidth - 2)++ it "wraps correctly" $+ result20em `shouldBeGolden` "loremIpsum20emCentre"++ it "gives correct safe width" $+ paragraphSafeWidth result20em `shouldBe` expectedSafeWidth++ it "wraps the same at safe width" $+ resultSafe `shouldBeWrappedLike` result20em++ it "does not wrap the same at smaller width" $+ resultUnsafe `shouldNotBeWrappedLike` result20em++ -- Cover for false negatives when halving odd numbers.+ it "does not wrap the same at 2 units smaller width" $+ resultUnsafe2 `shouldNotBeWrappedLike` result20em++ it "handles mixed line height" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ }+ let lineHeights = (800, 1300, 1700)+ let input = mixedLineHeightParagraph lineHeights font opts let result = layoutRich input- result `shouldBeGolden` "loremIpsum20em"+ result `shouldBeGolden` "mixedLineHeight" it "handles mixed sizes" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = mixedSizesParagraph (font, fontSmall) opts let result = layoutRich input result `shouldBeGolden` "mixedSizes" it "handles mixed script" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = mixedScriptParagraph font opts let result = layoutRich input result `shouldBeGolden` "mixedScript" it "handles mixed script with line wraps" $ do- let opts = defaultParagraphOptions { paragraphMaxWidth = 5000 }+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = 5000+ } let input = mixedScriptParagraph font opts let result = layoutRich input result `shouldBeGolden` "mixedScriptWrap" + it "handles empty box in the middle of the line" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = 5193+ }+ let input = emptyBoxParagraph font opts+ let result = layoutRich input+ result `shouldBeGolden` "emptyBoxMiddle"++ it "handles space box in the middle of the line" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = 4635+ }+ let input = spaceBoxParagraph AllowBoxCollapse font opts+ let result = layoutRich input+ result `shouldBeGolden` "spaceBoxMiddle"++ it "can collapse space box when on its own line" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = 100+ }+ let input = spaceBoxParagraph AllowBoxCollapse font opts+ let result = layoutRich input+ result `shouldBeGolden` "spaceBoxCollapsed"++ it "can preserve space box when on its own line" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = 100+ }+ let input = spaceBoxParagraph AvoidBoxCollapse font opts+ let result = layoutRich input+ result `shouldBeGolden` "spaceBoxPreserved"+ it "handles nested boxes" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = nestedBoxesParagraph font opts let result = layoutRich input result `shouldBeGolden` "nestedBoxes" it "handles hard break in LTR boxes" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = hardBoxBreakLTRParagraph font opts let result = layoutRich input result `shouldBeGolden` "hardBoxBreakLTR"@@ -79,7 +232,10 @@ originX + (sum $ take (n - 1) wordAdvancesWithSpace) let endX = originX + (sum wordAdvancesWithSpace) -- A paragraph exactly wide enough to fit the whole text.- let opts = defaultParagraphOptions { paragraphMaxWidth = endX }+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = endX+ } -- Small spacing that should push one word onto the next line. let s = 5 -- Large spacing that should push two words onto the next line.@@ -116,48 +272,129 @@ describe "with Arabic font" $ do font <- runIO $ loadFont arabicFont 0 testingOptions + it "makes space for one newline" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ }+ let input = newline1Paragraph font opts+ let result = layoutRich input+ result `shouldBeGolden` "newline1Paragraph"++ it "makes space for one newline plus text" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ }+ let input = newline1TextParagraph font opts+ let result = layoutRich input+ result `shouldBeGolden` "newline1TextParagraph"++ it "makes space for two newlines" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ }+ let input = newline2Paragraph font opts+ let result = layoutRich input+ result `shouldBeGolden` "newline2Paragraph"++ it "makes space for two newlines plus text" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ }+ let input = newline2TextParagraph font opts+ let result = layoutRich input+ result `shouldBeGolden` "newline2TextParagraph"+ it "handles hard break in RTL boxes" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = hardBoxBreakRTLParagraph font opts let result = layoutRich input result `shouldBeGolden` "hardBoxBreakRTL" it "handles neutral characters in RTL paragraph" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = neutralDirectionParagraph DirRTL font opts let result = layoutRich input result `shouldBeGolden` "neutralDirectionRTL" it "handles neutral characters in LTR paragraph" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = neutralDirectionParagraph DirLTR font opts let result = layoutRich input result `shouldBeGolden` "neutralDirectionLTR" it "handles simple mixed direction in RTL paragraph" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = mixedDirectionSimpleParagraph DirRTL font opts let result = layoutRich input result `shouldBeGolden` "mixedDirectionSimpleRTL" it "handles simple mixed direction in LTR paragraph" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = mixedDirectionSimpleParagraph DirLTR font opts let result = layoutRich input result `shouldBeGolden` "mixedDirectionSimpleLTR" it "handles complex mixed direction in RTL paragraph" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = mixedDirectionComplexParagraph DirRTL font opts let result = layoutRich input result `shouldBeGolden` "mixedDirectionComplexRTL" it "handles complex mixed direction in LTR paragraph" $ do let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = largeWidth+ } let input = mixedDirectionComplexParagraph DirLTR font opts let result = layoutRich input result `shouldBeGolden` "mixedDirectionComplexLTR" + it "preserves joining forms across soft breaks" $ do+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = 4500+ }+ let input = intraWordBreakParagraph font opts+ let glyphRunsVisual = glyphRuns $ layoutRich input+ let glyphRunsLogical = map reverse glyphRunsVisual+ -- Glyph indexes for the corresponding Arabic letters/ligatures:+ let n_initial = 407+ let v_final = 971+ let sh_initial = 373+ let tn_final = 1363+ -- Glyph index for the underscore used to break repetitions:+ let sp = 89+ -- Unconventional code formatting here shows that there should+ -- be three repetitions of the same glyph sequence, unaffected+ -- by the line break inserted after an initial form and before+ -- a final form.+ glyphRunsLogical `shouldBe`+ [[n_initial, v_final, sh_initial, tn_final, sp,+ n_initial, v_final, sh_initial], [tn_final, sp,+ n_initial, v_final, sh_initial, tn_final]]+ describe "paginate" $ do let goldenDir = ".golden" </> "paginatedRichParagraphLayout"@@ -167,7 +404,10 @@ font <- runIO $ loadFont latinFont 0 testingOptions it "wraps lorem ipsum at 20em" $ do- let opts = defaultParagraphOptions { paragraphMaxWidth = 20000 }+ let opts = defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = 20000+ } let input = loremIpsumParagraph font opts let pl = layoutRich input let popts = PageOptions@@ -195,13 +435,24 @@ let fontPath = arabicFont font <- runIO $ loadFont fontPath 0 demoOptions - let- opts = defaultParagraphOptions- input = mixedDirectionComplexParagraph DirRTL font opts- result = layoutRich input- shapedRunsSpec = shapedRunsSpecWithFont fontPath font+ let shapedRunsSpec = shapedRunsSpecWithFont fontPath font shapedRunsSpec "handles complex mixed direction in RTL paragraph"- "mixedDirectionComplexRTL"- result+ "mixedDirectionComplexRTL" $+ layoutRich $+ mixedDirectionComplexParagraph DirRTL font $+ defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = 640+ }++ shapedRunsSpec+ "preserves joining forms across soft breaks"+ "intraWordBreak" $+ layoutRich $+ intraWordBreakParagraph font $+ defaultParagraphOptions+ { paragraphAlignment = AlignStart+ , paragraphMaxWidth = 144+ }