{-# LANGUAGE OverloadedStrings, RecordWildCards, StandaloneDeriving #-}
-- | Generic layout logic, handling a hierarchy of varying formulas.
-- Unless callers have more specific needs they probably wish to use this abstraction.
-- Attempts to follow the CSS specs.
-- See `boxLayout` for a main entrypoint,
-- & `Graphics.Layout.CSS` to receive CSS input.
module Graphics.Layout(LayoutItem(..), UserData,
        layoutGetBox, layoutGetChilds, layoutGetInner,
        boxMinWidth, boxMaxWidth, boxNatWidth, boxWidth,
        boxNatHeight, boxMinHeight, boxMaxHeight, boxHeight,
        boxSplit, boxPaginate, boxPosition, boxLayout,
        glyphs, codepoints, fragmentFont, glyphsPerFont) where

import Data.Text.ParagraphLayout.Rich (Paragraph(..), ParagraphOptions(..),
                                ParagraphLayout(..), layoutRich)
import Data.Text.ParagraphLayout (paginate, PageContinuity(..), PageOptions(..))
import Stylist (PropertyParser(temp))
import Control.Parallel.Strategies
import Control.DeepSeq (NFData(..))

import Graphics.Layout.Box as B
import Graphics.Layout.Grid as G
import Graphics.Layout.Flow as F
import Graphics.Layout.Inline as I
import Graphics.Layout.CSS.Font (Font'(..))
import Graphics.Layout.Flex as Fl

import Data.Maybe (fromMaybe)

-- To gather glyphs for atlases.
import qualified Data.IntSet as IS
import qualified Data.Map.Strict as M
import qualified Data.Text.Glyphize as Hb
import Graphics.Text.Font.Choose (Pattern)

-- For comparisons
import Data.Array.Byte (ByteArray(..))
import Data.Text.Array (Array(..))
import Unsafe.Coerce (unsafeCoerce)

-- | Additional data routed through Balkon.
type UserData m n x = ((Font', Int), Either (PaddedBox m n) (LayoutItem m n x), x)

-- | A tree of different layout algorithms.
-- More to come...
data LayoutItem m n x =
    -- | A block element. With margins, borders, & padding.
    LayoutFlow x (PaddedBox m n) [LayoutItem m n x]
    -- | A grid or table element.
    | LayoutGrid x (Grid m n) [GridItem] [LayoutItem m n x]
    -- | Some richtext. (Balkón holds children)
    | LayoutInline x (Paragraph (UserData m n x)) PageOptions
    -- | Results laying out richtext, has fixed width.
    -- Generated from `LayoutInline` for the sake of pagination.
    | LayoutInline' x (ParagraphLayout (UserData m n x)) PageOptions
    -- | A branch with constant bounding box.
    -- Generated from `LayoutInline` when attaching position info.
    | LayoutConst x (PaddedBox m n) [LayoutItem m n x]
    -- | Children of a `LayoutInline` or `LayoutInline'`.
    | LayoutSpan (FragmentTree (UserData m n x))
    | LayoutFlex x (Flex (LayoutItem m n x) m)
    deriving (Int -> LayoutItem m n x -> ShowS
[LayoutItem m n x] -> ShowS
LayoutItem m n x -> String
(Int -> LayoutItem m n x -> ShowS)
-> (LayoutItem m n x -> String)
-> ([LayoutItem m n x] -> ShowS)
-> Show (LayoutItem m n x)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall m n x.
(Show n, Show m, Show x) =>
Int -> LayoutItem m n x -> ShowS
forall m n x.
(Show n, Show m, Show x) =>
[LayoutItem m n x] -> ShowS
forall m n x.
(Show n, Show m, Show x) =>
LayoutItem m n x -> String
$cshowsPrec :: forall m n x.
(Show n, Show m, Show x) =>
Int -> LayoutItem m n x -> ShowS
showsPrec :: Int -> LayoutItem m n x -> ShowS
$cshow :: forall m n x.
(Show n, Show m, Show x) =>
LayoutItem m n x -> String
show :: LayoutItem m n x -> String
$cshowList :: forall m n x.
(Show n, Show m, Show x) =>
[LayoutItem m n x] -> ShowS
showList :: [LayoutItem m n x] -> ShowS
Show, LayoutItem m n x -> LayoutItem m n x -> Bool
(LayoutItem m n x -> LayoutItem m n x -> Bool)
-> (LayoutItem m n x -> LayoutItem m n x -> Bool)
-> Eq (LayoutItem m n x)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall m n x.
(Eq n, Eq m, Eq x) =>
LayoutItem m n x -> LayoutItem m n x -> Bool
$c== :: forall m n x.
(Eq n, Eq m, Eq x) =>
LayoutItem m n x -> LayoutItem m n x -> Bool
== :: LayoutItem m n x -> LayoutItem m n x -> Bool
$c/= :: forall m n x.
(Eq n, Eq m, Eq x) =>
LayoutItem m n x -> LayoutItem m n x -> Bool
/= :: LayoutItem m n x -> LayoutItem m n x -> Bool
Eq)
-- | An empty box.
nullLayout :: (PropertyParser x, Zero m, Zero n) => LayoutItem m n x
nullLayout :: forall x m n.
(PropertyParser x, Zero m, Zero n) =>
LayoutItem m n x
nullLayout = x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
forall a. PropertyParser a => a
temp PaddedBox m n
forall a. Zero a => a
zero []

instance (Zero m, CastDouble m, NFData m, Zero n, CastDouble n, NFData n) =>
        NFData (LayoutItem m n x) where
    rnf :: LayoutItem m n x -> ()
rnf = PaddedBox m n -> ()
forall a. NFData a => a -> ()
rnf (PaddedBox m n -> ())
-> (LayoutItem m n x -> PaddedBox m n) -> LayoutItem m n x -> ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox -- Avoid auxiliary properties that don't cleanly `rnf`

-- | Retrieve the surrounding box for a layout item.
layoutGetBox, b :: (Zero m, Zero n, CastDouble m, CastDouble n) =>
        LayoutItem m n x -> PaddedBox m n
layoutGetBox :: forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox (LayoutFlow x
_ PaddedBox m n
ret [LayoutItem m n x]
_) = PaddedBox m n
ret
layoutGetBox (LayoutGrid x
_ Grid m n
self [GridItem]
_ [LayoutItem m n x]
_) = PaddedBox m n
forall a. Zero a => a
zero {
    min :: Size m n
B.min = n -> m -> Size m n
forall m n. n -> m -> Size m n
Size (Double -> n
forall a. CastDouble a => Double -> a
fromDouble (Double -> n) -> Double -> n
forall a b. (a -> b) -> a -> b
$ (n -> Double) -> Track n -> Double
forall n. (n -> Double) -> Track n -> Double
trackMin n -> Double
forall a. CastDouble a => a -> Double
toDouble (Track n -> Double) -> Track n -> Double
forall a b. (a -> b) -> a -> b
$ Grid m n -> Track n
forall m n. Size m n -> n
inline Grid m n
self)
            (Double -> m
forall a. CastDouble a => Double -> a
fromDouble (Double -> m) -> Double -> m
forall a b. (a -> b) -> a -> b
$ (m -> Double) -> Track m -> Double
forall n. (n -> Double) -> Track n -> Double
trackMin m -> Double
forall a. CastDouble a => a -> Double
toDouble (Track m -> Double) -> Track m -> Double
forall a b. (a -> b) -> a -> b
$ Grid m n -> Track m
forall m n. Size m n -> m
block Grid m n
self),
    size :: Size m n
B.size = n -> m -> Size m n
forall m n. n -> m -> Size m n
Size (Double -> n
forall a. CastDouble a => Double -> a
fromDouble (Double -> n) -> Double -> n
forall a b. (a -> b) -> a -> b
$ (n -> Double) -> Track n -> Double
forall n. (n -> Double) -> Track n -> Double
trackNat n -> Double
forall a. CastDouble a => a -> Double
toDouble (Track n -> Double) -> Track n -> Double
forall a b. (a -> b) -> a -> b
$ Grid m n -> Track n
forall m n. Size m n -> n
inline Grid m n
self)
            (Double -> m
forall a. CastDouble a => Double -> a
fromDouble (Double -> m) -> Double -> m
forall a b. (a -> b) -> a -> b
$ (m -> Double) -> Track m -> Double
forall n. (n -> Double) -> Track n -> Double
trackNat m -> Double
forall a. CastDouble a => a -> Double
toDouble (Track m -> Double) -> Track m -> Double
forall a b. (a -> b) -> a -> b
$ Grid m n -> Track m
forall m n. Size m n -> m
block Grid m n
self),
    max :: Size m n
B.max = n -> m -> Size m n
forall m n. n -> m -> Size m n
Size (Double -> n
forall a. CastDouble a => Double -> a
fromDouble (Double -> n) -> Double -> n
forall a b. (a -> b) -> a -> b
$ (n -> Double) -> Track n -> Double
forall n. (n -> Double) -> Track n -> Double
trackNat n -> Double
forall a. CastDouble a => a -> Double
toDouble (Track n -> Double) -> Track n -> Double
forall a b. (a -> b) -> a -> b
$ Grid m n -> Track n
forall m n. Size m n -> n
inline Grid m n
self)
            (Double -> m
forall a. CastDouble a => Double -> a
fromDouble (Double -> m) -> Double -> m
forall a b. (a -> b) -> a -> b
$ (m -> Double) -> Track m -> Double
forall n. (n -> Double) -> Track n -> Double
trackNat m -> Double
forall a. CastDouble a => a -> Double
toDouble (Track m -> Double) -> Track m -> Double
forall a b. (a -> b) -> a -> b
$ Grid m n -> Track m
forall m n. Size m n -> m
block Grid m n
self)
}
layoutGetBox (LayoutInline x
_ Paragraph (UserData m n x)
self PageOptions
_) = PaddedBox m n
forall a. Zero a => a
zero {
    min :: Size m n
B.min = (LayoutItem m n x -> PaddedBox m n)
-> Paragraph (UserData m n x) -> Size m n
forall x y z a c.
(CastDouble x, CastDouble y) =>
(z -> PaddedBox x y)
-> Paragraph (a, Either (PaddedBox x y) z, c) -> Size x y
inlineMin LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
b Paragraph (UserData m n x)
self, size :: Size m n
B.size = (LayoutItem m n x -> PaddedBox m n)
-> Paragraph (UserData m n x) -> Size m n
forall x y z a c.
(CastDouble x, CastDouble y) =>
(z -> PaddedBox x y)
-> Paragraph (a, Either (PaddedBox x y) z, c) -> Size x y
inlineSize LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
b Paragraph (UserData m n x)
self, max :: Size m n
B.max = (LayoutItem m n x -> PaddedBox m n)
-> Paragraph (UserData m n x) -> Size m n
forall x y z a c.
(CastDouble x, CastDouble y) =>
(z -> PaddedBox x y)
-> Paragraph (a, Either (PaddedBox x y) z, c) -> Size x y
inlineSize LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
b Paragraph (UserData m n x)
self
  }
layoutGetBox (LayoutInline' x
_ ParagraphLayout (UserData m n x)
self PageOptions
_) = PaddedBox m n
forall a. Zero a => a
zero {
    min :: Size m n
B.min = ParagraphLayout (UserData m n x) -> Size m n
forall x y a.
(CastDouble x, CastDouble y) =>
ParagraphLayout a -> Size x y
layoutSize ParagraphLayout (UserData m n x)
self, size :: Size m n
B.size = ParagraphLayout (UserData m n x) -> Size m n
forall x y a.
(CastDouble x, CastDouble y) =>
ParagraphLayout a -> Size x y
layoutSize ParagraphLayout (UserData m n x)
self, max :: Size m n
B.max = ParagraphLayout (UserData m n x) -> Size m n
forall x y a.
(CastDouble x, CastDouble y) =>
ParagraphLayout a -> Size x y
layoutSize ParagraphLayout (UserData m n x)
self
}
layoutGetBox (LayoutSpan FragmentTree (UserData m n x)
self) = FragmentTree ((Font', Int), PaddedBox m n, x) -> PaddedBox m n
forall m n a c.
(CastDouble m, CastDouble n) =>
FragmentTree (a, PaddedBox m n, c) -> PaddedBox m n
treeBox (FragmentTree ((Font', Int), PaddedBox m n, x) -> PaddedBox m n)
-> FragmentTree ((Font', Int), PaddedBox m n, x) -> PaddedBox m n
forall a b. (a -> b) -> a -> b
$ (Either (PaddedBox m n) (LayoutItem m n x) -> PaddedBox m n)
-> FragmentTree (UserData m n x)
-> FragmentTree ((Font', Int), PaddedBox m n, x)
forall b b' a c.
(b -> b') -> FragmentTree (a, b, c) -> FragmentTree (a, b', c)
treeMap Either (PaddedBox m n) (LayoutItem m n x) -> PaddedBox m n
forall {m} {n} {x}.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
Either (PaddedBox m n) (LayoutItem m n x) -> PaddedBox m n
layoutGetBoxRight FragmentTree (UserData m n x)
self
layoutGetBox (LayoutConst x
_ PaddedBox m n
ret [LayoutItem m n x]
_) = PaddedBox m n
ret
layoutGetBox (LayoutFlex x
_ Flex (LayoutItem m n x) m
self) = (LayoutItem m n x -> PaddedBox Double Double)
-> Flex (LayoutItem m n x) m -> PaddedBox m n
forall m n a.
(Zero m, CastDouble m, Zero n, CastDouble n) =>
(a -> PaddedBox Double Double) -> Flex a m -> PaddedBox m n
flexGetBox LayoutItem m n x -> PaddedBox Double Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox Double Double
layoutGetBox' Flex (LayoutItem m n x) m
self

b :: forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
b = LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox
layoutGetBoxRight :: Either (PaddedBox m n) (LayoutItem m n x) -> PaddedBox m n
layoutGetBoxRight (Right LayoutItem m n x
self) = LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem m n x
self
layoutGetBoxRight (Left PaddedBox m n
ret) = PaddedBox m n
ret

layoutGetBox' :: (Zero m, Zero n, CastDouble m, CastDouble n) =>
        LayoutItem m n x -> PaddedBox Double Double
layoutGetBox' :: forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox Double Double
layoutGetBox' = (n -> Double) -> PaddedBox Double n -> PaddedBox Double Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' n -> Double
forall a. CastDouble a => a -> Double
toDouble (PaddedBox Double n -> PaddedBox Double Double)
-> (LayoutItem m n x -> PaddedBox Double n)
-> LayoutItem m n x
-> PaddedBox Double Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (m -> Double) -> PaddedBox m n -> PaddedBox Double n
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' m -> Double
forall a. CastDouble a => a -> Double
toDouble (PaddedBox m n -> PaddedBox Double n)
-> (LayoutItem m n x -> PaddedBox m n)
-> LayoutItem m n x
-> PaddedBox Double n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox
-- | Retrieve the subtree under a node.
layoutGetChilds :: LayoutItem b n x -> [LayoutItem b n x]
layoutGetChilds (LayoutFlow x
_ PaddedBox b n
_ [LayoutItem b n x]
ret) = [LayoutItem b n x]
ret
layoutGetChilds (LayoutGrid x
_ Grid b n
_ [GridItem]
_ [LayoutItem b n x]
ret) = [LayoutItem b n x]
ret
layoutGetChilds (LayoutSpan (Leaf Fragment (UserData b n x)
_)) = []
layoutGetChilds (LayoutSpan (Branch AncestorBox (UserData b n x)
_ [FragmentTree (UserData b n x)]
ret)) = (FragmentTree (UserData b n x) -> LayoutItem b n x)
-> [FragmentTree (UserData b n x)] -> [LayoutItem b n x]
forall a b. (a -> b) -> [a] -> [b]
map FragmentTree (UserData b n x) -> LayoutItem b n x
forall m n x. FragmentTree (UserData m n x) -> LayoutItem m n x
LayoutSpan [FragmentTree (UserData b n x)]
ret
layoutGetChilds (LayoutInline x
_ Paragraph (UserData b n x)
self PageOptions
_) = (FragmentTree (UserData b n x) -> LayoutItem b n x)
-> [FragmentTree (UserData b n x)] -> [LayoutItem b n x]
forall a b. (a -> b) -> [a] -> [b]
map FragmentTree (UserData b n x) -> LayoutItem b n x
forall m n x. FragmentTree (UserData m n x) -> LayoutItem m n x
LayoutSpan ([FragmentTree (UserData b n x)] -> [LayoutItem b n x])
-> [FragmentTree (UserData b n x)] -> [LayoutItem b n x]
forall a b. (a -> b) -> a -> b
$ (LayoutItem b n x -> PaddedBox b n)
-> Paragraph (UserData b n x) -> [FragmentTree (UserData b n x)]
forall x y a c z.
(CastDouble x, CastDouble y, Eq x, Eq y, Eq a, Eq c, Eq z) =>
(z -> PaddedBox x y)
-> Paragraph (a, Either (PaddedBox x y) z, c)
-> [FragmentTree (a, Either (PaddedBox x y) z, c)]
inlineChildren LayoutItem b n x -> PaddedBox b n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
b Paragraph (UserData b n x)
self
layoutGetChilds (LayoutInline' x
_ ParagraphLayout (UserData b n x)
self PageOptions
_) = (FragmentTree (UserData b n x) -> LayoutItem b n x)
-> [FragmentTree (UserData b n x)] -> [LayoutItem b n x]
forall a b. (a -> b) -> [a] -> [b]
map FragmentTree (UserData b n x) -> LayoutItem b n x
forall m n x. FragmentTree (UserData m n x) -> LayoutItem m n x
LayoutSpan ([FragmentTree (UserData b n x)] -> [LayoutItem b n x])
-> [FragmentTree (UserData b n x)] -> [LayoutItem b n x]
forall a b. (a -> b) -> a -> b
$ ParagraphLayout (UserData b n x) -> [FragmentTree (UserData b n x)]
forall a. Eq a => ParagraphLayout a -> [FragmentTree a]
layoutChildren ParagraphLayout (UserData b n x)
self
layoutGetChilds (LayoutConst x
_ PaddedBox b n
_ [LayoutItem b n x]
childs) = [LayoutItem b n x]
childs
layoutGetChilds (LayoutFlex x
_ Flex (LayoutItem b n x) b
x) = (FlexChild (LayoutItem b n x) b -> LayoutItem b n x)
-> [FlexChild (LayoutItem b n x) b] -> [LayoutItem b n x]
forall a b. (a -> b) -> [a] -> [b]
map FlexChild (LayoutItem b n x) b -> LayoutItem b n x
forall a b. FlexChild a b -> a
Fl.flexInner ([FlexChild (LayoutItem b n x) b] -> [LayoutItem b n x])
-> [FlexChild (LayoutItem b n x) b] -> [LayoutItem b n x]
forall a b. (a -> b) -> a -> b
$ [[FlexChild (LayoutItem b n x) b]]
-> [FlexChild (LayoutItem b n x) b]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[FlexChild (LayoutItem b n x) b]]
 -> [FlexChild (LayoutItem b n x) b])
-> [[FlexChild (LayoutItem b n x) b]]
-> [FlexChild (LayoutItem b n x) b]
forall a b. (a -> b) -> a -> b
$ Flex (LayoutItem b n x) b -> [[FlexChild (LayoutItem b n x) b]]
forall a b. Flex a b -> [[FlexChild a b]]
Fl.children Flex (LayoutItem b n x) b
x
-- | Retrieve the caller-specified data attached to a layout node.
layoutGetInner :: LayoutItem m n x -> x
layoutGetInner (LayoutFlow x
ret PaddedBox m n
_ [LayoutItem m n x]
_) = x
ret
layoutGetInner (LayoutGrid x
ret Grid m n
_ [GridItem]
_ [LayoutItem m n x]
_) = x
ret
layoutGetInner (LayoutInline x
ret Paragraph (UserData m n x)
_ PageOptions
_) = x
ret
layoutGetInner (LayoutInline' x
ret ParagraphLayout (UserData m n x)
_ PageOptions
_) = x
ret
layoutGetInner (LayoutConst x
ret PaddedBox m n
_ [LayoutItem m n x]
_) = x
ret
layoutGetInner (LayoutSpan FragmentTree (UserData m n x)
x) = FragmentTree (UserData m n x) -> x
forall a b c. FragmentTree (a, b, c) -> c
treeInner FragmentTree (UserData m n x)
x
layoutGetInner (LayoutFlex x
ret Flex (LayoutItem m n x) m
_ ) = x
ret

-- | Retrieve the font associated with inline layout.
fragmentFont :: FragmentTree (a, b, c) -> a
fragmentFont FragmentTree (a, b, c)
x = let (a
ret, b
_, c
_) = FragmentTree (a, b, c) -> (a, b, c)
forall a. FragmentTree a -> a
treeInner' FragmentTree (a, b, c)
x in a
ret

-- | map-ready wrapper around `setCellBox` sourcing from a child node.
setCellBox' :: (LayoutItem m n x, GridItem) -> GridItem
setCellBox' (LayoutItem m n x
child, GridItem
cell) = GridItem -> PaddedBox m n -> GridItem
forall m n.
(CastDouble m, CastDouble n) =>
GridItem -> PaddedBox m n -> GridItem
setCellBox GridItem
cell (PaddedBox m n -> GridItem) -> PaddedBox m n -> GridItem
forall a b. (a -> b) -> a -> b
$ LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem m n x
child

-- | Update a (sub)tree to compute & cache minimum legible sizes.
boxMinWidth :: (Zero y, CastDouble y, NFData y) =>
        Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxMinWidth :: forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxMinWidth Maybe Double
parent (LayoutFlow x
val PaddedBox y Length
self [LayoutItem y Length x]
childs) = x
-> PaddedBox y Length
-> [LayoutItem y Length x]
-> LayoutItem y Length x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox y Length
self' [LayoutItem y Length x]
childs'
  where
    self' :: PaddedBox y Length
self' = PaddedBox y Length
self { min :: Size y Length
B.min = (Length -> Length) -> Size y Length -> Size y Length
forall n nn m. (n -> nn) -> Size m n -> Size m nn
mapSizeX (Double -> Length -> Length
B.mapAuto Double
min') (PaddedBox y Length -> Size y Length
forall m n. PaddedBox m n -> Size m n
B.min PaddedBox y Length
self) }
    min' :: Double
min' = Double -> PaddedBox y Length -> [PaddedBox y Double] -> Double
forall a b.
Double -> PaddedBox a Length -> [PaddedBox b Double] -> Double
flowMinWidth Double
parent' PaddedBox y Length
self [PaddedBox y Double]
childs''
    childs'' :: [PaddedBox y Double]
childs'' = (PaddedBox y Length -> PaddedBox y Double)
-> [PaddedBox y Length] -> [PaddedBox y Double]
forall a b. (a -> b) -> [a] -> [b]
map ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double)
-> (Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength Double
selfWidth) ([PaddedBox y Length] -> [PaddedBox y Double])
-> [PaddedBox y Length] -> [PaddedBox y Double]
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> PaddedBox y Length)
-> [LayoutItem y Length x] -> [PaddedBox y Length]
forall a b. (a -> b) -> [a] -> [b]
map LayoutItem y Length x -> PaddedBox y Length
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox [LayoutItem y Length x]
childs'
    childs' :: [LayoutItem y Length x]
childs' = (LayoutItem y Length x -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> [LayoutItem y Length x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxMinWidth (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x)
-> Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ Double -> Maybe Double
forall a. a -> Maybe a
Just Double
selfWidth) [LayoutItem y Length x]
childs
    selfWidth :: Double
selfWidth = PaddedBox y Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
width (PaddedBox y Double -> Double) -> PaddedBox y Double -> Double
forall a b. (a -> b) -> a -> b
$ (Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' (Double -> Length -> Double
lowerLength Double
parent') PaddedBox y Length
self
    parent' :: Double
parent' = Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe Double
0 Maybe Double
parent
boxMinWidth Maybe Double
parent (LayoutGrid x
val Grid y Length
self [GridItem]
cells0 [LayoutItem y Length x]
childs) = x
-> Grid y Length
-> [GridItem]
-> [LayoutItem y Length x]
-> LayoutItem y Length x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
val Grid y Length
self' [GridItem]
cells' [LayoutItem y Length x]
childs'
  where
    self' :: Grid y Length
self' = Track Length -> Track y -> Grid y Length
forall m n. n -> m -> Size m n
Size (Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self) { trackMins :: [Double]
trackMins = [Double]
cells } (Grid y Length -> Track y
forall m n. Size m n -> m
block Grid y Length
self)
    cells :: [Double]
cells = Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackMins Double
parent' (Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self) ([GridItem'] -> [Double]) -> [GridItem'] -> [Double]
forall a b. (a -> b) -> a -> b
$ (GridItem -> GridItem') -> [GridItem] -> [GridItem']
forall a b. (a -> b) -> [a] -> [b]
map GridItem -> GridItem'
forall m n. Size m n -> n
inline [GridItem]
cells'
    cells' :: [GridItem]
cells' = ((LayoutItem y Length x, GridItem) -> GridItem)
-> [(LayoutItem y Length x, GridItem)] -> [GridItem]
forall a b. (a -> b) -> [a] -> [b]
map (LayoutItem y Length x, GridItem) -> GridItem
forall {m} {n} {x}.
(CastDouble m, CastDouble n, Zero m, Zero n) =>
(LayoutItem m n x, GridItem) -> GridItem
setCellBox' ([(LayoutItem y Length x, GridItem)] -> [GridItem])
-> [(LayoutItem y Length x, GridItem)] -> [GridItem]
forall a b. (a -> b) -> a -> b
$ [LayoutItem y Length x]
-> [GridItem] -> [(LayoutItem y Length x, GridItem)]
forall a b. [a] -> [b] -> [(a, b)]
zip [LayoutItem y Length x]
childs' [GridItem]
cells0 -- Flatten subgrids
    childs'' :: [PaddedBox y Double]
childs'' = (PaddedBox y Length -> PaddedBox y Double)
-> [PaddedBox y Length] -> [PaddedBox y Double]
forall a b. (a -> b) -> [a] -> [b]
map ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double)
-> (Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength Double
selfWidth) ([PaddedBox y Length] -> [PaddedBox y Double])
-> [PaddedBox y Length] -> [PaddedBox y Double]
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> PaddedBox y Length)
-> [LayoutItem y Length x] -> [PaddedBox y Length]
forall a b. (a -> b) -> [a] -> [b]
map LayoutItem y Length x -> PaddedBox y Length
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox [LayoutItem y Length x]
childs'
    childs' :: [LayoutItem y Length x]
childs' = (LayoutItem y Length x -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> [LayoutItem y Length x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxMinWidth (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x)
-> Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ Double -> Maybe Double
forall a. a -> Maybe a
Just Double
selfWidth) [LayoutItem y Length x]
childs
    selfWidth :: Double
selfWidth = (Length -> Double) -> Track Length -> Double
forall n. (n -> Double) -> Track n -> Double
trackNat (Double -> Length -> Double
lowerLength Double
parent') (Track Length -> Double) -> Track Length -> Double
forall a b. (a -> b) -> a -> b
$ Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self
    parent' :: Double
parent' = Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe (Grid y Length -> [GridItem] -> Double
forall y. Grid y Length -> [GridItem] -> Double
gridEstWidth Grid y Length
self [GridItem]
cells0) Maybe Double
parent
    zeroBox :: PaddedBox Double Double
    zeroBox :: PaddedBox Double Double
zeroBox = PaddedBox Double Double
forall a. Zero a => a
zero
boxMinWidth Maybe Double
_ self :: LayoutItem y Length x
self@(LayoutInline x
_ Paragraph (UserData y Length x)
_ PageOptions
_) = LayoutItem y Length x
self
boxMinWidth Maybe Double
_ self :: LayoutItem y Length x
self@(LayoutInline' x
_ ParagraphLayout (UserData y Length x)
_ PageOptions
_) = LayoutItem y Length x
self
boxMinWidth Maybe Double
_ (LayoutConst x
val PaddedBox y Length
self' [LayoutItem y Length x]
childs) =
    x
-> PaddedBox y Length
-> [LayoutItem y Length x]
-> LayoutItem y Length x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst x
val PaddedBox y Length
self' ([LayoutItem y Length x] -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> [LayoutItem y Length x]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxMinWidth Maybe Double
forall a. Maybe a
Nothing) [LayoutItem y Length x]
childs
boxMinWidth Maybe Double
_ self :: LayoutItem y Length x
self@(LayoutSpan FragmentTree (UserData y Length x)
_) = LayoutItem y Length x
self
boxMinWidth Maybe Double
size self :: LayoutItem y Length x
self@(LayoutFlex x
a Flex (LayoutItem y Length x) y
b) = x -> Flex (LayoutItem y Length x) y -> LayoutItem y Length x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a (Flex (LayoutItem y Length x) y -> LayoutItem y Length x)
-> Flex (LayoutItem y Length x) y -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> LayoutItem y Length x)
-> Flex (LayoutItem y Length x) y -> Flex (LayoutItem y Length x) y
forall a b c. (a -> b) -> Flex a c -> Flex b c
flexMap (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxMinWidth Maybe Double
size) Flex (LayoutItem y Length x) y
b
-- | Update a (sub)tree to compute & cache ideal width.
boxNatWidth :: (Zero y, CastDouble y, NFData y) =>
        Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxNatWidth :: forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxNatWidth Maybe Double
parent (LayoutFlow x
val PaddedBox y Length
self [LayoutItem y Length x]
childs) = x
-> PaddedBox y Length
-> [LayoutItem y Length x]
-> LayoutItem y Length x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox y Length
self' [LayoutItem y Length x]
childs'
  where
    self' :: PaddedBox y Length
self' = PaddedBox y Length
self { nat :: Size Double Double
B.nat = Double -> Double -> Size Double Double
forall m n. n -> m -> Size m n
Size Double
size' (Double -> Size Double Double) -> Double -> Size Double Double
forall a b. (a -> b) -> a -> b
$ Size Double Double -> Double
forall m n. Size m n -> m
block (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox y Length -> Size Double Double
forall m n. PaddedBox m n -> Size Double Double
B.nat PaddedBox y Length
self }
    size' :: Double
size' = Double -> PaddedBox y Length -> [PaddedBox y Double] -> Double
forall a b.
Double -> PaddedBox a Length -> [PaddedBox b Double] -> Double
flowNatWidth Double
parent' PaddedBox y Length
self [PaddedBox y Double]
childs''
    childs'' :: [PaddedBox y Double]
childs'' = (PaddedBox y Length -> PaddedBox y Double)
-> [PaddedBox y Length] -> [PaddedBox y Double]
forall a b. (a -> b) -> [a] -> [b]
map ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double)
-> (Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength Double
selfWidth) ([PaddedBox y Length] -> [PaddedBox y Double])
-> [PaddedBox y Length] -> [PaddedBox y Double]
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> PaddedBox y Length)
-> [LayoutItem y Length x] -> [PaddedBox y Length]
forall a b. (a -> b) -> [a] -> [b]
map LayoutItem y Length x -> PaddedBox y Length
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox [LayoutItem y Length x]
childs'
    childs' :: [LayoutItem y Length x]
childs' = (LayoutItem y Length x -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> [LayoutItem y Length x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxNatWidth (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x)
-> Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ Double -> Maybe Double
forall a. a -> Maybe a
Just Double
selfWidth) [LayoutItem y Length x]
childs
    selfWidth :: Double
