From a999722e15f0ecd752e3b1c4eb836c4f72f012dd Mon Sep 17 00:00:00 2001 From: Isaac Shapira Date: Sun, 17 Aug 2014 11:53:32 -0600 Subject: [PATCH 1/2] line cap and dimensions bindings --- README.md | 28 ++++++++++++++++++++++ src/Graphics/Canvas.purs | 51 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/README.md b/README.md index c489a84..9378e62 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,13 @@ data Context2D :: * + type Dimensions = { height :: Number, width :: Number } + + data LineCap where + Round :: LineCap + Square :: LineCap + Butt :: LineCap + type Rectangle = { h :: Number, w :: Number, y :: Number, x :: Number } type ScaleTransform = { scaleY :: Number, scaleX :: Number } @@ -21,6 +28,11 @@ type TranslateTransform = { translateY :: Number, translateX :: Number } +### Type Class Instances + + instance showLineCap :: Show LineCap + + ### Values arc :: forall eff. Context2D -> Arc -> Eff (canvas :: Canvas | eff) Context2D @@ -39,8 +51,14 @@ fillRect :: forall eff. Context2D -> Rectangle -> Eff (canvas :: Canvas | eff) Context2D + getCanvasDimensions :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Dimensions + getCanvasElementById :: forall eff. String -> Eff (canvas :: Canvas | eff) CanvasElement + getCanvasHeight :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Number + + getCanvasWidth :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Number + getContext2D :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Context2D lineTo :: forall eff. Context2D -> Number -> Number -> Eff (canvas :: Canvas | eff) Context2D @@ -57,8 +75,18 @@ scale :: forall eff. ScaleTransform -> Context2D -> Eff (canvas :: Canvas | eff) Context2D + setCanvasDimensions :: forall eff. Dimensions -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement + + setCanvasHeight :: forall eff. Number -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement + + setCanvasWidth :: forall eff. Number -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement + setFillStyle :: forall eff. String -> Context2D -> Eff (canvas :: Canvas | eff) Context2D + setLineCap :: forall eff. LineCap -> Context2D -> Eff (canvas :: Canvas | eff) Context2D + + setLineCapImpl :: forall eff. String -> Context2D -> Eff (canvas :: Canvas | eff) Context2D + setLineWidth :: forall eff. Number -> Context2D -> Eff (canvas :: Canvas | eff) Context2D setShadowBlur :: forall eff. Number -> Context2D -> Eff (canvas :: Canvas | eff) Context2D diff --git a/src/Graphics/Canvas.purs b/src/Graphics/Canvas.purs index 9a493e3..3d2ea8a 100644 --- a/src/Graphics/Canvas.purs +++ b/src/Graphics/Canvas.purs @@ -22,6 +22,37 @@ foreign import getContext2D \ };\ \}" :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Context2D +foreign import getCanvasWidth + "function getCanvasWidth(canvas){ return function(){ return canvas.width; };};" + :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Number + +foreign import getCanvasHeight + "function getCanvasHeight(canvas){ return function(){ return canvas.height; };};" + :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Number + +foreign import setCanvasWidth + "function setCanvasWidth(width){ return function(canvas){ return function(){\ + \ canvas.width = width;\ + \ return canvas; \ + \};};};" :: forall eff. Number -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement + +foreign import setCanvasHeight + "function setCanvasHeight(height){ return function(canvas){ return function(){\ + \ canvas.height = height;\ + \ return canvas; \ + \};};};" :: forall eff. Number -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement + +type Dimensions = {width :: Number, height :: Number} + +getCanvasDimensions :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Dimensions +getCanvasDimensions ce = do + w <- getCanvasWidth ce + h <- getCanvasHeight ce + return {width : w, height : h} + +setCanvasDimensions :: forall eff. Dimensions -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement +setCanvasDimensions d ce = setCanvasHeight d.height ce >>= setCanvasWidth d.width + -- | -- Context Properties -- @@ -96,6 +127,26 @@ foreign import setShadowOffsetY \ };\ \}" :: forall eff. Number -> Context2D -> Eff (canvas :: Canvas | eff) Context2D +data LineCap = Round | Square | Butt + +instance showLineCap :: Show LineCap where + show Round = "round" + show Square = "square" + show Butt = "butt" + +foreign import setLineCapImpl + "function setLineCapImpl(cap){\ + \ return function(ctx) {\ + \ return function() {\ + \ ctx.lineCap = cap;\ + \ return ctx;\ + \ };\ + \ };\ + \}" :: forall eff. String -> Context2D -> Eff (canvas :: Canvas | eff) Context2D + +setLineCap :: forall eff. LineCap -> Context2D -> Eff (canvas :: Canvas | eff) Context2D +setLineCap cap ctx = setLineCapImpl (show cap) ctx + -- | -- Paths -- From dbf422cc55f3dde1d7e8e3f5ef151102826eb5f5 Mon Sep 17 00:00:00 2001 From: Isaac Shapira Date: Sun, 17 Aug 2014 14:45:16 -0600 Subject: [PATCH 2/2] addressing comments --- README.md | 5 ----- src/Graphics/Canvas.purs | 47 +++++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 9378e62..cf0d7e1 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,6 @@ type TranslateTransform = { translateY :: Number, translateX :: Number } -### Type Class Instances - - instance showLineCap :: Show LineCap - - ### Values arc :: forall eff. Context2D -> Arc -> Eff (canvas :: Canvas | eff) Context2D diff --git a/src/Graphics/Canvas.purs b/src/Graphics/Canvas.purs index 3d2ea8a..505a090 100644 --- a/src/Graphics/Canvas.purs +++ b/src/Graphics/Canvas.purs @@ -23,24 +23,38 @@ foreign import getContext2D \}" :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Context2D foreign import getCanvasWidth - "function getCanvasWidth(canvas){ return function(){ return canvas.width; };};" - :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Number + "function getCanvasWidth(canvas){\ + \ return function(){\ + \ return canvas.width;\ + \ };\ + \};" :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Number foreign import getCanvasHeight - "function getCanvasHeight(canvas){ return function(){ return canvas.height; };};" - :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Number + "function getCanvasHeight(canvas){\ + \ return function(){\ + \ return canvas.height;\ + \ };\ + \};" :: forall eff. CanvasElement -> Eff (canvas :: Canvas | eff) Number foreign import setCanvasWidth - "function setCanvasWidth(width){ return function(canvas){ return function(){\ - \ canvas.width = width;\ - \ return canvas; \ - \};};};" :: forall eff. Number -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement + "function setCanvasWidth(width){\ + \ return function(canvas){\ + \ return function(){\ + \ canvas.width = width;\ + \ return canvas;\ + \ };\ + \ };\ + \};" :: forall eff. Number -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement foreign import setCanvasHeight - "function setCanvasHeight(height){ return function(canvas){ return function(){\ - \ canvas.height = height;\ - \ return canvas; \ - \};};};" :: forall eff. Number -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement + "function setCanvasHeight(height){\ + \ return function(canvas){\ + \ return function(){\ + \ canvas.height = height;\ + \ return canvas; \ + \ };\ + \ };\ + \};" :: forall eff. Number -> CanvasElement -> Eff (canvas :: Canvas | eff) CanvasElement type Dimensions = {width :: Number, height :: Number} @@ -129,11 +143,6 @@ foreign import setShadowOffsetY data LineCap = Round | Square | Butt -instance showLineCap :: Show LineCap where - show Round = "round" - show Square = "square" - show Butt = "butt" - foreign import setLineCapImpl "function setLineCapImpl(cap){\ \ return function(ctx) {\ @@ -145,7 +154,9 @@ foreign import setLineCapImpl \}" :: forall eff. String -> Context2D -> Eff (canvas :: Canvas | eff) Context2D setLineCap :: forall eff. LineCap -> Context2D -> Eff (canvas :: Canvas | eff) Context2D -setLineCap cap ctx = setLineCapImpl (show cap) ctx +setLineCap Round = setLineCapImpl "round" +setLineCap Square = setLineCapImpl "square" +setLineCap Butt = setLineCapImpl "butt" -- | -- Paths