packages feed

freetype2-0.1.1: Graphics/Rendering/FreeType/Internal/Outline.hsc

{-# LANGUAGE ForeignFunctionInterface #-}
module Graphics.Rendering.FreeType.Internal.Outline
( FT_Outline(..)
, FT_Outline_MoveToFunc
, FT_Outline_LineToFunc
, FT_Outline_ConicToFunc
, FT_Outline_CubicToFunc
, FT_Outline_Funcs(..)
) where

import Foreign hiding (shift)
import Foreign.C.Types
import Foreign.C.String

import Graphics.Rendering.FreeType.Internal.Vector
import Graphics.Rendering.FreeType.Internal.PrimitiveTypes

#include <stddef.h>
#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)

#include "ft2build.h"
#include FT_FREETYPE_H

#include "freetype/ftimage.h"

data FT_Outline = FT_Outline
  { n_contours :: CShort
  , n_points   :: CShort
  , points     :: Ptr FT_Vector
  , tags       :: CString
  , contours   :: Ptr CShort
  , flags      :: FT_OUTLINE_FLAGS
  }

instance Storable FT_Outline where
  sizeOf    _ = #size FT_Outline
  alignment _ = #alignment FT_Outline
  peek ptr = do
    n_contours' <- (#peek FT_Outline, n_contours) ptr
    n_points'   <- (#peek FT_Outline, n_points)   ptr
    points'     <- (#peek FT_Outline, points)     ptr
    tags'       <- (#peek FT_Outline, tags)       ptr
    contours'   <- (#peek FT_Outline, contours)   ptr
    flags'      <- (#peek FT_Outline, flags)      ptr
    return $ FT_Outline
      { n_contours = n_contours'
      , n_points   = n_points'
      , points     = points'
      , tags       = tags'
      , contours   = contours'
      , flags      = flags'
      }
  poke ptr val = do
    (#poke FT_Outline, n_contours) ptr (n_contours val)
    (#poke FT_Outline, n_points)   ptr (n_points   val)
    (#poke FT_Outline, points)     ptr (points     val)
    (#poke FT_Outline, tags)       ptr (tags       val)
    (#poke FT_Outline, contours)   ptr (contours   val)
    (#poke FT_Outline, flags)      ptr (flags      val)

type FT_Outline_MoveToFunc = FunPtr
  (Ptr FT_Vector -> Ptr () -> IO CInt)

type FT_Outline_LineToFunc = FunPtr
  (Ptr FT_Vector -> Ptr () -> IO CInt)

type FT_Outline_ConicToFunc = FunPtr
  (Ptr FT_Vector -> Ptr FT_Vector -> Ptr () -> IO CInt)

type FT_Outline_CubicToFunc = FunPtr
  (Ptr FT_Vector -> Ptr FT_Vector -> Ptr FT_Vector -> Ptr () -> IO CInt)

data FT_Outline_Funcs = FT_Outline_Funcs
  { move_to  :: FT_Outline_MoveToFunc
  , line_to  :: FT_Outline_LineToFunc
  , conic_to :: FT_Outline_ConicToFunc
  , cubic_to :: FT_Outline_CubicToFunc
  , shift    :: CInt
  , delta    :: FT_Pos
  }

instance Storable FT_Outline_Funcs where
  sizeOf    _ = #size FT_Outline_Funcs
  alignment _ = #alignment FT_Outline_Funcs
  peek ptr = do
    move_to'  <- (#peek FT_Outline_Funcs, move_to) ptr
    line_to'  <- (#peek FT_Outline_Funcs, line_to) ptr
    conic_to' <- (#peek FT_Outline_Funcs, conic_to) ptr
    cubic_to' <- (#peek FT_Outline_Funcs, cubic_to) ptr
    shift'    <- (#peek FT_Outline_Funcs, shift) ptr
    delta'    <- (#peek FT_Outline_Funcs, delta) ptr
    return $ FT_Outline_Funcs
      { move_to  = move_to'
      , line_to  = line_to'
      , conic_to = conic_to'
      , cubic_to = cubic_to'
      , shift    = shift'
      , delta    = delta'
      }
  poke ptr val = do
    (#poke FT_Outline_Funcs, move_to) ptr (move_to val)
    (#poke FT_Outline_Funcs, line_to) ptr (line_to val)
    (#poke FT_Outline_Funcs, conic_to) ptr (conic_to val)
    (#poke FT_Outline_Funcs, cubic_to) ptr (cubic_to val)
    (#poke FT_Outline_Funcs, shift) ptr (shift val)
    (#poke FT_Outline_Funcs, delta) ptr (delta val)