@@ 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}),
@@ 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})]
@@ 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