selfWidth = PaddedBox y Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
width (PaddedBox y Double -> Double) -> PaddedBox y Double -> Double
forall a b. (a -> b) -> a -> b
$ (Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' (Double -> Length -> Double
lowerLength Double
parent') PaddedBox y Length
self
    parent' :: Double
parent' = Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe Double
0 Maybe Double
parent
boxNatWidth Maybe Double
parent (LayoutGrid x
val Grid y Length
self [GridItem]
cells0 [LayoutItem y Length x]
childs) = x
-> Grid y Length
-> [GridItem]
-> [LayoutItem y Length x]
-> LayoutItem y Length x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
val Grid y Length
self' [GridItem]
cells' [LayoutItem y Length x]
childs'
  where
    self' :: Grid y Length
self' = Track Length -> Track y -> Grid y Length
forall m n. n -> m -> Size m n
Size (Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self) { trackNats :: [Double]
trackNats = [Double]
cells } (Grid y Length -> Track y
forall m n. Size m n -> m
block Grid y Length
self)
    cells :: [Double]
cells = Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackNats Double
parent' (Grid y Length -> Track Length
forall m n. Size m n -> n
inline (Grid y Length -> Track Length) -> Grid y Length -> Track Length
forall a b. (a -> b) -> a -> b
$ Grid y Length
self) ([GridItem'] -> [Double]) -> [GridItem'] -> [Double]
forall a b. (a -> b) -> a -> b
$ (GridItem -> GridItem') -> [GridItem] -> [GridItem']
forall a b. (a -> b) -> [a] -> [b]
map GridItem -> GridItem'
forall m n. Size m n -> n
inline [GridItem]
cells'
    cells' :: [GridItem]
cells' = ((LayoutItem y Length x, GridItem) -> GridItem)
-> [(LayoutItem y Length x, GridItem)] -> [GridItem]
forall a b. (a -> b) -> [a] -> [b]
map (LayoutItem y Length x, GridItem) -> GridItem
forall {m} {n} {x}.
(CastDouble m, CastDouble n, Zero m, Zero n) =>
(LayoutItem m n x, GridItem) -> GridItem
setCellBox' ([(LayoutItem y Length x, GridItem)] -> [GridItem])
-> [(LayoutItem y Length x, GridItem)] -> [GridItem]
forall a b. (a -> b) -> a -> b
$ [LayoutItem y Length x]
-> [GridItem] -> [(LayoutItem y Length x, GridItem)]
forall a b. [a] -> [b] -> [(a, b)]
zip [LayoutItem y Length x]
childs' [GridItem]
cells0 -- Flatten subgrids
    childs'' :: [PaddedBox y Double]
childs'' = (PaddedBox y Length -> PaddedBox y Double)
-> [PaddedBox y Length] -> [PaddedBox y Double]
forall a b. (a -> b) -> [a] -> [b]
map ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double)
-> (Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength Double
selfWidth) ([PaddedBox y Length] -> [PaddedBox y Double])
-> [PaddedBox y Length] -> [PaddedBox y Double]
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> PaddedBox y Length)
-> [LayoutItem y Length x] -> [PaddedBox y Length]
forall a b. (a -> b) -> [a] -> [b]
map LayoutItem y Length x -> PaddedBox y Length
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox [LayoutItem y Length x]
childs'
    childs' :: [LayoutItem y Length x]
childs' = (LayoutItem y Length x -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> [LayoutItem y Length x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxNatWidth (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x)
-> Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ Double -> Maybe Double
forall a. a -> Maybe a
Just Double
selfWidth) [LayoutItem y Length x]
childs
    selfWidth :: Double
selfWidth = (Length -> Double) -> Track Length -> Double
forall n. (n -> Double) -> Track n -> Double
trackNat (Double -> Length -> Double
lowerLength Double
parent') (Track Length -> Double) -> Track Length -> Double
forall a b. (a -> b) -> a -> b
$ Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self
    parent' :: Double
parent' = Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe (Grid y Length -> [GridItem] -> Double
forall y. Grid y Length -> [GridItem] -> Double
gridEstWidth Grid y Length
self [GridItem]
cells0) Maybe Double
parent
    zeroBox :: PaddedBox Double Double
    zeroBox :: PaddedBox Double Double
zeroBox = PaddedBox Double Double
forall a. Zero a => a
zero
boxNatWidth Maybe Double
_ self :: LayoutItem y Length x
self@(LayoutInline x
_ Paragraph (UserData y Length x)
_ PageOptions
_) = LayoutItem y Length x
self
boxNatWidth Maybe Double
_ self :: LayoutItem y Length x
self@(LayoutInline' x
_ ParagraphLayout (UserData y Length x)
_ PageOptions
_) = LayoutItem y Length x
self
boxNatWidth Maybe Double
_ (LayoutConst x
val PaddedBox y Length
self' [LayoutItem y Length x]
childs) =
    x
