packages feed

wumpus-core-0.52.1: demo/AffineTestBase.hs

{-# OPTIONS -Wall #-}

-- Common machinery for the affine tests.

module AffineTestBase 
  ( 
    -- * test common code
    runAlgs
  , AffineTrafoAlg(..)
  , ControlPointAlg(..)

  , rgbLabel
  , rgbCircle
  , rgbEllipse
  , rgbPath

  ) where


import Wumpus.Core
import Wumpus.Core.Colour ( black, red, blue )



import System.Directory


light_blue :: RGBi
light_blue = RGBi 176 224 231


runAlgs :: [AffineTrafoAlg] -> [ControlPointAlg] -> IO ()
runAlgs ats cps = mkDirs >> mapM_ runATA ats >> mapM_ runCPA cps
  where
    mkDirs = createDirectoryIfMissing True "./out/affine_test/"


data AffineTrafoAlg = AffineTrafoAlg
      { ata_console_msg         :: String
      , ata_eps_file            :: FilePath
      , ata_svg_file            :: FilePath
      , ata_prim_constructor    :: RGBi -> Primitive
      , ata_pic_transformer     :: Picture -> Picture
      , ata_prim_transformer    :: Primitive -> Primitive
      }

runATA :: AffineTrafoAlg -> IO ()
runATA ata = do 
    { putStrLn $ ata_console_msg ata
    ; writeEPS (ata_eps_file ata) pic
    ; writeSVG (ata_svg_file ata) pic 
    }
  where
    pic = buildPictureATA (ata_prim_constructor ata) 
                          (ata_pic_transformer  ata)
                          (ata_prim_transformer ata)


buildPictureATA :: (RGBi -> Primitive) 
         -> (Picture -> Picture) 
         -> (Primitive -> Primitive) 
         -> Picture
buildPictureATA mk picF primF = 
    picture1 `picBeside` picture2 `picBeside` picture3
  where
    picture1 :: Picture
    picture1 = illustrateBounds light_blue $ frame [mk black]
  
    picture2 :: Picture
    picture2 = illustrateBounds light_blue $ picF $ frame [mk blue]

    picture3 :: Picture
    picture3 = illustrateBoundsPrim light_blue prim
      where
        prim :: Primitive
        prim = primF $ mk red





--------------------------------------------------------------------------------

data ControlPointAlg = ControlPointAlg
      { cpa_console_msg         :: String
      , cpa_eps_file            :: FilePath
      , cpa_svg_file            :: FilePath
      , cpa_prim_constructor    :: RGBi -> Primitive
      , cpa_prim_transformer    :: Primitive -> Primitive
      }

runCPA :: ControlPointAlg -> IO ()
runCPA cpa = do 
    { putStrLn $ cpa_console_msg cpa
    ; writeEPS (cpa_eps_file cpa) pic
    ; writeSVG (cpa_svg_file cpa) pic
    }
  where
    pic = cpPicture (cpa_prim_constructor cpa) (cpa_prim_transformer cpa)

cpPicture :: (RGBi -> Primitive) -> (Primitive -> Primitive) -> Picture
cpPicture constr trafo = 
    illustrateBounds light_blue $ illustrateControlPoints black 
                                $ transformed_prim
  where
   transformed_prim :: Primitive
   transformed_prim = trafo $ constr red


--------------------------------------------------------------------------------

rgbLabel :: RGBi -> Primitive
rgbLabel rgb = textlabel rgb wumpus_default_font "Wumpus!" zeroPt

rgbCircle :: RGBi -> Primitive
rgbCircle rgb = fillEllipse rgb 60 60 zeroPt

rgbEllipse :: RGBi -> Primitive
rgbEllipse rgb = fillEllipse rgb 60 30 zeroPt

rgbPath :: RGBi -> Primitive
rgbPath rgb = ostroke rgb default_stroke_attr $ dog_kennel

--------------------------------------------------------------------------------
-- Demo - draw a dog kennel...


dog_kennel :: PrimPath
dog_kennel = absPrimPath zeroPt $ 
    [ absLineTo  (P2 0 60) 
    , absLineTo  (P2 40 100)
    , absLineTo  (P2 80 60)
    , absLineTo  (P2 80 0)
    , absLineTo  (P2 60 0)  
    , absLineTo  (P2 60 30)
    , absCurveTo (P2 60 50) (P2 50 60) (P2 40 60)
    , absCurveTo (P2 30 60) (P2 20 50) (P2 20 30)
    , absLineTo  (P2 20 0)
    ]