{-# LINE 1 "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





type FT_Orientation = Word32
{-# LINE 22 "FreeType/Support/Outline/Types.hsc" #-}



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    :: Int32
{-# LINE 31 "FreeType/Support/Outline/Types.hsc" #-}
                          , 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    :: Int32
{-# LINE 75 "FreeType/Support/Outline/Types.hsc" #-}
                           , oftDelta    :: FT_Pos
                           }

instance Storable FT_Outline_Funcs' where
  sizeOf _    = (48)
{-# LINE 80 "FreeType/Support/Outline/Types.hsc" #-}
  alignment _ = 8
{-# LINE 81 "FreeType/Support/Outline/Types.hsc" #-}

  peek ptr =
    FT_Outline_Funcs'
      <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 85 "FreeType/Support/Outline/Types.hsc" #-}
      <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 86 "FreeType/Support/Outline/Types.hsc" #-}
      <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 87 "FreeType/Support/Outline/Types.hsc" #-}
      <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 88 "FreeType/Support/Outline/Types.hsc" #-}
      <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) ptr
{-# LINE 89 "FreeType/Support/Outline/Types.hsc" #-}
      <*> (\hsc_ptr -> peekByteOff hsc_ptr 40) ptr
{-# LINE 90 "FreeType/Support/Outline/Types.hsc" #-}

  poke ptr val = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr $ val & oftMove_to
{-# LINE 93 "FreeType/Support/Outline/Types.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 8) ptr $ val & oftLine_to
{-# LINE 94 "FreeType/Support/Outline/Types.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr $ val & oftConic_to
{-# LINE 95 "FreeType/Support/Outline/Types.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 24) ptr $ val & oftCubic_to
{-# LINE 96 "FreeType/Support/Outline/Types.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 32) ptr $ val & oftShift
{-# LINE 97 "FreeType/Support/Outline/Types.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 40) ptr $ val & oftDelta
{-# LINE 98 "FreeType/Support/Outline/Types.hsc" #-}



type FT_Outline_MoveToFunc = Ptr FT_Vector -- ^ to
                          -> Ptr ()        -- ^ user
                          -> IO Int32
{-# LINE 104 "FreeType/Support/Outline/Types.hsc" #-}

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 Int32
{-# LINE 116 "FreeType/Support/Outline/Types.hsc" #-}

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 Int32
{-# LINE 129 "FreeType/Support/Outline/Types.hsc" #-}

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 Int32
{-# LINE 143 "FreeType/Support/Outline/Types.hsc" #-}

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