-> PaddedBox y Length
-> [LayoutItem y Length x]
-> LayoutItem y Length x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst x
val PaddedBox y Length
self' ([LayoutItem y Length x] -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> [LayoutItem y Length x]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxNatWidth Maybe Double
forall a. Maybe a
Nothing) [LayoutItem y Length x]
childs
boxNatWidth Maybe Double
_ self :: LayoutItem y Length x
self@(LayoutSpan FragmentTree (UserData y Length x)
_) = LayoutItem y Length x
self
boxNatWidth Maybe Double
size (LayoutFlex x
a Flex (LayoutItem y Length x) y
b ) = x -> Flex (LayoutItem y Length x) y -> LayoutItem y Length x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a (Flex (LayoutItem y Length x) y -> LayoutItem y Length x)
-> Flex (LayoutItem y Length x) y -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> LayoutItem y Length x)
-> Flex (LayoutItem y Length x) y -> Flex (LayoutItem y Length x) y
forall a b c. (a -> b) -> Flex a c -> Flex b c
flexMap (Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxNatWidth Maybe Double
size) Flex (LayoutItem y Length x) y
b
-- | Update a (sub)tree to compute & cache maximum legible width.
boxMaxWidth :: (CastDouble y, Zero y, NFData y) =>
        PaddedBox a Double -> LayoutItem y Length x -> LayoutItem y Length x
boxMaxWidth :: forall y a x.
(CastDouble y, Zero y, NFData y) =>
PaddedBox a Double
-> LayoutItem y Length x -> LayoutItem y Length x
boxMaxWidth PaddedBox a Double
parent (LayoutFlow x
val PaddedBox y Length
self [LayoutItem y Length x]
childs) = x
-> PaddedBox y Length
-> [LayoutItem y Length x]
-> LayoutItem y Length x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox y Length
self' [LayoutItem y Length x]
childs'
  where
    childs' :: [LayoutItem y Length x]
childs' = (LayoutItem y Length x -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> [LayoutItem y Length x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (PaddedBox y Double
-> LayoutItem y Length x -> LayoutItem y Length x
forall y a x.
(CastDouble y, Zero y, NFData y) =>
PaddedBox a Double
-> LayoutItem y Length x -> LayoutItem y Length x
boxMaxWidth PaddedBox y Double
self'') [LayoutItem y Length x]
childs
    self'' :: PaddedBox y Double
self'' = (Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' (Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Size a Double -> Double
forall m n. Size m n -> n
inline (Size a Double -> Double) -> Size a Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox a Double -> Size a Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox a Double
parent) PaddedBox y Length
self'
    self' :: PaddedBox y Length
self' = PaddedBox y Length
self { max :: Size y Length
B.max = Length -> y -> Size y Length
forall m n. n -> m -> Size m n
Size (Double -> Length
Pixels Double
max') (Size y Length -> y
forall m n. Size m n -> m
block (Size y Length -> y) -> Size y Length -> y
forall a b. (a -> b) -> a -> b
$ PaddedBox y Length -> Size y Length
forall m n. PaddedBox m n -> Size m n
B.max PaddedBox y Length
self) }
    max' :: Double
max' = PaddedBox a Double -> PaddedBox y Length -> Double
forall a b. PaddedBox a Double -> PaddedBox b Length -> Double
flowMaxWidth PaddedBox a Double
parent PaddedBox y Length
self
boxMaxWidth PaddedBox a Double
parent (LayoutGrid x
val Grid y Length
self [GridItem]
cells [LayoutItem y Length x]
childs) = x
-> Grid y Length
-> [GridItem]
-> [LayoutItem y Length x]
-> LayoutItem y Length x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
val Grid y Length
self [GridItem]
cells [LayoutItem y Length x]
childs'
  where -- Propagate parent track as default.
    childs' :: [LayoutItem y Length x]
