packages feed

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

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

module Graphics.Cairo.Drawing.Transformations where

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

import Data.CairoContext

import Graphics.Cairo.Utilities.CairoMatrixT.Internal

#include <cairo.h>

cairoTranslate :: PrimMonad m =>
	CairoT r (PrimState m) -> CDouble -> CDouble -> m ()
cairoTranslate (CairoT fcr) tx ty =
	unsafeIOToPrim $ withForeignPtr fcr \cr -> c_cairo_translate cr tx ty

foreign import ccall "cairo_translate" c_cairo_translate ::
	Ptr (CairoT r s) -> CDouble -> CDouble -> IO ()

cairoScale :: PrimMonad m =>
	CairoT r (PrimState m) -> CDouble -> CDouble -> m ()
cairoScale (CairoT fcr) sx sy =
	unsafeIOToPrim $ withForeignPtr fcr \cr -> c_cairo_scale cr sx sy

foreign import ccall "cairo_scale" c_cairo_scale ::
	Ptr (CairoT r s) -> CDouble -> CDouble -> IO ()

cairoRotate :: PrimMonad m => CairoT r (PrimState m) -> CDouble -> m ()
cairoRotate (CairoT fcr) a =
	unsafeIOToPrim $ withForeignPtr fcr \cr -> c_cairo_rotate cr a

foreign import ccall "cairo_rotate" c_cairo_rotate ::
	Ptr (CairoT r s) -> CDouble -> IO ()

cairoTransform :: (PrimMonad m, IsCairoMatrixT mtx) =>
	CairoT r (PrimState m) -> mtx (PrimState m) -> m ()
cairoTransform (CairoT fcr) (toCairoMatrixT -> CairoMatrixT fmtx) =
	unsafeIOToPrim $ withForeignPtr fcr \pcr -> withForeignPtr fmtx \pmtx ->
		c_cairo_transform pcr pmtx

foreign import ccall "cairo_transform" c_cairo_transform ::
	Ptr (CairoT r s) -> Ptr (CairoMatrixT s) -> IO ()

cairoSetMatrix :: (PrimMonad m, IsCairoMatrixT mtx) =>
	CairoT r (PrimState m) -> mtx (PrimState m) -> m ()
cairoSetMatrix (CairoT fcr) (toCairoMatrixT -> CairoMatrixT fmtx) =
	unsafeIOToPrim $ withForeignPtr fcr \pcr -> withForeignPtr fmtx \pmtx ->
		c_cairo_set_matrix pcr pmtx

cairoGetMatrix :: PrimMonad m => CairoT r (PrimState m) -> m (CairoMatrixT (PrimState m))
cairoGetMatrix (CairoT fcr) = unsafeIOToPrim
	$ CairoMatrixT <$> withForeignPtr fcr \pcr -> do
		p <- mallocBytes #{size cairo_matrix_t}
		c_cairo_get_matrix pcr p
		newForeignPtr p (free p)

foreign import ccall "cairo_set_matrix" c_cairo_set_matrix ::
	Ptr (CairoT r s) -> Ptr (CairoMatrixT s) -> IO ()

foreign import ccall "cairo_get_matrix" c_cairo_get_matrix ::
	Ptr (CairoT r s) -> Ptr (CairoMatrixT s) -> IO ()

cairoIdentityMatrix :: PrimMonad m => CairoT r (PrimState m) -> m ()
cairoIdentityMatrix (CairoT fcr) =
	unsafeIOToPrim $ withForeignPtr fcr c_cairo_identity_matrix

foreign import ccall "cairo_identity_matrix" c_cairo_identity_matrix :: Ptr (CairoT r s) -> IO ()

cairoUserToDevice :: PrimMonad m =>
	CairoT r (PrimState m) -> CDouble -> CDouble -> m (CDouble, CDouble)
cairoUserToDevice (CairoT fcr) x y =
	unsafeIOToPrim $ withForeignPtr fcr \pcr -> alloca \px -> alloca \py -> do
		zipWithM_ poke [px, py] [x, y]
		c_cairo_user_to_device pcr px py
		(,) <$> peek px <*> peek py

foreign import ccall "cairo_user_to_device" c_cairo_user_to_device ::
	Ptr (CairoT r s) -> Ptr CDouble -> Ptr CDouble -> IO ()

cairoUserToDeviceDistance :: PrimMonad m =>
	CairoT r (PrimState m) -> CDouble -> CDouble -> m (CDouble, CDouble)
cairoUserToDeviceDistance (CairoT fcr) dx dy =
	unsafeIOToPrim $ withForeignPtr fcr \pcr -> alloca \px -> alloca \py -> do
		zipWithM_ poke [px, py] [dx, dy]
		c_cairo_user_to_device_distance pcr px py
		(,) <$> peek px <*> peek py

foreign import ccall "cairo_user_to_device_distance" c_cairo_user_to_device_distance ::
	Ptr (CairoT r s) -> Ptr CDouble -> Ptr CDouble -> IO ()

cairoDeviceToUser :: PrimMonad m =>
	(CairoT r (PrimState m)) -> CDouble -> CDouble -> m (CDouble, CDouble)
cairoDeviceToUser (CairoT fcr) x y =
	unsafeIOToPrim $ withForeignPtr fcr \pcr -> alloca \px -> alloca \py -> do
		zipWithM_ poke [px, py] [x, y]
		c_cairo_device_to_user pcr px py
		(,) <$> peek px <*> peek py

foreign import ccall "cairo_device_to_user" c_cairo_device_to_user ::
	Ptr (CairoT r s) -> Ptr CDouble -> Ptr CDouble -> IO ()

cairoDeviceToUserDistance :: PrimMonad m =>
	(CairoT r (PrimState m)) -> CDouble -> CDouble -> m (CDouble, CDouble)
cairoDeviceToUserDistance (CairoT fcr) dx dy =
	unsafeIOToPrim $ withForeignPtr fcr \pcr -> alloca \px -> alloca \py -> do
		zipWithM_ poke [px, py] [dx, dy]
		c_cairo_device_to_user_distance pcr px py
		(,) <$> peek px <*> peek py

foreign import ccall "cairo_device_to_user_distance" c_cairo_device_to_user_distance ::
	Ptr (CairoT r s) -> Ptr CDouble -> Ptr CDouble -> IO ()