module GEGL.Buffer
( FFI.GeglBuffer(..)
, gegl_buffer_new
, gegl_buffer_default_new
, gegl_buffer_save
, gegl_buffer_load
, gegl_buffer_flush
, gegl_buffer_create_sub_buffer
, gegl_buffer_get_extent
, gegl_buffer_set_extent
, gegl_buffer_get_x
, gegl_buffer_get_y
, gegl_buffer_get_height
, gegl_buffer_get_width
, gegl_buffer_get_pixel_count
, gegl_buffer_set_color
, gegl_buffer_set_pattern
, gegl_buffer_clear
, gegl_buffer_get
) where
import qualified GEGL.FFI.Buffer as FFI
import qualified GEGL.FFI.Rectangle as FFI (GeglRectangle(..))
import qualified GEGL.FFI.Color as FFI (GeglColor(..))
import GEGL.Enums (GeglAccessMode, GeglAbyssPolicy)
import BABL.Format (PixelFormat, babl_format)
import BABL.FFI.Format (BablFormatPtr(..))
import Foreign.Storable (peek)
import Foreign.C.String
import Foreign.C.Types (CDouble(..), CInt(..))
import Foreign.Ptr (nullPtr, Ptr(..))
import Foreign.Marshal (free)
import Foreign.Marshal.Utils (new)
import Foreign.Marshal.Alloc (malloc)
gegl_buffer_new
:: Maybe FFI.GeglRectangle
-> BablFormatPtr
-> IO FFI.GeglBuffer
gegl_buffer_new mrect (BablFormatPtr format) = do
ptr <- case mrect of
Just rect -> new rect
Nothing -> return nullPtr
val <- FFI.GeglBuffer <$> FFI.c_gegl_buffer_new ptr format
free ptr
return val
gegl_buffer_default_new :: IO FFI.GeglBuffer
gegl_buffer_default_new = FFI.GeglBuffer <$> FFI.c_gegl_buffer_new nullPtr nullPtr
gegl_buffer_new_for_backend
:: Maybe FFI.GeglRectangle
-> Ptr a
-> IO FFI.GeglBuffer
gegl_buffer_new_for_backend mext backend = do
rectPtr <- case mext of
Just ext -> new ext
Nothing -> return nullPtr
buf <- FFI.GeglBuffer <$> FFI.c_gegl_buffer_new_for_backend rectPtr backend
free rectPtr
return buf
gegl_buffer_open
:: FilePath
-> IO FFI.GeglBuffer
gegl_buffer_open fp = do
cfp <- newCString fp
ret <- FFI.GeglBuffer <$> FFI.c_gegl_buffer_open cfp
free cfp
return ret
gegl_buffer_save
:: FFI.GeglBuffer
-> FilePath
-> FFI.GeglRectangle
-> IO ()
gegl_buffer_save (FFI.GeglBuffer buf) fp roi = do
croi <- new roi
cfp <- newCString fp
FFI.c_gegl_buffer_save buf cfp croi
free croi
free cfp
gegl_buffer_load
:: FilePath
-> IO FFI.GeglBuffer
gegl_buffer_load path = do
cpath <- newCString path
ret <- FFI.GeglBuffer <$> FFI.c_gegl_buffer_load cpath
free cpath
return ret
gegl_buffer_flush
:: FFI.GeglBuffer
-> IO ()
gegl_buffer_flush (FFI.GeglBuffer buf) =
FFI.c_gegl_buffer_flush buf
gegl_buffer_create_sub_buffer
:: FFI.GeglBuffer
-> FFI.GeglRectangle
-> IO FFI.GeglBuffer
gegl_buffer_create_sub_buffer (FFI.GeglBuffer buf) rect = do
crect <- new rect
ret <- FFI.GeglBuffer <$> FFI.c_gegl_buffer_create_sub_buffer buf crect
free crect
return ret
gegl_buffer_get_extent
:: FFI.GeglBuffer
-> IO FFI.GeglRectangle
gegl_buffer_get_extent (FFI.GeglBuffer buffer) = do
rectPtr <- FFI.c_gegl_buffer_get_extent buffer
rect <- peek rectPtr
return rect
gegl_buffer_set_extent
:: FFI.GeglBuffer
-> FFI.GeglRectangle
-> IO Bool
gegl_buffer_set_extent (FFI.GeglBuffer buffer) rect = do
ptr <- new rect
val <- FFI.c_gegl_buffer_set_extent buffer ptr
free ptr
return val
gegl_buffer_get_x
:: FFI.GeglBuffer
-> IO Int
gegl_buffer_get_x buffer = do
FFI.GeglRectangle{..} <- gegl_buffer_get_extent buffer
return rectangleX
gegl_buffer_get_y
:: FFI.GeglBuffer
-> IO Int
gegl_buffer_get_y buffer = do
FFI.GeglRectangle{..} <- gegl_buffer_get_extent buffer
return rectangleY
gegl_buffer_get_height
:: FFI.GeglBuffer
-> IO Int
gegl_buffer_get_height buffer = do
FFI.GeglRectangle{..} <- gegl_buffer_get_extent buffer
return rectangleHeight
gegl_buffer_get_width
:: FFI.GeglBuffer
-> IO Int
gegl_buffer_get_width buffer = do
FFI.GeglRectangle{..} <- gegl_buffer_get_extent buffer
return rectangleWidth
gegl_buffer_get_pixel_count
:: FFI.GeglBuffer
-> IO Int
gegl_buffer_get_pixel_count buffer = do
FFI.GeglRectangle{..} <- gegl_buffer_get_extent buffer
return $ rectangleWidth * rectangleHeight
gegl_buffer_set_color
:: FFI.GeglBuffer
-> FFI.GeglRectangle
-> FFI.GeglColor
-> IO ()
gegl_buffer_set_color (FFI.GeglBuffer buffer) rect (FFI.GeglColor color) = do
rectPtr <- new rect
FFI.c_gegl_buffer_set_color buffer rectPtr color
free rectPtr
gegl_buffer_set_pattern
:: FFI.GeglBuffer
-> FFI.GeglRectangle
-> FFI.GeglBuffer
-> Double
-> Double
-> IO ()
gegl_buffer_set_pattern
(FFI.GeglBuffer buffer)
rect
(FFI.GeglBuffer pattern)
xoff
yoff
= do
rectPtr <- new rect
let (cx, cy) = (CDouble xoff, CDouble yoff)
FFI.c_gegl_buffer_set_pattern
buffer
rectPtr
pattern
cx
cy
free rectPtr
gegl_buffer_clear
:: FFI.GeglBuffer
-> FFI.GeglRectangle
-> IO ()
gegl_buffer_clear (FFI.GeglBuffer buf) rect = do
rectPtr <- new rect
FFI.c_gegl_buffer_clear buf rectPtr
free rectPtr
gegl_buffer_get
:: FFI.GeglBuffer
-> Maybe FFI.GeglRectangle
-> Double
-> Maybe BablFormatPtr
-> Ptr a
-> Int
-> GeglAbyssPolicy
-> IO ()
gegl_buffer_get (FFI.GeglBuffer buf) mrect scale mformat dest stride ap = do
rect <- case mrect of
Just r -> new r
Nothing -> return nullPtr
let format = case mformat of
Just (BablFormatPtr ptr) -> ptr
Nothing -> nullPtr
FFI.c_gegl_buffer_get
buf
rect
(CDouble scale)
format
dest
(CInt $ fromIntegral stride)
(CInt $ fromIntegral $ fromEnum ap)
free rect