module Data.Text.ParagraphLayout.Internal.ProtoFragment ( ProtoFragment (direction, verticalOffsets, advance, glyphs, hardBreak) , protoFragmentH , mapVerticalOffsets ) where import Data.Int (Int32) import Data.Text.Glyphize (Direction (..), GlyphInfo, GlyphPos (x_advance)) import qualified Data.Text.ParagraphLayout.Internal.BiDiLevels as BiDi import qualified Data.Text.ParagraphLayout.Internal.VerticalOffsets as VO -- | A box fragment which has not been positioned yet. data ProtoFragment = ProtoFragment { direction :: Direction -- ^ Text direction, which is constant within a fragment. , level :: BiDi.Level -- ^ BiDi embedding level. -- Should be even for LTR fragments and odd for RTL fragments. , verticalOffsets :: VO.VerticalOffsets -- ^ Vertical offsets used for aligning the fragment within its line. , advance :: Int32 -- ^ 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 -> VO.VerticalOffsets -> [(GlyphInfo, GlyphPos)] -> Bool -> ProtoFragment protoFragmentH dir lvl vo gs hard = ProtoFragment dir lvl vo adv gs hard where adv = sum $ map (x_advance . snd) gs -- | Apply the given function to the `verticalOffsets` in the given fragment. mapVerticalOffsets :: (VO.VerticalOffsets -> VO.VerticalOffsets) -> ProtoFragment -> ProtoFragment mapVerticalOffsets mapFunc pf = pf { verticalOffsets = mapFunc $ verticalOffsets pf } instance BiDi.WithLevel ProtoFragment where level = level -- BiDi.level = ProtoFragment.level