module Graphics.Hoodle.Render.Primitive
( drawStrokeCurve
, drawVWStrokeCurve
) where
import Control.Applicative
import Control.Monad
import Data.Strict.Tuple hiding (fst,snd)
import Graphics.Rendering.Cairo
import Data.Hoodle.Predefined
drawStrokeCurve :: [Pair Double Double] -> Render ()
drawStrokeCurve ((x0 :!: y0) : xs) = do
x0 `seq` y0 `seq` moveTo x0 y0
mapM_ f xs
where f (x :!: y) = x `seq` y `seq` lineTo x y
drawStrokeCurve [] = return ()
drawVWStrokeCurve :: [(Double,Double,Double)] -> Render ()
drawVWStrokeCurve [] = return ()
drawVWStrokeCurve (_:[]) = return ()
drawVWStrokeCurve ((xo,yo,_zo) : xs) = do
moveTo xo yo
let ((xlast,ylast,_zlast):rxs) = reverse xs
foldM_ forward (xo,yo) xs
foldM_ backward (xlast,ylast) rxs
where (dx,dy) = (,) <$> fst <*> snd $ predefinedPenShapeAspectXY
dir (x,y) = x * dy y * dx
forward (x0,y0) (x,y,z) = do if (dir (xx0,yy0) > 0)
then lineTo (x+0.5*dx*z) (y+0.5*dy*z)
else lineTo (x0.5*dx*z) (y0.5*dy*z)
return (x,y)
backward (x0,y0) (x,y,z) = do if (dir (xx0,yy0) < 0)
then lineTo (x0.5*dx*z) (y0.5*dy*z)
else lineTo (x+0.5*dx*z) (y+0.5*dy*z)
return (x,y)