packages feed

X11-xft-0.1: Graphics/X11/Xrender.hsc

-----------------------------------------------------------------------------
-- Module      :  Graphics.X11.Xrender
-- Copyright   :  Clemens Fruhwirth <clemens@endorphin.org> 2007
--
-- Haskell bindings for the Xrender extension.
--
-----------------------------------------------------------------------------

module Graphics.X11.Xrender
where
import Graphics.X11
import Graphics.X11.Xlib.Types
import Foreign
import Foreign.C
import Foreign.C.Types
import Foreign.Ptr
import Foreign.Storable( Storable(..) )

#include <X11/extensions/Xrender.h>


peekCUShort :: Ptr a -> CInt -> IO Int
peekCUShort ptr off = do
	v <- peekByteOff ptr (fromIntegral off)
	return (fromIntegral (v::CUShort))

pokeCUShort :: Ptr a -> CInt -> Int -> IO ()
pokeCUShort ptr off v =
	pokeByteOff ptr (fromIntegral off) (fromIntegral v::CUShort)


peekCShort :: Ptr a -> CInt -> IO Int
peekCShort ptr off = do
	v <- peekByteOff ptr (fromIntegral off)
	return (fromIntegral (v::CShort))

pokeCShort :: Ptr a -> CInt -> Int -> IO ()
pokeCShort ptr off v =
	pokeByteOff ptr (fromIntegral off) (fromIntegral v::CShort)

data XRenderColor = XRenderColor { 
      xrc_red :: Int, 
      xrc_green :: Int, 
      xrc_blue :: Int, 
      xrc_alpha :: Int 
    }

instance Storable XRenderColor where
	sizeOf _ = #{size XRenderColor}
	alignment _ = alignment (undefined::CInt)
	peek p = do
		red   <- peekCUShort p #{offset XRenderColor, red}
		blue  <- peekCUShort p #{offset XRenderColor, blue}
		green <- peekCUShort p #{offset XRenderColor, green}
		alpha <- peekCUShort p #{offset XRenderColor, alpha}
		return (XRenderColor red blue green alpha)
	poke p (XRenderColor red blue green alpha) = do
		pokeCUShort p #{offset XRenderColor,red} red
		pokeCUShort p #{offset XRenderColor,blue} blue
		pokeCUShort p #{offset XRenderColor,green} green
		pokeCUShort p #{offset XRenderColor,alpha} alpha

data XGlyphInfo = XGlyphInfo { 
      gi_width :: Int, 
      gi_height :: Int, 
      gi_x :: Int, 
      gi_y :: Int, 
      gi_xOff :: Int, 
      gi_yOff :: Int
    }

instance Storable XGlyphInfo where
	sizeOf _ = #{size XGlyphInfo}
	alignment _ = alignment (undefined::CInt)
	peek p = do
		width  <- peekCUShort p #{offset XGlyphInfo, width}
		height <- peekCUShort p #{offset XGlyphInfo, height}
		x <- peekCShort p #{offset XGlyphInfo, x}
		y <- peekCShort p #{offset XGlyphInfo, y}
		xOff <- peekCShort p #{offset XGlyphInfo, xOff}
		yOff <- peekCShort p #{offset XGlyphInfo, yOff}
		return (XGlyphInfo width height x y xOff yOff)
	poke p (XGlyphInfo width height x y xOff yOff) = do
		pokeCUShort p #{offset XGlyphInfo,width} width
		pokeCUShort p #{offset XGlyphInfo,height} height
		pokeCShort p #{offset XGlyphInfo,x} x
		pokeCShort p #{offset XGlyphInfo,y} y
		pokeCShort p #{offset XGlyphInfo,xOff} xOff
		pokeCShort p #{offset XGlyphInfo,yOff} yOff