packages feed

simple-pango-0.1.0.1: src/Graphics/Pango/Rendering/Cairo.hsc

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

module Graphics.Pango.Rendering.Cairo (
	-- * CREATE
	pangoCairoCreateContext,
	pangoCairoUpdateContext,
	pangoCairoCreateLayout,
	pangoCairoUpdateLayout,

	-- * SHOW
	pangoCairoShowLayout,
	pangoCairoShowErrorUnderline,
	pangoCairoShowGlyphItem,
	pangoCairoShowLayoutLine,

	-- * PATH
	pangoCairoLayoutLinePath,
	pangoCairoLayoutPath,
	pangoCairoErrorUnderlinePath,

	-- * RESOLUTION
	pangoCairoContextGetResolution,
	pangoCairoContextSetResolution

	) where

import Foreign.Ptr
import Foreign.ForeignPtr hiding (addForeignPtrFinalizer)
import Foreign.Concurrent
import Foreign.Marshal
import Foreign.C
import Foreign.C.String.Misc
import Control.Monad.Primitive
import Data.Maybe
import Data.CairoContext

import Graphics.Pango.Basic.GlyphStorage.Internal
import Graphics.Pango.Basic.LayoutObjects.PangoLayout.Internal
import Graphics.Pango.Basic.LayoutObjects.PangoLayoutLine.Internal
import Graphics.Pango.LowLevel.Contexts.Internal

import qualified Data.Text as T
import qualified Data.Text.Foreign as T

pangoCairoCreateContext :: PrimMonad m => CairoT r (PrimState m) -> m PangoContext
pangoCairoCreateContext (CairoT fcr) = unsafeIOToPrim
	$ withForeignPtr fcr \pcr ->
		mkPangoContext =<< c_pango_cairo_create_context pcr

foreign import ccall "pango_cairo_create_context"
	c_pango_cairo_create_context :: Ptr (CairoT r s) -> IO (Ptr PangoContext)

pangoCairoUpdateContext ::
	PrimMonad m => CairoT r (PrimState m) -> PangoContext -> m ()
pangoCairoUpdateContext (CairoT fcr) (PangoContext fc) = unsafeIOToPrim
	$ withForeignPtr fcr \pcr -> withForeignPtr fc \pc ->
		c_pango_cairo_update_context pcr pc

foreign import ccall "pango_cairo_update_context"
	c_pango_cairo_update_context ::
	Ptr (CairoT r s) -> Ptr PangoContext -> IO ()

pangoCairoCreateLayout ::
	PrimMonad m => CairoT r (PrimState m) -> m (PangoLayoutPrim (PrimState m))
pangoCairoCreateLayout (CairoT fcr) = unsafeIOToPrim
	$ withForeignPtr fcr \pcr ->
		mkPangoLayoutPrim =<< c_pango_cairo_create_layout pcr

foreign import ccall "pango_cairo_create_layout" c_pango_cairo_create_layout ::
	Ptr (CairoT r s) -> IO (Ptr PangoLayout)

pangoCairoUpdateLayout :: PrimMonad m =>
	CairoT r (PrimState m) -> PangoLayoutPrim (PrimState m) -> m ()
pangoCairoUpdateLayout (CairoT fcr) (PangoLayoutPrim fl) = unsafeIOToPrim
	$ withForeignPtr fcr \pcr -> withForeignPtr fl \pl ->
		c_pango_cairo_update_layout pcr pl

foreign import ccall "pango_cairo_update_layout" c_pango_cairo_update_layout ::
	Ptr (CairoT r s) -> Ptr PangoLayout -> IO ()

pangoCairoShowGlyphItem :: CairoTIO r -> T.Text -> PangoGlyphItem -> IO ()
pangoCairoShowGlyphItem (CairoT fcr) t (PangoGlyphItem fgi) =
	withForeignPtr fcr \cr -> T.withCStringLen t \(ct, n) -> do
		cs' <- copyCString ct n
		addForeignPtrFinalizer fcr $ free cs'
		withForeignPtr fgi $ c_pango_cairo_show_glyph_item cr cs'

