module FMP.Canvas (
Canvas(..),
cdrop, cdraw, cdraws , cfill, cfills, cclip
) where
import Prelude ( (.), map, Maybe(..), Show(..) )
import FMP.Types
import FMP.Picture
data Canvas = CDraw [Path]
| CClip Path
| CFill [Area]
| CDrop (Numeric, Numeric) Picture
| CConcat Canvas Canvas
| CRelax
deriving Show
instance HasConcat Canvas where
(&) = CConcat
instance HasRelax Canvas where
relax = CRelax
instance IsPicture Canvas where
toPicture c = setTrueBoundingBox (canvas2Pic empty [c])
canvas2Pic :: Picture -> [Canvas] -> Picture
canvas2Pic p (CDraw ps:cs) = draw ps (canvas2Pic p cs)
canvas2Pic p (CFill as:cs) = fill (map setFront as) (canvas2Pic p cs)
canvas2Pic p (CClip path:cs) = clip path (canvas2Pic p cs)
canvas2Pic p (CDrop pos p':cs)= overlay' [ ref (1 <* C) .= vec pos ] (Just 0) [canvas2Pic p cs, p']
canvas2Pic p (CConcat c1 c2:cs)
= canvas2Pic (canvas2Pic p cs) [c2,c1]
canvas2Pic p (CRelax:cs) = canvas2Pic p cs
canvas2Pic p [] = p
cdraws :: IsPath a => [a] -> Canvas
cdraws = CDraw . map toPath
cfills :: IsArea a => [a] -> Canvas
cfills = CFill . map toArea
cclip :: IsPath a => a -> Canvas
cclip = CClip . toPath
cdrop :: IsPicture a => (Numeric,Numeric) -> a -> Canvas
cdrop at = CDrop at . toPicture
cdraw :: IsPath a => a -> Canvas
cdraw a = cdraws [a]
cfill :: IsArea a => a -> Canvas
cfill a = cfills [a]