packages feed

simple-cairo-0.1.0.5: src/Graphics/Cairo/Drawing/Regions.hsc

{-# LANGUAGE BlockArguments #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Graphics.Cairo.Drawing.Regions where

import Foreign.Ptr
import Foreign.ForeignPtr hiding (newForeignPtr)
import Foreign.Concurrent
import Foreign.C.Types
import Control.Monad.Primitive

import Graphics.Cairo.Exception
import Graphics.Cairo.Utilities.Types

#include <cairo.h>

newtype CairoRegionT s = CairoRegionT (ForeignPtr (CairoRegionT s)) deriving Show

makeCairoRegionT :: Ptr (CairoRegionT s) -> IO (CairoRegionT s)
makeCairoRegionT p = CairoRegionT <$> newForeignPtr p (c_cairo_region_destroy p)

foreign import ccall "cairo_region_destroy" c_cairo_region_destroy ::
	Ptr (CairoRegionT s) -> IO ()

foreign import ccall "cairo_region_create" c_cairo_region_create :: IO (Ptr (CairoRegionT s))

cairoRegionCreate :: PrimMonad m => m (CairoRegionT (PrimState m))
cairoRegionCreate = unsafeIOToPrim do
	r <- makeCairoRegionT =<< c_cairo_region_create
	r <$ raiseIfErrorRegion r

foreign import ccall "cairo_region_create_rectangle" c_cairo_region_create_rectangle ::
	Ptr CairoRectangleIntT -> IO (Ptr (CairoRegionT s))

cairoRegionCreateRectangle :: PrimMonad m => CairoRectangleIntT -> m (CairoRegionT (PrimState m))
cairoRegionCreateRectangle (CairoRectangleIntT_ fr) = unsafeIOToPrim $ withForeignPtr fr \prct -> do
	r <- makeCairoRegionT =<< c_cairo_region_create_rectangle prct
	r <$ raiseIfErrorRegion r

cairoRegionNumRectangles :: PrimMonad m => CairoRegionT (PrimState m) -> m CInt
cairoRegionNumRectangles (CairoRegionT frg) =
	unsafeIOToPrim $ withForeignPtr frg c_cairo_region_num_rectangles

foreign import ccall "cairo_region_num_rectangles"
	c_cairo_region_num_rectangles :: Ptr (CairoRegionT s) -> IO CInt

cairoRegionGetRectangle :: PrimMonad m => CairoRegionT (PrimState m) -> CInt ->
	CairoRectangleIntTPrim (PrimState m) -> m ()
cairoRegionGetRectangle rg@(CairoRegionT frg) n (CairoRectangleIntTPrim frc) =
	unsafeIOToPrim
		$ withForeignPtr frg \prg -> withForeignPtr frc \prc -> do
			c_cairo_region_get_rectangle prg n prc
			raiseIfErrorRegion rg

foreign import ccall "cairo_region_get_rectangle"
	c_cairo_region_get_rectangle ::
		Ptr (CairoRegionT s) -> CInt -> Ptr CairoRectangleIntT -> IO ()