module PSlib where
-- This module implements provision of
-- control of postscript
type Postscript = String
data Point = Pt Int Int deriving (Eq,Show{-was:Text-})
initialise header = header ++ "/SMALL /Helvetica findfont 4 scalefont def\n" ++
"/SMALLBOLD /Helvetica-Bold findfont 4 scalefont def\n" ++
"/SMALLITALIC /Helvetica-Oblique findfont 4 scalefont def\n" ++
"/NORM /Helvetica findfont 5 scalefont def\n" ++
"/BOLD /Helvetica-Bold findfont 5 scalefont def\n" ++
"/LARGE /Helvetica-Bold findfont 11 scalefont def\n" ++
"NORM setfont\n"
++ setcms ++ stdProcedures ++ thinlines
setfont str = str ++ " setfont\n"
stdheader :: Postscript
stdheader = "%!PS-Adobe-2.0\n%%Created by Haskell Graph Package\n"
gslandscape = ""
landscape = translate 8 290 ++ rotate 270 ++ translate 20 10 ++ "0.9 0.9 scale\n"
portrait = ""
stdProcedures = rightshow ++ centreshow
drawObject :: [Point] -> Postscript
drawObject (pts) = newpath ++ moveto (Pt 0 0) ++ concat (map lineto pts) ++
thinlines ++ stroke
fillObject :: [Point] -> Postscript
fillObject (pts) = newpath ++ moveto (Pt 0 0) ++ concat (map lineto pts) ++
closepath ++ fill ++ stroke
fillBox :: Point -> Int -> Int -> Int -> Postscript
fillBox pt dx dy c = newpath ++ moveto pt ++ rlineto 0 dy ++ rlineto dx 0 ++
rlineto 0 (-dy) ++ closepath ++ setgray c ++ fill
drawBox :: Point -> Int -> Int -> Postscript
drawBox pt dx dy = thinlines ++ newpath ++ moveto pt ++ rlineto 0 dy ++ rlineto dx 0 ++
rlineto 0 (-dy) ++ closepath ++ stroke
rjustify str = "("++str++") rightshow\n"
cjustify str = "("++str++") centreshow\n"
-- basic prodedures
rightshow = "/rightshow\n{dup stringwidth pop\n0 exch sub\n0 rmoveto\nshow } def \n"
centreshow = "/centreshow\n{dup stringwidth pop\n0 exch sub\n2 div\n0 rmoveto\nshow } def \n"
-- basic functions.
fill = "fill\n"
stroke = "stroke\n"
closepath = "closepath\n"
newpath = "newpath\n"
showpage = "showpage\n\n"
gsave = "gsave\n"
grestore = "grestore\n"
text t = setgray 0 ++ "("++t++") show\n"
setgray 0 = "0 setgray\n"
setgray 10 = "1 setgray\n"
setgray n = "."++show n++" setgray\n"
moveto (Pt x y) = psCommand "moveto" [x,y]
rmoveto x y = psCommand "rmoveto" [x,y]
lineto :: Point -> Postscript
lineto (Pt x y) = psCommand "lineto" [x,y]
rlineto x y = psCommand "rlineto" [x,y]
setlinewidth n = psCommand "setlinewidth" [n]
thinlines = "0.2 setlinewidth\n"
rotate n = psCommand "rotate" [n]
psCommand c args = concat (map f args) ++c++"\n"
where f x = show x++" "
translate x y = psCommand "translate" [x,y]
scale x y = psCommand "scale" [x,y]
setcms = "2.84584 2.84584 scale\n"
|