{-# 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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m) -> m ()
cairoNewPath = (CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO ()) -> m ()
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
`withCairoT` Ptr (CairoT r (PrimState m)) -> IO ()
forall r s. Ptr (CairoT r s) -> IO ()
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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m) -> m ()
cairoNewSubPath = (CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO ()) -> m ()
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
`withCairoT` Ptr (CairoT r (PrimState m)) -> IO ()
forall r s. Ptr (CairoT r s) -> IO ()
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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m) -> CDouble -> CDouble -> m ()
cairoMoveTo CairoT r (PrimState m)
cr CDouble
x CDouble
y = CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO ()) -> m ()
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
withCairoT CairoT r (PrimState m)
cr \Ptr (CairoT r (PrimState m))
pcr -> Ptr (CairoT r (PrimState m)) -> CDouble -> CDouble -> IO ()
forall r s. Ptr (CairoT r s) -> CDouble -> CDouble -> IO ()
c_cairo_move_to Ptr (CairoT r (PrimState m))
pcr CDouble
x CDouble
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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m) -> CDouble -> CDouble -> m ()
cairoLineTo CairoT r (PrimState m)
cr CDouble
x CDouble
y = CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO ()) -> m ()
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
withCairoT CairoT r (PrimState m)
cr \Ptr (CairoT r (PrimState m))
pcr -> Ptr (CairoT r (PrimState m)) -> CDouble -> CDouble -> IO ()
forall r s. Ptr (CairoT r s) -> CDouble -> CDouble -> IO ()
c_cairo_line_to Ptr (CairoT r (PrimState m))
pcr CDouble
x CDouble
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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m)
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> m ()
cairoCurveTo CairoT r (PrimState m)
cr CDouble
x1 CDouble
y1 CDouble
x2 CDouble
y2 CDouble
x3 CDouble
y3 = CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO ()) -> m ()
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
withCairoT CairoT r (PrimState m)
cr \Ptr (CairoT r (PrimState m))
pcr -> Ptr (CairoT r (PrimState m))
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> IO ()
forall r s.
Ptr (CairoT r s)
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> IO ()
c_cairo_curve_to Ptr (CairoT r (PrimState m))
pcr CDouble
x1 CDouble
y1 CDouble
x2 CDouble
y2 CDouble
x3 CDouble
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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m) -> m ()
cairoClosePath = (CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO ()) -> m ()
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
`withCairoT` Ptr (CairoT r (PrimState m)) -> IO ()
forall r s. Ptr (CairoT r s) -> IO ()
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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m)
-> CDouble -> CDouble -> CDouble -> CDouble -> m ()
cairoRectangle CairoT r (PrimState m)
cr CDouble
x CDouble
y CDouble
w CDouble
h = CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO ()) -> m ()
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
withCairoT CairoT r (PrimState m)
cr \Ptr (CairoT r (PrimState m))
pcr -> Ptr (CairoT r (PrimState m))
-> CDouble -> CDouble -> CDouble -> CDouble -> IO ()
forall r s.
Ptr (CairoT r s)
-> CDouble -> CDouble -> CDouble -> CDouble -> IO ()
c_cairo_rectangle Ptr (CairoT r (PrimState m))
pcr CDouble
x CDouble
y CDouble
w CDouble
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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m)
-> CDouble
-> CDouble
-> CDouble
-> Angle CDouble
-> Angle CDouble
-> m ()
cairoArc CairoT r (PrimState m)
cr CDouble
xc CDouble
yc CDouble
r (Radian CDouble
a1) (Radian CDouble
a2) =
	CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO ()) -> m ()
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
withCairoT CairoT r (PrimState m)
cr \Ptr (CairoT r (PrimState m))
pcr -> Ptr (CairoT r (PrimState m))
-> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()
forall r s.
Ptr (CairoT r s)
-> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()
c_cairo_arc Ptr (CairoT r (PrimState m))
pcr CDouble
xc CDouble
yc CDouble
r CDouble
a1 CDouble
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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m)
-> CDouble
-> CDouble
-> CDouble
-> Angle CDouble
-> Angle CDouble
-> m ()
cairoArcNegative CairoT r (PrimState m)
cr CDouble
xc CDouble
yc CDouble
r (Radian CDouble
a1) (Radian CDouble
a2) =
	CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO ()) -> m ()
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
withCairoT CairoT r (PrimState m)
cr \Ptr (CairoT r (PrimState m))
pcr -> Ptr (CairoT r (PrimState m))
-> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()
forall r s.
Ptr (CairoT r s)
-> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()
c_cairo_arc_negative Ptr (CairoT r (PrimState m))
pcr CDouble
xc CDouble
yc CDouble
r CDouble
a1 CDouble
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 :: forall (m :: * -> *) r.
PrimMonad m =>
CairoT r (PrimState m) -> m CairoExtents
cairoPathExtents = (CairoT r (PrimState m)
 -> (Ptr (CairoT r (PrimState m)) -> IO CairoExtents)
 -> m CairoExtents)
-> (Ptr (CairoT r (PrimState m)) -> IO CairoExtents)
-> CairoT r (PrimState m)
-> m CairoExtents
forall a b c. (a -> b -> c) -> b -> a -> c
flip CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO CairoExtents)
-> m CairoExtents
forall (m :: * -> *) r a.
PrimMonad m =>
CairoT r (PrimState m)
-> (Ptr (CairoT r (PrimState m)) -> IO a) -> m a
withCairoT \Ptr (CairoT r (PrimState m))
pcr -> (Ptr CDouble -> IO CairoExtents) -> IO CairoExtents
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca \Ptr CDouble
x1 -> (Ptr CDouble -> IO CairoExtents) -> IO CairoExtents
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca \Ptr CDouble
y1 -> (Ptr CDouble -> IO CairoExtents) -> IO CairoExtents
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca \Ptr CDouble
x2 -> (Ptr CDouble -> IO CairoExtents) -> IO CairoExtents
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca \Ptr CDouble
y2 -> do
	Ptr (CairoT r (PrimState m))
-> Ptr CDouble
-> Ptr CDouble
-> Ptr CDouble
-> Ptr CDouble
-> IO ()
forall r s.
Ptr (CairoT r s)
-> Ptr CDouble
-> Ptr CDouble
-> Ptr CDouble
-> Ptr CDouble
-> IO ()
c_cairo_path_extents Ptr (CairoT r (PrimState m))
pcr Ptr CDouble
x1 Ptr CDouble
y1 Ptr CDouble
x2 Ptr CDouble
y2
	CDouble -> CDouble -> CDouble -> CDouble -> CairoExtents
CairoExtentsLeftTopRightBottom (CDouble -> CDouble -> CDouble -> CDouble -> CairoExtents)
-> IO CDouble -> IO (CDouble -> CDouble -> CDouble -> CairoExtents)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CDouble -> IO CDouble
forall a. Storable a => Ptr a -> IO a
peek Ptr CDouble
x1 IO (CDouble -> CDouble -> CDouble -> CairoExtents)
-> IO CDouble -> IO (CDouble -> CDouble -> CairoExtents)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CDouble -> IO CDouble
forall a. Storable a => Ptr a -> IO a
peek Ptr CDouble
y1 IO (CDouble -> CDouble -> CairoExtents)
-> IO CDouble -> IO (CDouble -> CairoExtents)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CDouble -> IO CDouble
forall a. Storable a => Ptr a -> IO a
peek Ptr CDouble
x2 IO (CDouble -> CairoExtents) -> IO CDouble -> IO CairoExtents
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CDouble -> IO CDouble
forall a. Storable a => Ptr a -> IO a
peek Ptr CDouble
y2

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