2 | import Derive.Prelude
5 | import Web.Async.Util
7 | import public Web.Canvas.Angle
8 | import public Web.Canvas.Hints
9 | import public Web.Canvas.Scene
10 | import public Web.Canvas.Shape
11 | import public Web.Canvas.Style
12 | import public Web.Canvas.Transformation
15 | %language ElabReflection
17 | %foreign "browser:lambda:(x,w)=>x.height"
18 | prim__height : HTMLCanvasElement -> PrimIO Double
20 | %foreign "browser:lambda:(x,v,w)=>{x.height = v}"
21 | prim__setHeight : HTMLCanvasElement -> Double -> PrimIO ()
23 | %foreign "browser:lambda:(x,w)=>x.width"
24 | prim__width : HTMLCanvasElement -> PrimIO Double
26 | %foreign "browser:lambda:(x,v,w)=>{x.width = v}"
27 | prim__setWidth : HTMLCanvasElement -> Double -> PrimIO ()
29 | %foreign "browser:lambda:(x,w)=>x.getContext('2d')"
30 | prim__context2D : HTMLCanvasElement -> PrimIO (Nullable CanvasRenderingContext2D)
34 | record CanvasDims where
40 | %runElab derive "CanvasDims" [Show,Eq]
42 | parameters {auto has : Has JSErr es}
44 | canvasDims : Ref Canvas -> JS es CanvasDims
46 | canvas <- castElementByRef {t = HTMLCanvasElement} r
47 | w <- primIO (prim__width canvas)
48 | h <- primIO (prim__height canvas)
52 | setCanvasDims : Ref Canvas -> CanvasDims -> JS es ()
53 | setCanvasDims r (CD w h) = do
54 | canvas <- castElementByRef {t = HTMLCanvasElement} r
55 | primIO (prim__setWidth canvas w)
56 | primIO (prim__setHeight canvas h)
59 | context2D : HTMLCanvasElement -> JS es CanvasRenderingContext2D
60 | context2D canvas = do
61 | m <- primIO (prim__context2D canvas)
62 | case nullableToMaybe m of
64 | Nothing => throw $
Caught "Web.Canvas.context2D: No 2D rendering context for canvas"
68 | render : Ref Canvas -> (CanvasRenderingContext2D => IO1 ()) -> JS es ()
69 | render ref scene = do
70 | canvas <- castElementByRef {t = HTMLCanvasElement} ref
71 | ctxt <- context2D canvas
72 | w <- primIO (prim__width canvas)
73 | h <- primIO (prim__height canvas)
74 | lift1 (clearRect 0 0 w h)