foreign import ccall "pango_cairo_show_glyph_item"
	c_pango_cairo_show_glyph_item ::
	Ptr (CairoT r s) -> CString -> Ptr PangoGlyphItem -> IO ()

pangoCairoShowLayoutLine :: CairoTIO r -> PangoLayoutLine -> IO ()
pangoCairoShowLayoutLine (CairoT fcr) (PangoLayoutLine fll) =
	withForeignPtr fcr \cr ->
		withForeignPtr fll $ c_pango_cairo_show_layout_line cr

foreign import ccall "pango_cairo_show_layout_line"
	c_pango_cairo_show_layout_line ::
	Ptr (CairoT r s) -> Ptr PangoLayoutLine -> IO ()

pangoCairoShowLayout :: CairoTIO r -> PangoLayout -> IO ()
pangoCairoShowLayout (CairoT fcr) (PangoLayout_ fl) = withForeignPtr fcr \cr ->
	withForeignPtr fl $ c_pango_cairo_show_layout cr

foreign import ccall "pango_cairo_show_layout" c_pango_cairo_show_layout ::
	Ptr (CairoT r s) -> Ptr PangoLayout -> IO ()

pangoCairoShowErrorUnderline ::
	CairoTIO r -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()
pangoCairoShowErrorUnderline (CairoT fcr) x y w h =
	withForeignPtr fcr \cr -> c_pango_cairo_show_error_underline cr x y w h

foreign import ccall "pango_cairo_show_error_underline"
	c_pango_cairo_show_error_underline ::
	Ptr (CairoT r s) -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()

pangoCairoLayoutLinePath :: CairoTIO r -> PangoLayoutLine -> IO ()
pangoCairoLayoutLinePath (CairoT fcr) (PangoLayoutLine fll) =
	withForeignPtr fcr \cr ->
		withForeignPtr fll $ c_pango_cairo_layout_line_path cr

foreign import ccall "pango_cairo_layout_line_path"
	c_pango_cairo_layout_line_path ::
	Ptr (CairoT r s) -> Ptr PangoLayoutLine -> IO ()

pangoCairoLayoutPath :: CairoTIO r -> PangoLayout -> IO ()
pangoCairoLayoutPath (CairoT fcr) (PangoLayout_ fl) = withForeignPtr fcr \cr ->
	withForeignPtr fl $ c_pango_cairo_layout_path cr

foreign import ccall "pango_cairo_layout_path" c_pango_cairo_layout_path ::
	Ptr (CairoT r s) -> Ptr PangoLayout -> IO ()

pangoCairoErrorUnderlinePath ::
	CairoTIO r -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()
pangoCairoErrorUnderlinePath (CairoT fcr) x y w h = withForeignPtr fcr \cr ->
	c_pango_cairo_error_underline_path cr x y w h

foreign import ccall "pango_cairo_error_underline_path"
	c_pango_cairo_error_underline_path ::
	Ptr (CairoT r s) -> CDouble -> CDouble -> CDouble -> CDouble -> IO ()

pangoCairoContextGetResolution :: PangoContext -> IO (Maybe CDouble)
pangoCairoContextGetResolution (PangoContext fctx) = do
	r <- withForeignPtr fctx c_pango_cairo_context_get_resolution
	pure if r < 0 then Nothing else Just r

foreign import ccall "pango_cairo_context_get_resolution"
	c_pango_cairo_context_get_resolution ::
	Ptr PangoContext -> IO CDouble

pangoCairoContextSetResolution :: PangoContext -> Maybe CDouble -> IO ()
pangoCairoContextSetResolution (PangoContext fctx) mr =
	withForeignPtr fctx \pctx -> c_pango_cairo_context_set_resolution pctx
		$ fromMaybe (- 1) mr

foreign import ccall "pango_cairo_context_set_resolution"
	c_pango_cairo_context_set_resolution ::
	Ptr PangoContext -> CDouble -> IO ()