{-# 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.Basic.Kernel
import Wumpus.Drawing.Chains
import Wumpus.Drawing.Colour.SVGColours
import Wumpus.Drawing.Paths
import Wumpus.Drawing.Text.SafeFonts
import Wumpus.Core -- package: wumpus-core
import Data.AffineSpace -- package: vector-space
import System.Directory
main :: IO ()
main = do
createDirectoryIfMissing True "./out/"
let pic = runDrawingU pic_drawing_ctx big_pic
writeEPS "./out/clip_pic.eps" pic
writeSVG "./out/clip_pic.svg" pic
pic_drawing_ctx :: DrawingContext
pic_drawing_ctx = standardContext 14
big_pic :: DDrawing
big_pic = pic1 `nextToV` zconcat [cpic1, cpic2, cpic3, cpic4]
fillPath :: Num u => Path u -> Graphic u
fillPath = filledPath . toPrimPath
pic1 :: DDrawing
pic1 = drawTracing $
localize (fillColour medium_slate_blue) $ do
draw $ fillPath path01
localize (fillColour powder_blue) $
draw $ fillPath path02
draw $ fillPath path03
draw $ fillPath path04
background :: RGBi -> DDrawing
background rgb = drawTracing $
localize (strokeColour rgb) $ mapM_ iheartHaskell ps
where
ps = unchain (coordinateScalingContext 86 16) $ tableDown 18 8
cpic1 :: DDrawing
cpic1 = clipDrawing (toPrimPath path01) (background black)
cpic2 :: DDrawing
cpic2 = clipDrawing (toPrimPath path02) (background medium_violet_red)
cpic3 :: DDrawing
cpic3 = clipDrawing (toPrimPath path03) (background black)
cpic4 :: DDrawing
cpic4 = clipDrawing (toPrimPath path04) (background black)
iheartHaskell :: Num u => FromPtSize u => Point2 u -> TraceDrawing u ()
iheartHaskell pt = do
draw $ textline "I Haskell" `at` pt
draw $ localize (fontFace symbol) $ textline "&heart;" `at` (pt .+^ hvec 7)
path01 :: Floating u => Path u
path01 = execPath zeroPt $ hline 80 >> rlineto (vec 112 160)
>> rlineto (vec (-112) 160)
>> hline (-80)
>> rlineto (vec 112 (-160))
>> rlineto (vec (-112) (-160))
path02 :: Floating u => Path u
path02 = execPath (P2 112 0) $ hline 80 >> rlineto (vec 72 112)
>> rlineto (vec 72 (-112))
>> hline 80
>> rlineto (vec (-224) 320)
>> hline (-80)
>> rlineto (vec 112 (-160))
>> rlineto (vec (-112) (-160))
path03 :: Floating u => Path u
path03 = execPath (P2 384 96) $ hline 96 >> vline 56 >> hline (-136)
path04 :: Floating u => Path u
path04 = execPath (P2 328 192) $ hline 152 >> vline 56 >> hline (-192)