module FMP.Canvas ( Canvas(..), cdrop, cdraw, cdraws , cfill, cfills, cclip ) where 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 _ = p -- RH: original canvas2Pic p (CRelax:cs) = canvas2Pic p cs -- RH: modified canvas2Pic p [] = p -- RH: added 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]