| Copyright | (C) 2016-2026 David M. Johnson |
|---|---|
| License | BSD3-style (see the file LICENSE) |
| Maintainer | David M. Johnson <code@dmj.io> |
| Stability | experimental |
| Portability | non-portable |
| Safe Haskell | None |
| Language | Haskell2010 |
Miso.Subscription.Canvas
Contents
Description
Subscriptions
Arguments
| :: DOMRef | The canvas |
| -> MisoString | "2d", "webgpu", "webgl2" |
| -> (Double -> model -> Canvas state) | Canvas callback in 60fps, high precision timestamp, model snapshot as args to Canvas DSL templating |
| -> Sub model action |
Sub for canvas operations, meant to be used with onCreated / onDestroyed
Example usage below
import Miso.Canvas data Action = InitCanvas DOMRef | StopCanvas canvasComponent ::Componentcontext props model action canvasComponent =componentm u v where m = () u = case InitCanvas domRef -> startSub "galaxy" $ canvasSub domRef "2d" $ _timeStamp currentModel -> do drawScene currentModel StopCanvas -> stopSub "galaxy" v _context _props () =canvas_[ onCreatedWith InitCanvas, onDestroyed StopCanvas ] [] drawScene :: Model ->Canvas() drawScene m = doclearRect(0, 0, 800, 480)fillStyle(colorColor.cornflowerblue)fillRect(0, 0, 800, 480)fillStyle(colorColor.white)font"24px sans-serif"fillText("Hello, miso!", 32, 48)
canvasSub is meant to bypass virtual DOM creation, creating a more efficient canvas
draw. This works by calling requestAnimationFrame in a tight loop around a freshly
initialized canvas (per onCreated).
The difference between canvasSub and Miso.Canvas is that this operates in a tight
rAF loop. The latter operates on a discrete event basis and the draw is called during
the diffing process.