module GEGL.Connection
( gegl_node_link
, gegl_node_link_many
, gegl_node_connect_to
, gegl_node_connect_from
, gegl_node_disconnect
) where
import Foreign.C.String (newCString)
import Foreign.Marshal.Alloc (free)
import Foreign.ForeignPtr (withForeignPtr)
import qualified GEGL.FFI.Connection as FFI
import GEGL.FFI.Node (GeglNode(..))
gegl_node_link
:: GeglNode
-> GeglNode
-> IO ()
gegl_node_link (GeglNode fsource) (GeglNode fsink) =
withForeignPtr fsource (\source -> withForeignPtr fsink (\sink ->
FFI.c_gegl_node_link source sink))
gegl_node_link_many
:: [GeglNode]
-> IO ()
gegl_node_link_many [] = return ()
gegl_node_link_many ([n]) = return ()
gegl_node_link_many (n:ns) = do
gegl_node_link n (head ns)
gegl_node_link_many ns
gegl_node_connect_to
:: GeglNode
-> String
-> GeglNode
-> String
-> IO Bool
gegl_node_connect_to (GeglNode fsource) outpad (GeglNode fsink) inpad = do
coutpad <- newCString outpad
cinpad <- newCString inpad
cout <-
withForeignPtr fsource (\source ->
withForeignPtr fsink (\sink ->
FFI.c_gegl_node_connect_to source coutpad sink cinpad))
free coutpad
free cinpad
if cout == 0
then return False
else return True
gegl_node_connect_from
:: GeglNode
-> String
-> GeglNode
-> String
-> IO Bool
gegl_node_connect_from (GeglNode fsink) inpad (GeglNode fsource) outpad = do
cinpad <- newCString inpad
coutpad <- newCString outpad
cout <- withForeignPtr fsink (\sink ->
withForeignPtr fsource (\source ->
FFI.c_gegl_node_connect_from sink cinpad source coutpad))
free cinpad
free coutpad
if cout == 0
then return False
else return True
gegl_node_disconnect
:: GeglNode
-> String
-> IO Bool
gegl_node_disconnect (GeglNode fnode) pad = do
cpad <- newCString pad
cout <- withForeignPtr fnode $ flip FFI.c_gegl_node_disconnect cpad
free cpad
if cout == 0
then return False
else return True