@@ -1,35 +1,19 @@
11
22module Collage where
33
4−data Line
5− = Start (Float,Float)
6− | Arc (Float,Float) Float (Float,Float) Path
7− | Line (Float,Float) Path
8− | Bezier (Float,Float) (Float,Float) (Float,Float) Path
9− | Quadratic (Float,Float) (Float,Float) Path
4+data Path = Path [(Float,Float)]
105
11−path ps = case ps of
12− [] -> Start (0,0)
13− hd:tl -> foldl Line (Start hd) tl
6+path = Path
7+segment p1 p2 = Path [p1,p2]
148
15−segment p1 p2 = Line p1 (Start p2)
9+data Shape = Shape [(Float,Float)]
1610
17−start = Start
18−arcTo = Arc
19−lineTo = Line
20−bezierTo = Bezier
21−quadraticTo = Quadratic
22−
23−data Shape = Shape Line
24−
25−polygon ps = Shape (case ps of
26− [] -> Start (0,0)
27− hd:tl -> Line hd $ foldl Line (Start hd) tl)
11+polygon = Shape
2812
2913rect w h = polygon [ (0-w/2,0-h/2), (0-w/2,h/2), (w/2,h/2), (w/2,0-h/2) ]
3014oval w h =
3115 let n = 50
32− f i = ( w/2 * cos (2*pi/n * i), h/2 * sin (2*pi/n * i))
16+ f i = (w/2 * cos (2*pi/n * i), h/2 * sin (2*pi/n * i))
3317 in Shape $ map f [0..n-1]
3418circle r = oval (2*r) (2*r)
3519ngon n r =
@@ -56,12 +40,21 @@ data FillStyle
5640 | LinearGradient [(Float,Color)] (Float,Float) (Float,Float)
5741 | RadialGradient [(Float,Color)] (Float,Float) Float (Float,Float) Float
5842
59−data LineStyle = NoLine | Line [Int] Int Float LineCap LineJoin Float FillStyle
43+-- dash pattern, dash offset, line width, cap, join, miter limit, fill style
44+type LineStyle = {
45+ width : Float,
46+ cap : LineCap,
47+ join : LineJoin,
48+ miterLimit : Float,
49+ fillStyle : FillStyle,
50+ dashing : [Int],
51+ dashOffset : Int
52+}
6053
6154data BasicForm
62− = FLine LineStyle FillStyle Line
55+ = FLine LineStyle Line
6356 | FShape LineStyle FillStyle Shape
64− | FImage Int Int String
57+ | FImage Int Int Int Int String
6558 | FElement Element
6659 | FGroup [Form]
6760
@@ -78,10 +71,14 @@ linearGradient stops start end = setFillStyle (LinearGradient stops start end)
7871radialGradient stops innerP innerR outerP outerR =
7972 setFillStyle (RadialGradient stops innerP innerR outerP outerR)
8073
81−solid clr ln = Form [] (FLine ln)
82−dotted clr ln = Form [] (FLine ln)
83−dashed clr ln = Form [] (FLine ln)
84−customLine pattern clr ln = Form [] (FLine (Custom pattern) clr ln)
74+plain = { width=1, cap=Butt, join=Miter, miterLimit=10,
75+ fillStyle=...,
76+ dashing=[], dashOffset=0 }
77+
78+solid c = Form [] . FLine c
79+dotted c = Form [] . FLine c
80+dashed c = Form [] . FLine c
81+lineStyle = Form [] . FLine
8582
8683
8784filled clr shp = Form [] (FShape shp)