packages feed

gegl-0.0.0.5: src/GEGL/FFI/Buffer.hs

{-# LANGUAGE ForeignFunctionInterface #-}

-- | FFI moule for managing and manipulating buffers
module GEGL.FFI.Buffer
  ( GeglBuffer(..)
  , GeglBufferDummy
  , c_gegl_buffer_new
  , c_gegl_buffer_new_for_backend
  , c_gegl_buffer_open
  , c_gegl_buffer_save
  , c_gegl_buffer_load
  , c_gegl_buffer_flush
  , c_gegl_buffer_create_sub_buffer
  , c_gegl_buffer_get_extent
  , c_gegl_buffer_set_extent
  , c_gegl_buffer_set_color
  , c_gegl_buffer_set_pattern
  , c_gegl_buffer_clear
  , c_gegl_buffer_get
  ) where

import Foreign
import Foreign.C.Types
import Foreign.C.String
import Foreign.Ptr
import Foreign.ForeignPtr

import GEGL.FFI.Rectangle (GeglRectangle)
import GEGL.FFI.Color     (GeglColorDummy)

import BABL.FFI.Format (BablFormatDummy)

-- | Pointer holding a buffer. Never peek or poke it.
type GeglBufferDummy = ForeignPtr ()
-- | Outward representation of the buffer.
data GeglBuffer = GeglBuffer GeglBufferDummy

-- | Interface to the @gegl_buffer_new@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_new"
  c_gegl_buffer_new
    :: Ptr GeglRectangle  -- ^ Buffer geometry
    -> BablFormatDummy  -- ^ Color format
    -> IO (Ptr()) -- ^ New buffer

-- | Interface to the @gegl_buffer_new_for_backend@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_new_for_backend"
  c_gegl_buffer_new_for_backend
    :: Ptr GeglRectangle  -- ^ Buffer geometry
    -> Ptr a              -- ^ The backend
    -> IO (Ptr()) -- ^ New buffer

-- | Interace to the @gegl_buffer_open@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_open"
  c_gegl_buffer_open
    :: CString            -- Path to buffer on disc
    -> IO (Ptr ()) -- The buffer

-- | Interface to the @gegl_buffer_save@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_save"
  c_gegl_buffer_save
    :: Ptr ()
    -> CString
    -> Ptr GeglRectangle
    -> IO ()

-- | Interface to the @gegl_buffer_load@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_load"
  c_gegl_buffer_load
    :: CString
    -> IO (Ptr ())

-- | Interface to the @gegl_buffer_flush@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_flush"
  c_gegl_buffer_flush
    :: Ptr ()
    -> IO ()

-- | Interface to the @gegl_buffer_create_sub_buffer@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_create_sub_buffer"
  c_gegl_buffer_create_sub_buffer
    :: Ptr ()
    -> Ptr GeglRectangle
    -> IO (Ptr ())

-- | Interface to the @gegl_buffer_get_extent@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_get_extent"
  c_gegl_buffer_get_extent
    :: Ptr ()
    -> IO (Ptr GeglRectangle)

-- | Interface to the @gegl_buffer_set_extent@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_set_extent"
  c_gegl_buffer_set_extent
    :: Ptr ()   -- ^ A buffer
    -> Ptr GeglRectangle -- ^ Geometry
    -> IO Bool           -- ^ Returns True on success

-- | Interface to the @gegl_buffer_set_color@ funciton in C.
foreign import ccall unsafe "gegl.h gegl_buffer_set_color"
  c_gegl_buffer_set_color
    :: Ptr ()   -- ^ The buffer
    -> Ptr GeglRectangle -- ^ Rectangular region to fill
    -> GeglColorDummy    -- ^ The colour to fill with.
    -> IO ()

-- | Interface to the @gegl_bufer_set_pattern@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_set_pattern"
  c_gegl_buffer_set_pattern
    :: Ptr ()   -- ^ The target buffer
    -> Ptr GeglRectangle -- ^ rectangular region to fill
    -> (Ptr())   -- ^ A buffer to be repeated as pattern
    -> CDouble           -- ^ X offset
    -> CDouble           -- ^ Y offset
    -> IO ()

-- | Interface to the @gegl_buffer_clear@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_clear"
  c_gegl_buffer_clear
    :: Ptr ()   -- ^ The target buffer
    -> Ptr GeglRectangle -- ^ Region to clear
    -> IO ()

-- | Interface to the @gegl_bufer_get@ function in C.
foreign import ccall unsafe "gegl.h gegl_buffer_get"
  c_gegl_buffer_get
    :: Ptr ()   -- ^ Buffer to retrieve data from
    -> Ptr GeglRectangle -- ^ Coordinates to retrieve from
    -> CDouble           -- ^ Sampling scale
    -> BablFormatDummy   -- ^ 'BablFormat' to store the data in
    -> Ptr a             -- ^ Memory destination
    -> CInt              -- ^ Rowstride in bytes or 0 to compute it from format
    -> CInt              -- ^ Repeat mode
    -> IO ()