From 95140978d0de7440db55a925a664cde01810d601 Mon Sep 17 00:00:00 2001 From: Jaro Date: Fri, 24 Feb 2023 08:31:59 +0100 Subject: [PATCH] Calculate "normal" line height and pen position. --- .golden/czechHelloParagraph/golden | 4 ++-- .golden/mixedLanguageLTRParagraph/golden | 6 +++--- src/Data/Text/ParagraphLayout/Plain.hs | 26 ++++++++++++++++-------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/.golden/czechHelloParagraph/golden b/.golden/czechHelloParagraph/golden index 009d0e6..2178d0e 100644 --- a/.golden/czechHelloParagraph/golden +++ b/.golden/czechHelloParagraph/golden @@ -1,5 +1,5 @@ -ParagraphLayout {paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = 0}, spanLayouts = [ - SpanLayout [Fragment {fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = 0}, fragmentPen = (0,0), fragmentGlyphs = +ParagraphLayout {paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = 1121}, spanLayouts = [ + SpanLayout [Fragment {fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 5274, y_size = 1121}, fragmentPen = (0,189), fragmentGlyphs = [(GlyphInfo {codepoint = 36, cluster = 0, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 663, y_advance = 0, x_offset = 0, y_offset = 0}), (GlyphInfo {codepoint = 75, cluster = 1, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 571, y_advance = 0, x_offset = 0, y_offset = 0}), (GlyphInfo {codepoint = 82, cluster = 2, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 590, y_advance = 0, x_offset = 0, y_offset = 0}), diff --git a/.golden/mixedLanguageLTRParagraph/golden b/.golden/mixedLanguageLTRParagraph/golden index f84c1f9..ff94fc6 100644 --- a/.golden/mixedLanguageLTRParagraph/golden +++ b/.golden/mixedLanguageLTRParagraph/golden @@ -1,5 +1,5 @@ -ParagraphLayout {paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 6113, y_size = 0}, spanLayouts = [ - SpanLayout [Fragment {fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = 0}, fragmentPen = (0,0), fragmentGlyphs = +ParagraphLayout {paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 6113, y_size = 1121}, spanLayouts = [ + SpanLayout [Fragment {fragmentRect = Rect {x_origin = 0, y_origin = 0, x_size = 4837, y_size = 1121}, fragmentPen = (0,189), fragmentGlyphs = [(GlyphInfo {codepoint = 77, cluster = 4, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 253, y_advance = 0, x_offset = 0, y_offset = 0}), (GlyphInfo {codepoint = 86, cluster = 5, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 446, y_advance = 0, x_offset = 0, y_offset = 0}), (GlyphInfo {codepoint = 72, cluster = 6, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 559, y_advance = 0, x_offset = 0, y_offset = 0}), @@ -12,7 +12,7 @@ ParagraphLayout {paragraphRect = Rect {x_origin = 0, y_origin = 0, x_size = 6113 (GlyphInfo {codepoint = 15, cluster = 13, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 246, y_advance = 0, x_offset = 0, y_offset = 0}), (GlyphInfo {codepoint = 3, cluster = 14, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 231, y_advance = 0, x_offset = 0, y_offset = 0})] }], - SpanLayout [Fragment {fragmentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = 0}, fragmentPen = (0,0), fragmentGlyphs = + SpanLayout [Fragment {fragmentRect = Rect {x_origin = 4837, y_origin = 0, x_size = 1276, y_size = 1121}, fragmentPen = (0,189), fragmentGlyphs = [(GlyphInfo {codepoint = 0, cluster = 15, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 500, y_advance = 0, x_offset = 0, y_offset = 0}), (GlyphInfo {codepoint = 0, cluster = 18, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 500, y_advance = 0, x_offset = 0, y_offset = 0}), (GlyphInfo {codepoint = 4, cluster = 21, unsafeToBreak = False, unsafeToConcat = False, safeToInsertTatweel = False},GlyphPos {x_advance = 276, y_advance = 0, x_offset = 0, y_offset = 0})] diff --git a/src/Data/Text/ParagraphLayout/Plain.hs b/src/Data/Text/ParagraphLayout/Plain.hs index 0807767..7e87b00 100644 --- a/src/Data/Text/ParagraphLayout/Plain.hs +++ b/src/Data/Text/ParagraphLayout/Plain.hs @@ -28,8 +28,10 @@ import Data.Text.Glyphize (Buffer(..) ,ContentType(ContentTypeUnicode) ,Font - ,GlyphPos(x_advance, y_advance) + ,FontExtents(..) + ,GlyphPos(x_advance) ,defaultBuffer + ,fontExtentsForDir ,shape ) import Data.Text.Internal (Text(Text)) @@ -101,12 +103,12 @@ base = Rect 0 0 0 0 containRects :: (Ord a, Num a) => [Rect a] -> Rect a containRects = foldr union base -containGlyphs :: [GlyphPos] -> Rect Int32 -containGlyphs ps = Rect +containGlyphsH :: Int32 -> [GlyphPos] -> Rect Int32 +containGlyphsH lineHeight ps = Rect { x_origin = 0 , y_origin = 0 , x_size = sum $ map x_advance ps - , y_size = sum $ map y_advance ps -- TODO add line height + , y_size = lineHeight } -- | Interface for basic plain text layout. @@ -130,21 +132,29 @@ layoutSpan rs = SpanLayout (map layoutRun $ spanToRuns rs) -- TODO: Calculate line height and pen position. layoutRun :: Run -> Fragment -layoutRun run = Fragment rect (0, 0) glyphs +layoutRun run = Fragment rect (penX, penY) glyphs where - rs = runOriginalSpan run - rect = containGlyphs $ map snd $ glyphs + rect = containGlyphsH lineHeight $ map snd $ glyphs + -- TODO: Add half-leadings as required by ParagraphOptions. + penX = 0 -- for horizontal text + penY = descent + lineHeight = ascent + descent + ascent = ascender extents + descent = - descender extents + extents = fontExtentsForDir font dir glyphs = shape font buffer features font = RS.spanFont rs -- TODO: Set beginsText / endsText. buffer = defaultBuffer { text = Lazy.fromStrict $ runText run , contentType = Just ContentTypeUnicode - , direction = runDirection run + , direction = dir , script = runScript run , language = Just $ RS.spanLanguage rs } features = [] + dir = runDirection run + rs = runOriginalSpan run resolveSpans :: Paragraph -> [RS.ResolvedSpan] resolveSpans (Paragraph arr off spans opts) = map resolve $ zip spans texts -- 2.30.2