0 | module Web.MVC.Canvas.Scene
2 | import Control.Monad.Either.Extra
4 | import Web.MVC.Canvas.Shape
5 | import Web.MVC.Canvas.Style
6 | import Web.MVC.Canvas.Transformation
15 | %foreign "browser:lambda:(x,a)=>x.measureText(a)"
16 | prim__measure : CanvasRenderingContext2D -> String -> PrimIO TextMetrics
19 | %foreign "browser:lambda:x=>x.actualBoundingBoxAscent"
20 | actualBoundingBoxAscent : TextMetrics -> Double
23 | %foreign "browser:lambda:x=>x.actualBoundingBoxDescent"
24 | actualBoundingBoxDescent : TextMetrics -> Double
27 | %foreign "browser:lambda:x=>x.actualBoundingBoxLeft"
28 | actualBoundingBoxLeft : TextMetrics -> Double
31 | %foreign "browser:lambda:x=>x.actualBoundingBoxRight"
32 | actualBoundingBoxRight : TextMetrics -> Double
35 | %foreign "browser:lambda:x=>x.alphabeticBaseline"
36 | alphabeticBaseline : TextMetrics -> Double
39 | %foreign "browser:lambda:x=>x.emHeightAscent"
40 | emHeightAscent : TextMetrics -> Double
43 | %foreign "browser:lambda:x=>x.emHeightDescent"
44 | emHeightDescent : TextMetrics -> Double
47 | %foreign "browser:lambda:x=>x.fontBoundingBoxAscent"
48 | fontBoundingBoxAscent : TextMetrics -> Double
51 | %foreign "browser:lambda:x=>x.fontBoundingBoxDescent"
52 | fontBoundingBoxDescent : TextMetrics -> Double
55 | %foreign "browser:lambda:x=>x.hangingBaseline"
56 | hangingBaseline : TextMetrics -> Double
59 | %foreign "browser:lambda:x=>x.ideographicBaseline"
60 | ideographicBaseline : TextMetrics -> Double
63 | %foreign "browser:lambda:x=>x.width"
64 | width : TextMetrics -> Double
66 | %foreign "browser:lambda:(c,d,a,b,f,s)=>{d0 = c.direction; b0 = c.textBaseline; a0 = c.textAlign; f0 = c.font; c.font = f; c.direction = d; c.textBaseline = b; c.textAlign = a; res = c.measureText(s); c.font = f0; c.direction = d0; c.textBaseline = b0; c.textAlign = a0; return res}"
68 | CanvasRenderingContext2D
69 | -> (dir, align, baseline, font, text : String)
77 | data Scene : Type where
78 | S1 : (fs : List Style) -> (tr : Transformation) -> (shape : Shape) -> Scene
79 | SM : (fs : List Style) -> (tr : Transformation) -> List Scene -> Scene
86 | applyAll : CanvasRenderingContext2D -> List Scene -> JSIO ()
89 | apply : CanvasRenderingContext2D -> Scene -> JSIO ()
91 | applyAll ctxt = assert_total $
traverseList_ (apply ctxt)
93 | apply ctxt (S1 fs tr shape) = do
95 | traverseList_ (apply ctxt) fs
100 | apply ctxt (SM fs tr xs) = do
102 | traverseList_ (apply ctxt) fs
109 | record TextMeasure where
112 | measure_ : (dir, align, bl, font, text : String) -> TextMetrics
117 | {auto m : TextMeasure}
120 | -> CanvasTextBaseline
121 | -> (font,text : String)
123 | measureText d a b f t = m.measure_ (show d) (show a) (show b) f t
128 | withMetrics : CanvasRenderingContext2D -> (TextMeasure => a) -> a
129 | withMetrics cd f = f @{TM $
prim__measureText cd}
134 | applyWithMetrics : CanvasRenderingContext2D -> (TextMeasure => Scene) -> JSIO ()
135 | applyWithMetrics cd f = withMetrics cd $
apply cd f