    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Graphics.X11.Xlib.Image
    -- Copyright   :  (c) Frederik Eaton 2006
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  libraries@haskell.org, frederik@ofb.net
    -- Stability   :  provisional
    -- Portability :  portable
    --
    -- Xlib image routines
    --
    -----------------------------------------------------------------------------

    module Graphics.X11.Xlib.Image(
            Image,
            createImage,
            putImage,
            destroyImage,
            ) where

    import Graphics.X11.Types
    import Graphics.X11.Xlib.Types

    import Foreign
    -- import Foreign.C
    import Foreign.C.Types

    ----------------------------------------------------------------
    -- Image
    ----------------------------------------------------------------

    -- | interface to the X11 library function @XCreateImage()@.
    createImage :: Display -> Visual -> CInt -> ImageFormat -> CInt -> Ptr CChar -> Dimension -> Dimension -> CInt -> CInt -> IO Image
    createImage display vis depth format offset dat width height bitmap_pad bytes_per_line = do
        image <- throwIfNull "createImage" (xCreateImage display vis depth format offset dat width height bitmap_pad bytes_per_line)
        return (Image image)
    foreign import ccall unsafe "HsXlib.h XCreateImage"
        xCreateImage :: Display -> Visual -> CInt -> ImageFormat -> CInt ->
            Ptr CChar -> Dimension -> Dimension -> CInt -> CInt -> IO (Ptr Image)

    -- | interface to the X11 library function @XPutImage()@.
    foreign import ccall unsafe "HsXlib.h XPutImage"
        putImage :: Display -> Drawable -> GC -> Image ->
            Position -> Position -> Position -> Position  -> Dimension -> Dimension -> IO ()

    -- | interface to the X11 library function @XDestroyImage()@.
    foreign import ccall unsafe "HsXlib.h XDestroyImage"
        destroyImage :: Image -> IO ()

    {- don't need XInitImage since Haskell users probably won't be setting
    members of the XImage structure themselves -}
    -- XInitImage omitted

    {- these two functions are for fetching image data from a drawable
    back into an image struct. i'm not exactly sure when they would be
    used -}
    -- XGetImage omitted
    -- XGetSubImage omitted