module Graphics.ImageMagick.MagickWand.Types
( PPixelIterator
, PPixelWand
, PPixelPacket
, PMagickPixelPacket
, PDrawingWand
, PMagickWand
, MagickWandException(..)
, ExceptionCarrier(..)
, module Graphics.ImageMagick.MagickCore.Types
, Pixel(..)
) where
import qualified Data.Vector.Storable as V
import Foreign
import Foreign.C.String
import Graphics.ImageMagick.MagickCore.Exception
import Graphics.ImageMagick.MagickCore.Types
import Graphics.ImageMagick.MagickWand.FFI.DrawingWand as F
import Graphics.ImageMagick.MagickWand.FFI.MagickWand as F
import Graphics.ImageMagick.MagickWand.FFI.PixelIterator as F
import Graphics.ImageMagick.MagickWand.FFI.PixelWand as F
import Graphics.ImageMagick.MagickWand.FFI.Types
type PPixelIterator = Ptr PixelIterator
type PPixelWand = Ptr PixelWand
type PMagickWand = Ptr MagickWand
type PDrawingWand = Ptr DrawingWand
type PMagickPixelPacket = ForeignPtr MagickPixelPacket
type PPixelPacket = ForeignPtr PixelPacket
constructException :: forall t.
(t -> Ptr ExceptionType -> IO CString)
-> t -> IO MagickWandException
constructException f w = alloca $ \x -> do
s <- peekCString =<< f w x
x' <- peek x
return $ MagickWandException (toSeverity x') x' s
instance ExceptionCarrier (Ptr MagickWand) where
getException = constructException F.magickGetException
instance ExceptionCarrier (Ptr PixelIterator) where
getException = constructException F.pixelGetIteratorException
instance ExceptionCarrier (Ptr PixelWand) where
getException = constructException F.pixelGetException
instance ExceptionCarrier (Ptr DrawingWand) where
getException = constructException F.drawGetException
class (Storable a) => Pixel a where
pixelStorageType :: [a] -> StorageType
withPixels :: [a] -> (Ptr a -> IO b) -> IO b
withPixels xs f = V.unsafeWith (V.fromList xs) f
instance Pixel Word8 where
pixelStorageType = const charPixel
instance Pixel Word16 where
pixelStorageType = const shortPixel
instance Pixel Word32 where
pixelStorageType = const longPixel
instance Pixel Word64 where
pixelStorageType = const longPixel
instance Pixel Float where
pixelStorageType = const floatPixel
instance Pixel Double where
pixelStorageType = const doublePixel