e7cadaf9ab
Currently, these files are either unused or compiled down to JS and included in the runtime system (i.e. `elm-runtime-x.y.z.js`) They will eventually get incorporated into the compiler though!
195 lines
No EOL
5.5 KiB
Elm
195 lines
No EOL
5.5 KiB
Elm
|
|
module Graphics.Element
|
|
(left,right,down,up,inward,outward
|
|
,topLeft,topRight,bottomLeft,bottomRight
|
|
,midLeft,midRight,midTop,midBottom
|
|
,middle,absolute,relative
|
|
,topLeftAt,topRightAt,bottomLeftAt,bottomRightAt
|
|
,width,height,size,widthOf,heightOf,sizeOf
|
|
,color,opacity
|
|
,text,image,fittedImage,video
|
|
,flow,above,below,beside,layers
|
|
,collage,spacer,container
|
|
,line,segment
|
|
,polygon,ngon,rect,oval,circle
|
|
,solid,dotted,dashed,customLine
|
|
,filled,outlined,customOutline,textured
|
|
,sprite,toForm
|
|
,rotate,scale,move
|
|
) where
|
|
|
|
import Graphics.Color
|
|
|
|
data Direction = DLeft | DRight | DUp | DDown | DIn | DOut
|
|
|
|
left = DLeft
|
|
right = DRight
|
|
down = DDown
|
|
up = DUp
|
|
inward = DIn
|
|
outward = DOut
|
|
|
|
data Pos1 = Absolute Int | Relative Float
|
|
data Pos2 = Near | Mid | Far
|
|
|
|
data Position
|
|
= Position Pos2 Pos2
|
|
| PositionAt Pos1 Pos1
|
|
| PositionTL Pos1 Pos1
|
|
| PositionTR Pos1 Pos1
|
|
| PositionBL Pos1 Pos1
|
|
| PositionBR Pos1 Pos1
|
|
|
|
topLeft = Position Near Near
|
|
topRight = Position Far Near
|
|
bottomLeft = Position Near Far
|
|
bottomRight = Position Far Far
|
|
|
|
midLeft = Position Near Mid
|
|
midRight = Position Far Mid
|
|
midTop = Position Mid Near
|
|
midBottom = Position Mid Far
|
|
|
|
middle = Position Mid Mid
|
|
|
|
middleAt = PositionAt
|
|
topLeftAt = PositionTL
|
|
topRightAt = PositionTR
|
|
bottomLeftAt = PositionBL
|
|
bottomRightAt = PositionBR
|
|
|
|
absolute = Absolute
|
|
relative = Relative
|
|
|
|
data Element = Element Int BasicElement Int Int Float (Maybe Color) (Just String)
|
|
|
|
newElement = Element 0
|
|
basicNewElement e w h = Element 0 e w h 1 Nothing Nothing
|
|
|
|
data BasicElement
|
|
= EText Text Text
|
|
| EImage String
|
|
| EVideo String
|
|
| EFittedImage String
|
|
| EFlow Direction [Element]
|
|
| ECollage Int Int [Form]
|
|
| EEmpty
|
|
| EContainer Position Element
|
|
|
|
width w' (Element _ e w h o c l) =
|
|
case e of
|
|
{ EText _ -> newElement e w' h o c l
|
|
; EImage _ -> newElement e w' h o c l
|
|
; EVideo _ -> newElement e w' h o c l
|
|
; _ -> newElement e w' h o c l }
|
|
height h' (Element _ e w h o c l) =
|
|
case e of
|
|
{ EText _ -> newElement e w h' o c l
|
|
; EImage _ -> newElement e w h' o c l
|
|
; EVideo _ -> newElement e w h' o c l
|
|
; _ -> newElement e w h' o c l }
|
|
size w' h' (Element _ e w h o c l) = newElement e w' h' o c l
|
|
opacity o' (Element _ e w h o c l) = newElement e w h o' c l
|
|
color c' (Element _ e w h o c l) = newElement e w h o (Just c') l
|
|
link l' (Element _ e w h o c l) = newElement e w h o c (Just l')
|
|
|
|
widthOf (Element _ _ w _ _ _ _) = w
|
|
heightOf (Element _ _ _ h _ _ _) = h
|
|
sizeOf (Element _ _ w h _ _ _) = (w,h)
|
|
|
|
n1 = 0-1
|
|
|
|
text t = basicNewElement (EText t) n1 n1
|
|
image w h s = basicNewElement (EImage s) w h
|
|
video w h s = basicNewElement (EVideo s) w h
|
|
fittedImage w h s = basicNewElement (EFittedImage s) w h
|
|
|
|
flow dir es =
|
|
let { w = let ws = map widthOf es in
|
|
case dir of { DLeft -> sum ws
|
|
; DRight -> sum ws
|
|
; _ -> maximum ws }
|
|
; h = let hs = map heightOf es in
|
|
case dir of { DDown -> sum hs
|
|
; DUp -> sum hs
|
|
; _ -> maximum hs }
|
|
} in basicNewElement (EFlow dir es) w h
|
|
|
|
above e1 e2 =
|
|
newElement
|
|
(EFlow DDown [e1,e2])
|
|
(max (widthOf e1) (widthOf e2))
|
|
(heightOf e1 + heightOf e2) 1 Nothing Nothing
|
|
|
|
below e1 e2 =
|
|
basicNewElement (EFlow DDown [e2,e1])
|
|
(max (widthOf e1) (widthOf e2))
|
|
(heightOf e1 + heightOf e2)
|
|
|
|
beside e1 e2 =
|
|
basicNewElement (EFlow DRight [e1,e2])
|
|
(widthOf e1 + widthOf e2)
|
|
(max (heightOf e1) (heightOf e2))
|
|
|
|
layers es =
|
|
basicNewElement (EFlow DIn es)
|
|
(maximum (map widthOf es))
|
|
(maximum (map heightOf es))
|
|
|
|
collage w h forms = basicNewElement (ECollage w h forms) w h
|
|
|
|
spacer w h = basicNewElement EEmpty w h
|
|
|
|
container w h pos e =
|
|
basicNewElement (EContainer pos e) w h
|
|
|
|
|
|
|
|
data LineStyle = Solid | Dotted | Dashed | Custom [Int]
|
|
data ShapeStyle = Filled | Outlined | CustomOutline [Int] | Textured String
|
|
|
|
data Line = Line [(Float,Float)]
|
|
|
|
line = Line
|
|
segment p1 p2 = Line [p1,p2]
|
|
|
|
data Shape = Shape [(Float,Float)] (Float,Float)
|
|
|
|
polygon = Shape
|
|
rect w h pos = Shape [(0-w/2,0-h/2),(0-w/2,h/2),(w/2,h/2),(w/2,0-h/2)] pos
|
|
oval w h pos =
|
|
let n = 50 in
|
|
let f i = ( w/2 * cos (2*pi/n * i), h/2 * sin (2*pi/n * i)) in
|
|
Shape (map f [0..n-1]) pos
|
|
circle r = oval (2*r) (2*r)
|
|
ngon n r pos =
|
|
let m = toFloat n in
|
|
let f i = ( r * cos (2*pi/m * i), r * sin (2*pi/m * i)) in
|
|
Shape (map f [0..n-1]) pos
|
|
|
|
data Form = Form Float Float (Float,Float) BasicForm
|
|
|
|
data BasicForm
|
|
= FLine LineStyle Color Line
|
|
| FShape ShapeStyle Color Shape
|
|
| FImage Int Int String
|
|
| FElement Element
|
|
|
|
solid clr ln = Form 0 1 (0,0) (FLine Solid clr ln)
|
|
dotted clr ln = Form 0 1 (0,0) (FLine Dotted clr ln)
|
|
dashed clr ln = Form 0 1 (0,0) (FLine Dashed clr ln)
|
|
customLine pattern clr ln =
|
|
Form 0 1 (0,0) (FLine (Custom pattern) clr ln)
|
|
|
|
filled clr (Shape ps pos) = Form 0 1 pos (FShape Filled clr (Shape ps pos))
|
|
outlined clr (Shape ps pos) = Form 0 1 pos (FShape Outlined clr (Shape ps pos))
|
|
customOutline pattern clr (Shape ps pos) =
|
|
Form 0 1 pos (FShape (CustomOutline pattern) clr (Shape ps pos))
|
|
textured src (Shape ps pos) = Form 0 1 pos (FShape (Textured src) black (Shape ps pos))
|
|
|
|
sprite w h pos src = Form 0 1 pos (FImage w h src)
|
|
toForm pos e = Form 0 1 pos (FElement e)
|
|
|
|
rotate t (Form theta scale pos form) = Form (t+theta) scale pos form
|
|
scale s (Form theta scale pos form) = Form theta (s*scale) pos form
|
|
move x y (Form theta scale (px,py) form) = Form theta scale (x+px,y+py) form |