miso-1.15.0.0: src/Miso/Canvas/FFI.hs
-----------------------------------------------------------------------------
{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
-- |
-- Module : Miso.Canvas.FFI
-- 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
--
-- One JavaScript import per straight-line @CanvasRenderingContext2D@
-- operation: a method call or a property assignment that returns nothing.
--
-- "Miso.Canvas" used to go through the generic 'Miso.DSL.#' and 'setField':
-- a method name marshalled to a JavaScript string, a property lookup, an
-- argument array, and a 'JSVal' handle for every argument and the result,
-- on each operation. A direct import does one call with the numbers as
-- numbers. On MicroHs this made the canvas benchmark in @sample-app-canvas@
-- about 3.5 times faster (78 to 22 ms per frame for 1000 rectangles).
--
-- 'fillStyleRGB', 'strokeStyleRGB', 'shadowColorRGB' and their @RGBA@
-- variants take the colour as numbers and build the @rgb(…)@ string in
-- JavaScript, instead of 'Miso.CSS.Color.renderColor' building it from
-- Haskell (several string operations across the FFI per colour).
--
-- Operations that return a value (gradients, patterns, image data) stay on
-- the generic path in "Miso.Canvas". The native GHC backend has no
-- JavaScript FFI, so there these are the generic calls as before.
----------------------------------------------------------------------------
module Miso.Canvas.FFI
( jsString
, clearRect
, fillRect
, strokeRect
, rect
, quadraticCurveTo
, beginPath
, closePath
, fill
, stroke
, clip
, save
, restore
, moveTo
, lineTo
, scale
, translate
, rotate
, bezierCurveTo
, transform
, setTransform
, arc
, arcTo
, fillText
, strokeText
, drawImage
, drawImage4
, putImageData
, lineWidth
, miterLimit
, shadowBlur
, shadowOffsetX
, shadowOffsetY
, globalAlpha
, font
, lineCap
, lineJoin
, direction
, textAlign
, textBaseline
, globalCompositeOperation
, shadowColor
, fillStyle
, strokeStyle
, fillStyleRGB
, fillStyleRGBA
, strokeStyleRGB
, strokeStyleRGBA
, shadowColorRGB
, shadowColorRGBA
) where
-----------------------------------------------------------------------------
import Miso.String (MisoString)
#if defined(GHCJS_NEW) || defined(wasm32_HOST_ARCH) || defined(__MHS__)
import Miso.DSL.FFI (JSVal, JSString (..))
#ifdef MISO_TEXT
import Miso.DSL.FFI (textToJSString)
#endif
#else
import Control.Monad (void)
import Miso.CSS.Color (Color (..), renderColor)
import Miso.DSL (JSVal, (#), setField)
#endif
-----------------------------------------------------------------------------
-- | A 'MisoString' as the string the imports take.
#if !(defined(GHCJS_NEW) || defined(wasm32_HOST_ARCH) || defined(__MHS__))
jsString :: MisoString -> MisoString
jsString s = s
#elif defined(MISO_TEXT)
jsString :: MisoString -> JSString
jsString = textToJSString
#else
jsString :: MisoString -> JSString
jsString s = s
#endif
-----------------------------------------------------------------------------
#if defined(GHCJS_NEW)
-- The GHC JavaScript backend: the code is an arrow function.
foreign import javascript unsafe "(($1,$2,$3,$4,$5) => { $1.clearRect($2,$3,$4,$5); })"
clearRect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5) => { $1.fillRect($2,$3,$4,$5); })"
fillRect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5) => { $1.strokeRect($2,$3,$4,$5); })"
strokeRect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5) => { $1.rect($2,$3,$4,$5); })"
rect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5) => { $1.quadraticCurveTo($2,$3,$4,$5); })"
quadraticCurveTo :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1) => { $1.beginPath(); })"
beginPath :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1) => { $1.closePath(); })"
closePath :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1) => { $1.fill(); })"
fill :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1) => { $1.stroke(); })"
stroke :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1) => { $1.clip(); })"
clip :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1) => { $1.save(); })"
save :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1) => { $1.restore(); })"
restore :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3) => { $1.moveTo($2,$3); })"
moveTo :: JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3) => { $1.lineTo($2,$3); })"
lineTo :: JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3) => { $1.scale($2,$3); })"
scale :: JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3) => { $1.translate($2,$3); })"
translate :: JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.rotate($2); })"
rotate :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5,$6,$7) => { $1.bezierCurveTo($2,$3,$4,$5,$6,$7); })"
bezierCurveTo :: JSVal -> Double -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5,$6,$7) => { $1.transform($2,$3,$4,$5,$6,$7); })"
transform :: JSVal -> Double -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5,$6,$7) => { $1.setTransform($2,$3,$4,$5,$6,$7); })"
setTransform :: JSVal -> Double -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5,$6) => { $1.arc($2,$3,$4,$5,$6); })"
arc :: JSVal -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5,$6) => { $1.arcTo($2,$3,$4,$5,$6); })"
arcTo :: JSVal -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4) => { $1.fillText($2,$3,$4); })"
fillText :: JSVal -> JSString -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4) => { $1.strokeText($2,$3,$4); })"
strokeText :: JSVal -> JSString -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4) => { $1.drawImage($2,$3,$4); })"
drawImage :: JSVal -> JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5,$6) => { $1.drawImage($2,$3,$4,$5,$6); })"
drawImage4 :: JSVal -> JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4) => { $1.putImageData($2,$3,$4); })"
putImageData :: JSVal -> JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.lineWidth = $2; })"
lineWidth :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.miterLimit = $2; })"
miterLimit :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.shadowBlur = $2; })"
shadowBlur :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.shadowOffsetX = $2; })"
shadowOffsetX :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.shadowOffsetY = $2; })"
shadowOffsetY :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.globalAlpha = $2; })"
globalAlpha :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.font = $2; })"
font :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.lineCap = $2; })"
lineCap :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.lineJoin = $2; })"
lineJoin :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.direction = $2; })"
direction :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.textAlign = $2; })"
textAlign :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.textBaseline = $2; })"
textBaseline :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.globalCompositeOperation = $2; })"
globalCompositeOperation :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.shadowColor = $2; })"
shadowColor :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.fillStyle = $2; })"
fillStyle :: JSVal -> JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2) => { $1.strokeStyle = $2; })"
strokeStyle :: JSVal -> JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4) => { $1.fillStyle = 'rgb(' + $2 + ',' + $3 + ',' + $4 + ')'; })"
fillStyleRGB :: JSVal -> Int -> Int -> Int -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5) => { $1.fillStyle = 'rgba(' + $2 + ',' + $3 + ',' + $4 + ',' + $5 + ')'; })"
fillStyleRGBA :: JSVal -> Int -> Int -> Int -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4) => { $1.strokeStyle = 'rgb(' + $2 + ',' + $3 + ',' + $4 + ')'; })"
strokeStyleRGB :: JSVal -> Int -> Int -> Int -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5) => { $1.strokeStyle = 'rgba(' + $2 + ',' + $3 + ',' + $4 + ',' + $5 + ')'; })"
strokeStyleRGBA :: JSVal -> Int -> Int -> Int -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4) => { $1.shadowColor = 'rgb(' + $2 + ',' + $3 + ',' + $4 + ')'; })"
shadowColorRGB :: JSVal -> Int -> Int -> Int -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "(($1,$2,$3,$4,$5) => { $1.shadowColor = 'rgba(' + $2 + ',' + $3 + ',' + $4 + ',' + $5 + ')'; })"
shadowColorRGBA :: JSVal -> Int -> Int -> Int -> Double -> IO ()
#elif defined(wasm32_HOST_ARCH) || defined(__MHS__)
-- The GHC wasm backend and MicroHs: the code is a statement.
foreign import javascript unsafe "$1.clearRect($2,$3,$4,$5)"
clearRect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.fillRect($2,$3,$4,$5)"
fillRect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.strokeRect($2,$3,$4,$5)"
strokeRect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.rect($2,$3,$4,$5)"
rect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.quadraticCurveTo($2,$3,$4,$5)"
quadraticCurveTo :: JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.beginPath()"
beginPath :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.closePath()"
closePath :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.fill()"
fill :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.stroke()"
stroke :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.clip()"
clip :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.save()"
save :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.restore()"
restore :: JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.moveTo($2,$3)"
moveTo :: JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.lineTo($2,$3)"
lineTo :: JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.scale($2,$3)"
scale :: JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.translate($2,$3)"
translate :: JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.rotate($2)"
rotate :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.bezierCurveTo($2,$3,$4,$5,$6,$7)"
bezierCurveTo :: JSVal -> Double -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.transform($2,$3,$4,$5,$6,$7)"
transform :: JSVal -> Double -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.setTransform($2,$3,$4,$5,$6,$7)"
setTransform :: JSVal -> Double -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.arc($2,$3,$4,$5,$6)"
arc :: JSVal -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.arcTo($2,$3,$4,$5,$6)"
arcTo :: JSVal -> Double -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.fillText($2,$3,$4)"
fillText :: JSVal -> JSString -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.strokeText($2,$3,$4)"
strokeText :: JSVal -> JSString -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.drawImage($2,$3,$4)"
drawImage :: JSVal -> JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.drawImage($2,$3,$4,$5,$6)"
drawImage4 :: JSVal -> JSVal -> Double -> Double -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.putImageData($2,$3,$4)"
putImageData :: JSVal -> JSVal -> Double -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.lineWidth = $2"
lineWidth :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.miterLimit = $2"
miterLimit :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.shadowBlur = $2"
shadowBlur :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.shadowOffsetX = $2"
shadowOffsetX :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.shadowOffsetY = $2"
shadowOffsetY :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.globalAlpha = $2"
globalAlpha :: JSVal -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.font = $2"
font :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.lineCap = $2"
lineCap :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.lineJoin = $2"
lineJoin :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.direction = $2"
direction :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.textAlign = $2"
textAlign :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.textBaseline = $2"
textBaseline :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.globalCompositeOperation = $2"
globalCompositeOperation :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.shadowColor = $2"
shadowColor :: JSVal -> JSString -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.fillStyle = $2"
fillStyle :: JSVal -> JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.strokeStyle = $2"
strokeStyle :: JSVal -> JSVal -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.fillStyle = 'rgb(' + $2 + ',' + $3 + ',' + $4 + ')'"
fillStyleRGB :: JSVal -> Int -> Int -> Int -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.fillStyle = 'rgba(' + $2 + ',' + $3 + ',' + $4 + ',' + $5 + ')'"
fillStyleRGBA :: JSVal -> Int -> Int -> Int -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.strokeStyle = 'rgb(' + $2 + ',' + $3 + ',' + $4 + ')'"
strokeStyleRGB :: JSVal -> Int -> Int -> Int -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.strokeStyle = 'rgba(' + $2 + ',' + $3 + ',' + $4 + ',' + $5 + ')'"
strokeStyleRGBA :: JSVal -> Int -> Int -> Int -> Double -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.shadowColor = 'rgb(' + $2 + ',' + $3 + ',' + $4 + ')'"
shadowColorRGB :: JSVal -> Int -> Int -> Int -> IO ()
-----------------------------------------------------------------------------
foreign import javascript unsafe "$1.shadowColor = 'rgba(' + $2 + ',' + $3 + ',' + $4 + ',' + $5 + ')'"
shadowColorRGBA :: JSVal -> Int -> Int -> Int -> Double -> IO ()
#else
-- Native GHC: no JavaScript FFI, the generic DSL as before.
clearRect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
clearRect ctx a0 a1 a2 a3 = void (ctx # "clearRect" $ (a0,a1,a2,a3))
-----------------------------------------------------------------------------
fillRect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
fillRect ctx a0 a1 a2 a3 = void (ctx # "fillRect" $ (a0,a1,a2,a3))
-----------------------------------------------------------------------------
strokeRect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
strokeRect ctx a0 a1 a2 a3 = void (ctx # "strokeRect" $ (a0,a1,a2,a3))
-----------------------------------------------------------------------------
rect :: JSVal -> Double -> Double -> Double -> Double -> IO ()
rect ctx a0 a1 a2 a3 = void (ctx # "rect" $ (a0,a1,a2,a3))
-----------------------------------------------------------------------------
quadraticCurveTo :: JSVal -> Double -> Double -> Double -> Double -> IO ()
quadraticCurveTo ctx a0 a1 a2 a3 = void (ctx # "quadraticCurveTo" $ (a0,a1,a2,a3))
-----------------------------------------------------------------------------
beginPath :: JSVal -> IO ()
beginPath ctx = void (ctx # "beginPath" $ ())
-----------------------------------------------------------------------------
closePath :: JSVal -> IO ()
closePath ctx = void (ctx # "closePath" $ ())
-----------------------------------------------------------------------------
fill :: JSVal -> IO ()
fill ctx = void (ctx # "fill" $ ())
-----------------------------------------------------------------------------
stroke :: JSVal -> IO ()
stroke ctx = void (ctx # "stroke" $ ())
-----------------------------------------------------------------------------
clip :: JSVal -> IO ()
clip ctx = void (ctx # "clip" $ ())
-----------------------------------------------------------------------------
save :: JSVal -> IO ()
save ctx = void (ctx # "save" $ ())
-----------------------------------------------------------------------------
restore :: JSVal -> IO ()
restore ctx = void (ctx # "restore" $ ())
-----------------------------------------------------------------------------
moveTo :: JSVal -> Double -> Double -> IO ()
moveTo ctx a0 a1 = void (ctx # "moveTo" $ (a0,a1))
-----------------------------------------------------------------------------
lineTo :: JSVal -> Double -> Double -> IO ()
lineTo ctx a0 a1 = void (ctx # "lineTo" $ (a0,a1))
-----------------------------------------------------------------------------
scale :: JSVal -> Double -> Double -> IO ()
scale ctx a0 a1 = void (ctx # "scale" $ (a0,a1))
-----------------------------------------------------------------------------
translate :: JSVal -> Double -> Double -> IO ()
translate ctx a0 a1 = void (ctx # "translate" $ (a0,a1))
-----------------------------------------------------------------------------
rotate :: JSVal -> Double -> IO ()
rotate ctx a0 = void (ctx # "rotate" $ a0)
-----------------------------------------------------------------------------
bezierCurveTo :: JSVal -> Double -> Double -> Double -> Double -> Double -> Double -> IO ()
bezierCurveTo ctx a0 a1 a2 a3 a4 a5 = void (ctx # "bezierCurveTo" $ (a0,a1,a2,a3,a4,a5))
-----------------------------------------------------------------------------
transform :: JSVal -> Double -> Double -> Double -> Double -> Double -> Double -> IO ()
transform ctx a0 a1 a2 a3 a4 a5 = void (ctx # "transform" $ (a0,a1,a2,a3,a4,a5))
-----------------------------------------------------------------------------
setTransform :: JSVal -> Double -> Double -> Double -> Double -> Double -> Double -> IO ()
setTransform ctx a0 a1 a2 a3 a4 a5 = void (ctx # "setTransform" $ (a0,a1,a2,a3,a4,a5))
-----------------------------------------------------------------------------
arc :: JSVal -> Double -> Double -> Double -> Double -> Double -> IO ()
arc ctx a0 a1 a2 a3 a4 = void (ctx # "arc" $ (a0,a1,a2,a3,a4))
-----------------------------------------------------------------------------
arcTo :: JSVal -> Double -> Double -> Double -> Double -> Double -> IO ()
arcTo ctx a0 a1 a2 a3 a4 = void (ctx # "arcTo" $ (a0,a1,a2,a3,a4))
-----------------------------------------------------------------------------
fillText :: JSVal -> MisoString -> Double -> Double -> IO ()
fillText ctx o a0 a1 = void (ctx # "fillText" $ (o,a0,a1))
-----------------------------------------------------------------------------
strokeText :: JSVal -> MisoString -> Double -> Double -> IO ()
strokeText ctx o a0 a1 = void (ctx # "strokeText" $ (o,a0,a1))
-----------------------------------------------------------------------------
drawImage :: JSVal -> JSVal -> Double -> Double -> IO ()
drawImage ctx o a0 a1 = void (ctx # "drawImage" $ (o,a0,a1))
-----------------------------------------------------------------------------
drawImage4 :: JSVal -> JSVal -> Double -> Double -> Double -> Double -> IO ()
drawImage4 ctx o a0 a1 a2 a3 = void (ctx # "drawImage" $ (o,a0,a1,a2,a3))
-----------------------------------------------------------------------------
putImageData :: JSVal -> JSVal -> Double -> Double -> IO ()
putImageData ctx o a0 a1 = void (ctx # "putImageData" $ (o,a0,a1))
-----------------------------------------------------------------------------
lineWidth :: JSVal -> Double -> IO ()
lineWidth ctx v = setField ctx "lineWidth" v
-----------------------------------------------------------------------------
miterLimit :: JSVal -> Double -> IO ()
miterLimit ctx v = setField ctx "miterLimit" v
-----------------------------------------------------------------------------
shadowBlur :: JSVal -> Double -> IO ()
shadowBlur ctx v = setField ctx "shadowBlur" v
-----------------------------------------------------------------------------
shadowOffsetX :: JSVal -> Double -> IO ()
shadowOffsetX ctx v = setField ctx "shadowOffsetX" v
-----------------------------------------------------------------------------
shadowOffsetY :: JSVal -> Double -> IO ()
shadowOffsetY ctx v = setField ctx "shadowOffsetY" v
-----------------------------------------------------------------------------
globalAlpha :: JSVal -> Double -> IO ()
globalAlpha ctx v = setField ctx "globalAlpha" v
-----------------------------------------------------------------------------
font :: JSVal -> MisoString -> IO ()
font ctx v = setField ctx "font" v
-----------------------------------------------------------------------------
lineCap :: JSVal -> MisoString -> IO ()
lineCap ctx v = setField ctx "lineCap" v
-----------------------------------------------------------------------------
lineJoin :: JSVal -> MisoString -> IO ()
lineJoin ctx v = setField ctx "lineJoin" v
-----------------------------------------------------------------------------
direction :: JSVal -> MisoString -> IO ()
direction ctx v = setField ctx "direction" v
-----------------------------------------------------------------------------
textAlign :: JSVal -> MisoString -> IO ()
textAlign ctx v = setField ctx "textAlign" v
-----------------------------------------------------------------------------
textBaseline :: JSVal -> MisoString -> IO ()
textBaseline ctx v = setField ctx "textBaseline" v
-----------------------------------------------------------------------------
globalCompositeOperation :: JSVal -> MisoString -> IO ()
globalCompositeOperation ctx v = setField ctx "globalCompositeOperation" v
-----------------------------------------------------------------------------
shadowColor :: JSVal -> MisoString -> IO ()
shadowColor ctx v = setField ctx "shadowColor" v
-----------------------------------------------------------------------------
fillStyle :: JSVal -> JSVal -> IO ()
fillStyle ctx v = setField ctx "fillStyle" v
-----------------------------------------------------------------------------
strokeStyle :: JSVal -> JSVal -> IO ()
strokeStyle ctx v = setField ctx "strokeStyle" v
-----------------------------------------------------------------------------
fillStyleRGB :: JSVal -> Int -> Int -> Int -> IO ()
fillStyleRGB ctx r g b = setField ctx "fillStyle" (renderColor (RGB r g b))
-----------------------------------------------------------------------------
fillStyleRGBA :: JSVal -> Int -> Int -> Int -> Double -> IO ()
fillStyleRGBA ctx r g b a = setField ctx "fillStyle" (renderColor (RGBA r g b a))
-----------------------------------------------------------------------------
strokeStyleRGB :: JSVal -> Int -> Int -> Int -> IO ()
strokeStyleRGB ctx r g b = setField ctx "strokeStyle" (renderColor (RGB r g b))
-----------------------------------------------------------------------------
strokeStyleRGBA :: JSVal -> Int -> Int -> Int -> Double -> IO ()
strokeStyleRGBA ctx r g b a = setField ctx "strokeStyle" (renderColor (RGBA r g b a))
-----------------------------------------------------------------------------
shadowColorRGB :: JSVal -> Int -> Int -> Int -> IO ()
shadowColorRGB ctx r g b = setField ctx "shadowColor" (renderColor (RGB r g b))
-----------------------------------------------------------------------------
shadowColorRGBA :: JSVal -> Int -> Int -> Int -> Double -> IO ()
shadowColorRGBA ctx r g b a = setField ctx "shadowColor" (renderColor (RGBA r g b a))
#endif
-----------------------------------------------------------------------------