{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Graphics.Blank.Utils where
import Data.ByteString.Base64
import qualified Data.ByteString as B
import Data.Text(Text)
import qualified Data.Text as Text
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
import Graphics.Blank.Canvas
import Graphics.Blank.Generated
import Graphics.Blank.JavaScript
import Prelude.Compat
clearCanvas :: Canvas ()
clearCanvas :: Canvas ()
clearCanvas = do
(Double, Double, Double, Double, Double, Double) -> Canvas ()
setTransform (Double
1, Double
0, Double
0, Double
1, Double
0, Double
0)
CanvasContext
me <- Canvas CanvasContext
myCanvasContext
(Double, Double, Double, Double) -> Canvas ()
clearRect (Double
0,Double
0,forall a b. (Image a, Num b) => a -> b
width CanvasContext
me,forall a b. (Image a, Num b) => a -> b
height CanvasContext
me)
saveRestore :: Canvas a -> Canvas a
saveRestore :: forall a. Canvas a -> Canvas a
saveRestore Canvas a
m = do
() -> Canvas ()
save ()
a
r <- Canvas a
m
() -> Canvas ()
restore ()
forall (m :: * -> *) a. Monad m => a -> m a
return a
r
infixr 0 #
(#) :: a -> (a -> b) -> b
# :: forall a b. a -> (a -> b) -> b
(#) a
obj a -> b
act = a -> b
act a
obj
readDataURL :: Text -> FilePath -> IO Text
readDataURL :: Text -> FilePath -> IO Text
readDataURL Text
mime_type FilePath
filePath = do
ByteString
dat <- FilePath -> IO ByteString
B.readFile FilePath
filePath
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Text
"data:" forall a. Semigroup a => a -> a -> a
<> Text
mime_type forall a. Semigroup a => a -> a -> a
<> Text
";base64," forall a. Semigroup a => a -> a -> a
<> ByteString -> Text
decodeUtf8 (ByteString -> ByteString
encode ByteString
dat)
dataURLMimeType :: Text -> Text
dataURLMimeType :: Text -> Text
dataURLMimeType Text
txt
| Text
dat forall a. Eq a => a -> a -> Bool
/= Text
"data" = forall a. HasCallStack => FilePath -> a
error FilePath
"dataURLMimeType: no 'data:'"
| Bool -> Bool
not (Text -> Bool
Text.null Text
rest0) Bool -> Bool -> Bool
&& Bool -> Bool
not (Text -> Bool
Text.null Text
rest2) = Text
mime_type
| Bool
otherwise = forall a. HasCallStack => FilePath -> a
error FilePath
"dataURLMimeType: bad parse"
where
(Text
dat,Text
rest0) = (Char -> Bool) -> Text -> (Text, Text)
Text.span (forall a. Eq a => a -> a -> Bool
/= Char
':') Text
txt
rest1 :: Text
rest1 = case Text -> Maybe (Char, Text)
Text.uncons Text
rest0 of
Just (Char
_,Text
rest1') -> Text
rest1'
Maybe (Char, Text)
Nothing -> Text
"dataURLMimeType: Unexpected empty Text"
(Text
mime_type,Text
rest2) = (Char -> Bool) -> Text -> (Text, Text)
Text.span (forall a. Eq a => a -> a -> Bool
/= Char
';') Text
rest1
writeDataURL :: FilePath -> Text -> IO ()
writeDataURL :: FilePath -> Text -> IO ()
writeDataURL FilePath
fileName
= FilePath -> ByteString -> IO ()
B.writeFile FilePath
fileName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
decodeLenient
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
encodeUtf8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
Text.tail
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> Text -> Text
Text.dropWhile (forall a. Eq a => a -> a -> Bool
/= Char
',')
drawImageAt :: Image image => (image, Double, Double) -> Canvas ()
drawImageAt :: forall image. Image image => (image, Double, Double) -> Canvas ()
drawImageAt (image
img, Double
dx, Double
dy) = Method -> Canvas ()
Method forall a b. (a -> b) -> a -> b
$ forall image. Image image => (image, [Double]) -> Method
DrawImage (image
img, [Double
dx, Double
dy])
drawImageSize :: Image image => (image, Double, Double, Double, Double) -> Canvas ()
drawImageSize :: forall image.
Image image =>
(image, Double, Double, Double, Double) -> Canvas ()
drawImageSize (image
img, Double
dx, Double
dy, Double
dw, Double
dh) = Method -> Canvas ()
Method forall a b. (a -> b) -> a -> b
$ forall image. Image image => (image, [Double]) -> Method
DrawImage (image
img, [Double
dx, Double
dy, Double
dw, Double
dh])
drawImageCrop :: Image image => (image, Double, Double, Double, Double, Double, Double, Double, Double) -> Canvas ()
drawImageCrop :: forall image.
Image image =>
(image, Double, Double, Double, Double, Double, Double, Double,
Double)
-> Canvas ()
drawImageCrop (image
img, Double
sx, Double
sy, Double
sw, Double
sh, Double
dx, Double
dy, Double
dw, Double
dh)
= Method -> Canvas ()
Method forall a b. (a -> b) -> a -> b
$ forall image. Image image => (image, [Double]) -> Method
DrawImage (image
img, [Double
sx, Double
sy, Double
sw, Double
sh, Double
dx, Double
dy, Double
dw, Double
dh])
putImageDataAt :: (ImageData, Double, Double) -> Canvas ()
putImageDataAt :: (ImageData, Double, Double) -> Canvas ()
putImageDataAt (ImageData
imgData, Double
dx, Double
dy) = Method -> Canvas ()
Method forall a b. (a -> b) -> a -> b
$ (ImageData, [Double]) -> Method
PutImageData (ImageData
imgData, [Double
dx, Double
dy])
putImageDataDirty :: (ImageData, Double, Double, Double, Double, Double, Double) -> Canvas ()
putImageDataDirty :: (ImageData, Double, Double, Double, Double, Double, Double)
-> Canvas ()
putImageDataDirty (ImageData
imgData, Double
dx, Double
dy, Double
dirtyX, Double
dirtyY, Double
dirtyWidth, Double
dirtyHeight)
= Method -> Canvas ()
Method forall a b. (a -> b) -> a -> b
$ (ImageData, [Double]) -> Method
PutImageData (ImageData
imgData, [Double
dx, Double
dy, Double
dirtyX, Double
dirtyY, Double
dirtyWidth, Double
dirtyHeight])