module GEGL.Node.State
( gegl_node_get_consumers
, gegl_node_get_producer
, gegl_node_get_bounding_box
) where
import qualified GEGL.FFI.Node.State as FFI
import qualified GEGL.FFI.Node as FFI
import qualified GEGL.FFI.Rectangle as FFI
import Foreign.C.String
import Foreign.ForeignPtr
import Foreign.Marshal.Alloc (free)
import Foreign.Storable (peek)
gegl_node_get_consumers
:: FFI.GeglNode
-> String
-> IO [(FFI.GeglNode, String)]
gegl_node_get_consumers (FFI.GeglNode node) name = do
cname <- newCString name
ptrs <- withForeignPtr node $ \ptr -> FFI.c_gegl_node_get_consumers ptr cname
nodes <- mapM (\nodePtr -> FFI.GeglNode <$> newForeignPtr_ (fst nodePtr)) ptrs
names <- mapM (\nodePtr -> peekCString $ snd nodePtr) ptrs
free cname
return $ zip nodes names
gegl_node_get_producer
:: FFI.GeglNode
-> String
-> IO (Maybe (FFI.GeglNode, String))
gegl_node_get_producer (FFI.GeglNode fnode) name = do
cname <- newCString name
mtup <- withForeignPtr fnode $ \node -> FFI.c_gegl_node_get_producer node cname
free cname
case mtup of
Just (pnode, pcname) -> do
pfnode <- FFI.GeglNode <$> newForeignPtr_ pnode
pname <- peekCString pcname
return $ Just $ (pfnode, pname)
Nothing ->
return Nothing
gegl_node_get_bounding_box
:: FFI.GeglNode
-> IO FFI.GeglRectangle
gegl_node_get_bounding_box (FFI.GeglNode fnode) = do
ptr <- withForeignPtr fnode $ \node -> FFI.c_gegl_node_get_bounding_box node
rect <- peek ptr
free ptr
return rect