{-# OPTIONS -Wall #-}
-- Note - how the background is built in this example is very
-- expensive, i.e. it generates large PostScript and SVG files
-- because the text elements are drawn many more times than they
-- are actually seen.
--
-- This example just illustrates that clipping-paths work and
-- uses a complicated background to make that point.
--
module ClipPic where
import Wumpus.Drawing.Colour.SVGColours
import Wumpus.Drawing.Paths.Absolute
import Wumpus.Drawing.Text.StandardFontDefs
import Wumpus.Basic.Kernel -- package: wumpus-basic
import Wumpus.Core -- package: wumpus-core
import Data.AffineSpace -- package: vector-space
import System.Directory
main :: IO ()
main = do
createDirectoryIfMissing True "./out/"
let pic1 = runCtxPictureU std_ctx $ top_pic `vconcat` clip_pic
writeEPS "./out/clip_pic.eps" pic1
writeSVG "./out/clip_pic.svg" pic1
std_ctx :: DrawingContext
std_ctx = standardContext 14
top_pic :: CtxPicture
top_pic = drawTracing $ localize (fill_colour medium_slate_blue) $ do
draw $ toPrimPath path01 >>= filledPath
draw $ localize (fill_colour powder_blue) $ toPrimPath path02 >>= filledPath
draw $ toPrimPath path03 >>= filledPath
draw $ toPrimPath path04 >>= filledPath
clip_pic :: CtxPicture
clip_pic = drawTracing $ do
mapM_ draw $ [ clip1, clip2, clip3, clip4 ]
background :: RGBi -> Graphic Double
background rgb =
fmap ignoreAns $ localize (text_colour rgb) $ ihh `at` P2 0 288
where
ihh = chain (tableDown 18 (86,16)) (replicate 112 iheartHaskell)
-- Wumpus-Basic needs a clip function, but is this the most
-- satisfactory definition?
--
clipGraphic :: PrimPath -> Graphic u -> Graphic u
clipGraphic cp = fmap (clipObject cp)
clip1 :: Graphic Double
clip1 = toPrimPath path01 >>= \pp -> clipGraphic pp (background black)
clip2 :: Graphic Double
clip2 = toPrimPath path02 >>= \pp -> clipGraphic pp (background medium_violet_red)
clip3 :: Graphic Double
clip3 = toPrimPath path03 >>= \pp -> clipGraphic pp (background black)
clip4 :: Graphic Double
clip4 = toPrimPath path04 >>= \pp -> clipGraphic pp (background black)
iheartHaskell :: LocGraphic Double
iheartHaskell = promoteR1 $ \pt ->
let body = plainTextLine "I Haskell" `at` pt
heart = localize (set_font symbol) $
plainTextLine "&heart;" `at` (pt .+^ hvec 7)
in body `oplus` heart
path01 :: AbsPath Double
path01 = evalAbsBuild zeroPt $ hline 80
>> relline (vec 112 160)
>> relline (vec (-112) 160)
>> hline (-80)
>> relline (vec 112 (-160))
>> relline (vec (-112) (-160))
path02 :: AbsPath Double
path02 = evalAbsBuild (P2 112 0) $ hline 80
>> relline (vec 72 112)
>> relline (vec 72 (-112))
>> hline 80
>> relline (vec (-224) 320)
>> hline (-80)
>> relline (vec 112 (-160))
>> relline (vec (-112) (-160))
path03 :: AbsPath Double
path03 = evalAbsBuild (P2 384 96) $ hline 96 >> vline 56 >> hline (-136)
path04 :: AbsPath Double
path04 = evalAbsBuild (P2 328 192) $ hline 152 >> vline 56 >> hline (-192)