xournal-types 0.1 → 0.2
raw patch · 7 files changed
+131/−55 lines, 7 files
Files
- CHANGES +3/−1
- src/Data/Xournal/BBox.hs +76/−0
- src/Data/Xournal/Buffer.hs +17/−0
- src/Data/Xournal/Generic.hs +29/−2
- src/Data/Xournal/Map.hs +3/−49
- src/Data/Xournal/Simple.hs +1/−1
- xournal-types.cabal +2/−2
CHANGES view
@@ -1,4 +1,6 @@ 0.1: 18 Dec 2011- * First public release. + * First public release +0.2: 25 Dec 2011+ * double buffer support
src/Data/Xournal/BBox.hs view
@@ -1,9 +1,13 @@+{-# LANGUAGE TypeFamilies #-}+ module Data.Xournal.BBox where +import Control.Monad import Data.ByteString hiding (map,maximum,minimum) import Data.Xournal.Generic import Data.Xournal.Simple import Data.Strict.Tuple +import Data.Monoid import Prelude hiding (fst,snd) data BBox = BBox { bbox_upperleft :: (Double,Double) @@ -32,6 +36,78 @@ ys = map snd lst in BBox { bbox_upperleft = (minimum xs, minimum ys) , bbox_lowerright = (maximum xs, maximum ys) } ++dimToBBox :: Dimension -> BBox +dimToBBox (Dim w h) = BBox (0,0) (w,h)++intersectBBox :: BBox -> BBox -> Maybe BBox+intersectBBox (BBox (x1,y1) (x2,y2)) (BBox (x3,y3) (x4,y4)) = do + guard $ (x1 <= x3 && x3 <= x2) || (x3 <= x1 && x1 <= x4 ) + guard $ (y1 <= y3 && y3 <= y4) || (y3 <= y1 && y1 <= y4 )+ let x5 = if x1 <= x3 then x3 else x1 + y5 = if y1 <= y3 then y3 else y1 + x6 = min x2 x4 + y6 = min y2 y4+ return (BBox (x5,y5) (x6,y6))+ +{- + let x5 = if x1 <= x3 && x2 <= x3 && xthen x3 else x1+ y5 = if y1 < y3 then y3 else y1+ x6 = if x2 < x4 then x2 else x4+ y6 = if y2 < y4 then y2 else y4+ in BBox (x5,y5) (x6,y6) -}+ +unionBBox :: BBox -> BBox -> BBox+unionBBox (BBox (x1,y1) (x2,y2)) (BBox (x3,y3) (x4,y4)) = + let x5 = if x1 < x3 then x1 else x3+ y5 = if y1 < y3 then y1 else y3+ x6 = if x2 < x4 then x4 else x2+ y6 = if y2 < y4 then y4 else y2+ in BBox (x5,y5) (x6,y6)+ + +data ULMaybe a = Bottom | Middle a | Top + +newtype IntersectBBox = Intersect { unIntersect :: ULMaybe BBox } ++newtype UnionBBox = Union { unUnion :: ULMaybe BBox }+ +instance Monoid (IntersectBBox) where + (Intersect Bottom) `mappend` _ = Intersect Bottom+ _ `mappend` (Intersect Bottom) = Intersect Bottom + (Intersect Top) `mappend` x = x + x `mappend` (Intersect Top) = x + (Intersect (Middle x)) `mappend` (Intersect (Middle y)) = fromMaybe (x `intersectBBox` y)+ mempty = Intersect Top + +instance Monoid (UnionBBox) where+ (Union Bottom) `mappend` x = x + x `mappend` (Union Bottom) = x+ (Union Top) `mappend` _ = Union Top+ _ `mappend` (Union Top) = Union Top + (Union (Middle x)) `mappend` (Union (Middle y)) = Union (Middle (x `unionBBox` y))+ mempty = Union Bottom+ +class Maybeable a where+ type ElemType a :: *+ toMaybe :: a -> Maybe (ElemType a) + fromMaybe :: Maybe (ElemType a) -> a + +instance Maybeable IntersectBBox where+ type ElemType IntersectBBox = BBox+ toMaybe (Intersect Bottom) = error "empty intersectbbox"+ toMaybe (Intersect Top) = Nothing + toMaybe (Intersect (Middle x)) = Just x + fromMaybe Nothing = Intersect Top + fromMaybe (Just x) = Intersect (Middle x)+ +instance Maybeable UnionBBox where+ type ElemType UnionBBox = BBox+ toMaybe (Union Bottom) = error "empty unionbbox"+ toMaybe (Union Top) = Nothing + toMaybe (Union (Middle x)) = Just x + fromMaybe Nothing = Union Top + fromMaybe (Just x) = Union (Middle x) mkStrokeBBoxFromStroke :: Stroke -> StrokeBBox
+ src/Data/Xournal/Buffer.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE TypeFamilies #-}++module Data.Xournal.Buffer where++import Data.IntMap +import Data.Xournal.Simple+import Data.Xournal.Generic+import Data.Xournal.BBox+import Data.Xournal.Map++type TLayerBBoxBuf buf = GLayerBuf buf [] StrokeBBox++type TPageBBoxMapBkgBuf bkg buf = GPage bkg IntMap (TLayerBBoxBuf buf)++type TXournalBBoxMapBkgBuf bkg buf = + GXournal IntMap (TPageBBoxMapBkgBuf bkg buf)+
src/Data/Xournal/Generic.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE TypeFamilies, TypeOperators #-}+{-# LANGUAGE TypeFamilies, TypeOperators, MultiParamTypeClasses #-} module Data.Xournal.Generic where @@ -21,17 +21,27 @@ , gbackground :: b , glayers :: s a } -newtype GLayer s a = GLayer { gstrokes :: s a } +data GLayer s a = GLayer { gstrokes :: s a } + +data GLayerBuf b s a = GLayerBuf { gbuffer :: b + , gbstrokes :: s a + } + instance (Functor s) => Functor (GLayer s) where fmap f (GLayer strs) = GLayer (fmap f strs) +instance (Functor s) => Functor (GLayerBuf b s) where+ fmap f (GLayerBuf b strs) = GLayerBuf b (fmap f strs) + instance (Functor s) => Functor (GPage b s) where fmap f (GPage d b ls) = GPage d b (fmap f ls) instance (Functor s) => Functor (GXournal s) where fmap f (GXournal t ps) = GXournal t (fmap f ps) +class GCast a b where + gcast :: a -> b -- data GBackground b = GBackground b@@ -42,6 +52,7 @@ } + type TLayerSimple = GLayer [] Stroke type TPageSimple = GPage Background [] TLayerSimple @@ -120,6 +131,12 @@ g_strokes :: GLayer s a :-> s a g_strokes = lens gstrokes (\a f -> f { gstrokes = a } ) +g_bstrokes :: GLayerBuf b s a :-> s a +g_bstrokes = lens gbstrokes (\a f -> f { gbstrokes = a } )++g_buffer :: GLayerBuf b s a :-> b +g_buffer = lens gbuffer (\a f -> f { gbuffer = a } )+ g_selectTitle :: GSelect a b :-> ByteString g_selectTitle = lens gselectTitle (\a f -> f {gselectTitle = a}) @@ -131,12 +148,22 @@ ++ toLayer :: (GStrokeable a, GListable s) => GLayer s a -> Layer toLayer = layerFromTLayerSimple . fmap gToStroke . chgStreamToList +toNoBufferLayer :: GLayerBuf b s a -> GLayer s a +toNoBufferLayer (GLayerBuf b s) = GLayer s ++ toPage :: (GStrokeable a, GBackgroundable b, GListable s, GListable s', Functor s') => (b->Background) -> GPage b s' (GLayer s a) -> Page toPage f = pageFromTPageSimple . bkgchange f . chgStreamToList . fmap (fmap gToStroke . chgStreamToList) ++toPageFromBuf :: (GStrokeable a, GBackgroundable b, GListable s, GListable s', Functor s') => + (b->Background) -> GPage b s' (GLayerBuf buf s a) -> Page+toPageFromBuf f = pageFromTPageSimple . bkgchange f . chgStreamToList . fmap (fmap gToStroke . chgStreamToList . toNoBufferLayer) bkgchange :: (b -> b') -> GPage b s a -> GPage b' s a
src/Data/Xournal/Map.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeFamilies, OverloadedStrings #-} module Data.Xournal.Map where @@ -20,51 +20,5 @@ type TXournalBBoxMapBkg b = GXournal IntMap (TPageBBoxMapBkg b) -{--data XournalBBoxMap = XournalBBoxMap { xbm_pages :: M.IntMap PageBBoxMap } --data PageBBoxMap = PageBBoxMap { pbm_dim :: Dimension- , pbm_bkg :: Background- , pbm_layers :: M.IntMap LayerBBox }--}--{--instance IPage PageBBoxMap where- type TLayer PageBBoxMap = LayerBBox- pageDim = pbm_dim - pageBkg = pbm_bkg- pageLayers = M.elems . pbm_layers- -instance IXournal XournalBBoxMap where- type TPage XournalBBoxMap = PageBBoxMap - xournalPages = M.elems . xbm_pages - -mkXournalBBoxMapFromXournalBBox :: XournalBBox -> XournalBBoxMap -mkXournalBBoxMapFromXournalBBox xoj = - XournalBBoxMap { xbm_pages = M.map mkPageBBoxMapFromPageBBox - . M.fromList - $ zip [0..] (xojbbox_pages xoj) } --mkPageBBoxMapFromPageBBox :: PageBBox -> PageBBoxMap-mkPageBBoxMapFromPageBBox page = - PageBBoxMap { pbm_dim = pagebbox_dim page- , pbm_bkg = pagebbox_bkg page- , pbm_layers = M.fromList $ zip [0..] (pagebbox_layers page) }--mkXournalBBoxMapFromXournal :: Xournal -> XournalBBoxMap -mkXournalBBoxMapFromXournal = mkXournalBBoxMapFromXournalBBox . mkXournalBBoxFromXournal --xournalFromXournalBBoxMap :: XournalBBoxMap -> Xournal -xournalFromXournalBBoxMap xoj = - emptyXournal { xoj_pages = map pageFromPageBBoxMap (xournalPages xoj) } - -pageFromPageBBoxMap :: PageBBoxMap -> Page -pageFromPageBBoxMap page = - let pbox = PageBBox { pagebbox_dim = pbm_dim page- , pagebbox_bkg = pbm_bkg page- , pagebbox_layers = pageLayers page }- in pageFromPageBBox pbox - --} - - +emptyGXournalMap :: GXournal IntMap a+emptyGXournalMap = GXournal "" empty
src/Data/Xournal/Simple.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE BangPatterns, OverloadedStrings, TypeOperators, TypeFamilies, FlexibleContexts #-}-+ module Data.Xournal.Simple where import qualified Data.ByteString as S
xournal-types.cabal view
@@ -1,5 +1,5 @@ Name: xournal-types-Version: 0.1+Version: 0.2 Synopsis: Data types for programs for xournal file format Description: Xournal file format data type including generic interface License: BSD3@@ -30,7 +30,7 @@ Data.Xournal.Simple Data.Xournal.BBox Data.Xournal.Map--- Data.Xournal.Select+ Data.Xournal.Buffer Data.Xournal.Predefined Other-Modules: