packages feed

freetype2-0.2.0: FreeType/Support/Outline/Types.hsc

{-# LANGUAGE ForeignFunctionInterface #-}

module FreeType.Support.Outline.Types
  ( module FreeType.Support.Outline.Types
  , FT_Outline (..)
  ) where

import           FreeType.Circular.Types
import           FreeType.Core.Types.Types

import           Data.Int
import           Data.Function ((&))
import           Data.Word
import           Foreign.Storable
import           Foreign.Ptr

#include "ft2build.h"
#include FT_IMAGE_H
#include FT_OUTLINE_H

type FT_Orientation = #type enum FT_Orientation_



data FT_Outline_Funcs = FT_Outline_Funcs
                          { ofMove_to  :: FT_Outline_MoveToFunc
                          , ofLine_to  :: FT_Outline_LineToFunc
                          , ofConic_to :: FT_Outline_ConicToFunc
                          , ofCubic_to :: FT_Outline_CubicToFunc
                          , ofShift    :: #type int
                          , ofDelta    :: FT_Pos
                          }

instance Storable FT_Outline_Funcs where
  sizeOf _    = sizeOf    (undefined :: FT_Outline_Funcs')
  alignment _ = alignment (undefined :: FT_Outline_Funcs')

  peek ptr = do
    FT_Outline_Funcs' move_to line_to conic_to cubic_to shift delta <- peek $ castPtr ptr
    return $ FT_Outline_Funcs
               { ofMove_to  = ft_Outline_MoveToFunc' move_to
               , ofLine_to  = ft_Outline_LineToFunc' line_to
               , ofConic_to = ft_Outline_ConicToFunc' conic_to
               , ofCubic_to = ft_Outline_CubicToFunc' cubic_to
               , ofShift    = shift
               , ofDelta    = delta
               }

  poke ptr (FT_Outline_Funcs move_to line_to conic_to cubic_to shift delta) = do
    move_toF  <- ft_Outline_MoveToFunc move_to
    line_toF  <- ft_Outline_LineToFunc line_to  
    conic_toF <- ft_Outline_ConicToFunc conic_to
    cubic_toF <- ft_Outline_CubicToFunc cubic_to
    poke (castPtr ptr) $ FT_Outline_Funcs'
                           { oftMove_to  = move_toF
                           , oftLine_to  = line_toF
                           , oftConic_to = conic_toF
                           , oftCubic_to = cubic_toF
                           , oftShift    = shift
                           , oftDelta    = delta
                           }
    freeHaskellFunPtr move_toF
    freeHaskellFunPtr line_toF
    freeHaskellFunPtr conic_toF
    freeHaskellFunPtr cubic_toF



data FT_Outline_Funcs' = FT_Outline_Funcs'
                           { oftMove_to  :: FunPtr FT_Outline_MoveToFunc
                           , oftLine_to  :: FunPtr FT_Outline_LineToFunc
                           , oftConic_to :: FunPtr FT_Outline_ConicToFunc
                           , oftCubic_to :: FunPtr FT_Outline_CubicToFunc
                           , oftShift    :: #type int
                           , oftDelta    :: FT_Pos
                           }

instance Storable FT_Outline_Funcs' where
  sizeOf _    = #size      struct FT_Outline_Funcs_
  alignment _ = #alignment struct FT_Outline_Funcs_

  peek ptr =
    FT_Outline_Funcs'
      <$> #{peek struct FT_Outline_Funcs_, move_to } ptr
      <*> #{peek struct FT_Outline_Funcs_, line_to } ptr
      <*> #{peek struct FT_Outline_Funcs_, conic_to} ptr
      <*> #{peek struct FT_Outline_Funcs_, cubic_to} ptr
      <*> #{peek struct FT_Outline_Funcs_, shift   } ptr
      <*> #{peek struct FT_Outline_Funcs_, delta   } ptr

  poke ptr val = do
    #{poke struct FT_Outline_Funcs_, move_to } ptr $ val & oftMove_to
    #{poke struct FT_Outline_Funcs_, line_to } ptr $ val & oftLine_to
    #{poke struct FT_Outline_Funcs_, conic_to} ptr $ val & oftConic_to
    #{poke struct FT_Outline_Funcs_, cubic_to} ptr $ val & oftCubic_to
    #{poke struct FT_Outline_Funcs_, shift   } ptr $ val & oftShift
    #{poke struct FT_Outline_Funcs_, delta   } ptr $ val & oftDelta



type FT_Outline_MoveToFunc = Ptr FT_Vector -- ^ to
                          -> Ptr ()        -- ^ user
                          -> IO #type int

foreign import ccall "wrapper"
  ft_Outline_MoveToFunc :: FT_Outline_MoveToFunc -> IO (FunPtr FT_Outline_MoveToFunc)

foreign import ccall "dynamic"
  ft_Outline_MoveToFunc' :: FunPtr FT_Outline_MoveToFunc -> FT_Outline_MoveToFunc



type FT_Outline_LineToFunc = Ptr FT_Vector -- ^ to
                          -> Ptr ()        -- ^ user
                          -> IO #type int

foreign import ccall "wrapper"
  ft_Outline_LineToFunc :: FT_Outline_LineToFunc -> IO (FunPtr FT_Outline_LineToFunc)

foreign import ccall "dynamic"
  ft_Outline_LineToFunc' :: FunPtr FT_Outline_LineToFunc -> FT_Outline_LineToFunc



type FT_Outline_ConicToFunc = Ptr FT_Vector -- ^ control
                           -> Ptr FT_Vector -- ^ to
                           -> Ptr ()        -- ^ user
                           -> IO #type int

foreign import ccall "wrapper"
  ft_Outline_ConicToFunc :: FT_Outline_ConicToFunc -> IO (FunPtr FT_Outline_ConicToFunc)

foreign import ccall "dynamic"
  ft_Outline_ConicToFunc' :: FunPtr FT_Outline_ConicToFunc -> FT_Outline_ConicToFunc



type FT_Outline_CubicToFunc = Ptr FT_Vector -- ^ control1
                           -> Ptr FT_Vector -- ^ control2
                           -> Ptr FT_Vector -- ^ to
                           -> Ptr ()        -- ^ user
                           -> IO #type int

foreign import ccall "wrapper"
  ft_Outline_CubicToFunc :: FT_Outline_CubicToFunc -> IO (FunPtr FT_Outline_CubicToFunc)

foreign import ccall "dynamic"
  ft_Outline_CubicToFunc' :: FunPtr FT_Outline_CubicToFunc -> FT_Outline_CubicToFunc