packages feed

simple-cairo-0.1.0.5: src/Graphics/Cairo/Surfaces/CairoSurfaceT/Internal.hsc

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

module Graphics.Cairo.Surfaces.CairoSurfaceT.Internal where

import Foreign.Ptr
import Foreign.ForeignPtr hiding (newForeignPtr)
import Foreign.Concurrent
import Control.Monad.Primitive
import Control.Concurrent.STM
import Data.Word
import System.IO.Unsafe

import Graphics.Cairo.Surfaces.CairoSurfaceTypeT

import Graphics.Cairo.Template

#include <cairo.h>

class IsCairoSurfaceT sr where
	toCairoSurfaceT :: sr s ps -> CairoSurfaceT s ps
	cairoSurfaceTFinishChecker :: sr s ps -> STM (TChan ())

	cairoSurfaceTFinishChecker _ = newTChan >>= \c -> c <$ writeTChan c ()

instance IsCairoSurfaceT CairoSurfaceT where toCairoSurfaceT = id

newtype CairoSurfaceT s ps = CairoSurfaceT (ForeignPtr (CairoSurfaceT s ps)) deriving Show

mkCairoSurfaceT :: Ptr (CairoSurfaceT s ps) -> IO (CairoSurfaceT s ps)
mkCairoSurfaceT p = CairoSurfaceT <$> newForeignPtr p (c_cairo_surface_destroy p)

foreign import ccall "cairo_surface_destroy" c_cairo_surface_destroy ::
	Ptr (CairoSurfaceT s ps) -> IO ()

foreign import ccall "cairo_surface_finish" c_cairo_surface_finish ::
	Ptr (CairoSurfaceT s ps) -> IO ()

cairoSurfaceFlush :: (IsCairoSurfaceT sr, PrimMonad m) => sr s (PrimState m) -> m ()
cairoSurfaceFlush (toCairoSurfaceT -> CairoSurfaceT fsr) = unsafeIOToPrim
	$ withForeignPtr fsr c_cairo_surface_flush

foreign import ccall "cairo_surface_flush" c_cairo_surface_flush ::
	Ptr (CairoSurfaceT s ps) -> IO ()

cairoSurfaceGetType :: IsCairoSurfaceT sr => sr s ps -> CairoSurfaceTypeT
cairoSurfaceGetType (toCairoSurfaceT -> CairoSurfaceT fsr) = unsafePerformIO
	$ CairoSurfaceTypeT <$> withForeignPtr fsr c_cairo_surface_get_type

foreign import ccall "cairo_surface_get_type" c_cairo_surface_get_type ::
	Ptr (CairoSurfaceT s ps) -> IO #{type cairo_surface_type_t}

cairoSurfaceGetContent :: IsCairoSurfaceT sr => sr s ps -> CairoContentT
cairoSurfaceGetContent (toCairoSurfaceT -> CairoSurfaceT fsr) = unsafePerformIO
	$ CairoContentT <$> withForeignPtr fsr c_cairo_surface_get_content

foreign import ccall "cairo_surface_get_content" c_cairo_surface_get_content ::
	Ptr (CairoSurfaceT s ps) -> IO #{type cairo_content_t}

newtype CairoContentT = CairoContentT #{type cairo_content_t} deriving Show

mkMemberGen ''CairoContentT 'CairoContentT "CairoContentColor" #{const CAIRO_CONTENT_COLOR}
mkMemberGen ''CairoContentT 'CairoContentT "CairoContentAlpha" #{const CAIRO_CONTENT_ALPHA}
mkMemberGen ''CairoContentT 'CairoContentT "CairoContentColorAlpha" #{const CAIRO_CONTENT_COLOR_ALPHA}