packages feed

wumpus-drawing-0.2.0: demo/LeftRightText.hs

{-# OPTIONS -Wall #-}

-- Note - @main@ is more convoluted than would normally be 
-- expected as it supports both sources of glyph metrics - the 
-- GhostScript distribution or the Core 14 metrics from Adobe.
-- 
-- \"Real\" applications would be expected to choose one source. 
--
-- I-am-not-a-lawyer, but it does look as though the Adobe font
-- metrics are redistributable, the GhostScript metrics are 
-- seemingly redistributable under the same terms as the larger
-- GhostScript distribution.
-- 


module LeftRightText where

import FontLoaderUtils

import Wumpus.Drawing.Colour.SVGColours
import Wumpus.Drawing.Dots.Marks
import Wumpus.Drawing.Text.LRText
import Wumpus.Drawing.Text.SafeFonts


import Wumpus.Basic.Kernel                      -- package: wumpus-basic
import Wumpus.Basic.System.FontLoader.Afm
import Wumpus.Basic.System.FontLoader.GhostScript

import Wumpus.Core                              -- package: wumpus-core

import System.Directory



main :: IO ()
main = do 
    (mb_gs, mb_afm) <- processCmdLine default_font_loader_help
    createDirectoryIfMissing True "./out/"
    maybe gs_failk  makeGSPicture  $ mb_gs
    maybe afm_failk makeAfmPicture $ mb_afm
  where
    gs_failk  = putStrLn "No GhostScript font path supplied..."
    afm_failk = putStrLn "No AFM v4.1 font path supplied..."


makeGSPicture :: FilePath -> IO ()
makeGSPicture font_dir = do
    putStrLn "Using GhostScript metrics..."
    (gs_metrics, msgs) <- loadGSMetrics font_dir ["Helvetica"]
    mapM_ putStrLn msgs
    let pic1 = runCtxPictureU (makeCtx gs_metrics) text_pic
    writeEPS "./out/lr_text01.eps" pic1
    writeSVG "./out/lr_text01.svg" pic1

makeAfmPicture :: FilePath -> IO ()
makeAfmPicture font_dir = do
    putStrLn "Using AFM 4.1 metrics..."
    (afm_metrics, msgs) <- loadAfmMetrics font_dir ["Helvetica"]
    mapM_ putStrLn msgs
    let pic2 = runCtxPictureU (makeCtx afm_metrics) text_pic
    writeEPS "./out/lr_text02.eps" pic2
    writeSVG "./out/lr_text02.svg" pic2




makeCtx :: GlyphMetrics -> DrawingContext
makeCtx = fontFace helvetica . metricsContext 14


text_pic :: CtxPicture Double
text_pic = drawTracing $ do 
    drawi_ $ (fn left_text)       `at` P2   0 400
    drawi_ $ (fn center_text)     `at` P2 150 400
    drawi_ $ (fn right_text)      `at` P2 300 400
    drawi_ $ (fn blank_text)      `at` P2   0 300
    drawi_ $ (fn ne_oneline)      `at` P2 150 300 
    drawi_ $ (fn cc_oneline)      `at` P2 300 300


    drawi_ $ (fn sw_oneline)      `at` P2   0 200
    drawi_ $ (fn ss_oneline)      `at` P2 150 200
    drawi_ $ (fn se_oneline)      `at` P2 300 200
    drawi_ $ (fn swr_multi)       `at` P2   0 100
    drawi_ $ (fn ssr_multi)       `at` P2 150 100
    drawi_ $ (fn ner_multi)       `at` P2 300 100
    drawi_ $ (fn rleft_text)      `at` P2   0 (-75)
    drawi_ $ (fn rcenter_text)    `at` P2 150 (-75)
    drawi_ $ (fn rright_text)     `at` P2 300 (-75)

    draw $ redPlus            `at` P2   0 400
    draw $ redPlus            `at` P2 150 400
    draw $ redPlus            `at` P2 300 400
    draw $ redPlus            `at` P2   0 300  
    draw $ redPlus            `at` P2 150 300 
    draw $ redPlus            `at` P2 300 300 
    draw $ redPlus            `at` P2   0 200  
    draw $ redPlus            `at` P2 150 200 
    draw $ redPlus            `at` P2 300 200  
    draw $ redPlus            `at` P2   0 100  
    draw $ redPlus            `at` P2 150 100 
    draw $ redPlus            `at` P2 300 100 
    draw $ redPlus            `at` P2   0 (-75)
    draw $ redPlus            `at` P2 150 (-75)
    draw $ redPlus            `at` P2 300 (-75)
      
  where
    fn = illustrateBoundedLocGraphic
   
redPlus :: (Fractional u, FromPtSize u) => LocGraphic u
redPlus = localize (strokeColour red) markPlus



-- single line
--
ne_oneline :: BoundedLocGraphic Double
ne_oneline = singleLine "north east" `startPos` NE


-- single line
--
se_oneline :: BoundedLocGraphic Double
se_oneline = singleLine "south east" `startPos` SE

-- single line
--
ss_oneline :: BoundedLocGraphic Double
ss_oneline = singleLine "south" `startPos` SS

-- single line
--
sw_oneline :: BoundedLocGraphic Double
sw_oneline = singleLine "south west" `startPos` SW


-- multi line
--
ssr_multi :: BoundedLocGraphic Double
ssr_multi = multiAlignCenter (0.25*pi) "south rot45" `startPos` SS

-- multi line
--
swr_multi :: BoundedLocGraphic Double
swr_multi = multiAlignCenter (0.25*pi) "south west rot45" `startPos` SW

-- multi line
--
ner_multi :: BoundedLocGraphic Double
ner_multi = multiAlignCenter (0.25*pi) "north east rot45" `startPos` NE


cc_oneline :: BoundedLocGraphic Double
cc_oneline = rsingleLine 0 "Center-center..."  `startPos` CENTER


blank_text :: BoundedLocGraphic Double
blank_text = multiAlignCenter 0 "" `startPos` CENTER


left_text :: BoundedLocGraphic Double
left_text = multiAlignLeft 0 dummy_text `startPos` CENTER


right_text :: BoundedLocGraphic Double
right_text = multiAlignRight 0 dummy_text `startPos` CENTER

center_text :: BoundedLocGraphic Double
center_text = multiAlignCenter 0 dummy_text `startPos` CENTER


rleft_text :: BoundedLocGraphic Double
rleft_text = multiAlignLeft (0.25*pi)  dummy_text `startPos` CENTER


rright_text :: BoundedLocGraphic Double
rright_text = multiAlignRight (0.25*pi) dummy_text `startPos` CENTER

rcenter_text :: BoundedLocGraphic Double
rcenter_text = multiAlignCenter (0.25*pi) dummy_text `startPos` CENTER


dummy_text :: String 
dummy_text = unlines $ [ "The quick brown"
                       , "fox jumps over"
                       , "the lazy dog."
                       ]