hip-1.0.1: src/Graphics/Image/IO/Base.hs
{-# LANGUAGE FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, TypeFamilies #-}
-- |
-- Module : Graphics.Image.IO.Base
-- Copyright : (c) Alexey Kuleshevich 2016
-- License : BSD3
-- Maintainer : Alexey Kuleshevich <lehins@yandex.ru>
-- Stability : experimental
-- Portability : non-portable
--
module Graphics.Image.IO.Base (
ImageFormat(..), Readable(..), Writable(..), Convertible(..),
displayProgram, spawnProcess
) where
import qualified Data.ByteString as B (ByteString)
import qualified Data.ByteString.Lazy as BL (ByteString)
import Data.IORef
import System.IO.Unsafe (unsafePerformIO)
import System.Process (proc, createProcess, ProcessHandle)
-- | Used during converting pixels between libraries.
class Convertible a b where
convert :: a -> b
-- | Image file format. Helps in guessing image format using a file extension,
-- as well as supplying format specific options during saving an image.
class ImageFormat format where
-- | Options that can be used during writing an image in this format.
data SaveOption format
-- | Default file extension for this image format.
ext :: format -> String
-- | Known extensions for this image format.
exts :: format -> [String]
exts f = [ext f]
-- | Returns `True` if a file extension (ex. @".png"@) corresponds to this format.
isFormat :: String -> format -> Bool
isFormat e f = e `elem` exts f
-- | Image formats that can be read from file.
class ImageFormat format => Readable img format where
-- | Decode an image from `BL.ByteString`.
decode :: format -> B.ByteString -> Either String img
-- | Image formats that can be written to file.
class ImageFormat format => Writable img format where
-- | Encode an image to `BL.ByteString`.
encode :: format -> [SaveOption format] -> img -> BL.ByteString
-- | Global variable for setting display program.
displayProgram :: IORef (String, Bool)
displayProgram = unsafePerformIO . newIORef $ ("gpicview", False)
{-# NOINLINE displayProgram #-}
-- | Implemented here for backwards compatibility with `process < 1.2.0.0`
spawnProcess :: FilePath -> [String] -> IO ProcessHandle
spawnProcess cmd args = do
(_,_,_,p) <- createProcess (proc cmd args)
return p