xournal-render-0.2.0.0: src/Graphics/Xournal/Type.hs
{-# LANGUAGE TypeFamilies #-}
module Graphics.Xournal.Type where
import Prelude hiding (fst,snd)
import Data.Strict.Tuple
import Data.ByteString hiding (map, minimum, maximum)
import Text.Xournal.Type
data AlterList a b = Empty | a :- AlterList b a
deriving (Show)
infixr 6 :-
newtype NotHitted = NotHitted { unNotHitted :: [StrokeBBox] }
deriving (Show)
newtype Hitted = Hitted { unHitted :: [StrokeBBox] }
deriving (Show)
type StrokeHitted = AlterList NotHitted Hitted
fmapAL :: (a -> c) -> (b -> d) -> AlterList a b -> AlterList c d
fmapAL _ _ Empty = Empty
fmapAL f g (x :- ys) = f x :- fmapAL g f ys
getA :: AlterList a b -> [a]
getA Empty = []
getA (x :- xs) = x : getB xs
getB :: AlterList a b -> [b]
getB Empty = []
getB (x :- xs) = getA xs
interleave :: (a->c) -> (b->c) -> AlterList a b -> [c]
interleave fa fb Empty = []
interleave fa fb (x :- xs) = fa x : (interleave fb fa xs)
----
data BBox = BBox { bbox_upperleft :: (Double,Double)
, bbox_lowerright :: (Double,Double) }
deriving (Show)
data XournalBBox = XournalBBox { xojbbox_pages :: [PageBBox] }
data PageBBox = PageBBox { pagebbox_dim :: Dimension
, pagebbox_bkg :: Background
, pagebbox_layers :: [LayerBBox] }
data LayerBBox = LayerBBox { layerbbox_strokes :: [StrokeBBox] }
data StrokeBBox = StrokeBBox { strokebbox_tool :: ByteString
, strokebbox_color :: ByteString
, strokebbox_width :: Double
, strokebbox_data :: [Pair Double Double]
, strokebbox_bbox :: BBox }
deriving (Show)
instance IStroke StrokeBBox where
strokeTool = strokebbox_tool
strokeColor = strokebbox_color
strokeWidth = strokebbox_width
strokeData = strokebbox_data
instance ILayer LayerBBox where
type TStroke LayerBBox = StrokeBBox
layerStrokes = layerbbox_strokes
instance IPage PageBBox where
type TLayer PageBBox = LayerBBox
pageDim = pagebbox_dim
pageBkg = pagebbox_bkg
pageLayers = pagebbox_layers
instance IXournal XournalBBox where
type TPage XournalBBox = PageBBox
xournalPages = xojbbox_pages
mkXournalBBoxFromXournal :: Xournal -> XournalBBox
mkXournalBBoxFromXournal xoj =
XournalBBox { xojbbox_pages = map mkPageBBoxFromPage (xoj_pages xoj) }
mkPageBBoxFromPage :: Page -> PageBBox
mkPageBBoxFromPage pg =
PageBBox { pagebbox_dim = page_dim pg
, pagebbox_bkg = page_bkg pg
, pagebbox_layers = map mkLayerBBoxFromLayer (page_layers pg) }
mkLayerBBoxFromLayer :: Layer -> LayerBBox
mkLayerBBoxFromLayer ly =
LayerBBox { layerbbox_strokes = map mkStrokeBBoxFromStroke (layer_strokes ly) }
mkStrokeBBoxFromStroke :: Stroke -> StrokeBBox
mkStrokeBBoxFromStroke str =
StrokeBBox { strokebbox_tool = stroke_tool str
, strokebbox_color = stroke_color str
, strokebbox_width = stroke_width str
, strokebbox_data = stroke_data str
, strokebbox_bbox = mkbbox (stroke_data str) }
mkbbox :: [Pair Double Double] -> BBox
mkbbox lst = let xs = map fst lst
ys = map snd lst
in BBox { bbox_upperleft = (minimum xs, minimum ys)
, bbox_lowerright = (maximum xs, maximum ys) }
xournalFromXournalBBox :: XournalBBox -> Xournal
xournalFromXournalBBox xojbbox =
emptyXournal { xoj_pages = map pageFromPageBBox (xojbbox_pages xojbbox) }
pageFromPageBBox :: PageBBox -> Page
pageFromPageBBox pgbbox =
Page { page_dim = pagebbox_dim pgbbox
, page_bkg = pagebbox_bkg pgbbox
, page_layers = map layerFromLayerBBox (pagebbox_layers pgbbox) }
layerFromLayerBBox :: LayerBBox -> Layer
layerFromLayerBBox lybbox =
Layer { layer_strokes = map strokeFromStrokeBBox (layerbbox_strokes lybbox) }
strokeFromStrokeBBox :: StrokeBBox -> Stroke
strokeFromStrokeBBox strbbox =
Stroke { stroke_tool = strokebbox_tool strbbox
, stroke_color = strokebbox_color strbbox
, stroke_width= strokebbox_width strbbox
, stroke_data = strokebbox_data strbbox }
----
emptyLayer :: Layer
emptyLayer = Layer { layer_strokes = [] }
newPageFromOld :: Page -> Page
newPageFromOld page =
Page { page_dim = page_dim page
, page_bkg = page_bkg page
, page_layers = [emptyLayer] }