packages feed

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

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

module Graphics.Cairo.Drawing.CairoPatternT.Setting where

import Foreign.Ptr
import Foreign.ForeignPtr
import Control.Monad.Primitive
import Data.Word
import Graphics.Cairo.Drawing.CairoPatternT.Basic
import Graphics.Cairo.Utilities.CairoMatrixT.Internal

#include <cairo.h>

class CairoPatternSetting s where
	cairoPatternSet :: (PrimMonad m, IsCairoPatternT pt) => pt (PrimState m) -> s -> m ()
	cairoPatternGet :: (PrimMonad m, IsCairoPatternT pt) => pt (PrimState m) -> m s

newtype CairoExtendT = CairoExtendT #{type cairo_extend_t} deriving Show

pattern CairoExtendNone :: CairoExtendT
pattern CairoExtendNone <- CairoExtendT #{const CAIRO_EXTEND_NONE} where
	CairoExtendNone = CairoExtendT #{const CAIRO_EXTEND_NONE}

pattern CairoExtendRepeat :: CairoExtendT
pattern CairoExtendRepeat <- CairoExtendT #{const CAIRO_EXTEND_REPEAT} where
	CairoExtendRepeat = CairoExtendT #{const CAIRO_EXTEND_REPEAT}

pattern CairoExtendReflect :: CairoExtendT
pattern CairoExtendReflect <- CairoExtendT #{const CAIRO_EXTEND_REFLECT} where
	CairoExtendReflect = CairoExtendT #{const CAIRO_EXTEND_REFLECT}

pattern CairoExtendPad :: CairoExtendT
pattern CairoExtendPad <- CairoExtendT #{const CAIRO_EXTEND_PAD} where
	CairoExtendPad = CairoExtendT #{const CAIRO_EXTEND_PAD}

instance CairoPatternSetting CairoExtendT where
	cairoPatternSet = cairoPatternSetExtend
	cairoPatternGet = cairoPatternGetExtend

cairoPatternSetExtend :: (PrimMonad m, IsCairoPatternT pt) => pt (PrimState m) -> CairoExtendT -> m ()
cairoPatternSetExtend (toCairoPatternT -> CairoPatternT fpt) (CairoExtendT ex) =
	unsafeIOToPrim $ withForeignPtr fpt \ppt -> c_cairo_pattern_set_extend ppt ex

foreign import ccall "cairo_pattern_set_extend" c_cairo_pattern_set_extend ::
	Ptr (CairoPatternT s) -> #{type cairo_extend_t} -> IO ()

cairoPatternGetExtend :: (PrimMonad m, IsCairoPatternT pt) => pt (PrimState m) -> m CairoExtendT
cairoPatternGetExtend (toCairoPatternT -> CairoPatternT fpt) =
	unsafeIOToPrim $ CairoExtendT <$> withForeignPtr fpt c_cairo_pattern_get_extend

foreign import ccall "cairo_pattern_get_extend" c_cairo_pattern_get_extend ::
	Ptr (CairoPatternT s) -> IO #{type cairo_extend_t}

newtype CairoFilterT = CairoFilterT #{type cairo_filter_t} deriving Show

pattern CairoFilterFast :: CairoFilterT
pattern CairoFilterFast <- CairoFilterT #{const CAIRO_FILTER_FAST} where
	CairoFilterFast = CairoFilterT #{const CAIRO_FILTER_FAST}

pattern CairoFilterGood :: CairoFilterT
pattern CairoFilterGood <- CairoFilterT #{const CAIRO_FILTER_GOOD} where
	CairoFilterGood = CairoFilterT #{const CAIRO_FILTER_GOOD}

pattern CairoFilterBest :: CairoFilterT
pattern CairoFilterBest <- CairoFilterT #{const CAIRO_FILTER_BEST} where
	CairoFilterBest = CairoFilterT #{const CAIRO_FILTER_BEST}

pattern CairoFilterNearest :: CairoFilterT
pattern CairoFilterNearest <- CairoFilterT #{const CAIRO_FILTER_NEAREST} where
	CairoFilterNearest = CairoFilterT #{const CAIRO_FILTER_NEAREST}

pattern CairoFilterBilinear :: CairoFilterT
pattern CairoFilterBilinear <- CairoFilterT #{const CAIRO_FILTER_BILINEAR} where
	CairoFilterBilinear = CairoFilterT #{const CAIRO_FILTER_BILINEAR}

pattern CairoFilterGaussian :: CairoFilterT
pattern CairoFilterGaussian <- CairoFilterT #{const CAIRO_FILTER_GAUSSIAN} where
	CairoFilterGaussian = CairoFilterT #{const CAIRO_FILTER_GAUSSIAN}

instance CairoPatternSetting CairoFilterT where
	cairoPatternSet = cairoPatternSetFilter
	cairoPatternGet = cairoPatternGetFilter

cairoPatternSetFilter :: (PrimMonad m, IsCairoPatternT pt) =>
	pt (PrimState m) -> CairoFilterT -> m ()
cairoPatternSetFilter (toCairoPatternT -> CairoPatternT fpt) (CairoFilterT flt) =
	unsafeIOToPrim $ withForeignPtr fpt \ppt -> c_cairo_pattern_set_filter ppt flt

foreign import ccall "cairo_pattern_set_filter" c_cairo_pattern_set_filter ::
	Ptr (CairoPatternT s) -> #{type cairo_filter_t} -> IO ()

cairoPatternGetFilter :: (PrimMonad m, IsCairoPatternT pt) =>
	pt (PrimState m) -> m CairoFilterT
cairoPatternGetFilter (toCairoPatternT -> CairoPatternT fpt) =
	unsafeIOToPrim $ CairoFilterT <$> withForeignPtr fpt c_cairo_pattern_get_filter

foreign import ccall "cairo_pattern_get_filter" c_cairo_pattern_get_filter ::
	Ptr (CairoPatternT s) -> IO #{type cairo_filter_t}

cairoPatternSetMatrix :: (PrimMonad m, IsCairoPatternT pt, IsCairoMatrixT mtx) =>
	pt (PrimState m) -> mtx (PrimState m) -> m ()
cairoPatternSetMatrix (toCairoPatternT -> CairoPatternT fpt) (toCairoMatrixT -> CairoMatrixT fmtx) =
	unsafeIOToPrim $ withForeignPtr fpt \ppt -> withForeignPtr fmtx \pmtx ->
		c_cairo_pattern_set_matrix ppt pmtx

foreign import ccall "cairo_pattern_set_matrix" c_cairo_pattern_set_matrix ::
	Ptr (CairoPatternT s) -> Ptr (CairoMatrixT s) -> IO ()

cairoPatternGetMatrix :: (PrimMonad m, IsCairoPatternT pt) =>
	pt (PrimState m) -> m (CairoMatrixT (PrimState m))
cairoPatternGetMatrix (toCairoPatternT -> CairoPatternT fpt) = (CairoMatrixT <$>)
	$ cairoMatrixAlloc \pmtx -> withForeignPtr fpt \ppt ->
		c_cairo_pattern_get_matrix ppt pmtx

foreign import ccall "cairo_pattern_get_matrix" c_cairo_pattern_get_matrix ::
	Ptr (CairoPatternT s) -> Ptr (CairoMatrixT s) -> IO ()