{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Diagrams.Backend.Rasterific.CmdLine
(
mainWith
, defaultMain
, multiMain
, animMain
, gifMain
, uniformGifMain
, GifOpts(..)
, Rasterific
, B
) where
import Diagrams.Backend.CmdLine
import Diagrams.Backend.Rasterific
import Diagrams.Prelude hiding (height, interval,
output, width, option)
import qualified Data.ByteString.Lazy as L (writeFile)
import Options.Applicative
defaultMain :: Diagram Rasterific -> IO ()
defaultMain :: Diagram Rasterific -> IO ()
defaultMain = Diagram Rasterific -> IO ()
QDiagram Rasterific V2 Double Any -> IO ()
forall d. (Mainable d, Parseable (MainOpts d)) => d -> IO ()
mainWith
instance TypeableFloat n => Mainable (QDiagram Rasterific V2 n Any) where
type MainOpts (QDiagram Rasterific V2 n Any) = DiagramOpts
mainRender :: MainOpts (QDiagram Rasterific V2 n Any)
-> QDiagram Rasterific V2 n Any -> IO ()
mainRender MainOpts (QDiagram Rasterific V2 n Any)
opts QDiagram Rasterific V2 n Any
d = DiagramOpts -> QDiagram Rasterific V2 n Any -> IO ()
forall n.
TypeableFloat n =>
DiagramOpts -> QDiagram Rasterific V2 n Any -> IO ()
chooseRender DiagramOpts
MainOpts (QDiagram Rasterific V2 n Any)
opts QDiagram Rasterific V2 n Any
d
chooseRender :: TypeableFloat n => DiagramOpts -> QDiagram Rasterific V2 n Any -> IO ()
chooseRender :: forall n.
TypeableFloat n =>
DiagramOpts -> QDiagram Rasterific V2 n Any -> IO ()
chooseRender DiagramOpts
opts QDiagram Rasterific V2 n Any
d
| String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
path = IO ()
noFileError
| Bool
otherwise = String -> SizeSpec V2 n -> QDiagram Rasterific V2 n Any -> IO ()
forall n.
TypeableFloat n =>
String -> SizeSpec V2 n -> QDiagram Rasterific V2 n Any -> IO ()
renderRasterific String
path SizeSpec V2 n
sz QDiagram Rasterific V2 n Any
d
where
path :: String
path = DiagramOpts
optsDiagramOpts -> Getting String DiagramOpts String -> String
forall s a. s -> Getting a s a -> a
^.Getting String DiagramOpts String
Lens' DiagramOpts String
output
sz :: SizeSpec V2 n
sz = GifDelay -> n
forall a b. (Integral a, Num b) => a -> b
fromIntegral (GifDelay -> n) -> SizeSpec V2 GifDelay -> SizeSpec V2 n
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe GifDelay -> Maybe GifDelay -> SizeSpec V2 GifDelay
forall n. Num n => Maybe n -> Maybe n -> SizeSpec V2 n
mkSizeSpec2D (DiagramOpts
optsDiagramOpts
-> Getting (Maybe GifDelay) DiagramOpts (Maybe GifDelay)
-> Maybe GifDelay
forall s a. s -> Getting a s a -> a
^.Getting (Maybe GifDelay) DiagramOpts (Maybe GifDelay)
Lens' DiagramOpts (Maybe GifDelay)
width) (DiagramOpts
optsDiagramOpts
-> Getting (Maybe GifDelay) DiagramOpts (Maybe GifDelay)
-> Maybe GifDelay
forall s a. s -> Getting a s a -> a
^.Getting (Maybe GifDelay) DiagramOpts (Maybe GifDelay)
Lens' DiagramOpts (Maybe GifDelay)
height)
noFileError :: IO ()
noFileError :: IO ()
noFileError = String -> IO ()
putStrLn String
"No output file given. Specify output file with -o"
multiMain :: [(String, Diagram Rasterific)] -> IO ()
multiMain :: [(String, Diagram Rasterific)] -> IO ()
multiMain = [(String, Diagram Rasterific)] -> IO ()
[(String, QDiagram Rasterific V2 Double Any)] -> IO ()
forall d. (Mainable d, Parseable (MainOpts d)) => d -> IO ()
mainWith
instance TypeableFloat n => Mainable [(String,QDiagram Rasterific V2 n Any)] where
type MainOpts [(String,QDiagram Rasterific V2 n Any)]
= (MainOpts (QDiagram Rasterific V2 n Any), DiagramMultiOpts)
mainRender :: MainOpts [(String, QDiagram Rasterific V2 n Any)]
-> [(String, QDiagram Rasterific V2 n Any)] -> IO ()
mainRender = (MainOpts (QDiagram Rasterific V2 n Any), DiagramMultiOpts)
-> [(String, QDiagram Rasterific V2 n Any)] -> IO ()
MainOpts [(String, QDiagram Rasterific V2 n Any)]
-> [(String, QDiagram Rasterific V2 n Any)] -> IO ()
forall d.
Mainable d =>
(MainOpts d, DiagramMultiOpts) -> [(String, d)] -> IO ()
defaultMultiMainRender
animMain :: Animation Rasterific V2 Double -> IO ()
animMain :: Animation Rasterific V2 Double -> IO ()
animMain = Animation Rasterific V2 Double -> IO ()
forall d. (Mainable d, Parseable (MainOpts d)) => d -> IO ()
mainWith
instance TypeableFloat n => Mainable (Animation Rasterific V2 n) where
type MainOpts (Animation Rasterific V2 n) = (DiagramOpts, DiagramAnimOpts)
mainRender :: MainOpts (Animation Rasterific V2 n)
-> Animation Rasterific V2 n -> IO ()
mainRender MainOpts (Animation Rasterific V2 n)
opts Animation Rasterific V2 n
d = (DiagramOpts -> QDiagram Rasterific V2 n Any -> IO ())
-> Lens' DiagramOpts String
-> (DiagramOpts, DiagramAnimOpts)
-> Animation Rasterific V2 n
-> IO ()
forall opts b (v :: * -> *) n.
(opts -> QDiagram b v n Any -> IO ())
-> Lens' opts String
-> (opts, DiagramAnimOpts)
-> Animation b v n
-> IO ()
defaultAnimMainRender DiagramOpts -> QDiagram Rasterific V2 n Any -> IO ()
forall n.
TypeableFloat n =>
DiagramOpts -> QDiagram Rasterific V2 n Any -> IO ()
chooseRender (String -> f String) -> DiagramOpts -> f DiagramOpts
Lens' DiagramOpts String
output (DiagramOpts, DiagramAnimOpts)
MainOpts (Animation Rasterific V2 n)
opts Animation Rasterific V2 n
d
data GifOpts = GifOpts { GifOpts -> Bool
_dither :: Bool
, GifOpts -> Bool
_noLooping :: Bool
, GifOpts -> Maybe GifDelay
_loopRepeat :: Maybe Int}
makeLenses ''GifOpts
instance Parseable GifOpts where
parser :: Parser GifOpts
parser = Bool -> Bool -> Maybe GifDelay -> GifOpts
GifOpts (Bool -> Bool -> Maybe GifDelay -> GifOpts)
-> Parser Bool -> Parser (Bool -> Maybe GifDelay -> GifOpts)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Mod FlagFields Bool -> Parser Bool
switch
( String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"dither"
Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help String
"Turn on dithering." )
Parser (Bool -> Maybe GifDelay -> GifOpts)
-> Parser Bool -> Parser (Maybe GifDelay -> GifOpts)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
( String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"looping-off"
Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help String
"Turn looping off" )
Parser (Maybe GifDelay -> GifOpts)
-> Parser (Maybe GifDelay) -> Parser GifOpts
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ( Parser GifDelay -> Parser (Maybe GifDelay)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser GifDelay -> Parser (Maybe GifDelay))
-> (Mod OptionFields GifDelay -> Parser GifDelay)
-> Mod OptionFields GifDelay
-> Parser (Maybe GifDelay)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReadM GifDelay -> Mod OptionFields GifDelay -> Parser GifDelay
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM GifDelay
forall a. Read a => ReadM a
auto)
( String -> Mod OptionFields GifDelay
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"loop-repeat"
Mod OptionFields GifDelay
-> Mod OptionFields GifDelay -> Mod OptionFields GifDelay
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields GifDelay
forall (f :: * -> *) a. String -> Mod f a
help String
"Number of times to repeat" )
instance ToResult [(QDiagram Rasterific V2 n Any, GifDelay)] where
type Args [(QDiagram Rasterific V2 n Any, GifDelay)] = ()
type ResultOf [(QDiagram Rasterific V2 n Any, GifDelay)] = [(QDiagram Rasterific V2 n Any, GifDelay)]
toResult :: [(QDiagram Rasterific V2 n Any, GifDelay)]
-> Args [(QDiagram Rasterific V2 n Any, GifDelay)]
-> ResultOf [(QDiagram Rasterific V2 n Any, GifDelay)]
toResult [(QDiagram Rasterific V2 n Any, GifDelay)]
ds Args [(QDiagram Rasterific V2 n Any, GifDelay)]
_ = [(QDiagram Rasterific V2 n Any, GifDelay)]
ResultOf [(QDiagram Rasterific V2 n Any, GifDelay)]
ds
instance TypeableFloat n => Mainable [(QDiagram Rasterific V2 n Any, GifDelay)] where
type MainOpts [(QDiagram Rasterific V2 n Any, GifDelay)] = (DiagramOpts, GifOpts)
mainRender :: MainOpts [(QDiagram Rasterific V2 n Any, GifDelay)]
-> [(QDiagram Rasterific V2 n Any, GifDelay)] -> IO ()
mainRender (DiagramOpts
dOpts, GifOpts
gOpts) [(QDiagram Rasterific V2 n Any, GifDelay)]
ids
| String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
path = IO ()
noFileError
| Bool
otherwise = case SizeSpec V2 n
-> GifLooping
-> PaletteOptions
-> [(QDiagram Rasterific V2 n Any, GifDelay)]
-> Either String ByteString
forall n.
TypeableFloat n =>
SizeSpec V2 n
-> GifLooping
-> PaletteOptions
-> [(QDiagram Rasterific V2 n Any, GifDelay)]
-> Either String ByteString
rasterGif SizeSpec V2 n
sz GifLooping
lOpts PaletteOptions
pOpts [(QDiagram Rasterific V2 n Any, GifDelay)]
ids of
Right ByteString
bs -> String -> ByteString -> IO ()
L.writeFile String
path ByteString
bs
Left String
e -> String -> IO ()
putStrLn String
e
where
sz :: SizeSpec V2 n
sz = GifDelay -> n
forall a b. (Integral a, Num b) => a -> b
fromIntegral (GifDelay -> n) -> SizeSpec V2 GifDelay -> SizeSpec V2 n
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe GifDelay -> Maybe GifDelay -> SizeSpec V2 GifDelay
forall n. Num n => Maybe n -> Maybe n -> SizeSpec V2 n
mkSizeSpec2D (DiagramOpts
dOptsDiagramOpts
-> Getting (Maybe GifDelay) DiagramOpts (Maybe GifDelay)
-> Maybe GifDelay
forall s a. s -> Getting a s a -> a
^.Getting (Maybe GifDelay) DiagramOpts (Maybe GifDelay)
Lens' DiagramOpts (Maybe GifDelay)
width) (DiagramOpts
dOptsDiagramOpts
-> Getting (Maybe GifDelay) DiagramOpts (Maybe GifDelay)
-> Maybe GifDelay
forall s a. s -> Getting a s a -> a
^.Getting (Maybe GifDelay) DiagramOpts (Maybe GifDelay)
Lens' DiagramOpts (Maybe GifDelay)
height)
path :: String
path = DiagramOpts
dOptsDiagramOpts -> Getting String DiagramOpts String -> String
forall s a. s -> Getting a s a -> a
^.Getting String DiagramOpts String
Lens' DiagramOpts String
output
lOpts :: GifLooping
lOpts
| GifOpts
gOptsGifOpts -> Getting Bool GifOpts Bool -> Bool
forall s a. s -> Getting a s a -> a
^.Getting Bool GifOpts Bool
Lens' GifOpts Bool
noLooping = GifLooping
LoopingNever
| Bool
otherwise = GifLooping
-> (GifDelay -> GifLooping) -> Maybe GifDelay -> GifLooping
forall b a. b -> (a -> b) -> Maybe a -> b
maybe GifLooping
LoopingForever (Word16 -> GifLooping
LoopingRepeat (Word16 -> GifLooping)
-> (GifDelay -> Word16) -> GifDelay -> GifLooping
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GifDelay -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral)
(GifOpts
gOptsGifOpts
-> Getting (Maybe GifDelay) GifOpts (Maybe GifDelay)
-> Maybe GifDelay
forall s a. s -> Getting a s a -> a
^.Getting (Maybe GifDelay) GifOpts (Maybe GifDelay)
Lens' GifOpts (Maybe GifDelay)
loopRepeat)
pOpts :: PaletteOptions
pOpts = PaletteOptions
defaultPaletteOptions {enableImageDithering=gOpts^.dither}
gifMain :: [(Diagram Rasterific, GifDelay)] -> IO ()
gifMain :: [(Diagram Rasterific, GifDelay)] -> IO ()
gifMain = [(Diagram Rasterific, GifDelay)] -> IO ()
[(QDiagram Rasterific V2 Double Any, GifDelay)] -> IO ()
forall d. (Mainable d, Parseable (MainOpts d)) => d -> IO ()
mainWith
uniformGifMain :: GifDelay -> [Diagram Rasterific] -> IO ()
uniformGifMain :: GifDelay -> [Diagram Rasterific] -> IO ()
uniformGifMain GifDelay
i = [(QDiagram Rasterific V2 Double Any, GifDelay)] -> IO ()
forall d. (Mainable d, Parseable (MainOpts d)) => d -> IO ()
mainWith ([(QDiagram Rasterific V2 Double Any, GifDelay)] -> IO ())
-> ([QDiagram Rasterific V2 Double Any]
-> [(QDiagram Rasterific V2 Double Any, GifDelay)])
-> [QDiagram Rasterific V2 Double Any]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (QDiagram Rasterific V2 Double Any
-> (QDiagram Rasterific V2 Double Any, GifDelay))
-> [QDiagram Rasterific V2 Double Any]
-> [(QDiagram Rasterific V2 Double Any, GifDelay)]
forall a b. (a -> b) -> [a] -> [b]
map (,GifDelay
i)