From 7f7bfdd8094bf942ed135a210c7485552b69d015 Mon Sep 17 00:00:00 2001 From: Jaro Date: Sat, 11 Mar 2023 06:34:46 +0100 Subject: [PATCH] Test forming and breaking ligatures. --- .golden/ligatureParagraph/golden | 13 +++++++++++++ .golden/ligatureParagraphBreak1/golden | 16 ++++++++++++++++ .golden/ligatureParagraphBreak2/golden | 16 ++++++++++++++++ test/Data/Text/ParagraphLayout/ParagraphData.hs | 4 ++++ test/Data/Text/ParagraphLayoutSpec.hs | 14 +++++++++++++- 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 .golden/ligatureParagraph/golden create mode 100644 .golden/ligatureParagraphBreak1/golden create mode 100644 .golden/ligatureParagraphBreak2/golden diff --git a/.golden/ligatureParagraph/golden b/.golden/ligatureParagraph/golden new file mode 100644 index 0000000..a101b14 --- /dev/null +++ b/.golden/ligatureParagraph/golden @@ -0,0 +1,13 @@ +ParagraphLayout {paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121}, spanLayouts = [ + SpanLayout [Fragment {fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4672, y_size = -1121}, fragmentPen = (0,-932), fragmentGlyphs = + [(GlyphInfo {codepoint = 76, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 81, cluster = 1, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 72, cluster = 2, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 431, cluster = 3, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 1033, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 70, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 76, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 72, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 81, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 87, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})] + }] +]} diff --git a/.golden/ligatureParagraphBreak1/golden b/.golden/ligatureParagraphBreak1/golden new file mode 100644 index 0000000..8186bfb --- /dev/null +++ b/.golden/ligatureParagraphBreak1/golden @@ -0,0 +1,16 @@ +ParagraphLayout {paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -3363}, spanLayouts = [ + SpanLayout [Fragment {fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 2162, y_size = -1121}, fragmentPen = (0,-932), fragmentGlyphs = + [(GlyphInfo {codepoint = 76, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 81, cluster = 1, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 72, cluster = 2, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 426, cluster = 3, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 776, y_advance = 0, x_offset = 0, y_offset = 0})] + }, Fragment {fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 2104, y_size = -1121}, fragmentPen = (0,-932), fragmentGlyphs = + [(GlyphInfo {codepoint = 76, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 70, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 76, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 72, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 81, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0})] + }, Fragment {fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 402, y_size = -1121}, fragmentPen = (0,-932), fragmentGlyphs = + [(GlyphInfo {codepoint = 87, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})] + }] +]} diff --git a/.golden/ligatureParagraphBreak2/golden b/.golden/ligatureParagraphBreak2/golden new file mode 100644 index 0000000..d426385 --- /dev/null +++ b/.golden/ligatureParagraphBreak2/golden @@ -0,0 +1,16 @@ +ParagraphLayout {paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -3363}, spanLayouts = [ + SpanLayout [Fragment {fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 1772, y_size = -1121}, fragmentPen = (0,-932), fragmentGlyphs = + [(GlyphInfo {codepoint = 76, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 81, cluster = 1, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 72, cluster = 2, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 73, cluster = 3, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 386, y_advance = 0, x_offset = 0, y_offset = 0})] + }, Fragment {fragmentRect = Rect {x_origin = 0, y_origin = -1121, x_size = 1361, y_size = -1121}, fragmentPen = (0,-932), fragmentGlyphs = + [(GlyphInfo {codepoint = 428, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 643, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 70, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 465, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 76, cluster = 7, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0})] + }, Fragment {fragmentRect = Rect {x_origin = 0, y_origin = -2242, x_size = 1535, y_size = -1121}, fragmentPen = (0,-932), fragmentGlyphs = + [(GlyphInfo {codepoint = 72, cluster = 8, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 81, cluster = 9, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 574, y_advance = 0, x_offset = 0, y_offset = 0}), + (GlyphInfo {codepoint = 87, cluster = 10, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 402, y_advance = 0, x_offset = 0, y_offset = 0})] + }] +]} diff --git a/test/Data/Text/ParagraphLayout/ParagraphData.hs b/test/Data/Text/ParagraphLayout/ParagraphData.hs index 6f514fe..597c39e 100644 --- a/test/Data/Text/ParagraphLayout/ParagraphData.hs +++ b/test/Data/Text/ParagraphLayout/ParagraphData.hs @@ -3,6 +3,7 @@ module Data.Text.ParagraphLayout.ParagraphData ,czechHelloParagraph ,emptyParagraph ,emptySpanParagraph + ,ligatureParagraph ,loremIpsumParagraph ,mixedLanguageLTRParagraph ,mixedScriptSerbianParagraph @@ -45,6 +46,9 @@ emptySpanParagraph = "xx" |< en~"" >| "zzzzz" trivialParagraph :: ParagraphOptions -> Paragraph trivialParagraph = "xxx" |< en~"a" >| "zzz" +ligatureParagraph :: ParagraphOptions -> Paragraph +ligatureParagraph = "" |< en~"inefficient" >| "" + -- | Fillter text using the Arabic script. -- Source: arabicFillerParagraph :: ParagraphOptions -> Paragraph diff --git a/test/Data/Text/ParagraphLayoutSpec.hs b/test/Data/Text/ParagraphLayoutSpec.hs index 3d36034..8c5c7ce 100644 --- a/test/Data/Text/ParagraphLayoutSpec.hs +++ b/test/Data/Text/ParagraphLayoutSpec.hs @@ -113,6 +113,19 @@ spec = do it "handles Czech hello" $ \font -> do let result = layoutPlain $ czechHelloParagraph $ opts font result `shouldBeGolden` "czechHelloParagraph" + it "renders an \"ffi\" ligature" $ \ font -> do + let result = layoutPlain $ ligatureParagraph $ opts font + result `shouldBeGolden` "ligatureParagraph" + it "breaks an \"ffi\" ligature into \"ff\" + \"i\"" $ \ font -> do + let result = layoutPlain $ ligatureParagraph $ + (opts font) + { paragraphMaxWidth = 2418 } + result `shouldBeGolden` "ligatureParagraphBreak1" + it "breaks an \"ffi\" ligature into \"f\" + \"fi\"" $ \ font -> do + let result = layoutPlain $ ligatureParagraph $ + (opts font) + { paragraphMaxWidth = 1800 } + result `shouldBeGolden` "ligatureParagraphBreak2" it "handles mixed languages in LTR layout" $ \font -> do let result = layoutPlain $ mixedLanguageLTRParagraph $ opts font result `shouldBeGolden` "mixedLanguageLTRParagraph" @@ -140,7 +153,6 @@ spec = do (opts font) { paragraphMaxWidth = 1300 } result `shouldBeGolden` "czechHelloParagraphNarrow" - -- TODO test breaking ligatures it "wraps by characters when line is ultra narrow" $ \font -> do let result = layoutPlain $ czechHelloParagraph $ -- 2.30.2