packages feed

simple-cairo-0.1.0.5: src/Graphics/Cairo/Drawing/Paths/Basic.hs

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

module Graphics.Cairo.Drawing.Paths.Basic where

import Foreign.Ptr
import Foreign.Marshal
import Foreign.Storable
import Foreign.C.Types
import Control.Monad.Primitive
import Data.Angle
import Data.CairoContext

import Graphics.Cairo.Drawing.Extents

cairoNewPath :: PrimMonad m => CairoT r (PrimState m) -> m ()
cairoNewPath = (`withCairoT` c_cairo_new_path)

foreign import ccall "cairo_new_path" c_cairo_new_path :: Ptr (CairoT r s) -> IO ()

cairoNewSubPath :: PrimMonad m => CairoT r (PrimState m) -> m ()
cairoNewSubPath = (`withCairoT` c_cairo_new_sub_path)

foreign import ccall "cairo_new_sub_path" c_cairo_new_sub_path :: Ptr (CairoT r s) -> IO ()

cairoMoveTo :: PrimMonad m => CairoT r (PrimState m) -> CDouble -> CDouble -> m ()
cairoMoveTo cr x y = withCairoT cr \pcr -> c_cairo_move_to pcr x y

foreign import ccall "cairo_move_to" c_cairo_move_to ::
	Ptr (CairoT r s) -> CDouble -> CDouble -> IO ()

cairoLineTo :: PrimMonad m => CairoT r (PrimState m) -> CDouble -> CDouble -> m ()
cairoLineTo cr x y = withCairoT cr \pcr -> c_cairo_line_to pcr x y

foreign import ccall "cairo_line_to" c_cairo_line_to ::
	Ptr (CairoT r s) -> CDouble -> CDouble -> IO ()

cairoCurveTo :: PrimMonad m => CairoT r (PrimState m) -> CDouble -> CDouble ->
	CDouble -> CDouble -> CDouble -> CDouble -> m ()
cairoCurveTo cr x1 y1 x2 y2 x3 y3 = withCairoT cr \pcr -> c_cairo_curve_to pcr x1 y1 x2 y2 x3 y3

foreign import ccall "cairo_curve_to" c_cairo_curve_to ::
	Ptr (CairoT r s) -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()

cairoClosePath :: PrimMonad m => CairoT r (PrimState m) -> m ()
cairoClosePath = (`withCairoT` c_cairo_close_path)

foreign import ccall "cairo_close_path" c_cairo_close_path ::
	Ptr (CairoT r s) -> IO ()

cairoRectangle :: PrimMonad m => CairoT r (PrimState m) -> CDouble -> CDouble -> CDouble -> CDouble -> m ()
cairoRectangle cr x y w h = withCairoT cr \pcr -> c_cairo_rectangle pcr x y w h

foreign import ccall "cairo_rectangle" c_cairo_rectangle ::
	Ptr (CairoT r s) -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()

cairoArc :: PrimMonad m => CairoT r (PrimState m) -> CDouble -> CDouble ->
	CDouble -> Angle CDouble -> Angle CDouble -> m ()
cairoArc cr xc yc r (Radian a1) (Radian a2) =
	withCairoT cr \pcr -> c_cairo_arc pcr xc yc r a1 a2

foreign import ccall "cairo_arc" c_cairo_arc :: Ptr (CairoT r s) ->
	CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()

cairoArcNegative :: PrimMonad m => CairoT r (PrimState m) -> CDouble -> CDouble ->
	CDouble -> Angle CDouble -> Angle CDouble -> m ()
cairoArcNegative cr xc yc r (Radian a1) (Radian a2) =
	withCairoT cr \pcr -> c_cairo_arc_negative pcr xc yc r a1 a2

foreign import ccall "cairo_arc_negative" c_cairo_arc_negative ::
	Ptr (CairoT r s) -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble ->
	IO ()

cairoPathExtents :: PrimMonad m => CairoT r (PrimState m) -> m CairoExtents
cairoPathExtents = flip withCairoT \pcr -> alloca \x1 -> alloca \y1 -> alloca \x2 -> alloca \y2 -> do
	c_cairo_path_extents pcr x1 y1 x2 y2
	CairoExtentsLeftTopRightBottom <$> peek x1 <*> peek y1 <*> peek x2 <*> peek y2

foreign import ccall "cairo_path_extents" c_cairo_path_extents ::
	Ptr (CairoT r s) -> Ptr CDouble -> Ptr CDouble -> Ptr CDouble -> Ptr CDouble -> IO ()