childs' = ((GridItem, LayoutItem y Length x) -> LayoutItem y Length x)
-> [(GridItem, LayoutItem y Length x)] -> [LayoutItem y Length x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (GridItem, LayoutItem y Length x) -> LayoutItem y Length x
forall {y} {x}.
(Zero y, NFData y, CastDouble y) =>
(GridItem, LayoutItem y Length x) -> LayoutItem y Length x
inner ([(GridItem, LayoutItem y Length x)] -> [LayoutItem y Length x])
-> [(GridItem, LayoutItem y Length x)] -> [LayoutItem y Length x]
forall a b. (a -> b) -> a -> b
$ [GridItem]
-> [LayoutItem y Length x] -> [(GridItem, LayoutItem y Length x)]
forall a b. [a] -> [b] -> [(a, b)]
zip [GridItem]
cells [LayoutItem y Length x]
childs
    inner :: (GridItem, LayoutItem y Length x) -> LayoutItem y Length x
inner (Size GridItem'
cellx GridItem'
celly, LayoutItem y Length x
child) =
        PaddedBox Double Double
-> LayoutItem y Length x -> LayoutItem y Length x
forall y a x.
(CastDouble y, Zero y, NFData y) =>
PaddedBox a Double
-> LayoutItem y Length x -> LayoutItem y Length x
boxMaxWidth (Track Length -> GridItem' -> Double
forall x. CastDouble x => Track x -> GridItem' -> Double
cellSize (Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self) GridItem'
cellx Double -> Double -> PaddedBox Double Double
`size2box` Track y -> GridItem' -> Double
forall x. CastDouble x => Track x -> GridItem' -> Double
cellSize (Grid y Length -> Track y
forall m n. Size m n -> m
block Grid y Length
self) GridItem'
celly) LayoutItem y Length x
child
    size2box :: Double -> Double -> PaddedBox Double Double
size2box Double
x Double
y = PaddedBox Double Double
zeroBox { min :: Size Double Double
B.min = Double -> Double -> Size Double Double
forall m n. n -> m -> Size m n
Size Double
x Double
y, max :: Size Double Double
B.max = Double -> Double -> Size Double Double
forall m n. n -> m -> Size m n
Size Double
x Double
y, size :: Size Double Double
B.size = Double -> Double -> Size Double Double
forall m n. n -> m -> Size m n
Size Double
x Double
y }
boxMaxWidth PaddedBox a Double
parent self :: LayoutItem y Length x
self@(LayoutInline x
_ Paragraph (UserData y Length x)
_ PageOptions
_) = LayoutItem y Length x
self
boxMaxWidth PaddedBox a Double
parent self :: LayoutItem y Length x
self@(LayoutInline' x
_ ParagraphLayout (UserData y Length x)
_ PageOptions
_) = LayoutItem y Length x
self
boxMaxWidth PaddedBox a Double
_ (LayoutConst x
val PaddedBox y Length
self' [LayoutItem y Length x]
childs) = x
-> PaddedBox y Length
-> [LayoutItem y Length x]
-> LayoutItem y Length x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst x
val PaddedBox y Length
self' ([LayoutItem y Length x] -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$
    (LayoutItem y Length x -> LayoutItem y Length x)
-> [LayoutItem y Length x] -> [LayoutItem y Length x]
forall a b. (a -> b) -> [a] -> [b]
map (PaddedBox Double Double
-> LayoutItem y Length x -> LayoutItem y Length x
forall y a x.
(CastDouble y, Zero y, NFData y) =>
PaddedBox a Double
-> LayoutItem y Length x -> LayoutItem y Length x
boxMaxWidth (PaddedBox Double Double
 -> LayoutItem y Length x -> LayoutItem y Length x)
-> PaddedBox Double Double
-> LayoutItem y Length x
-> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ (y -> Double) -> PaddedBox y Double -> PaddedBox Double Double
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' y -> Double
forall a. CastDouble a => a -> Double
toDouble (PaddedBox y Double -> PaddedBox Double Double)
-> PaddedBox y Double -> PaddedBox Double Double
forall a b. (a -> b) -> a -> b
$ (Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' Length -> Double
forall a. CastDouble a => a -> Double
toDouble PaddedBox y Length
self') [LayoutItem y Length x]
childs
boxMaxWidth PaddedBox a Double
parent self :: LayoutItem y Length x
self@(LayoutSpan FragmentTree (UserData y Length x)
_) = LayoutItem y Length x
self
boxMaxWidth PaddedBox a Double
parent (LayoutFlex x
a Flex (LayoutItem y Length x) y
b) = x -> Flex (LayoutItem y Length x) y -> LayoutItem y Length x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a (Flex (LayoutItem y Length x) y -> LayoutItem y Length x)
-> Flex (LayoutItem y Length x) y -> LayoutItem y Length x
forall a b. (a -> b) -> a -> b
$ (case Flex (LayoutItem y Length x) y -> Direction
forall a b. Flex a b -> Direction
Fl.direction Flex (LayoutItem y Length x) y
b of
    Direction
Fl.Row -> (Flex (LayoutItem y Length x) y
 -> Double -> Flex (LayoutItem y Length x) y)
-> Double
-> Flex (LayoutItem y Length x) y
-> Flex (LayoutItem y Length x) y
forall a b c. (a -> b -> c) -> b -> a -> c
flip Flex (LayoutItem y Length x) y
-> Double -> Flex (LayoutItem y Length x) y
forall b a. CastDouble b => Flex a b -> Double -> Flex a b
flexWrap (Size a Double -> Double
forall m n. Size m n -> n
inline (Size a Double -> Double) -> Size a Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox a Double -> Size a Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox a Double
parent)
    Direction
Fl.Column -> Flex (LayoutItem y Length x) y -> Flex (LayoutItem y Length x) y
forall a. a -> a
id) (Flex (LayoutItem y Length x) y -> Flex (LayoutItem y Length x) y)
-> Flex (LayoutItem y Length x) y -> Flex (LayoutItem y Length x) y
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> LayoutItem y Length x)
-> Flex (LayoutItem y Length x) y -> Flex (LayoutItem y Length x) y
forall a b c. (a -> b) -> Flex a c -> Flex b c
flexMap (PaddedBox a Double
-> LayoutItem y Length x -> LayoutItem y Length x
forall y a x.
(CastDouble y, Zero y, NFData y) =>
PaddedBox a Double
-> LayoutItem y Length x -> LayoutItem y Length x
boxMaxWidth PaddedBox a Double
parent) Flex (LayoutItem y Length x) y
b
-- | Update a (sub)tree to compute & cache final width.
boxWidth :: (Zero y, CastDouble y, NFData y) =>
        PaddedBox b Double -> LayoutItem y Length x -> LayoutItem y Double x
boxWidth :: forall y b x.
(Zero y, CastDouble y, NFData y) =>
PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
boxWidth PaddedBox b Double
parent (LayoutFlow x
val PaddedBox y Length
self [LayoutItem y Length x]
childs) = x
-> PaddedBox y Double
-> [LayoutItem y Double x]
-> LayoutItem y Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox y Double
self' [LayoutItem y Double x]
childs'
  where
    childs' :: [LayoutItem y Double x]
childs' = (LayoutItem y Length x -> LayoutItem y Double x)
-> [LayoutItem y Length x] -> [LayoutItem y Double x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (PaddedBox y Double
-> LayoutItem y Length x -> LayoutItem y Double x
forall y b x.
(Zero y, CastDouble y, NFData y) =>
PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
boxWidth PaddedBox y Double
self') [LayoutItem y Length x]
childs
    self' :: PaddedBox y Double
self' = ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' (Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Size b Double -> Double
forall m n. Size m n -> n
inline (Size b Double -> Double) -> Size b Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox b Double -> Size b Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox b Double
parent) PaddedBox y Length
self) {
        size :: Size y Double
size = Double -> y -> Size y Double
forall m n. n -> m -> Size m n
Size Double
size' (y -> Size y Double) -> y -> Size y Double
forall a b. (a -> b) -> a -> b
$ Size y Length -> y
forall m n. Size m n -> m
block (Size y Length -> y) -> Size y Length -> y
forall a b. (a -> b) -> a -> b
$ PaddedBox y Length -> Size y Length
forall m n. PaddedBox m n -> Size m n
B.max PaddedBox y Length
self
      }
    size' :: Double
size' = PaddedBox b Double -> PaddedBox y Length -> Double
forall a b. PaddedBox a Double -> PaddedBox b Length -> Double
flowWidth PaddedBox b Double
parent PaddedBox y Length
self
boxWidth PaddedBox b Double
parent (LayoutGrid x
val Grid y Length
self [GridItem]
cells [LayoutItem y Length x]
childs) = x
-> Grid y Double
-> [GridItem]
-> [LayoutItem y Double x]
-> LayoutItem y Double x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
val Grid y Double
self' [GridItem]
cells' [LayoutItem y Double x]
childs'
  where -- Propagate parent track as default
    ([GridItem]
cells', [LayoutItem y Double x]
childs') = [(GridItem, LayoutItem y Double x)]
-> ([GridItem], [LayoutItem y Double x])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(GridItem, LayoutItem y Double x)]
 -> ([GridItem], [LayoutItem y Double x]))
-> [(GridItem, LayoutItem y Double x)]
-> ([GridItem], [LayoutItem y Double x])
forall a b. (a -> b) -> a -> b
$ ((GridItem, LayoutItem y Length x)
 -> (GridItem, LayoutItem y Double x))
-> [(GridItem, LayoutItem y Length x)]
-> [(GridItem, LayoutItem y Double x)]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (GridItem, LayoutItem y Length x)
-> (GridItem, LayoutItem y Double x)
forall {y} {x}.
(NFData y, CastDouble y, Zero y) =>
(GridItem, LayoutItem y Length x)
-> (GridItem, LayoutItem y Double x)
recurse ([(GridItem, LayoutItem y Length x)]
 -> [(GridItem, LayoutItem y Double x)])
-> [(GridItem, LayoutItem y Length x)]
-> [(GridItem, LayoutItem y Double x)]
forall a b. (a -> b) -> a -> b
$ [GridItem]
-> [LayoutItem y Length x] -> [(GridItem, LayoutItem y Length x)]
forall a b. [a] -> [b] -> [(a, b)]
zip [GridItem]
cells [LayoutItem y Length x]
childs
    recurse :: (GridItem, LayoutItem y Length x)
-> (GridItem, LayoutItem y Double x)
recurse (GridItem
cell, LayoutItem y Length x
child) = (GridItem
cell', LayoutItem y Double x
child')
      where
        cell' :: GridItem
cell' = GridItem -> PaddedBox y Double -> GridItem
forall m n.
(CastDouble m, CastDouble n) =>
GridItem -> PaddedBox m n -> GridItem
setCellBox GridItem
cell (PaddedBox y Double -> GridItem) -> PaddedBox y Double -> GridItem
forall a b. (a -> b) -> a -> b
$ LayoutItem y Double x -> PaddedBox y Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem y Double x
child'
        child' :: LayoutItem y Double x
child' = PaddedBox Double Double
-> LayoutItem y Length x -> LayoutItem y Double x
forall y b x.
(Zero y, CastDouble y, NFData y) =>
PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
boxWidth (Grid y Length -> GridItem -> PaddedBox Double Double
forall x y.
(CastDouble x, CastDouble y) =>
Grid y x -> GridItem -> PaddedBox Double Double
gridItemBox Grid y Length
self GridItem
cell) LayoutItem y Length x
child
    self' :: Grid y Double
self' = (Track Double -> Track y -> Grid y Double)
-> Track y -> Track Double -> Grid y Double
forall a b c. (a -> b -> c) -> b -> a -> c
flip Track Double -> Track y -> Grid y Double
forall m n. n -> m -> Size m n
Size (Grid y Length -> Track y
forall m n. Size m n -> m
block Grid y Length
self) Track {
        cells :: [Either Double Double]
cells = (Double -> Either Double Double)
-> [Double] -> [Either Double Double]
forall a b. (a -> b) -> [a] -> [b]
map Double -> Either Double Double
forall a b. a -> Either a b
Left [Double]
widths,
        trackMins :: [Double]
trackMins = Track Length -> [Double]
forall x. Track x -> [Double]
trackMins (Track Length -> [Double]) -> Track Length -> [Double]
forall a b. (a -> b) -> a -> b
$ Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self, trackNats :: [Double]
trackNats = Track Length -> [Double]
forall x. Track x -> [Double]
trackNats (Track Length -> [Double]) -> Track Length -> [Double]
forall a b. (a -> b) -> a -> b
$ Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self,
        gap :: Double
gap = Double -> Length -> Double
lowerLength Double
outerwidth (Length -> Double) -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Track Length -> Length
forall x. Track x -> x
gap (Track Length -> Length) -> Track Length -> Length
forall a b. (a -> b) -> a -> b
$ Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self
    }
    outerwidth :: Double
outerwidth = Size b Double -> Double
forall m n. Size m n -> n
inline (Size b Double -> Double) -> Size b Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox b Double -> Size b Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox b Double
parent
    widths :: [Double]
widths = Double -> Track Length -> [Double]
sizeTrackMaxs (Size b Double -> Double
forall m n. Size m n -> n
inline (Size b Double -> Double) -> Size b Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox b Double -> Size b Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox b Double
parent) (Track Length -> [Double]) -> Track Length -> [Double]
forall a b. (a -> b) -> a -> b
$ Grid y Length -> Track Length
forall m n. Size m n -> n
inline Grid y Length
self
boxWidth PaddedBox b Double
parent self :: LayoutItem y Length x
self@(LayoutInline x
val (Paragraph Array
a Int
b RootNode Int (UserData y Length x)
c ParagraphOptions
d) PageOptions
paging) =
    x
-> Paragraph (UserData y Double x)
-> PageOptions
-> LayoutItem y Double x
forall m n x.
x -> Paragraph (UserData m n x) -> PageOptions -> LayoutItem m n x
LayoutInline x
val ((Either (PaddedBox y Length) (LayoutItem y Length x)
 -> Either (PaddedBox y Double) (LayoutItem y Double x))
-> Paragraph (UserData y Length x)
-> Paragraph (UserData y Double x)
forall b b' a c.
(b -> b') -> Paragraph (a, b, c) -> Paragraph (a, b', c)
paragraphMap Either (PaddedBox y Length) (LayoutItem y Length x)
-> Either (PaddedBox y Double) (LayoutItem y Double x)
forall {y} {m} {x}.
(NFData y, Zero y, CastDouble y) =>
Either (PaddedBox m Length) (LayoutItem y Length x)
-> Either (PaddedBox m Double) (LayoutItem y Double x)
inner (Paragraph (UserData y Length x)
 -> Paragraph (UserData y Double x))
-> Paragraph (UserData y Length x)
-> Paragraph (UserData y Double x)
forall a b. (a -> b) -> a -> b
$ Array
-> Int
-> RootNode Int (UserData y Length x)
-> ParagraphOptions
-> Paragraph (UserData y Length x)
forall d.
Array -> Int -> RootNode Int d -> ParagraphOptions -> Paragraph d
Paragraph Array
a Int
b RootNode Int (UserData y Length x)
c ParagraphOptions
d {
        paragraphMaxWidth :: Int32
paragraphMaxWidth = Double -> Int32
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
round (Double -> Int32) -> Double -> Int32
forall a b. (a -> b) -> a -> b
$ Size b Double -> Double
forall m n. Size m n -> n
B.inline (Size b Double -> Double) -> Size b Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox b Double -> Size b Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox b Double
parent
      }) PageOptions
paging
  where
    inner :: Either (PaddedBox m Length) (LayoutItem y Length x)
-> Either (PaddedBox m Double) (LayoutItem y Double x)
inner (Left PaddedBox m Length
a) = PaddedBox m Double
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. a -> Either a b
Left (PaddedBox m Double
 -> Either (PaddedBox m Double) (LayoutItem y Double x))
-> PaddedBox m Double
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox m Length -> PaddedBox m Double
forall {m}. PaddedBox m Length -> PaddedBox m Double
resolveWidth PaddedBox m Length
a
    inner (Right LayoutItem y Length x
a) = LayoutItem y Double x
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. b -> Either a b
Right (LayoutItem y Double x
 -> Either (PaddedBox m Double) (LayoutItem y Double x))
-> LayoutItem y Double x
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox y Double
-> LayoutItem y Length x -> LayoutItem y Double x
forall y b x.
(Zero y, CastDouble y, NFData y) =>
PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
boxWidth (PaddedBox y Length -> PaddedBox y Double
forall {m}. PaddedBox m Length -> PaddedBox m Double
resolveWidth (PaddedBox y Length -> PaddedBox y Double)
-> PaddedBox y Length -> PaddedBox y Double
forall a b. (a -> b) -> a -> b
$ LayoutItem y Length x -> PaddedBox y Length
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem y Length x
self) LayoutItem y Length x
a
    resolveWidth :: PaddedBox m Length -> PaddedBox m Double
resolveWidth = (Length -> Double) -> PaddedBox m Length -> PaddedBox m Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' ((Length -> Double) -> PaddedBox m Length -> PaddedBox m Double)
-> (Length -> Double) -> PaddedBox m Length -> PaddedBox m Double
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Size b Double -> Double
forall m n. Size m n -> n
B.inline (Size b Double -> Double) -> Size b Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox b Double -> Size b Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox b Double
parent
boxWidth PaddedBox b Double
parent self :: LayoutItem y Length x
self@(LayoutInline' x
a ParagraphLayout (UserData y Length x)
b PageOptions
c) = x
-> ParagraphLayout (UserData y Double x)
-> PageOptions
-> LayoutItem y Double x
forall m n x.
x
-> ParagraphLayout (UserData m n x)
-> PageOptions
-> LayoutItem m n x
LayoutInline' x
a ((Either (PaddedBox y Length) (LayoutItem y Length x)
 -> Either (PaddedBox y Double) (LayoutItem y Double x))
-> ParagraphLayout (UserData y Length x)
-> ParagraphLayout (UserData y Double x)
forall b b' a c.
(b -> b')
-> ParagraphLayout (a, b, c) -> ParagraphLayout (a, b', c)
layoutMap Either (PaddedBox y Length) (LayoutItem y Length x)
-> Either (PaddedBox y Double) (LayoutItem y Double x)
forall {y} {m} {x}.
(NFData y, Zero y, CastDouble y) =>
Either (PaddedBox m Length) (LayoutItem y Length x)
-> Either (PaddedBox m Double) (LayoutItem y Double x)
inner ParagraphLayout (UserData y Length x)
b) PageOptions
c
  where
    inner :: Either (PaddedBox m Length) (LayoutItem y Length x)
-> Either (PaddedBox m Double) (LayoutItem y Double x)
inner (Left PaddedBox m Length
a) = PaddedBox m Double
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. a -> Either a b
Left (PaddedBox m Double
 -> Either (PaddedBox m Double) (LayoutItem y Double x))
-> PaddedBox m Double
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox m Length -> PaddedBox m Double
forall {m}. PaddedBox m Length -> PaddedBox m Double
resolveWidth PaddedBox m Length
a
    inner (Right LayoutItem y Length x
a) = LayoutItem y Double x
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. b -> Either a b
Right (LayoutItem y Double x
 -> Either (PaddedBox m Double) (LayoutItem y Double x))
-> LayoutItem y Double x
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox y Double
-> LayoutItem y Length x -> LayoutItem y Double x
forall y b x.
(Zero y, CastDouble y, NFData y) =>
PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
boxWidth (PaddedBox y Length -> PaddedBox y Double
forall {m}. PaddedBox m Length -> PaddedBox m Double
resolveWidth (PaddedBox y Length -> PaddedBox y Double)
-> PaddedBox y Length -> PaddedBox y Double
forall a b. (a -> b) -> a -> b
$ LayoutItem y Length x -> PaddedBox y Length
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem y Length x
self) LayoutItem y Length x
a
    resolveWidth :: PaddedBox m Length -> PaddedBox m Double
resolveWidth = (Length -> Double) -> PaddedBox m Length -> PaddedBox m Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' ((Length -> Double) -> PaddedBox m Length -> PaddedBox m Double)
-> (Length -> Double) -> PaddedBox m Length -> PaddedBox m Double
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Size b Double -> Double
forall m n. Size m n -> n
B.inline (Size b Double -> Double) -> Size b Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox b Double -> Size b Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox b Double
parent
boxWidth PaddedBox b Double
p (LayoutConst x
val PaddedBox y Length
self [LayoutItem y Length x]
childs) = x
-> PaddedBox y Double
-> [LayoutItem y Double x]
-> LayoutItem y Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst x
val ((Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' Length -> Double
cb PaddedBox y Length
self) ([LayoutItem y Double x] -> LayoutItem y Double x)
-> [LayoutItem y Double x] -> LayoutItem y Double x
forall a b. (a -> b) -> a -> b
$
    (LayoutItem y Length x -> LayoutItem y Double x)
-> [LayoutItem y Length x] -> [LayoutItem y Double x]
forall a b. (a -> b) -> [a] -> [b]
map (PaddedBox Double Double
-> LayoutItem y Length x -> LayoutItem y Double x
forall y b x.
(Zero y, CastDouble y, NFData y) =>
PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
boxWidth (PaddedBox Double Double
 -> LayoutItem y Length x -> LayoutItem y Double x)
-> PaddedBox Double Double
-> LayoutItem y Length x
-> LayoutItem y Double x
forall a b. (a -> b) -> a -> b
$ (y -> Double) -> PaddedBox y Double -> PaddedBox Double Double
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' y -> Double
forall a. CastDouble a => a -> Double
toDouble (PaddedBox y Double -> PaddedBox Double Double)
-> PaddedBox y Double -> PaddedBox Double Double
forall a b. (a -> b) -> a -> b
$ (Length -> Double) -> PaddedBox y Length -> PaddedBox y Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' Length -> Double
cb PaddedBox y Length
self) [LayoutItem y Length x]
childs
  where cb :: Length -> Double
cb = Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox b Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
width PaddedBox b Double
p
boxWidth PaddedBox b Double
parent self :: LayoutItem y Length x
self@(LayoutSpan FragmentTree (UserData y Length x)
self') = FragmentTree (UserData y Double x) -> LayoutItem y Double x
forall m n x. FragmentTree (UserData m n x) -> LayoutItem m n x
LayoutSpan (FragmentTree (UserData y Double x) -> LayoutItem y Double x)
-> FragmentTree (UserData y Double x) -> LayoutItem y Double x
forall a b. (a -> b) -> a -> b
$ (Either (PaddedBox y Length) (LayoutItem y Length x)
 -> Either (PaddedBox y Double) (LayoutItem y Double x))
-> FragmentTree (UserData y Length x)
-> FragmentTree (UserData y Double x)
forall b b' a c.
(b -> b') -> FragmentTree (a, b, c) -> FragmentTree (a, b', c)
treeMap Either (PaddedBox y Length) (LayoutItem y Length x)
-> Either (PaddedBox y Double) (LayoutItem y Double x)
forall {y} {m} {x}.
(NFData y, Zero y, CastDouble y) =>
Either (PaddedBox m Length) (LayoutItem y Length x)
-> Either (PaddedBox m Double) (LayoutItem y Double x)
inner FragmentTree (UserData y Length x)
self'
  where
    inner :: Either (PaddedBox m Length) (LayoutItem y Length x)
-> Either (PaddedBox m Double) (LayoutItem y Double x)
inner (Left PaddedBox m Length
a) = PaddedBox m Double
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. a -> Either a b
Left (PaddedBox m Double
 -> Either (PaddedBox m Double) (LayoutItem y Double x))
-> PaddedBox m Double
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox m Length -> PaddedBox m Double
forall {m}. PaddedBox m Length -> PaddedBox m Double
resolveWidth PaddedBox m Length
a
    inner (Right LayoutItem y Length x
a) = LayoutItem y Double x
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. b -> Either a b
Right (LayoutItem y Double x
 -> Either (PaddedBox m Double) (LayoutItem y Double x))
-> LayoutItem y Double x
-> Either (PaddedBox m Double) (LayoutItem y Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox y Double
-> LayoutItem y Length x -> LayoutItem y Double x
forall y b x.
(Zero y, CastDouble y, NFData y) =>
PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
boxWidth (PaddedBox y Length -> PaddedBox y Double
forall {m}. PaddedBox m Length -> PaddedBox m Double
resolveWidth (PaddedBox y Length -> PaddedBox y Double)
-> PaddedBox y Length -> PaddedBox y Double
forall a b. (a -> b) -> a -> b
$ LayoutItem y Length x -> PaddedBox y Length
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem y Length x
self) LayoutItem y Length x
a
    resolveWidth :: PaddedBox m Length -> PaddedBox m Double
resolveWidth = (Length -> Double) -> PaddedBox m Length -> PaddedBox m Double
forall n nn m. (n -> nn) -> PaddedBox m n -> PaddedBox m nn
mapX' ((Length -> Double) -> PaddedBox m Length -> PaddedBox m Double)
-> (Length -> Double) -> PaddedBox m Length -> PaddedBox m Double
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Size b Double -> Double
forall m n. Size m n -> n
B.inline (Size b Double -> Double) -> Size b Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox b Double -> Size b Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox b Double
parent
boxWidth PaddedBox b Double
parent (LayoutFlex x
a Flex (LayoutItem y Length x) y
b) = x -> Flex (LayoutItem y Double x) y -> LayoutItem y Double x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a (Flex (LayoutItem y Double x) y -> LayoutItem y Double x)
-> Flex (LayoutItem y Double x) y -> LayoutItem y Double x
forall a b. (a -> b) -> a -> b
$ (LayoutItem y Length x -> LayoutItem y Double x)
-> Flex (LayoutItem y Length x) y -> Flex (LayoutItem y Double x) y
forall a b c. (a -> b) -> Flex a c -> Flex b c
flexMap (PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
forall y b x.
(Zero y, CastDouble y, NFData y) =>
PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
boxWidth PaddedBox b Double
parent) Flex (LayoutItem y Length x) y
b

-- | Update a (sub)tree to compute & cache ideal legible height.
boxNatHeight :: Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxNatHeight :: forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxNatHeight Double
parent (LayoutFlow x
val PaddedBox Length Double
self [LayoutItem Length Double x]
childs) = x
-> PaddedBox Length Double
-> [LayoutItem Length Double x]
-> LayoutItem Length Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox Length Double
self' [LayoutItem Length Double x]
childs'
  where
    self' :: PaddedBox Length Double
self' = PaddedBox Length Double
self { size :: Size Length Double
size = (Length -> Length) -> Size Length Double -> Size Length Double
forall m mm n. (m -> mm) -> Size m n -> Size mm n
mapSizeY (Double -> Length -> Length
mapAuto Double
size') (PaddedBox Length Double -> Size Length Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Length Double
self) }
    size' :: Double
size' = Double
-> PaddedBox Length Double -> [PaddedBox Double Double] -> Double
flowNatHeight Double
parent PaddedBox Length Double
self [PaddedBox Double Double]
childs''
    childs'' :: [PaddedBox Double Double]
childs'' = (PaddedBox Length Double -> PaddedBox Double Double)
-> [PaddedBox Length Double] -> [PaddedBox Double Double]
forall a b. (a -> b) -> [a] -> [b]
map ((Length -> Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' (Double -> Length -> Double
lowerLength Double
parent)) ([PaddedBox Length Double] -> [PaddedBox Double Double])
-> [PaddedBox Length Double] -> [PaddedBox Double Double]
forall a b. (a -> b) -> a -> b
$ (LayoutItem Length Double x -> PaddedBox Length Double)
-> [LayoutItem Length Double x] -> [PaddedBox Length Double]
forall a b. (a -> b) -> [a] -> [b]
map LayoutItem Length Double x -> PaddedBox Length Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox [LayoutItem Length Double x]
childs'
    childs' :: [LayoutItem Length Double x]
childs' = (LayoutItem Length Double x -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> [LayoutItem Length Double x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxNatHeight (Double
 -> LayoutItem Length Double x -> LayoutItem Length Double x)
-> Double
-> LayoutItem Length Double x
-> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$ Size Length Double -> Double
forall m n. Size m n -> n
inline (Size Length Double -> Double) -> Size Length Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Length Double -> Size Length Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Length Double
self) [LayoutItem Length Double x]
childs
boxNatHeight Double
parent (LayoutGrid x
val Grid Length Double
self [GridItem]
cells [LayoutItem Length Double x]
childs) = x
-> Grid Length Double
-> [GridItem]
-> [LayoutItem Length Double x]
-> LayoutItem Length Double x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
val Grid Length Double
self' [GridItem]
cells [LayoutItem Length Double x]
childs'
  where
    self' :: Grid Length Double
self' = Track Double -> Track Length -> Grid Length Double
forall m n. n -> m -> Size m n
Size (Grid Length Double -> Track Double
forall m n. Size m n -> n
inline Grid Length Double
self) (Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self) { trackNats :: [Double]
trackNats = [Double]
heights }
    heights :: [Double]
heights = Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackNats Double
parent (Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self) ([GridItem'] -> [Double]) -> [GridItem'] -> [Double]
forall a b. (a -> b) -> a -> b
$ (GridItem -> GridItem') -> [GridItem] -> [GridItem']
forall a b. (a -> b) -> [a] -> [b]
map GridItem -> GridItem'
forall m n. Size m n -> m
block [GridItem]
cells'
    cells' :: [GridItem]
cells' = ((LayoutItem Length Double x, GridItem) -> GridItem)
-> [(LayoutItem Length Double x, GridItem)] -> [GridItem]
forall a b. (a -> b) -> [a] -> [b]
map (LayoutItem Length Double x, GridItem) -> GridItem
forall {m} {n} {x}.
(CastDouble m, CastDouble n, Zero m, Zero n) =>
(LayoutItem m n x, GridItem) -> GridItem
setCellBox' ([(LayoutItem Length Double x, GridItem)] -> [GridItem])
-> [(LayoutItem Length Double x, GridItem)] -> [GridItem]
forall a b. (a -> b) -> a -> b
$ [LayoutItem Length Double x]
-> [GridItem] -> [(LayoutItem Length Double x, GridItem)]
forall a b. [a] -> [b] -> [(a, b)]
zip [LayoutItem Length Double x]
childs' [GridItem]
cells -- Flatten subgrids
    childs' :: [LayoutItem Length Double x]
childs' = (LayoutItem Length Double x -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> [LayoutItem Length Double x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxNatHeight Double
width) [LayoutItem Length Double x]
childs
    width :: Double
width = (Double -> Double) -> Track Double -> Double
forall n. (n -> Double) -> Track n -> Double
trackNat Double -> Double
forall a. a -> a
id (Track Double -> Double) -> Track Double -> Double
forall a b. (a -> b) -> a -> b
$ Grid Length Double -> Track Double
forall m n. Size m n -> n
inline Grid Length Double
self
boxNatHeight Double
parent self :: LayoutItem Length Double x
self@(LayoutInline x
_ Paragraph (UserData Length Double x)
_ PageOptions
_) = LayoutItem Length Double x
self
boxNatHeight Double
parent self :: LayoutItem Length Double x
self@(LayoutInline' x
_ ParagraphLayout (UserData Length Double x)
_ PageOptions
_) = LayoutItem Length Double x
self
boxNatHeight Double
p (LayoutConst x
val PaddedBox Length Double
self' [LayoutItem Length Double x]
childs) = x
-> PaddedBox Length Double
-> [LayoutItem Length Double x]
-> LayoutItem Length Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst x
val PaddedBox Length Double
self' ([LayoutItem Length Double x] -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$
    (LayoutItem Length Double x -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> [LayoutItem Length Double x]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxNatHeight (Double
 -> LayoutItem Length Double x -> LayoutItem Length Double x)
-> Double
-> LayoutItem Length Double x
-> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
width (PaddedBox Double Double -> Double)
-> PaddedBox Double Double -> Double
forall a b. (a -> b) -> a -> b
$ (Length -> Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' (Double -> Length -> Double
lowerLength Double
p) PaddedBox Length Double
self') [LayoutItem Length Double x]
childs
boxNatHeight Double
parent self :: LayoutItem Length Double x
self@(LayoutSpan FragmentTree (UserData Length Double x)
_) = LayoutItem Length Double x
self
boxNatHeight Double
parent (LayoutFlex x
a Flex (LayoutItem Length Double x) Length
b) = x
-> Flex (LayoutItem Length Double x) Length
-> LayoutItem Length Double x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a (Flex (LayoutItem Length Double x) Length
 -> LayoutItem Length Double x)
-> Flex (LayoutItem Length Double x) Length
-> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$ (LayoutItem Length Double x -> LayoutItem Length Double x)
-> Flex (LayoutItem Length Double x) Length
-> Flex (LayoutItem Length Double x) Length
forall a b c. (a -> b) -> Flex a c -> Flex b c
flexMap (Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxNatHeight Double
parent) Flex (LayoutItem Length Double x) Length
b
-- | Update a (sub)tree to compute & cache minimum legible height.
boxMinHeight :: Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxMinHeight :: forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxMinHeight Double
parent (LayoutFlow x
val PaddedBox Length Double
self [LayoutItem Length Double x]
childs) = x
-> PaddedBox Length Double
-> [LayoutItem Length Double x]
-> LayoutItem Length Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox Length Double
self' [LayoutItem Length Double x]
childs'
  where
    childs' :: [LayoutItem Length Double x]
childs' = (LayoutItem Length Double x -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> [LayoutItem Length Double x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxMinHeight (Double
 -> LayoutItem Length Double x -> LayoutItem Length Double x)
-> Double
-> LayoutItem Length Double x
-> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$ Size Length Double -> Double
forall m n. Size m n -> n
inline (Size Length Double -> Double) -> Size Length Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Length Double -> Size Length Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Length Double
self) [LayoutItem Length Double x]
childs
    self' :: PaddedBox Length Double
self' = PaddedBox Length Double
self { min :: Size Length Double
B.min = Double -> Length -> Size Length Double
forall m n. n -> m -> Size m n
Size (Size Length Double -> Double
forall m n. Size m n -> n
inline (Size Length Double -> Double) -> Size Length Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Length Double -> Size Length Double
forall m n. PaddedBox m n -> Size m n
B.min PaddedBox Length Double
self) (Double -> Length
Pixels Double
min') }
    min' :: Double
min' = Double -> PaddedBox Length Double -> Double
flowMinHeight Double
parent PaddedBox Length Double
self
boxMinHeight Double
parent (LayoutGrid x
val Grid Length Double
self [GridItem]
cells [LayoutItem Length Double x]
childs) = x
-> Grid Length Double
-> [GridItem]
-> [LayoutItem Length Double x]
-> LayoutItem Length Double x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
val Grid Length Double
self' [GridItem]
cells' [LayoutItem Length Double x]
childs'
  where
    ([GridItem]
cells', [LayoutItem Length Double x]
childs') = [(GridItem, LayoutItem Length Double x)]
-> ([GridItem], [LayoutItem Length Double x])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(GridItem, LayoutItem Length Double x)]
 -> ([GridItem], [LayoutItem Length Double x]))
-> [(GridItem, LayoutItem Length Double x)]
-> ([GridItem], [LayoutItem Length Double x])
forall a b. (a -> b) -> a -> b
$ ((GridItem, LayoutItem Length Double x)
 -> (GridItem, LayoutItem Length Double x))
-> [(GridItem, LayoutItem Length Double x)]
-> [(GridItem, LayoutItem Length Double x)]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (GridItem, LayoutItem Length Double x)
-> (GridItem, LayoutItem Length Double x)
forall {x}.
(GridItem, LayoutItem Length Double x)
-> (GridItem, LayoutItem Length Double x)
recurse ([(GridItem, LayoutItem Length Double x)]
 -> [(GridItem, LayoutItem Length Double x)])
-> [(GridItem, LayoutItem Length Double x)]
-> [(GridItem, LayoutItem Length Double x)]
forall a b. (a -> b) -> a -> b
$ [GridItem]
-> [LayoutItem Length Double x]
-> [(GridItem, LayoutItem Length Double x)]
forall a b. [a] -> [b] -> [(a, b)]
zip [GridItem]
cells [LayoutItem Length Double x]
childs
    recurse :: (GridItem, LayoutItem Length Double x)
-> (GridItem, LayoutItem Length Double x)
recurse (GridItem
cell, LayoutItem Length Double x
child) = (GridItem
cell', LayoutItem Length Double x
child') -- Propagate track into subgrids.
      where
        cell' :: GridItem
cell' = GridItem -> PaddedBox Length Double -> GridItem
forall m n.
(CastDouble m, CastDouble n) =>
GridItem -> PaddedBox m n -> GridItem
setCellBox GridItem
cell (LayoutItem Length Double x -> PaddedBox Length Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem Length Double x
child')
        child' :: LayoutItem Length Double x
child' = Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxMinHeight Double
width LayoutItem Length Double x
child
    self' :: Grid Length Double
self' = Track Double -> Track Length -> Grid Length Double
forall m n. n -> m -> Size m n
Size (Grid Length Double -> Track Double
forall m n. Size m n -> n
inline Grid Length Double
self) (Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self) { trackMins :: [Double]
trackMins = [Double]
heights }
    heights :: [Double]
heights = Double -> Track Length -> [GridItem'] -> [Double]
sizeTrackMins Double
width (Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self) ([GridItem'] -> [Double]) -> [GridItem'] -> [Double]
forall a b. (a -> b) -> a -> b
$ (GridItem -> GridItem') -> [GridItem] -> [GridItem']
forall a b. (a -> b) -> [a] -> [b]
map GridItem -> GridItem'
forall m n. Size m n -> m
block [GridItem]
cells
    width :: Double
width = (Double -> Double) -> Track Double -> Double
forall n. (n -> Double) -> Track n -> Double
trackNat Double -> Double
forall a. a -> a
id (Track Double -> Double) -> Track Double -> Double
forall a b. (a -> b) -> a -> b
$ Grid Length Double -> Track Double
forall m n. Size m n -> n
inline Grid Length Double
self
boxMinHeight Double
parent self :: LayoutItem Length Double x
self@(LayoutInline x
_ Paragraph (UserData Length Double x)
_ PageOptions
_) = LayoutItem Length Double x
self
boxMinHeight Double
_ self :: LayoutItem Length Double x
self@(LayoutInline' x
_ ParagraphLayout (UserData Length Double x)
_ PageOptions
_) = LayoutItem Length Double x
self
boxMinHeight Double
p (LayoutConst x
val PaddedBox Length Double
self' [LayoutItem Length Double x]
childs) = x
-> PaddedBox Length Double
-> [LayoutItem Length Double x]
-> LayoutItem Length Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst x
val PaddedBox Length Double
self' ([LayoutItem Length Double x] -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$
    (LayoutItem Length Double x -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> [LayoutItem Length Double x]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxMinHeight (Double
 -> LayoutItem Length Double x -> LayoutItem Length Double x)
-> Double
-> LayoutItem Length Double x
-> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
width (PaddedBox Double Double -> Double)
-> PaddedBox Double Double -> Double
forall a b. (a -> b) -> a -> b
$ (Length -> Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' (Double -> Length -> Double
lowerLength Double
p) PaddedBox Length Double
self') [LayoutItem Length Double x]
childs
boxMinHeight Double
parent self :: LayoutItem Length Double x
self@(LayoutSpan FragmentTree (UserData Length Double x)
_) = LayoutItem Length Double x
self
boxMinHeight Double
parent self :: LayoutItem Length Double x
self@(LayoutFlex x
a Flex (LayoutItem Length Double x) Length
b) = x
-> Flex (LayoutItem Length Double x) Length
-> LayoutItem Length Double x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a (Flex (LayoutItem Length Double x) Length
 -> LayoutItem Length Double x)
-> Flex (LayoutItem Length Double x) Length
-> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$ (LayoutItem Length Double x -> LayoutItem Length Double x)
-> Flex (LayoutItem Length Double x) Length
-> Flex (LayoutItem Length Double x) Length
forall a b c. (a -> b) -> Flex a c -> Flex b c
flexMap (Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxMinHeight Double
parent) Flex (LayoutItem Length Double x) Length
b
-- | Update a subtree to compute & cache maximum legible height.
boxMaxHeight :: PaddedBox Double Double -> LayoutItem Length Double x ->
        LayoutItem Length Double x
boxMaxHeight :: forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
boxMaxHeight PaddedBox Double Double
parent (LayoutFlow x
val PaddedBox Length Double
self [LayoutItem Length Double x]
childs) = x
-> PaddedBox Length Double
-> [LayoutItem Length Double x]
-> LayoutItem Length Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox Length Double
self' [LayoutItem Length Double x]
childs'
  where
    childs' :: [LayoutItem Length Double x]
childs' = (LayoutItem Length Double x -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> [LayoutItem Length Double x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
boxMaxHeight (PaddedBox Double Double
 -> LayoutItem Length Double x -> LayoutItem Length Double x)
-> PaddedBox Double Double
-> LayoutItem Length Double x
-> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$ (Length -> Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' (Double -> Length -> Double
lowerLength Double
width) PaddedBox Length Double
self') [LayoutItem Length Double x]
childs
    self' :: PaddedBox Length Double
self' = PaddedBox Length Double
self { max :: Size Length Double
B.max = Double -> Length -> Size Length Double
forall m n. n -> m -> Size m n
Size (Size Length Double -> Double
forall m n. Size m n -> n
inline (Size Length Double -> Double) -> Size Length Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Length Double -> Size Length Double
forall m n. PaddedBox m n -> Size m n
B.max PaddedBox Length Double
self) (Double -> Length
Pixels Double
max') }
    max' :: Double
max' = Double -> PaddedBox Length Double -> Double
flowMaxHeight (Size Double Double -> Double
forall m n. Size m n -> n
inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
parent) PaddedBox Length Double
self
    width :: Double
width = Size Length Double -> Double
forall m n. Size m n -> n
inline (Size Length Double -> Double) -> Size Length Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Length Double -> Size Length Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Length Double
self
boxMaxHeight PaddedBox Double Double
parent (LayoutGrid x
val Grid Length Double
self [GridItem]
cells [LayoutItem Length Double x]
childs) = x
-> Grid Length Double
-> [GridItem]
-> [LayoutItem Length Double x]
-> LayoutItem Length Double x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
val Grid Length Double
self [GridItem]
cells' [LayoutItem Length Double x]
childs'
  where
    ([GridItem]
cells', [LayoutItem Length Double x]
childs') = [(GridItem, LayoutItem Length Double x)]
-> ([GridItem], [LayoutItem Length Double x])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(GridItem, LayoutItem Length Double x)]
 -> ([GridItem], [LayoutItem Length Double x]))
-> [(GridItem, LayoutItem Length Double x)]
-> ([GridItem], [LayoutItem Length Double x])
forall a b. (a -> b) -> a -> b
$ ((GridItem, LayoutItem Length Double x)
 -> (GridItem, LayoutItem Length Double x))
-> [(GridItem, LayoutItem Length Double x)]
-> [(GridItem, LayoutItem Length Double x)]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (GridItem, LayoutItem Length Double x)
-> (GridItem, LayoutItem Length Double x)
forall {x}.
(GridItem, LayoutItem Length Double x)
-> (GridItem, LayoutItem Length Double x)
recurse ([(GridItem, LayoutItem Length Double x)]
 -> [(GridItem, LayoutItem Length Double x)])
-> [(GridItem, LayoutItem Length Double x)]
-> [(GridItem, LayoutItem Length Double x)]
forall a b. (a -> b) -> a -> b
$ [GridItem]
-> [LayoutItem Length Double x]
-> [(GridItem, LayoutItem Length Double x)]
forall a b. [a] -> [b] -> [(a, b)]
zip [GridItem]
cells [LayoutItem Length Double x]
childs
    recurse :: (GridItem, LayoutItem Length Double x)
-> (GridItem, LayoutItem Length Double x)
recurse (GridItem
cell, LayoutItem Length Double x
child) = (GridItem
cell', LayoutItem Length Double x
child') -- Propagate track into subgrids
      where
        cell' :: GridItem
cell' = GridItem -> PaddedBox Length Double -> GridItem
forall m n.
(CastDouble m, CastDouble n) =>
GridItem -> PaddedBox m n -> GridItem
setCellBox GridItem
cell (LayoutItem Length Double x -> PaddedBox Length Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem Length Double x
child')
        child' :: LayoutItem Length Double x
child' = PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
boxMaxHeight (Grid Length Double -> GridItem -> PaddedBox Double Double
forall x y.
(CastDouble x, CastDouble y) =>
Grid y x -> GridItem -> PaddedBox Double Double
gridItemBox Grid Length Double
self GridItem
cell) LayoutItem Length Double x
child
    heights :: [Double]
heights = Double -> Track Length -> [Double]
sizeTrackMaxs (Size Double Double -> Double
forall m n. Size m n -> n
inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
parent) (Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self)
    width :: Double
width = Size Double Double -> Double
forall m n. Size m n -> n
inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
parent
boxMaxHeight PaddedBox Double Double
_ (LayoutInline x
val Paragraph (UserData Length Double x)
self' PageOptions
paging) = x
-> Paragraph (UserData Length Double x)
-> PageOptions
-> LayoutItem Length Double x
forall m n x.
x -> Paragraph (UserData m n x) -> PageOptions -> LayoutItem m n x
LayoutInline x
val Paragraph (UserData Length Double x)
self' PageOptions
paging
boxMaxHeight PaddedBox Double Double
_ (LayoutInline' x
val ParagraphLayout (UserData Length Double x)
self' PageOptions
paging) = x
-> ParagraphLayout (UserData Length Double x)
-> PageOptions
-> LayoutItem Length Double x
forall m n x.
x
-> ParagraphLayout (UserData m n x)
-> PageOptions
-> LayoutItem m n x
LayoutInline' x
val ParagraphLayout (UserData Length Double x)
self' PageOptions
paging
boxMaxHeight PaddedBox Double Double
p (LayoutConst x
val PaddedBox Length Double
self' [LayoutItem Length Double x]
childs) = x
-> PaddedBox Length Double
-> [LayoutItem Length Double x]
-> LayoutItem Length Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst x
val PaddedBox Length Double
self' ([LayoutItem Length Double x] -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$
    (LayoutItem Length Double x -> LayoutItem Length Double x)
-> [LayoutItem Length Double x] -> [LayoutItem Length Double x]
forall a b. (a -> b) -> [a] -> [b]
map (PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
boxMaxHeight (PaddedBox Double Double
 -> LayoutItem Length Double x -> LayoutItem Length Double x)
-> PaddedBox Double Double
-> LayoutItem Length Double x
-> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$ (Length -> Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' (Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
width PaddedBox Double Double
p) PaddedBox Length Double
self') [LayoutItem Length Double x]
childs
boxMaxHeight PaddedBox Double Double
parent (LayoutSpan FragmentTree (UserData Length Double x)
self') = FragmentTree (UserData Length Double x)
-> LayoutItem Length Double x
forall m n x. FragmentTree (UserData m n x) -> LayoutItem m n x
LayoutSpan FragmentTree (UserData Length Double x)
self'
boxMaxHeight PaddedBox Double Double
parent (LayoutFlex x
a Flex (LayoutItem Length Double x) Length
b) = x
-> Flex (LayoutItem Length Double x) Length
-> LayoutItem Length Double x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a (Flex (LayoutItem Length Double x) Length
 -> LayoutItem Length Double x)
-> Flex (LayoutItem Length Double x) Length
-> LayoutItem Length Double x
forall a b. (a -> b) -> a -> b
$ (LayoutItem Length Double x -> LayoutItem Length Double x)
-> Flex (LayoutItem Length Double x) Length
-> Flex (LayoutItem Length Double x) Length
forall a b c. (a -> b) -> Flex a c -> Flex b c
flexMap (PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
boxMaxHeight PaddedBox Double Double
parent) Flex (LayoutItem Length Double x) Length
b
-- | Update a (sub)tree to compute & cache final height.
boxHeight :: PaddedBox Double Double -> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight :: forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight PaddedBox Double Double
parent (LayoutFlow x
val PaddedBox Length Double
self [LayoutItem Length Double x]
childs) = x
-> PaddedBox Double Double
-> [LayoutItem Double Double x]
-> LayoutItem Double Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox Double Double
self' [LayoutItem Double Double x]
childs'
  where
    childs' :: [LayoutItem Double Double x]
childs' = (LayoutItem Length Double x -> LayoutItem Double Double x)
-> [LayoutItem Length Double x] -> [LayoutItem Double Double x]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight PaddedBox Double Double
self') [LayoutItem Length Double x]
childs
    self' :: PaddedBox Double Double
self' = ((Length -> Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' (Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Size Double Double -> Double
forall m n. Size m n -> n
inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
parent) PaddedBox Length Double
self) {
        size :: Size Double Double
size = Double -> Double -> Size Double Double
forall m n. n -> m -> Size m n
Size (Size Length Double -> Double
forall m n. Size m n -> n
inline (Size Length Double -> Double) -> Size Length Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Length Double -> Size Length Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Length Double
self) Double
size'
      }
    size' :: Double
size' = PaddedBox Double Double -> PaddedBox Length Double -> Double
flowHeight PaddedBox Double Double
parent PaddedBox Length Double
self
    width :: Double
width = Size Length Double -> Double
forall m n. Size m n -> n
inline (Size Length Double -> Double) -> Size Length Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Length Double -> Size Length Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Length Double
self
boxHeight PaddedBox Double Double
parent (LayoutGrid x
val Grid Length Double
self [GridItem]
cells0 [LayoutItem Length Double x]
childs) = x
-> Grid Double Double
-> [GridItem]
-> [LayoutItem Double Double x]
-> LayoutItem Double Double x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
val Grid Double Double
self' [GridItem]
cells' [LayoutItem Double Double x]
childs'
  where
    ([GridItem]
cells', [LayoutItem Double Double x]
childs') = [(GridItem, LayoutItem Double Double x)]
-> ([GridItem], [LayoutItem Double Double x])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(GridItem, LayoutItem Double Double x)]
 -> ([GridItem], [LayoutItem Double Double x]))
-> [(GridItem, LayoutItem Double Double x)]
-> ([GridItem], [LayoutItem Double Double x])
forall a b. (a -> b) -> a -> b
$ ((GridItem, LayoutItem Length Double x)
 -> (GridItem, LayoutItem Double Double x))
-> [(GridItem, LayoutItem Length Double x)]
-> [(GridItem, LayoutItem Double Double x)]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (GridItem, LayoutItem Length Double x)
-> (GridItem, LayoutItem Double Double x)
forall {x}.
(GridItem, LayoutItem Length Double x)
-> (GridItem, LayoutItem Double Double x)
recurse ([(GridItem, LayoutItem Length Double x)]
 -> [(GridItem, LayoutItem Double Double x)])
-> [(GridItem, LayoutItem Length Double x)]
-> [(GridItem, LayoutItem Double Double x)]
forall a b. (a -> b) -> a -> b
$ [GridItem]
-> [LayoutItem Length Double x]
-> [(GridItem, LayoutItem Length Double x)]
forall a b. [a] -> [b] -> [(a, b)]
zip [GridItem]
cells0 [LayoutItem Length Double x]
childs
    recurse :: (GridItem, LayoutItem Length Double x)
-> (GridItem, LayoutItem Double Double x)
recurse (GridItem
cell, LayoutItem Length Double x
child) = (GridItem
cell', LayoutItem Double Double x
child') -- Propagate track into subgrids.
      where
        cell' :: GridItem
cell' = GridItem -> PaddedBox Double Double -> GridItem
forall m n.
(CastDouble m, CastDouble n) =>
GridItem -> PaddedBox m n -> GridItem
setCellBox GridItem
cell (LayoutItem Double Double x -> PaddedBox Double Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem Double Double x
child')
        child' :: LayoutItem Double Double x
child' = PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight (LayoutItem Double Double x -> PaddedBox Double Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox (LayoutItem Double Double x -> PaddedBox Double Double)
-> LayoutItem Double Double x -> PaddedBox Double Double
forall a b. (a -> b) -> a -> b
$ x
-> Grid Double Double
-> [GridItem]
-> [LayoutItem Double Double x]
-> LayoutItem Double Double x
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid x
val Grid Double Double
self' [] []) LayoutItem Length Double x
child
    self' :: Grid Double Double
self' = Track Double -> Track Double -> Grid Double Double
forall m n. n -> m -> Size m n
Size (Grid Length Double -> Track Double
forall m n. Size m n -> n
inline Grid Length Double
self) Track {
        gap :: Double
gap = Double -> Length -> Double
lowerLength Double
width (Length -> Double) -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Track Length -> Length
forall x. Track x -> x
gap (Track Length -> Length) -> Track Length -> Length
forall a b. (a -> b) -> a -> b
$ Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self,
        cells :: [Either Double Double]
cells = (Either Length Double -> Either Double Double)
-> [Either Length Double] -> [Either Double Double]
forall a b. (a -> b) -> [a] -> [b]
map Either Length Double -> Either Double Double
forall {b}. Either Length b -> Either Double b
lowerSize ([Either Length Double] -> [Either Double Double])
-> [Either Length Double] -> [Either Double Double]
forall a b. (a -> b) -> a -> b
$ Track Length -> [Either Length Double]
forall x. Track x -> [Either x Double]
cells (Track Length -> [Either Length Double])
-> Track Length -> [Either Length Double]
forall a b. (a -> b) -> a -> b
$ Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self,
        trackMins :: [Double]
trackMins = Track Length -> [Double]
forall x. Track x -> [Double]
trackMins (Track Length -> [Double]) -> Track Length -> [Double]
forall a b. (a -> b) -> a -> b
$ Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self, trackNats :: [Double]
trackNats = Track Length -> [Double]
forall x. Track x -> [Double]
trackNats (Track Length -> [Double]) -> Track Length -> [Double]
forall a b. (a -> b) -> a -> b
$ Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self
      }
    heights :: [Double]
heights = Double -> Track Length -> [Double]
sizeTrackMaxs (Size Double Double -> Double
forall m n. Size m n -> n
inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
parent) (Track Length -> [Double]) -> Track Length -> [Double]
forall a b. (a -> b) -> a -> b
$ Grid Length Double -> Track Length
forall m n. Size m n -> m
block Grid Length Double
self
    lowerSize :: Either Length b -> Either Double b
lowerSize (Left Length
x) = Double -> Either Double b
forall a b. a -> Either a b
Left (Double -> Either Double b) -> Double -> Either Double b
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength Double
width Length
x
    lowerSize (Right b
x) = b -> Either Double b
forall a b. b -> Either a b
Right b
x
    width :: Double
width = Size Double Double -> Double
forall m n. Size m n -> n
inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
parent
boxHeight PaddedBox Double Double
parent self :: LayoutItem Length Double x
self@(LayoutInline x
val Paragraph (UserData Length Double x)
self' PageOptions
paging) =
    x
-> Paragraph (UserData Double Double x)
-> PageOptions
-> LayoutItem Double Double x
forall m n x.
x -> Paragraph (UserData m n x) -> PageOptions -> LayoutItem m n x
LayoutInline x
val ((Either (PaddedBox Length Double) (LayoutItem Length Double x)
 -> Either (PaddedBox Double Double) (LayoutItem Double Double x))
-> Paragraph (UserData Length Double x)
-> Paragraph (UserData Double Double x)
forall b b' a c.
(b -> b') -> Paragraph (a, b, c) -> Paragraph (a, b', c)
paragraphMap Either (PaddedBox Length Double) (LayoutItem Length Double x)
-> Either (PaddedBox Double Double) (LayoutItem Double Double x)
forall {n} {x}.
Either (PaddedBox Length n) (LayoutItem Length Double x)
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
inner Paragraph (UserData Length Double x)
self') PageOptions
paging
  where
    inner :: Either (PaddedBox Length n) (LayoutItem Length Double x)
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
inner (Left PaddedBox Length n
a) = PaddedBox Double n
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. a -> Either a b
Left (PaddedBox Double n
 -> Either (PaddedBox Double n) (LayoutItem Double Double x))
-> PaddedBox Double n
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox Length n -> PaddedBox Double n
forall {n}. PaddedBox Length n -> PaddedBox Double n
resolveHeight PaddedBox Length n
a
    inner (Right LayoutItem Length Double x
a) = LayoutItem Double Double x
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. b -> Either a b
Right (LayoutItem Double Double x
 -> Either (PaddedBox Double n) (LayoutItem Double Double x))
-> LayoutItem Double Double x
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight (PaddedBox Length Double -> PaddedBox Double Double
forall {n}. PaddedBox Length n -> PaddedBox Double n
resolveHeight (PaddedBox Length Double -> PaddedBox Double Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall a b. (a -> b) -> a -> b
$ LayoutItem Length Double x -> PaddedBox Length Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem Length Double x
self) LayoutItem Length Double x
a
    resolveHeight :: PaddedBox Length n -> PaddedBox Double n
resolveHeight = (Length -> Double) -> PaddedBox Length n -> PaddedBox Double n
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' ((Length -> Double) -> PaddedBox Length n -> PaddedBox Double n)
-> (Length -> Double) -> PaddedBox Length n -> PaddedBox Double n
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Size Double Double -> Double
forall m n. Size m n -> n
B.inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox Double Double
parent
boxHeight PaddedBox Double Double
parent self :: LayoutItem Length Double x
self@(LayoutInline' x
val ParagraphLayout (UserData Length Double x)
self' PageOptions
paging) =
    x
-> ParagraphLayout (UserData Double Double x)
-> PageOptions
-> LayoutItem Double Double x
forall m n x.
x
-> ParagraphLayout (UserData m n x)
-> PageOptions
-> LayoutItem m n x
LayoutInline' x
val ((Either (PaddedBox Length Double) (LayoutItem Length Double x)
 -> Either (PaddedBox Double Double) (LayoutItem Double Double x))
-> ParagraphLayout (UserData Length Double x)
-> ParagraphLayout (UserData Double Double x)
forall b b' a c.
(b -> b')
-> ParagraphLayout (a, b, c) -> ParagraphLayout (a, b', c)
layoutMap Either (PaddedBox Length Double) (LayoutItem Length Double x)
-> Either (PaddedBox Double Double) (LayoutItem Double Double x)
forall {n} {x}.
Either (PaddedBox Length n) (LayoutItem Length Double x)
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
inner ParagraphLayout (UserData Length Double x)
self') PageOptions
paging
  where
    inner :: Either (PaddedBox Length n) (LayoutItem Length Double x)
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
inner (Left PaddedBox Length n
a) = PaddedBox Double n
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. a -> Either a b
Left (PaddedBox Double n
 -> Either (PaddedBox Double n) (LayoutItem Double Double x))
-> PaddedBox Double n
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox Length n -> PaddedBox Double n
forall {n}. PaddedBox Length n -> PaddedBox Double n
resolveHeight PaddedBox Length n
a
    inner (Right LayoutItem Length Double x
a) = LayoutItem Double Double x
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. b -> Either a b
Right (LayoutItem Double Double x
 -> Either (PaddedBox Double n) (LayoutItem Double Double x))
-> LayoutItem Double Double x
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight (PaddedBox Length Double -> PaddedBox Double Double
forall {n}. PaddedBox Length n -> PaddedBox Double n
resolveHeight (PaddedBox Length Double -> PaddedBox Double Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall a b. (a -> b) -> a -> b
$ LayoutItem Length Double x -> PaddedBox Length Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem Length Double x
self) LayoutItem Length Double x
a
    resolveHeight :: PaddedBox Length n -> PaddedBox Double n
resolveHeight = (Length -> Double) -> PaddedBox Length n -> PaddedBox Double n
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' ((Length -> Double) -> PaddedBox Length n -> PaddedBox Double n)
-> (Length -> Double) -> PaddedBox Length n -> PaddedBox Double n
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Size Double Double -> Double
forall m n. Size m n -> n
B.inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox Double Double
parent
boxHeight PaddedBox Double Double
p (LayoutConst x
val PaddedBox Length Double
self [LayoutItem Length Double x]
childs) =
    let self' :: PaddedBox Double Double
self' = (Length -> Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' (Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
width PaddedBox Double Double
p) PaddedBox Length Double
self
    in x
-> PaddedBox Double Double
-> [LayoutItem Double Double x]
-> LayoutItem Double Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst x
val PaddedBox Double Double
self' ([LayoutItem Double Double x] -> LayoutItem Double Double x)
-> [LayoutItem Double Double x] -> LayoutItem Double Double x
forall a b. (a -> b) -> a -> b
$ (LayoutItem Length Double x -> LayoutItem Double Double x)
-> [LayoutItem Length Double x] -> [LayoutItem Double Double x]
forall a b. (a -> b) -> [a] -> [b]
map (PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight PaddedBox Double Double
self') [LayoutItem Length Double x]
childs
boxHeight PaddedBox Double Double
parent self :: LayoutItem Length Double x
self@(LayoutSpan FragmentTree (UserData Length Double x)
self') = FragmentTree (UserData Double Double x)
-> LayoutItem Double Double x
forall m n x. FragmentTree (UserData m n x) -> LayoutItem m n x
LayoutSpan (FragmentTree (UserData Double Double x)
 -> LayoutItem Double Double x)
-> FragmentTree (UserData Double Double x)
-> LayoutItem Double Double x
forall a b. (a -> b) -> a -> b
$ (Either (PaddedBox Length Double) (LayoutItem Length Double x)
 -> Either (PaddedBox Double Double) (LayoutItem Double Double x))
-> FragmentTree (UserData Length Double x)
-> FragmentTree (UserData Double Double x)
forall b b' a c.
(b -> b') -> FragmentTree (a, b, c) -> FragmentTree (a, b', c)
treeMap Either (PaddedBox Length Double) (LayoutItem Length Double x)
-> Either (PaddedBox Double Double) (LayoutItem Double Double x)
forall {n} {x}.
Either (PaddedBox Length n) (LayoutItem Length Double x)
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
inner FragmentTree (UserData Length Double x)
self'
  where
    inner :: Either (PaddedBox Length n) (LayoutItem Length Double x)
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
inner (Left PaddedBox Length n
a) = PaddedBox Double n
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. a -> Either a b
Left (PaddedBox Double n
 -> Either (PaddedBox Double n) (LayoutItem Double Double x))
-> PaddedBox Double n
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox Length n -> PaddedBox Double n
forall {n}. PaddedBox Length n -> PaddedBox Double n
resolveHeight PaddedBox Length n
a
    inner (Right LayoutItem Length Double x
a) = LayoutItem Double Double x
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. b -> Either a b
Right (LayoutItem Double Double x
 -> Either (PaddedBox Double n) (LayoutItem Double Double x))
-> LayoutItem Double Double x
-> Either (PaddedBox Double n) (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight (PaddedBox Length Double -> PaddedBox Double Double
forall {n}. PaddedBox Length n -> PaddedBox Double n
resolveHeight (PaddedBox Length Double -> PaddedBox Double Double)
-> PaddedBox Length Double -> PaddedBox Double Double
forall a b. (a -> b) -> a -> b
$ LayoutItem Length Double x -> PaddedBox Length Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem Length Double x
self) LayoutItem Length Double x
a
    resolveHeight :: PaddedBox Length n -> PaddedBox Double n
resolveHeight = (Length -> Double) -> PaddedBox Length n -> PaddedBox Double n
forall m mm n. (m -> mm) -> PaddedBox m n -> PaddedBox mm n
mapY' ((Length -> Double) -> PaddedBox Length n -> PaddedBox Double n)
-> (Length -> Double) -> PaddedBox Length n -> PaddedBox Double n
forall a b. (a -> b) -> a -> b
$ Double -> Length -> Double
lowerLength (Double -> Length -> Double) -> Double -> Length -> Double
forall a b. (a -> b) -> a -> b
$ Size Double Double -> Double
forall m n. Size m n -> n
B.inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox Double Double
parent
boxHeight PaddedBox Double Double
p (LayoutFlex x
a Flex (LayoutItem Length Double x) Length
b) = x
-> Flex (LayoutItem Double Double x) Double
-> LayoutItem Double Double x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a (Flex (LayoutItem Double Double x) Double
 -> LayoutItem Double Double x)
-> Flex (LayoutItem Double Double x) Double
-> LayoutItem Double Double x
forall a b. (a -> b) -> a -> b
$
    (LayoutItem Double Double x -> Direction -> Double)
-> Double
-> Flex (LayoutItem Double Double x) Length
-> Flex (LayoutItem Double Double x) Double
forall b a.
CastDouble b =>
(a -> Direction -> Double) -> Double -> Flex a b -> Flex a Double
flexResolve (PaddedBox Double Double -> Direction -> Double
forall m. Num m => PaddedBox m m -> Direction -> m
innerMain (PaddedBox Double Double -> Direction -> Double)
-> (LayoutItem Double Double x -> PaddedBox Double Double)
-> LayoutItem Double Double x
-> Direction
-> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LayoutItem Double Double x -> PaddedBox Double Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox) (PaddedBox Double Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
width PaddedBox Double Double
p) (Flex (LayoutItem Double Double x) Length
 -> Flex (LayoutItem Double Double x) Double)
-> Flex (LayoutItem Double Double x) Length
-> Flex (LayoutItem Double Double x) Double
forall a b. (a -> b) -> a -> b
$ (LayoutItem Length Double x -> LayoutItem Double Double x)
-> Flex (LayoutItem Length Double x) Length
-> Flex (LayoutItem Double Double x) Length
forall a b c. (a -> b) -> Flex a c -> Flex b c
flexMap (PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight PaddedBox Double Double
p) Flex (LayoutItem Length Double x) Length
b

-- | Split a (sub)tree to fit within max-height.
-- May take full page height into account.
boxSplit :: PropertyParser x => Double -> Double -> LayoutItem Double Double x ->
    (LayoutItem Double Double x, Maybe (LayoutItem Double Double x))
boxSplit :: forall x.
PropertyParser x =>
Double
-> Double
-> LayoutItem Double Double x
-> (LayoutItem Double Double x, Maybe (LayoutItem Double Double x))
boxSplit Double
maxheight Double
_ LayoutItem Double Double x
node | PaddedBox Double Double -> Double
forall {a} {n}. Num a => PaddedBox a n -> a
height (LayoutItem Double Double x -> PaddedBox Double Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem Double Double x
node) Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
maxheight = (LayoutItem Double Double x
node, Maybe (LayoutItem Double Double x)
forall a. Maybe a
Nothing)
boxSplit Double
maxheight Double
pageheight (LayoutFlow x
val PaddedBox Double Double
self [LayoutItem Double Double x]
childs)
    | (LayoutItem Double Double x
next:[LayoutItem Double Double x]
_) <- [LayoutItem Double Double x]
childs1, ((Double
y,LayoutItem Double Double x
_):[(Double, LayoutItem Double Double x)]
_) <- [(Double, LayoutItem Double Double x)]
childs0',
        (LayoutItem Double Double x
tail,Just LayoutItem Double Double x
nextpage) <- Double
-> Double
-> LayoutItem Double Double x
-> (LayoutItem Double Double x, Maybe (LayoutItem Double Double x))
forall x.
PropertyParser x =>
Double
-> Double
-> LayoutItem Double Double x
-> (LayoutItem Double Double x, Maybe (LayoutItem Double Double x))
boxSplit (Double
maxheight Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
y) Double
pageheight LayoutItem Double Double x
next =
            (x
-> PaddedBox Double Double
-> [LayoutItem Double Double x]
-> LayoutItem Double Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox Double Double
self {
                size :: Size Double Double
size = (PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
self) { block :: Double
B.block = Double
y }
            } ([LayoutItem Double Double x]
childs0 [LayoutItem Double Double x]
-> [LayoutItem Double Double x] -> [LayoutItem Double Double x]
forall a. [a] -> [a] -> [a]
++ [LayoutItem Double Double x
tail]),
             LayoutItem Double Double x -> Maybe (LayoutItem Double Double x)
forall a. a -> Maybe a
Just (LayoutItem Double Double x -> Maybe (LayoutItem Double Double x))
-> LayoutItem Double Double x -> Maybe (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ x
-> PaddedBox Double Double
-> [LayoutItem Double Double x]
-> LayoutItem Double Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox Double Double
self {
                size :: Size Double Double
size = (PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
self) { block :: Double
B.block = Size Double Double -> Double
forall m n. Size m n -> m
B.block (PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
self) Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
y }
             } (LayoutItem Double Double x
nextpageLayoutItem Double Double x
-> [LayoutItem Double Double x] -> [LayoutItem Double Double x]
forall a. a -> [a] -> [a]
:[LayoutItem Double Double x]
childs1))
    | Bool
otherwise =
        (x
-> PaddedBox Double Double
-> [LayoutItem Double Double x]
-> LayoutItem Double Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox Double Double
self { size :: Size Double Double
size = (PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
self) { block :: Double
B.block = Double
maxheight } } [LayoutItem Double Double x]
childs0,
         LayoutItem Double Double x -> Maybe (LayoutItem Double Double x)
forall a. a -> Maybe a
Just (LayoutItem Double Double x -> Maybe (LayoutItem Double Double x))
-> LayoutItem Double Double x -> Maybe (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ x
-> PaddedBox Double Double
-> [LayoutItem Double Double x]
-> LayoutItem Double Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow x
val PaddedBox Double Double
self [LayoutItem Double Double x]
childs1) -- TODO recompute height
  where
    childs0 :: [LayoutItem Double Double x]
childs0 = ((Double, LayoutItem Double Double x)
 -> LayoutItem Double Double x)
-> [(Double, LayoutItem Double Double x)]
-> [LayoutItem Double Double x]
forall a b. (a -> b) -> [a] -> [b]
map (Double, LayoutItem Double Double x) -> LayoutItem Double Double x
forall a b. (a, b) -> b
snd [(Double, LayoutItem Double Double x)]
childs0'
    childs1 :: [LayoutItem Double Double x]
childs1 = ((Double, LayoutItem Double Double x)
 -> LayoutItem Double Double x)
-> [(Double, LayoutItem Double Double x)]
-> [LayoutItem Double Double x]
forall a b. (a -> b) -> [a] -> [b]
map (Double, LayoutItem Double Double x) -> LayoutItem Double Double x
forall a b. (a, b) -> b
snd [(Double, LayoutItem Double Double x)]
childs1'
    ([(Double, LayoutItem Double Double x)]
childs0', [(Double, LayoutItem Double Double x)]
childs1') = ((Double, LayoutItem Double Double x) -> Bool)
-> [(Double, LayoutItem Double Double x)]
-> ([(Double, LayoutItem Double Double x)],
    [(Double, LayoutItem Double Double x)])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Double, LayoutItem Double Double x) -> Bool
forall {b}. (Double, b) -> Bool
overflowed ([(Double, LayoutItem Double Double x)]
 -> ([(Double, LayoutItem Double Double x)],
     [(Double, LayoutItem Double Double x)]))
-> [(Double, LayoutItem Double Double x)]
-> ([(Double, LayoutItem Double Double x)],
    [(Double, LayoutItem Double Double x)])
forall a b. (a -> b) -> a -> b
$ Double
-> [LayoutItem Double Double x]
-> [(Double, LayoutItem Double Double x)]
forall {t} {n} {x}.
(Num t, Zero t, Zero n, CastDouble t, CastDouble n) =>
t -> [LayoutItem t n x] -> [(t, LayoutItem t n x)]
inner Double
0 [LayoutItem Double Double x]
childs
    overflowed :: (Double, b) -> Bool
overflowed (Double
y, b
_) = Double
y Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
>= Double
maxheight
    inner :: t -> [LayoutItem t n x] -> [(t, LayoutItem t n x)]
inner t
start (LayoutItem t n x
child:[LayoutItem t n x]
childs) = (t
start', LayoutItem t n x
child)(t, LayoutItem t n x)
-> [(t, LayoutItem t n x)] -> [(t, LayoutItem t n x)]
forall a. a -> [a] -> [a]
:t -> [LayoutItem t n x] -> [(t, LayoutItem t n x)]
inner t
start' [LayoutItem t n x]
childs -- TODO margin collapse?
        where start' :: t
start' = t
start t -> t -> t
forall a. Num a => a -> a -> a
+ PaddedBox t n -> t
forall {a} {n}. Num a => PaddedBox a n -> a
height (LayoutItem t n x -> PaddedBox t n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem t n x
child)
    inner t
_ [] = []
boxSplit Double
_ Double
_ self :: LayoutItem Double Double x
self@(LayoutConst x
_ PaddedBox Double Double
_ [LayoutItem Double Double x]
_) = (LayoutItem Double Double x
self, Maybe (LayoutItem Double Double x)
forall a. Maybe a
Nothing) -- Doesn't split.
boxSplit Double
_ Double
_ self :: LayoutItem Double Double x
self@(LayoutGrid x
_ Grid Double Double
_ [GridItem]
_ [LayoutItem Double Double x]
_) = (LayoutItem Double Double x
self, Maybe (LayoutItem Double Double x)
forall a. Maybe a
Nothing) -- TODO
boxSplit Double
maxheight Double
pageheight (LayoutInline x
a Paragraph (UserData Double Double x)
self PageOptions
b) =
    Double
-> Double
-> LayoutItem Double Double x
-> (LayoutItem Double Double x, Maybe (LayoutItem Double Double x))
forall x.
PropertyParser x =>
Double
-> Double
-> LayoutItem Double Double x
-> (LayoutItem Double Double x, Maybe (LayoutItem Double Double x))
boxSplit Double
maxheight Double
pageheight (LayoutItem Double Double x
 -> (LayoutItem Double Double x,
     Maybe (LayoutItem Double Double x)))
-> LayoutItem Double Double x
-> (LayoutItem Double Double x, Maybe (LayoutItem Double Double x))
forall a b. (a -> b) -> a -> b
$ x
-> ParagraphLayout (UserData Double Double x)
-> PageOptions
-> LayoutItem Double Double x
forall m n x.
x
-> ParagraphLayout (UserData m n x)
-> PageOptions
-> LayoutItem m n x
LayoutInline' x
a (Paragraph (UserData Double Double x)
-> ParagraphLayout (UserData Double Double x)
forall d. Paragraph d -> ParagraphLayout d
layoutRich Paragraph (UserData Double Double x)
self) PageOptions
b
boxSplit Double
maxheight Double
pageheight (LayoutInline' x
a ParagraphLayout (UserData Double Double x)
self PageOptions
paging) =
    case PageOptions
-> ParagraphLayout (UserData Double Double x)
-> (PageContinuity, ParagraphLayout (UserData Double Double x),
    Maybe (ParagraphLayout (UserData Double Double x)))
forall pl.
Paginable pl =>
PageOptions -> pl -> (PageContinuity, pl, Maybe pl)
paginate PageOptions
paging {
            pageCurrentHeight :: Int32
pageCurrentHeight = Int -> Int32
forall a. Enum a => Int -> a
toEnum (Int -> Int32) -> Int -> Int32
forall a b. (a -> b) -> a -> b
$ Double -> Int
forall a. Enum a => a -> Int
fromEnum Double
maxheight,
            pageNextHeight :: Int32
pageNextHeight = Int -> Int32
forall a. Enum a => Int -> a
toEnum (Int -> Int32) -> Int -> Int32
forall a b. (a -> b) -> a -> b
$ Double -> Int
forall a. Enum a => a -> Int
fromEnum Double
pageheight
      } ParagraphLayout (UserData Double Double x)
self of
        (PageContinuity
Continue, ParagraphLayout (UserData Double Double x)
self', Maybe (ParagraphLayout (UserData Double Double x))
next) -> (ParagraphLayout (UserData Double Double x)
-> LayoutItem Double Double x
forall {m} {n}.
ParagraphLayout (UserData m n x) -> LayoutItem m n x
wrap ParagraphLayout (UserData Double Double x)
self', ParagraphLayout (UserData Double Double x)
-> LayoutItem Double Double x
forall {m} {n}.
ParagraphLayout (UserData m n x) -> LayoutItem m n x
wrap (ParagraphLayout (UserData Double Double x)
 -> LayoutItem Double Double x)
-> Maybe (ParagraphLayout (UserData Double Double x))
-> Maybe (LayoutItem Double Double x)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (ParagraphLayout (UserData Double Double x))
next)
        (PageContinuity
Break, ParagraphLayout (UserData Double Double x)
_, Maybe (ParagraphLayout (UserData Double Double x))
_) -> (LayoutItem Double Double x
forall x m n.
(PropertyParser x, Zero m, Zero n) =>
LayoutItem m n x
nullLayout, LayoutItem Double Double x -> Maybe (LayoutItem Double Double x)
forall a. a -> Maybe a
Just (LayoutItem Double Double x -> Maybe (LayoutItem Double Double x))
-> LayoutItem Double Double x -> Maybe (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ ParagraphLayout (UserData Double Double x)
-> LayoutItem Double Double x
forall {m} {n}.
ParagraphLayout (UserData m n x) -> LayoutItem m n x
wrap ParagraphLayout (UserData Double Double x)
self)
  where
    wrap :: ParagraphLayout (UserData m n x) -> LayoutItem m n x
wrap ParagraphLayout (UserData m n x)
self' = x
-> ParagraphLayout (UserData m n x)
-> PageOptions
-> LayoutItem m n x
forall m n x.
x
-> ParagraphLayout (UserData m n x)
-> PageOptions
-> LayoutItem m n x
LayoutInline' x
a ParagraphLayout (UserData m n x)
self' PageOptions
paging
boxSplit Double
_ Double
_ self :: LayoutItem Double Double x
self@(LayoutSpan FragmentTree (UserData Double Double x)
_) = (LayoutItem Double Double x
self, Maybe (LayoutItem Double Double x)
forall a. Maybe a
Nothing) -- Can't split!
boxSplit Double
maxheight Double
pageheight (LayoutFlex x
a Flex (LayoutItem Double Double x) Double
self) =
    -- FIXME: What if any children are too big for the page?
    let (Flex (LayoutItem Double Double x) Double
p0, Flex (LayoutItem Double Double x) Double
p1) = (LayoutItem Double Double x -> Size Double Double)
-> Double
-> Double
-> Flex (LayoutItem Double Double x) Double
-> (Flex (LayoutItem Double Double x) Double,
    Flex (LayoutItem Double Double x) Double)
forall a.
(a -> Size Double Double)
-> Double
-> Double
-> Flex a Double
-> (Flex a Double, Flex a Double)
flexSplit ( PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
B.size (PaddedBox Double Double -> Size Double Double)
-> (LayoutItem Double Double x -> PaddedBox Double Double)
-> LayoutItem Double Double x
-> Size Double Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LayoutItem Double Double x -> PaddedBox Double Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox ) Double
maxheight Double
pageheight Flex (LayoutItem Double Double x) Double
self
    in if [[FlexChild (LayoutItem Double Double x) Double]] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([[FlexChild (LayoutItem Double Double x) Double]] -> Bool)
-> [[FlexChild (LayoutItem Double Double x) Double]] -> Bool
forall a b. (a -> b) -> a -> b
$ Flex (LayoutItem Double Double x) Double
-> [[FlexChild (LayoutItem Double Double x) Double]]
forall a b. Flex a b -> [[FlexChild a b]]
Fl.children Flex (LayoutItem Double Double x) Double
p1
    then (x
-> Flex (LayoutItem Double Double x) Double
-> LayoutItem Double Double x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a Flex (LayoutItem Double Double x) Double
p0, Maybe (LayoutItem Double Double x)
forall a. Maybe a
Nothing)
    else (x
-> Flex (LayoutItem Double Double x) Double
-> LayoutItem Double Double x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a Flex (LayoutItem Double Double x) Double
p0, LayoutItem Double Double x -> Maybe (LayoutItem Double Double x)
forall a. a -> Maybe a
Just (LayoutItem Double Double x -> Maybe (LayoutItem Double Double x))
-> LayoutItem Double Double x -> Maybe (LayoutItem Double Double x)
forall a b. (a -> b) -> a -> b
$ x
-> Flex (LayoutItem Double Double x) Double
-> LayoutItem Double Double x
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex x
a Flex (LayoutItem Double Double x) Double
p1)
-- | Generate a list of pages from a node, splitting subtrees where necessary.
boxPaginate :: Double
-> LayoutItem Double Double x -> [LayoutItem Double Double x]
boxPaginate Double
pageheight LayoutItem Double Double x
node
    | (LayoutItem Double Double x
page, Just LayoutItem Double Double x
overflow) <- Double
-> Double
-> LayoutItem Double Double x
-> (LayoutItem Double Double x, Maybe (LayoutItem Double Double x))
forall x.
PropertyParser x =>
Double
-> Double
-> LayoutItem Double Double x
-> (LayoutItem Double Double x, Maybe (LayoutItem Double Double x))
boxSplit Double
pageheight Double
pageheight LayoutItem Double Double x
node =
        LayoutItem Double Double x
pageLayoutItem Double Double x
-> [LayoutItem Double Double x] -> [LayoutItem Double Double x]
forall a. a -> [a] -> [a]
:Double
-> LayoutItem Double Double x -> [LayoutItem Double Double x]
boxPaginate Double
pageheight LayoutItem Double Double x
overflow
    | Bool
otherwise = [LayoutItem Double Double x
node]

-- | Compute position of all nodes in the (sub)tree relative to a base coordinate.
boxPosition :: (PropertyParser x, Eq x) => (Double, Double) ->
    LayoutItem Double Double x -> LayoutItem Double Double ((Double, Double), x)
boxPosition :: forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition (Double
x,Double
y) (LayoutFlow x
val PaddedBox Double Double
box [LayoutFlex x
val' Flex (LayoutItem Double Double x) Double
self]) =
    ((Double, Double), x)
-> PaddedBox Double Double
-> [LayoutItem Double Double ((Double, Double), x)]
-> LayoutItem Double Double ((Double, Double), x)
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow ((Double
x,Double
y), x
val) PaddedBox Double Double
box [ -- Obtaining size from parent
        ((Double, Double), x)
-> Flex (LayoutItem Double Double ((Double, Double), x)) Double
-> LayoutItem Double Double ((Double, Double), x)
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex ((Double, Double)
pos', x
val') (Flex (LayoutItem Double Double ((Double, Double), x)) Double
 -> LayoutItem Double Double ((Double, Double), x))
-> Flex (LayoutItem Double Double ((Double, Double), x)) Double
-> LayoutItem Double Double ((Double, Double), x)
forall a b. (a -> b) -> a -> b
$
            ((Double, Double)
 -> LayoutItem Double Double x
 -> LayoutItem Double Double ((Double, Double), x))
-> (LayoutItem Double Double x -> Size Double Double)
-> (Double, Double)
-> Size Double Double
-> Flex (LayoutItem Double Double x) Double
-> Flex (LayoutItem Double Double ((Double, Double), x)) Double
forall a b.
((Double, Double) -> a -> b)
-> (a -> Size Double Double)
-> (Double, Double)
-> Size Double Double
-> Flex a Double
-> Flex b Double
flexPosition (Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition LayoutItem Double Double x -> Size Double Double
forall {n} {m} {x}.
(Num n, Num m, Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> Size m n
boxSize (Double, Double)
pos' (PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
B.size PaddedBox Double Double
box) Flex (LayoutItem Double Double x) Double
self
    ]
  where
    boxSize :: LayoutItem m n x -> Size m n
boxSize LayoutItem m n x
box' = let b :: PaddedBox m n
b = LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem m n x
box' in PaddedBox m n -> n
forall {a} {m}. Num a => PaddedBox m a -> a
B.width PaddedBox m n
b n -> m -> Size m n
forall m n. n -> m -> Size m n
`Size` PaddedBox m n -> m
forall {a} {n}. Num a => PaddedBox a n -> a
B.height PaddedBox m n
b
    pos' :: (Double, Double)
pos' = (Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
+ PaddedBox Double Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
B.leftSpace PaddedBox Double Double
box, Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
+ PaddedBox Double Double -> Double
forall {a} {m}. Num a => PaddedBox m a -> a
B.rightSpace PaddedBox Double Double
box)
boxPosition (Double, Double)
pos self :: LayoutItem Double Double x
self@(LayoutFlex x
val Flex (LayoutItem Double Double x) Double
self') =
    ((Double, Double), x)
-> Flex (LayoutItem Double Double ((Double, Double), x)) Double
-> LayoutItem Double Double ((Double, Double), x)
forall m n x. x -> Flex (LayoutItem m n x) m -> LayoutItem m n x
LayoutFlex ((Double, Double)
pos, x
val) (Flex (LayoutItem Double Double ((Double, Double), x)) Double
 -> LayoutItem Double Double ((Double, Double), x))
-> Flex (LayoutItem Double Double ((Double, Double), x)) Double
-> LayoutItem Double Double ((Double, Double), x)
forall a b. (a -> b) -> a -> b
$ ((Double, Double)
 -> LayoutItem Double Double x
 -> LayoutItem Double Double ((Double, Double), x))
-> (LayoutItem Double Double x -> Size Double Double)
-> (Double, Double)
-> Size Double Double
-> Flex (LayoutItem Double Double x) Double
-> Flex (LayoutItem Double Double ((Double, Double), x)) Double
forall a b.
((Double, Double) -> a -> b)
-> (a -> Size Double Double)
-> (Double, Double)
-> Size Double Double
-> Flex a Double
-> Flex b Double
flexPosition (Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition LayoutItem Double Double x -> Size Double Double
forall {n} {m} {x}.
(Num n, Num m, Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> Size m n
boxSize (Double, Double)
pos Size Double Double
size Flex (LayoutItem Double Double x) Double
self'
  where
    boxSize :: LayoutItem m n x -> Size m n
boxSize LayoutItem m n x
box' = let b :: PaddedBox m n
b = LayoutItem m n x -> PaddedBox m n
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem m n x
box' in PaddedBox m n -> n
forall {a} {m}. Num a => PaddedBox m a -> a
B.width PaddedBox m n
b n -> m -> Size m n
forall m n. n -> m -> Size m n
`Size` PaddedBox m n -> m
forall {a} {n}. Num a => PaddedBox a n -> a
B.height PaddedBox m n
b
    size :: Size Double Double
size = PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
B.size (PaddedBox Double Double -> Size Double Double)
-> PaddedBox Double Double -> Size Double Double
forall a b. (a -> b) -> a -> b
$ LayoutItem Double Double x -> PaddedBox Double Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem Double Double x
self
boxPosition pos :: (Double, Double)
pos@(Double
x, Double
y) (LayoutFlow x
val PaddedBox Double Double
self [LayoutItem Double Double x]
childs) = ((Double, Double), x)
-> PaddedBox Double Double
-> [LayoutItem Double Double ((Double, Double), x)]
-> LayoutItem Double Double ((Double, Double), x)
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutFlow ((Double, Double)
pos, x
val) PaddedBox Double Double
self [LayoutItem Double Double ((Double, Double), x)]
childs'
  where
    childs' :: [LayoutItem Double Double ((Double, Double), x)]
childs' = ((Size Double Double, LayoutItem Double Double x)
 -> LayoutItem Double Double ((Double, Double), x))
-> [(Size Double Double, LayoutItem Double Double x)]
-> [LayoutItem Double Double ((Double, Double), x)]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' (Size Double Double, LayoutItem Double Double x)
-> LayoutItem Double Double ((Double, Double), x)
forall {x}.
(PropertyParser x, Eq x) =>
(Size Double Double, LayoutItem Double Double x)
-> LayoutItem Double Double ((Double, Double), x)
recurse ([(Size Double Double, LayoutItem Double Double x)]
 -> [LayoutItem Double Double ((Double, Double), x)])
-> [(Size Double Double, LayoutItem Double Double x)]
-> [LayoutItem Double Double ((Double, Double), x)]
forall a b. (a -> b) -> a -> b
$ [Size Double Double]
-> [LayoutItem Double Double x]
-> [(Size Double Double, LayoutItem Double Double x)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Size Double Double]
pos' [LayoutItem Double Double x]
childs
    recurse :: (Size Double Double, LayoutItem Double Double x)
-> LayoutItem Double Double ((Double, Double), x)
recurse ((Size Double
x' Double
y'), LayoutItem Double Double x
child) = (Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition (Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
x', Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
y') LayoutItem Double Double x
child
    pos' :: [Size Double Double]
pos' = [PaddedBox Double Double] -> [Size Double Double]
positionFlow ([PaddedBox Double Double] -> [Size Double Double])
-> [PaddedBox Double Double] -> [Size Double Double]
forall a b. (a -> b) -> a -> b
$ (LayoutItem Double Double x -> PaddedBox Double Double)
-> [LayoutItem Double Double x] -> [PaddedBox Double Double]
forall a b. (a -> b) -> [a] -> [b]
map LayoutItem Double Double x -> PaddedBox Double Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox [LayoutItem Double Double x]
childs
boxPosition pos :: (Double, Double)
pos@(Double
x, Double
y) (LayoutGrid x
val Grid Double Double
self [GridItem]
cells [LayoutItem Double Double x]
childs) = ((Double, Double), x)
-> Grid Double Double
-> [GridItem]
-> [LayoutItem Double Double ((Double, Double), x)]
-> LayoutItem Double Double ((Double, Double), x)
forall m n x.
x
-> Grid m n -> [GridItem] -> [LayoutItem m n x] -> LayoutItem m n x
LayoutGrid ((Double, Double)
pos, x
val) Grid Double Double
self [GridItem]
cells [LayoutItem Double Double ((Double, Double), x)]
childs'
  where
    childs' :: [LayoutItem Double Double ((Double, Double), x)]
childs' = (((Double, Double), LayoutItem Double Double x)
 -> LayoutItem Double Double ((Double, Double), x))
-> [((Double, Double), LayoutItem Double Double x)]
-> [LayoutItem Double Double ((Double, Double), x)]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' ((Double, Double), LayoutItem Double Double x)
-> LayoutItem Double Double ((Double, Double), x)
forall {x}.
(PropertyParser x, Eq x) =>
((Double, Double), LayoutItem Double Double x)
-> LayoutItem Double Double ((Double, Double), x)
recurse ([((Double, Double), LayoutItem Double Double x)]
 -> [LayoutItem Double Double ((Double, Double), x)])
-> [((Double, Double), LayoutItem Double Double x)]
-> [LayoutItem Double Double ((Double, Double), x)]
forall a b. (a -> b) -> a -> b
$ [(Double, Double)]
-> [LayoutItem Double Double x]
-> [((Double, Double), LayoutItem Double Double x)]
forall a b. [a] -> [b] -> [(a, b)]
zip [(Double, Double)]
pos' [LayoutItem Double Double x]
childs
    recurse :: ((Double, Double), LayoutItem Double Double x)
-> LayoutItem Double Double ((Double, Double), x)
recurse ((Double
x', Double
y'), LayoutItem Double Double x
child) = (Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition (Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
x', Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
y') LayoutItem Double Double x
child
    pos' :: [(Double, Double)]
pos' = Grid Double Double -> [GridItem] -> [(Double, Double)]
gridPosition Grid Double Double
self [GridItem]
cells
boxPosition pos :: (Double, Double)
pos@(Double
x, Double
y) (LayoutInline x
val Paragraph (UserData Double Double x)
self PageOptions
paging) =
    (Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition (Double, Double)
pos (LayoutItem Double Double x
 -> LayoutItem Double Double ((Double, Double), x))
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall a b. (a -> b) -> a -> b
$ x
-> ParagraphLayout (UserData Double Double x)
-> PageOptions
-> LayoutItem Double Double x
forall m n x.
x
-> ParagraphLayout (UserData m n x)
-> PageOptions
-> LayoutItem m n x
LayoutInline' x
val (Paragraph (UserData Double Double x)
-> ParagraphLayout (UserData Double Double x)
forall d. Paragraph d -> ParagraphLayout d
layoutRich Paragraph (UserData Double Double x)
self) PageOptions
paging
boxPosition pos :: (Double, Double)
pos@(Double
x, Double
y) self :: LayoutItem Double Double x
self@(LayoutInline' x
val ParagraphLayout (UserData Double Double x)
_ PageOptions
_) =
    (Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition (Double, Double)
pos (LayoutItem Double Double x
 -> LayoutItem Double Double ((Double, Double), x))
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall a b. (a -> b) -> a -> b
$ x
-> PaddedBox Double Double
-> [LayoutItem Double Double x]
-> LayoutItem Double Double x
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst x
val (LayoutItem Double Double x -> PaddedBox Double Double
forall m n x.
(Zero m, Zero n, CastDouble m, CastDouble n) =>
LayoutItem m n x -> PaddedBox m n
layoutGetBox LayoutItem Double Double x
self) ([LayoutItem Double Double x] -> LayoutItem Double Double x)
-> [LayoutItem Double Double x] -> LayoutItem Double Double x
forall a b. (a -> b) -> a -> b
$ LayoutItem Double Double x -> [LayoutItem Double Double x]
forall {b} {n} {x}.
(CastDouble b, CastDouble n, Eq b, Eq n, Eq x, Zero b, Zero n) =>
LayoutItem b n x -> [LayoutItem b n x]
layoutGetChilds LayoutItem Double Double x
self
boxPosition (Double, Double)
pos (LayoutConst x
val PaddedBox Double Double
self [LayoutItem Double Double x]
childs) =
    ((Double, Double), x)
-> PaddedBox Double Double
-> [LayoutItem Double Double ((Double, Double), x)]
-> LayoutItem Double Double ((Double, Double), x)
forall m n x.
x -> PaddedBox m n -> [LayoutItem m n x] -> LayoutItem m n x
LayoutConst ((Double, Double)
pos, x
val) PaddedBox Double Double
self ([LayoutItem Double Double ((Double, Double), x)]
 -> LayoutItem Double Double ((Double, Double), x))
-> [LayoutItem Double Double ((Double, Double), x)]
-> LayoutItem Double Double ((Double, Double), x)
forall a b. (a -> b) -> a -> b
$ (LayoutItem Double Double x
 -> LayoutItem Double Double ((Double, Double), x))
-> [LayoutItem Double Double x]
-> [LayoutItem Double Double ((Double, Double), x)]
forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' ((Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition (Double, Double)
pos) [LayoutItem Double Double x]
childs
boxPosition (Double, Double)
pos (LayoutSpan FragmentTree (UserData Double Double x)
self) = FragmentTree (UserData Double Double ((Double, Double), x))
-> LayoutItem Double Double ((Double, Double), x)
forall m n x. FragmentTree (UserData m n x) -> LayoutItem m n x
LayoutSpan (FragmentTree (UserData Double Double ((Double, Double), x))
 -> LayoutItem Double Double ((Double, Double), x))
-> FragmentTree (UserData Double Double ((Double, Double), x))
-> LayoutItem Double Double ((Double, Double), x)
forall a b. (a -> b) -> a -> b
$ (Double, Double)
-> ((Double, Double)
    -> Either (PaddedBox Double Double) (LayoutItem Double Double x)
    -> Either
         (PaddedBox Double Double)
         (LayoutItem Double Double ((Double, Double), x)))
-> FragmentTree (UserData Double Double x)
-> FragmentTree (UserData Double Double ((Double, Double), x))
forall b b' a c.
(Double, Double)
-> ((Double, Double) -> b -> b')
-> FragmentTree (a, b, c)
-> FragmentTree (a, b', ((Double, Double), c))
positionTree (Double, Double)
pos (Double, Double)
-> Either (PaddedBox Double Double) (LayoutItem Double Double x)
-> Either
     (PaddedBox Double Double)
     (LayoutItem Double Double ((Double, Double), x))
forall {x} {a}.
(PropertyParser x, Eq x) =>
(Double, Double)
-> Either a (LayoutItem Double Double x)
-> Either a (LayoutItem Double Double ((Double, Double), x))
inner FragmentTree (UserData Double Double x)
self
  where
    inner :: (Double, Double)
-> Either a (LayoutItem Double Double x)
-> Either a (LayoutItem Double Double ((Double, Double), x))
inner (Double, Double)
_ (Left a
ret) = a -> Either a (LayoutItem Double Double ((Double, Double), x))
forall a b. a -> Either a b
Left a
ret
    inner (Double, Double)
pos' (Right LayoutItem Double Double x
kid) = LayoutItem Double Double ((Double, Double), x)
-> Either a (LayoutItem Double Double ((Double, Double), x))
forall a b. b -> Either a b
Right (LayoutItem Double Double ((Double, Double), x)
 -> Either a (LayoutItem Double Double ((Double, Double), x)))
-> LayoutItem Double Double ((Double, Double), x)
-> Either a (LayoutItem Double Double ((Double, Double), x))
forall a b. (a -> b) -> a -> b
$ (Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition (Double, Double)
pos' LayoutItem Double Double x
kid
-- | Compute sizes & position information for all nodes in the (sub)tree.
boxLayout :: (PropertyParser x, Eq x) => PaddedBox Double Double ->
        LayoutItem Length Length x -> Bool -> 
        [LayoutItem Double Double ((Double, Double), x)]
boxLayout :: forall x.
(PropertyParser x, Eq x) =>
PaddedBox Double Double
-> LayoutItem Length Length x
-> Bool
-> [LayoutItem Double Double ((Double, Double), x)]
boxLayout PaddedBox Double Double
parent LayoutItem Length Length x
self Bool
paginate = [LayoutItem Double Double ((Double, Double), x)]
self9
  where
    self0 :: LayoutItem Length Length x
self0 = Maybe Double
-> LayoutItem Length Length x -> LayoutItem Length Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxMinWidth Maybe Double
forall a. Maybe a
Nothing LayoutItem Length Length x
self
    self1 :: LayoutItem Length Length x
self1 = Maybe Double
-> LayoutItem Length Length x -> LayoutItem Length Length x
forall y x.
(Zero y, CastDouble y, NFData y) =>
Maybe Double -> LayoutItem y Length x -> LayoutItem y Length x
boxNatWidth Maybe Double
forall a. Maybe a
Nothing LayoutItem Length Length x
self0
    self2 :: LayoutItem Length Length x
self2 = PaddedBox Double Double
-> LayoutItem Length Length x -> LayoutItem Length Length x
forall y a x.
(CastDouble y, Zero y, NFData y) =>
PaddedBox a Double
-> LayoutItem y Length x -> LayoutItem y Length x
boxMaxWidth PaddedBox Double Double
parent LayoutItem Length Length x
self1
    self3 :: LayoutItem Length Double x
self3 = PaddedBox Double Double
-> LayoutItem Length Length x -> LayoutItem Length Double x
forall y b x.
(Zero y, CastDouble y, NFData y) =>
PaddedBox b Double
-> LayoutItem y Length x -> LayoutItem y Double x
boxWidth PaddedBox Double Double
parent LayoutItem Length Length x
self2
    self4 :: LayoutItem Length Double x
self4 = Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxNatHeight (Size Double Double -> Double
forall m n. Size m n -> n
inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
parent) LayoutItem Length Double x
self3
    self5 :: LayoutItem Length Double x
self5 = Double -> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
Double -> LayoutItem Length Double x -> LayoutItem Length Double x
boxMinHeight (Size Double Double -> Double
forall m n. Size m n -> n
inline (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
parent) LayoutItem Length Double x
self4
    self6 :: LayoutItem Length Double x
self6 = PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Length Double x
boxMaxHeight PaddedBox Double Double
parent LayoutItem Length Double x
self5
    self7 :: LayoutItem Double Double x
self7 = PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
forall x.
PaddedBox Double Double
-> LayoutItem Length Double x -> LayoutItem Double Double x
boxHeight PaddedBox Double Double
parent LayoutItem Length Double x
self6
    self8 :: [LayoutItem Double Double x]
self8 | Bool
paginate = Double
-> LayoutItem Double Double x -> [LayoutItem Double Double x]
forall {x}.
PropertyParser x =>
Double
-> LayoutItem Double Double x -> [LayoutItem Double Double x]
boxPaginate (Size Double Double -> Double
forall m n. Size m n -> m
block (Size Double Double -> Double) -> Size Double Double -> Double
forall a b. (a -> b) -> a -> b
$ PaddedBox Double Double -> Size Double Double
forall m n. PaddedBox m n -> Size m n
size PaddedBox Double Double
parent) LayoutItem Double Double x
self7
        | Bool
otherwise = [LayoutItem Double Double x
self7]
    self9 :: [LayoutItem Double Double ((Double, Double), x)]
self9 = (LayoutItem Double Double x
 -> LayoutItem Double Double ((Double, Double), x))
-> [LayoutItem Double Double x]
-> [LayoutItem Double Double ((Double, Double), x)]
forall a b. (a -> b) -> [a] -> [b]
map ((Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
forall x.
(PropertyParser x, Eq x) =>
(Double, Double)
-> LayoutItem Double Double x
-> LayoutItem Double Double ((Double, Double), x)
boxPosition (Double
0, Double
0)) [LayoutItem Double Double x]
self8

-- | Compute a mapping from a layout tree indicating which glyphs for which fonts
-- are required.
-- Useful for assembling glyph atlases.
glyphsPerFont :: (CastDouble x, CastDouble y, Eq x, Eq y, Eq z, Zero x, Zero y) =>
        LayoutItem x y z -> M.Map (Pattern, Double) IS.IntSet
glyphsPerFont :: forall x y z.
(CastDouble x, CastDouble y, Eq x, Eq y, Eq z, Zero x, Zero y) =>
LayoutItem x y z -> Map (Pattern, Double) IntSet
glyphsPerFont (LayoutSpan self :: FragmentTree (UserData x y z)
self@(Leaf Fragment (UserData x y z)
_)) | (Int
_:[Int]
_) <- [Int]
glyphs =
        (Font' -> Pattern
pattern Font'
font, Font' -> Double
fontSize Font'
font) (Pattern, Double) -> IntSet -> Map (Pattern, Double) IntSet
forall k a. k -> a -> Map k a
`M.singleton` [Int] -> IntSet
IS.fromList [Int]
glyphs
    | Bool
otherwise = Map (Pattern, Double) IntSet
forall k a. Map k a
M.empty
  where
    glyphs :: [Int]
glyphs = (Word32 -> Int) -> [Word32] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map Word32 -> Int
forall a. Enum a => a -> Int
fromEnum ([Word32] -> [Int]) -> [Word32] -> [Int]
forall a b. (a -> b) -> a -> b
$ FragmentTree (UserData x y z) -> [Word32]
forall x. FragmentTree x -> [Word32]
codepoints FragmentTree (UserData x y z)
self
    (Font'
font, Int
_) = FragmentTree (UserData x y z) -> (Font', Int)
forall {a} {b} {c}. FragmentTree (a, b, c) -> a
fragmentFont FragmentTree (UserData x y z)
self
glyphsPerFont LayoutItem x y z
node = (IntSet -> IntSet -> IntSet)
-> [Map (Pattern, Double) IntSet] -> Map (Pattern, Double) IntSet
forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
(a -> a -> a) -> f (Map k a) -> Map k a
M.unionsWith IntSet -> IntSet -> IntSet
IS.union ([Map (Pattern, Double) IntSet] -> Map (Pattern, Double) IntSet)
-> [Map (Pattern, Double) IntSet] -> Map (Pattern, Double) IntSet
forall a b. (a -> b) -> a -> b
$ (LayoutItem x y z -> Map (Pattern, Double) IntSet)
-> [LayoutItem x y z] -> [Map (Pattern, Double) IntSet]
forall a b. (a -> b) -> [a] -> [b]
map LayoutItem x y z -> Map (Pattern, Double) IntSet
forall x y z.
(CastDouble x, CastDouble y, Eq x, Eq y, Eq z, Zero x, Zero y) =>
LayoutItem x y z -> Map (Pattern, Double) IntSet
glyphsPerFont ([LayoutItem x y z] -> [Map (Pattern, Double) IntSet])
-> [LayoutItem x y z] -> [Map (Pattern, Double) IntSet]
forall a b. (a -> b) -> a -> b
$ LayoutItem x y z -> [LayoutItem x y z]
forall {b} {n} {x}.
(CastDouble b, CastDouble n, Eq b, Eq n, Eq x, Zero b, Zero n) =>
LayoutItem b n x -> [LayoutItem b n x]
layoutGetChilds LayoutItem x y z
node

parMap' :: NFData b => (a -> b) -> [a] -> [b]
parMap' :: forall b a. NFData b => (a -> b) -> [a] -> [b]
parMap' = Strategy b -> (a -> b) -> [a] -> [b]
forall b a. Strategy b -> (a -> b) -> [a] -> [b]
parMap Strategy b
forall a. NFData a => Strategy a
rdeepseq

------
--- Orphan typeclass instances
------

instance Show (Paragraph x) where
    show :: Paragraph x -> String
show (Paragraph Array
arr Int
_ RootNode Int x
_ ParagraphOptions
_) = ByteArray -> String
forall a. Show a => a -> String
show (ByteArray -> String) -> ByteArray -> String
forall a b. (a -> b) -> a -> b
$ Array -> ByteArray
asBA Array
arr
deriving instance Show PageOptions
instance Eq (Paragraph x) where
    Paragraph Array
a Int
_ RootNode Int x
_ ParagraphOptions
_ == :: Paragraph x -> Paragraph x -> Bool
== Paragraph Array
b Int
_ RootNode Int x
_ ParagraphOptions
_ = Array -> ByteArray
asBA Array
a  ByteArray -> ByteArray -> Bool
forall a. Eq a => a -> a -> Bool
== Array -> ByteArray
asBA Array
b
deriving instance Eq PageOptions

asBA :: Array -> ByteArray
asBA = Array -> ByteArray
forall a b. a -> b
unsafeCoerce :: Array -> ByteArray