{-# LINE 1 "FreeType/Core/Base.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE PatternSynonyms #-}

{- | Please refer to the
     [Core API > Base Interface](https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html)
     chapter of the reference.

     Internal: "FreeType.Core.Base.Internal".
-}

module FreeType.Core.Base
  ( -- ** FT_Library
    FT_Library
    -- ** FT_Face
  , FT_Face
    -- ** FT_Size
  , FT_Size
    -- ** FT_GlyphSlot
  , FT_GlyphSlot
    -- ** FT_CharMap
  , FT_CharMap
    -- ** FT_Encoding
  , FT_Encoding
  , pattern FT_ENCODING_NONE
  , pattern FT_ENCODING_MS_SYMBOL
  , pattern FT_ENCODING_UNICODE
  , pattern FT_ENCODING_SJIS
  , pattern FT_ENCODING_PRC
  , pattern FT_ENCODING_BIG5
  , pattern FT_ENCODING_WANSUNG
  , pattern FT_ENCODING_JOHAB
  , pattern FT_ENCODING_ADOBE_STANDARD
  , pattern FT_ENCODING_ADOBE_EXPERT
  , pattern FT_ENCODING_ADOBE_CUSTOM
  , pattern FT_ENCODING_ADOBE_LATIN_1
  , pattern FT_ENCODING_OLD_LATIN_2
  , pattern FT_ENCODING_APPLE_ROMAN
    -- ** FT_ENC_TAG
    -- | [FT_ENC_TAG](https://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#ft_enc_tag) is the same as [FT_IMAGE_TAG](https://www.freetype.org/freetype2/docs/reference/ft2-basic_types.html#ft_image_tag). See 'FT_MAKE_TAG'
    -- ** FT_FaceRec
  , FT_FaceRec (..)
    -- ** FT_HAS_HORIZONTAL
  , pattern FT_HAS_HORIZONTAL
    -- ** FT_HAS_VERTICAL
  , pattern FT_HAS_VERTICAL
    -- ** FT_HAS_KERNING
  , pattern FT_HAS_KERNING
    -- ** FT_HAS_FIXED_SIZES
  , pattern FT_HAS_FIXED_SIZES
    -- ** FT_HAS_GLYPH_NAMES
  , pattern FT_HAS_GLYPH_NAMES
    -- ** FT_HAS_COLOR
  , pattern FT_HAS_COLOR
    -- ** FT_HAS_MULTIPLE_MASTERS
  , pattern FT_HAS_MULTIPLE_MASTERS
    -- ** FT_IS_SFNT
  , pattern FT_IS_SFNT
    -- ** FT_IS_SCALABLE
  , pattern FT_IS_SCALABLE
    -- ** FT_IS_FIXED_WIDTH
  , pattern FT_IS_FIXED_WIDTH
    -- ** FT_IS_CID_KEYED
  , pattern FT_IS_CID_KEYED
    -- ** FT_IS_TRICKY
  , pattern FT_IS_TRICKY
    -- ** FT_IS_NAMED_INSTANCE
  , pattern FT_IS_NAMED_INSTANCE
    -- ** FT_IS_VARIATION
  , pattern FT_IS_VARIATION
    -- ** FT_SizeRec
  , FT_SizeRec (..)
    -- ** FT_Size_Metrics
  , FT_Size_Metrics (..)
    -- ** FT_GlyphSlotRec
  , FT_GlyphSlotRec (..)
    -- ** FT_Glyph_Metrics
  , FT_Glyph_Metrics (..)
    -- ** FT_SubGlyph
  , FT_SubGlyph
    -- ** FT_Bitmap_Size
  , FT_Bitmap_Size (..)
    -- ** FT_Init_FreeType
  , ft_Init_FreeType
  , ft_With_FreeType
    -- ** FT_Done_FreeType
  , ft_Done_FreeType
    -- ** FT_New_Face
  , ft_New_Face
  , ft_With_Face
    -- ** FT_Done_Face
  , ft_Done_Face
    -- ** FT_Reference_Face
  , ft_Reference_Face
    -- ** FT_New_Memory_Face
  , ft_New_Memory_Face
  , ft_With_Memory_Face
    -- ** FT_Face_Properties
  , ft_Face_Properties
    -- ** FT_Open_Face
  , ft_Open_Face
    -- ** FT_Open_Args
  , FT_Open_Args (..)
    -- ** FT_Parameter
  , FT_Parameter (..)
    -- ** FT_Attach_File
  , ft_Attach_File
    -- ** FT_Attach_Stream
  , ft_Attach_Stream
    -- ** FT_Set_Char_Size
  , ft_Set_Char_Size
    -- ** FT_Set_Pixel_Sizes
  , ft_Set_Pixel_Sizes
    -- ** FT_Request_Size
  , ft_Request_Size
    -- ** FT_Select_Size
  , ft_Select_Size
    -- ** FT_Size_Request_Type
  , FT_Size_Request_Type
  , pattern FT_SIZE_REQUEST_TYPE_NOMINAL
  , pattern FT_SIZE_REQUEST_TYPE_REAL_DIM
  , pattern FT_SIZE_REQUEST_TYPE_BBOX
  , pattern FT_SIZE_REQUEST_TYPE_CELL
  , pattern FT_SIZE_REQUEST_TYPE_SCALES
    -- ** FT_Size_RequestRec
  , FT_Size_RequestRec (..)
    -- ** FT_Size_Request
  , FT_Size_Request
    -- ** FT_Set_Transform
  , ft_Set_Transform
    -- ** FT_Load_Glyph
  , ft_Load_Glyph
    -- ** FT_Get_Char_Index
  , ft_Get_Char_Index
    -- ** FT_Get_First_Char
    -- | Fused into 'ft_Get_Next_Char'.

    -- ** FT_Get_Next_Char
  , ft_Get_Next_Char
    -- ** FT_Get_Name_Index
  , ft_Get_Name_Index
    -- ** FT_Load_Char
  , ft_Load_Char
    -- ** FT_LOAD_TARGET_MODE
  , pattern FT_LOAD_TARGET_MODE
    -- ** FT_Render_Glyph
  , ft_Render_Glyph
    -- ** FT_Render_Mode
  , FT_Render_Mode
  , pattern FT_RENDER_MODE_NORMAL
  , pattern FT_RENDER_MODE_LIGHT
  , pattern FT_RENDER_MODE_MONO
  , pattern FT_RENDER_MODE_LCD
  , pattern FT_RENDER_MODE_LCD_V
    -- ** FT_Get_Kerning
  , ft_Get_Kerning
    -- ** FT_Kerning_Mode
  , FT_Kerning_Mode
  , pattern FT_KERNING_DEFAULT
  , pattern FT_KERNING_UNFITTED
  , pattern FT_KERNING_UNSCALED
    -- ** FT_Get_Track_Kerning
  , ft_Get_Track_Kerning
    -- ** FT_Get_Glyph_Name
  , ft_Get_Glyph_Name
    -- ** FT_Get_Postscript_Name
  , ft_Get_Postscript_Name
    -- ** FT_CharMapRec
  , FT_CharMapRec (..)
    -- ** FT_Select_Charmap
  , ft_Select_Charmap
    -- ** FT_Set_Charmap
  , ft_Set_Charmap
    -- ** FT_Get_Charmap_Index
  , ft_Get_Charmap_Index
    -- ** FT_Get_FSType_Flags
  , ft_Get_FSType_Flags
    -- ** FT_Get_SubGlyph_Info
  , ft_Get_SubGlyph_Info
    -- ** FT_Face_Internal
  , FT_Face_Internal
    -- ** FT_Size_Internal
  , FT_Size_Internal
    -- ** FT_Slot_Internal
  , FT_Slot_Internal
    -- ** FT_FACE_FLAG_XXX
  , pattern FT_FACE_FLAG_SCALABLE
  , pattern FT_FACE_FLAG_FIXED_SIZES
  , pattern FT_FACE_FLAG_FIXED_WIDTH
  , pattern FT_FACE_FLAG_SFNT
  , pattern FT_FACE_FLAG_HORIZONTAL
  , pattern FT_FACE_FLAG_VERTICAL
  , pattern FT_FACE_FLAG_KERNING
  , pattern FT_FACE_FLAG_FAST_GLYPHS
  , pattern FT_FACE_FLAG_MULTIPLE_MASTERS
  , pattern FT_FACE_FLAG_GLYPH_NAMES
  , pattern FT_FACE_FLAG_EXTERNAL_STREAM
  , pattern FT_FACE_FLAG_HINTER
  , pattern FT_FACE_FLAG_CID_KEYED
  , pattern FT_FACE_FLAG_TRICKY
  , pattern FT_FACE_FLAG_COLOR
  , pattern FT_FACE_FLAG_VARIATION
    -- ** FT_STYLE_FLAG_XXX
  , pattern FT_STYLE_FLAG_ITALIC
  , pattern FT_STYLE_FLAG_BOLD
    -- ** FT_OPEN_XXX
  , pattern FT_OPEN_MEMORY
  , pattern FT_OPEN_STREAM
  , pattern FT_OPEN_PATHNAME
  , pattern FT_OPEN_DRIVER
  , pattern FT_OPEN_PARAMS
    -- ** FT_LOAD_XXX
  , pattern FT_LOAD_DEFAULT
  , pattern FT_LOAD_NO_SCALE
  , pattern FT_LOAD_NO_HINTING
  , pattern FT_LOAD_RENDER
  , pattern FT_LOAD_NO_BITMAP
  , pattern FT_LOAD_VERTICAL_LAYOUT
  , pattern FT_LOAD_FORCE_AUTOHINT
  , pattern FT_LOAD_CROP_BITMAP
  , pattern FT_LOAD_PEDANTIC
  , pattern FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
  , pattern FT_LOAD_NO_RECURSE
  , pattern FT_LOAD_IGNORE_TRANSFORM
  , pattern FT_LOAD_MONOCHROME
  , pattern FT_LOAD_LINEAR_DESIGN
  , pattern FT_LOAD_NO_AUTOHINT
  , pattern FT_LOAD_COLOR
  , pattern FT_LOAD_COMPUTE_METRICS
  , pattern FT_LOAD_BITMAP_METRICS_ONLY
    -- ** FT_LOAD_TARGET_XXX
  , pattern FT_LOAD_TARGET_NORMAL
  , pattern FT_LOAD_TARGET_LIGHT
  , pattern FT_LOAD_TARGET_MONO
  , pattern FT_LOAD_TARGET_LCD
  , pattern FT_LOAD_TARGET_LCD_V
    -- ** FT_SUBGLYPH_FLAG_XXX
  , pattern FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS
  , pattern FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES
  , pattern FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID
  , pattern FT_SUBGLYPH_FLAG_SCALE
  , pattern FT_SUBGLYPH_FLAG_XY_SCALE
  , pattern FT_SUBGLYPH_FLAG_2X2
  , pattern FT_SUBGLYPH_FLAG_USE_MY_METRICS
    -- ** FT_FSTYPE_XXX
  , pattern FT_FSTYPE_INSTALLABLE_EMBEDDING
  , pattern FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING
  , pattern FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING
  , pattern FT_FSTYPE_EDITABLE_EMBEDDING
  , pattern FT_FSTYPE_NO_SUBSETTING
  , pattern FT_FSTYPE_BITMAP_EMBEDDING_ONLY
    -- ** FT_HAS_FAST_GLYPHS
    -- | Deprecated: 'FT_HAS_FAST_GLYPHS'.
  ) where

import           FreeType.Core.Base.Internal
import           FreeType.Core.Base.Types
import           FreeType.Core.Types.Types
import           FreeType.Exception.Internal

import           Control.Exception
import           Data.Bits
import           Foreign.C.String
import           Foreign.Marshal
import           Foreign.Ptr
import           Foreign.Storable






pattern FT_HAS_HORIZONTAL :: FT_Face -> IO Bool
pattern FT_HAS_HORIZONTAL <- _
  where
    FT_HAS_HORIZONTAL face = do
      face' <- peek face
      case FT_FACE_FLAG_HORIZONTAL .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_HAS_VERTICAL :: FT_Face -> IO Bool
pattern FT_HAS_VERTICAL <- _
  where
    FT_HAS_VERTICAL face = do
      face' <- peek face
      case FT_FACE_FLAG_VERTICAL .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_HAS_KERNING :: FT_Face -> IO Bool
pattern FT_HAS_KERNING <- _
  where
    FT_HAS_KERNING face = do
      face' <- peek face
      case FT_FACE_FLAG_KERNING .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_HAS_FIXED_SIZES :: FT_Face -> IO Bool
pattern FT_HAS_FIXED_SIZES <- _
  where
    FT_HAS_FIXED_SIZES face = do
      face' <- peek face
      case FT_FACE_FLAG_FIXED_SIZES .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_HAS_GLYPH_NAMES :: FT_Face -> IO Bool
pattern FT_HAS_GLYPH_NAMES <- _
  where
    FT_HAS_GLYPH_NAMES face = do
      face' <- peek face
      case FT_FACE_FLAG_GLYPH_NAMES .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_HAS_COLOR :: FT_Face -> IO Bool
pattern FT_HAS_COLOR <- _
  where
    FT_HAS_COLOR face = do
      face' <- peek face
      case FT_FACE_FLAG_COLOR .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_HAS_MULTIPLE_MASTERS :: FT_Face -> IO Bool
pattern FT_HAS_MULTIPLE_MASTERS <- _
  where
    FT_HAS_MULTIPLE_MASTERS face = do
      face' <- peek face
      case FT_FACE_FLAG_MULTIPLE_MASTERS .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_IS_SFNT :: FT_Face -> IO Bool
pattern FT_IS_SFNT <- _
  where
    FT_IS_SFNT face = do
      face' <- peek face
      case FT_FACE_FLAG_SFNT .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_IS_SCALABLE :: FT_Face -> IO Bool
pattern FT_IS_SCALABLE <- _
  where
    FT_IS_SCALABLE face = do
      face' <- peek face
      case FT_FACE_FLAG_SCALABLE .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_IS_FIXED_WIDTH :: FT_Face -> IO Bool
pattern FT_IS_FIXED_WIDTH <- _
  where
    FT_IS_FIXED_WIDTH face = do
      face' <- peek face
      case FT_FACE_FLAG_FIXED_WIDTH .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_IS_CID_KEYED :: FT_Face -> IO Bool
pattern FT_IS_CID_KEYED <- _
  where
    FT_IS_CID_KEYED face = do
      face' <- peek face
      case FT_FACE_FLAG_CID_KEYED .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_IS_TRICKY :: FT_Face -> IO Bool
pattern FT_IS_TRICKY <- _
  where
    FT_IS_TRICKY face = do
      face' <- peek face
      case FT_FACE_FLAG_TRICKY .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_IS_NAMED_INSTANCE :: FT_Face -> IO Bool
pattern FT_IS_NAMED_INSTANCE <- _
  where
    FT_IS_NAMED_INSTANCE face = do
      face' <- peek face
      case 0x7FFF0000 .&. frFace_flags face' of
        0 -> return False
        _ -> return True



pattern FT_IS_VARIATION :: FT_Face -> IO Bool
pattern FT_IS_VARIATION <- _
  where
    FT_IS_VARIATION face = do
      face' <- peek face
      case FT_FACE_FLAG_VARIATION .&. frFace_flags face' of
        0 -> return False
        _ -> return True



ft_Init_FreeType :: IO FT_Library -- ^ library
ft_Init_FreeType =
  autoAllocaError "ft_Init_FreeType" ft_Init_FreeType'



-- | 'bracket' over 'ft_Init_FreeType' and 'ft_Done_FreeType'.
--
--   The provided 'FT_Library' should not be used after this function terminates.
ft_With_FreeType :: (FT_Library -> IO a) -> IO a
ft_With_FreeType =
  bracket ft_Init_FreeType ft_Done_FreeType


ft_Done_FreeType
  :: FT_Library -- ^ library
  -> IO ()
ft_Done_FreeType =
  autoError "ft_Done_FreeType" ft_Done_FreeType'



ft_New_Face
  :: FT_Library -- ^ library
  -> FilePath   -- ^ filepathname
  -> FT_Long    -- ^ face_index
  -> IO FT_Face -- ^ face
ft_New_Face lib path index =
  withCString path $ \pathPtr ->
    alloca $ \facePtr -> do
      ftError "ft_New_Face" $ ft_New_Face' lib (castPtr pathPtr) index facePtr
      peek facePtr



-- | 'bracket' over 'ft_New_Face' and 'ft_Done_Face'.
--
--   The provided 'FT_Face' should not be used after this function terminates.
ft_With_Face
  :: FT_Library        -- ^ library
  -> FilePath          -- ^ filepathname
  -> FT_Long           -- ^ face_index
  -> (FT_Face -> IO a)
  -> IO a
ft_With_Face lib path index = bracket (ft_New_Face lib path index) ft_Done_Face



ft_Done_Face
  :: FT_Face -- ^ face
  -> IO ()
ft_Done_Face =
  autoError "ft_Done_Face" ft_Done_Face'



ft_Reference_Face
  :: FT_Face -- ^ face
  -> IO ()
ft_Reference_Face =
  autoError "ft_Reference_Face" ft_Reference_Face'



ft_New_Memory_Face
  :: FT_Library  -- ^ library
  -> Ptr FT_Byte -- ^ file_base
  -> FT_Long     -- ^ file_size
  -> FT_Long     -- ^ face_index
  -> IO FT_Face  -- ^ face
ft_New_Memory_Face =
  autoAllocaError "ft_New_Memory_Face" ft_New_Memory_Face'



-- | 'bracket' over 'ft_New_Memory_Face' and 'ft_Done_Face'.
--
--   The provided 'FT_Face' should not be used after this function terminates.
ft_With_Memory_Face
  :: FT_Library        -- ^ library
  -> Ptr FT_Byte       -- ^ file_base
  -> FT_Long           -- ^ file_size
  -> FT_Long           -- ^ face_index
  -> (FT_Face -> IO a)
  -> IO a
ft_With_Memory_Face lib base size index =
  bracket (ft_New_Memory_Face lib base size index) ft_Done_Face



ft_Face_Properties
  :: FT_Face          -- ^ face
  -> FT_UInt          -- ^ num_properties
  -> Ptr FT_Parameter -- ^ properties
  -> IO ()
ft_Face_Properties =
  autoError "ft_Face_Properties" ft_Face_Properties'



ft_Open_Face
  :: FT_Library       -- ^ library
  -> Ptr FT_Open_Args -- ^ args
  -> FT_Long          -- ^ face_index
  -> IO FT_Face       -- ^ face
ft_Open_Face =
  autoAllocaError "ft_Open_Face" ft_Open_Face'



ft_Attach_File
  :: FT_Face  -- ^ face
  -> FilePath -- ^ filepathname
  -> IO ()
ft_Attach_File face path =
  withCString path $
    ftError "ft_Attach_File" . ft_Attach_File' face . castPtr



ft_Attach_Stream
  :: FT_Face          -- ^ face
  -> Ptr FT_Open_Args -- ^ parameters
  -> IO ()
ft_Attach_Stream =
  autoError "ft_Attach_Stream" ft_Attach_Stream'




ft_Set_Char_Size
  :: FT_Face    -- ^ face
  -> FT_F26Dot6 -- ^ char_width
  -> FT_F26Dot6 -- ^ char_height
  -> FT_UInt    -- ^ horz_resolution
  -> FT_UInt    -- ^ vert_resolution
  -> IO ()
ft_Set_Char_Size =
  autoError "ft_Set_Char_Size" ft_Set_Char_Size'



ft_Set_Pixel_Sizes
  :: FT_Face -- ^ face
  -> FT_UInt -- ^ pixel_width
  -> FT_UInt -- ^ pixel_height
  -> IO ()
ft_Set_Pixel_Sizes =
  autoError "ft_Set_Pixel_Sizes" ft_Set_Pixel_Sizes'



ft_Request_Size
  :: FT_Face         -- ^ face
  -> FT_Size_Request -- ^ req
  -> IO ()
ft_Request_Size =
  autoError "ft_Request_Size" ft_Request_Size'



ft_Select_Size
  :: FT_Face -- ^ face
  -> FT_Int  -- ^ strike_index
  -> IO ()
ft_Select_Size =
  autoError "ft_Select_Size" ft_Select_Size'



pattern FT_SIZE_REQUEST_TYPE_NOMINAL
      , FT_SIZE_REQUEST_TYPE_REAL_DIM
      , FT_SIZE_REQUEST_TYPE_BBOX
      , FT_SIZE_REQUEST_TYPE_CELL
      , FT_SIZE_REQUEST_TYPE_SCALES
     :: (Eq a, Num a) => a
pattern FT_SIZE_REQUEST_TYPE_NOMINAL  = 0
{-# LINE 603 "FreeType/Core/Base.hsc" #-}
pattern FT_SIZE_REQUEST_TYPE_REAL_DIM = 1
{-# LINE 604 "FreeType/Core/Base.hsc" #-}
pattern FT_SIZE_REQUEST_TYPE_BBOX     = 2
{-# LINE 605 "FreeType/Core/Base.hsc" #-}
pattern FT_SIZE_REQUEST_TYPE_CELL     = 3
{-# LINE 606 "FreeType/Core/Base.hsc" #-}
pattern FT_SIZE_REQUEST_TYPE_SCALES   = 4
{-# LINE 607 "FreeType/Core/Base.hsc" #-}



ft_Set_Transform
  :: FT_Face         -- ^ face
  -> Maybe FT_Matrix -- ^ matrix
  -> Maybe FT_Vector -- ^ delta
  -> IO ()
ft_Set_Transform face mayMat mayVec =
  let mayAlloca Nothing    = ($ nullPtr)
      mayAlloca (Just val) = with val
  in mayAlloca mayMat $ \matPtr ->
       mayAlloca mayVec $
         ft_Set_Transform' face matPtr



ft_Load_Glyph
  :: FT_Face  -- ^ face
  -> FT_UInt  -- ^ glyph_index
  -> FT_Int32 -- ^ load_flags
  -> IO ()
ft_Load_Glyph =
  autoError "ft_Load_Glyph" $ ft_Load_Glyph'



foreign import ccall "FT_Get_Char_Index"
  ft_Get_Char_Index
    :: FT_Face    -- ^ face
    -> FT_ULong   -- ^ charcode
    -> IO FT_UInt



-- | When @charcode@ is:
--
--     * @Nothing@ — behaves like 'ft_Get_First_Char''
--     * @Just _ @ — behaves like 'ft_Get_Next_Char''
ft_Get_Next_Char
  :: FT_Face                -- ^ face
  -> Maybe FT_ULong         -- ^ charcode
  -> IO (FT_ULong, FT_UInt) -- ^ (charcode, gindex)
ft_Get_Next_Char face Nothing =
  alloca $ \ptr ->
    (,)
      <$> ft_Get_First_Char' face ptr
      <*> peek ptr

ft_Get_Next_Char face (Just code) =
  alloca $ \ptr ->
    (,)
      <$> ft_Get_Next_Char' face code ptr
      <*> peek ptr



foreign import ccall "FT_Get_Name_Index"
  ft_Get_Name_Index
    :: FT_Face       -- ^ face
    -> Ptr FT_String -- ^ glyph_name
    -> IO FT_UInt



ft_Load_Char
  :: FT_Face  -- ^ face
  -> FT_ULong -- ^ char_code
  -> FT_Int32 -- ^ load_flags
  -> IO ()
ft_Load_Char =
  autoError "ft_Load_Char" ft_Load_Char'



pattern FT_LOAD_TARGET_MODE :: FT_Int32 -> FT_Render_Mode
pattern FT_LOAD_TARGET_MODE <- _
  where
    FT_LOAD_TARGET_MODE x = fromIntegral $ (x `shiftR` 16) .&. 15




ft_Render_Glyph
  :: FT_GlyphSlot   -- ^ slot
  -> FT_Render_Mode -- ^ render_mode
  -> IO ()
ft_Render_Glyph =
  autoError "ft_Render_Glyph" ft_Render_Glyph'



pattern FT_RENDER_MODE_NORMAL
      , FT_RENDER_MODE_LIGHT
      , FT_RENDER_MODE_MONO
      , FT_RENDER_MODE_LCD
      , FT_RENDER_MODE_LCD_V
     :: (Eq a, Num a) => a
pattern FT_RENDER_MODE_NORMAL = 0
{-# LINE 706 "FreeType/Core/Base.hsc" #-}
pattern FT_RENDER_MODE_LIGHT  = 1
{-# LINE 707 "FreeType/Core/Base.hsc" #-}
pattern FT_RENDER_MODE_MONO   = 2
{-# LINE 708 "FreeType/Core/Base.hsc" #-}
pattern FT_RENDER_MODE_LCD    = 3
{-# LINE 709 "FreeType/Core/Base.hsc" #-}
pattern FT_RENDER_MODE_LCD_V  = 4
{-# LINE 710 "FreeType/Core/Base.hsc" #-}



ft_Get_Kerning
  :: FT_Face      -- ^ face
  -> FT_UInt      -- ^ left_glyph
  -> FT_UInt      -- ^ right_glyph
  -> FT_UInt      -- ^ kern_mode
  -> IO FT_Vector -- ^ kerning
ft_Get_Kerning =
  autoAllocaError "ft_Get_Kerning" ft_Get_Kerning'



pattern FT_KERNING_DEFAULT
      , FT_KERNING_UNFITTED
      , FT_KERNING_UNSCALED
     :: (Eq a, Num a) => a
pattern FT_KERNING_DEFAULT  = 0
{-# LINE 729 "FreeType/Core/Base.hsc" #-}
pattern FT_KERNING_UNFITTED = 1
{-# LINE 730 "FreeType/Core/Base.hsc" #-}
pattern FT_KERNING_UNSCALED = 2
{-# LINE 731 "FreeType/Core/Base.hsc" #-}



ft_Get_Track_Kerning
  :: FT_Face     -- ^ face
  -> FT_Fixed    -- ^ point_size
  -> FT_Int      -- ^ degree
  -> IO FT_Fixed -- ^ kerning
ft_Get_Track_Kerning =
  autoAllocaError "ft_Get_Track_Kerning" ft_Get_Track_Kerning'



ft_Get_Glyph_Name
  :: FT_Face    -- ^ face
  -> FT_UInt    -- ^ glyph_index
  -> FT_UInt    -- ^ buffer_max
  -> IO String  -- ^ buffer
ft_Get_Glyph_Name face index buffer_max =
  allocaArray (fromIntegral buffer_max) $ \buffer -> do
    ftError "ft_Get_Glyph_Name" $ ft_Get_Glyph_Name' face index (castPtr buffer) buffer_max
    peekCString buffer



ft_Get_Postscript_Name
  :: FT_Face   -- ^ face
  -> IO String
ft_Get_Postscript_Name face =
  peekCString . castPtr =<< ft_Get_Postscript_Name' face



ft_Select_Charmap
  :: FT_Face     -- ^ face
  -> FT_Encoding -- ^ encoding
  -> IO ()
ft_Select_Charmap =
  autoError "ft_Select_Charmap" ft_Select_Charmap'



ft_Set_Charmap
  :: FT_Face    -- ^ face
  -> FT_CharMap -- ^ charmap
  -> IO ()
ft_Set_Charmap =
  autoError "ft_Set_Charmap" ft_Set_Charmap'



foreign import ccall "FT_Get_Charmap_Index"
  ft_Get_Charmap_Index
    :: FT_CharMap -- ^ charmap
    -> IO FT_Int



foreign import ccall "FT_Get_FSType_Flags"
  ft_Get_FSType_Flags
    :: FT_Face      -- ^ face
    -> IO FT_UShort



ft_Get_SubGlyph_Info
  :: FT_GlyphSlot -- ^ glyph
  -> FT_UInt      -- ^ sub_index
  -> IO (FT_Int, FT_UInt, FT_Int, FT_Int, FT_Matrix)
        -- ^ (p_index, p_flags, p_arg1, p_arg2, p_transform)
ft_Get_SubGlyph_Info glyph index =
  alloca $ \p_indexPtr ->
    alloca $ \p_flagsPtr ->
      alloca $ \p_arg1Ptr ->
        alloca $ \p_arg2Ptr ->
          alloca $ \p_transformPtr -> do
            ftError "ft_Get_SubGlyph_Info" $ ft_Get_SubGlyph_Info' glyph index p_indexPtr p_flagsPtr p_arg1Ptr p_arg2Ptr p_transformPtr
            (,,,,)
              <$> peek p_indexPtr
              <*> peek p_flagsPtr
              <*> peek p_arg1Ptr
              <*> peek p_arg2Ptr
              <*> peek p_transformPtr



pattern FT_FACE_FLAG_SCALABLE
      , FT_FACE_FLAG_FIXED_SIZES
      , FT_FACE_FLAG_FIXED_WIDTH
      , FT_FACE_FLAG_SFNT
      , FT_FACE_FLAG_HORIZONTAL
      , FT_FACE_FLAG_VERTICAL
      , FT_FACE_FLAG_KERNING
      , FT_FACE_FLAG_FAST_GLYPHS
      , FT_FACE_FLAG_MULTIPLE_MASTERS
      , FT_FACE_FLAG_GLYPH_NAMES
      , FT_FACE_FLAG_EXTERNAL_STREAM
      , FT_FACE_FLAG_HINTER
      , FT_FACE_FLAG_CID_KEYED
      , FT_FACE_FLAG_TRICKY
      , FT_FACE_FLAG_COLOR
      , FT_FACE_FLAG_VARIATION
     :: (Eq a, Num a) => a
pattern FT_FACE_FLAG_SCALABLE         = 1
{-# LINE 835 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_FIXED_SIZES      = 2
{-# LINE 836 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_FIXED_WIDTH      = 4
{-# LINE 837 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_SFNT             = 8
{-# LINE 838 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_HORIZONTAL       = 16
{-# LINE 839 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_VERTICAL         = 32
{-# LINE 840 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_KERNING          = 64
{-# LINE 841 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_FAST_GLYPHS      = 128
{-# LINE 842 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_MULTIPLE_MASTERS = 256
{-# LINE 843 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_GLYPH_NAMES      = 512
{-# LINE 844 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_EXTERNAL_STREAM  = 1024
{-# LINE 845 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_HINTER           = 2048
{-# LINE 846 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_CID_KEYED        = 4096
{-# LINE 847 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_TRICKY           = 8192
{-# LINE 848 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_COLOR            = 16384
{-# LINE 849 "FreeType/Core/Base.hsc" #-}
pattern FT_FACE_FLAG_VARIATION        = 32768
{-# LINE 850 "FreeType/Core/Base.hsc" #-}



pattern FT_STYLE_FLAG_ITALIC
      , FT_STYLE_FLAG_BOLD
     :: (Eq a, Num a) => a
pattern FT_STYLE_FLAG_ITALIC = 1
{-# LINE 857 "FreeType/Core/Base.hsc" #-}
pattern FT_STYLE_FLAG_BOLD   = 2
{-# LINE 858 "FreeType/Core/Base.hsc" #-}



pattern FT_OPEN_MEMORY
      , FT_OPEN_STREAM
      , FT_OPEN_PATHNAME
      , FT_OPEN_DRIVER
      , FT_OPEN_PARAMS
     :: (Eq a, Num a) => a
pattern FT_OPEN_MEMORY   = 1
{-# LINE 868 "FreeType/Core/Base.hsc" #-}
pattern FT_OPEN_STREAM   = 2
{-# LINE 869 "FreeType/Core/Base.hsc" #-}
pattern FT_OPEN_PATHNAME = 4
{-# LINE 870 "FreeType/Core/Base.hsc" #-}
pattern FT_OPEN_DRIVER   = 8
{-# LINE 871 "FreeType/Core/Base.hsc" #-}
pattern FT_OPEN_PARAMS   = 16
{-# LINE 872 "FreeType/Core/Base.hsc" #-}



pattern FT_LOAD_DEFAULT
      , FT_LOAD_NO_SCALE
      , FT_LOAD_NO_HINTING
      , FT_LOAD_RENDER
      , FT_LOAD_NO_BITMAP
      , FT_LOAD_VERTICAL_LAYOUT
      , FT_LOAD_FORCE_AUTOHINT
      , FT_LOAD_CROP_BITMAP
      , FT_LOAD_PEDANTIC
      , FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
      , FT_LOAD_NO_RECURSE
      , FT_LOAD_IGNORE_TRANSFORM
      , FT_LOAD_MONOCHROME
      , FT_LOAD_LINEAR_DESIGN
      , FT_LOAD_NO_AUTOHINT
      , FT_LOAD_COLOR
      , FT_LOAD_COMPUTE_METRICS
      , FT_LOAD_BITMAP_METRICS_ONLY
     :: (Eq a, Num a) => a
pattern FT_LOAD_DEFAULT                     = 0
{-# LINE 895 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_NO_SCALE                    = 1
{-# LINE 896 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_NO_HINTING                  = 2
{-# LINE 897 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_RENDER                      = 4
{-# LINE 898 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_NO_BITMAP                   = 8
{-# LINE 899 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_VERTICAL_LAYOUT             = 16
{-# LINE 900 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_FORCE_AUTOHINT              = 32
{-# LINE 901 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_CROP_BITMAP                 = 64
{-# LINE 902 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_PEDANTIC                    = 128
{-# LINE 903 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH = 512
{-# LINE 904 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_NO_RECURSE                  = 1024
{-# LINE 905 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_IGNORE_TRANSFORM            = 2048
{-# LINE 906 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_MONOCHROME                  = 4096
{-# LINE 907 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_LINEAR_DESIGN               = 8192
{-# LINE 908 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_NO_AUTOHINT                 = 32768
{-# LINE 909 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_COLOR                       = 1048576
{-# LINE 910 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_COMPUTE_METRICS             = 2097152
{-# LINE 911 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_BITMAP_METRICS_ONLY         = 4194304
{-# LINE 912 "FreeType/Core/Base.hsc" #-}



pattern FT_LOAD_TARGET_NORMAL
      , FT_LOAD_TARGET_LIGHT
      , FT_LOAD_TARGET_MONO
      , FT_LOAD_TARGET_LCD
      , FT_LOAD_TARGET_LCD_V
     :: (Eq a, Num a) => a
pattern FT_LOAD_TARGET_NORMAL = 0
{-# LINE 922 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_TARGET_LIGHT  = 65536
{-# LINE 923 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_TARGET_MONO   = 131072
{-# LINE 924 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_TARGET_LCD    = 196608
{-# LINE 925 "FreeType/Core/Base.hsc" #-}
pattern FT_LOAD_TARGET_LCD_V  = 262144
{-# LINE 926 "FreeType/Core/Base.hsc" #-}



pattern FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS
      , FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES
      , FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID
      , FT_SUBGLYPH_FLAG_SCALE
      , FT_SUBGLYPH_FLAG_XY_SCALE
      , FT_SUBGLYPH_FLAG_2X2
      , FT_SUBGLYPH_FLAG_USE_MY_METRICS
     :: (Eq a, Num a) => a
pattern FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS     = 1
{-# LINE 938 "FreeType/Core/Base.hsc" #-}
pattern FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES = 2
{-# LINE 939 "FreeType/Core/Base.hsc" #-}
pattern FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID   = 4
{-# LINE 940 "FreeType/Core/Base.hsc" #-}
pattern FT_SUBGLYPH_FLAG_SCALE              = 8
{-# LINE 941 "FreeType/Core/Base.hsc" #-}
pattern FT_SUBGLYPH_FLAG_XY_SCALE           = 64
{-# LINE 942 "FreeType/Core/Base.hsc" #-}
pattern FT_SUBGLYPH_FLAG_2X2                = 128
{-# LINE 943 "FreeType/Core/Base.hsc" #-}
pattern FT_SUBGLYPH_FLAG_USE_MY_METRICS     = 512
{-# LINE 944 "FreeType/Core/Base.hsc" #-}



pattern FT_FSTYPE_INSTALLABLE_EMBEDDING
      , FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING
      , FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING
      , FT_FSTYPE_EDITABLE_EMBEDDING
      , FT_FSTYPE_NO_SUBSETTING
      , FT_FSTYPE_BITMAP_EMBEDDING_ONLY
     :: (Eq a, Num a) => a
pattern FT_FSTYPE_INSTALLABLE_EMBEDDING        = 0
{-# LINE 955 "FreeType/Core/Base.hsc" #-}
pattern FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING = 2
{-# LINE 956 "FreeType/Core/Base.hsc" #-}
pattern FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING  = 4
{-# LINE 957 "FreeType/Core/Base.hsc" #-}
pattern FT_FSTYPE_EDITABLE_EMBEDDING           = 8
{-# LINE 958 "FreeType/Core/Base.hsc" #-}
pattern FT_FSTYPE_NO_SUBSETTING                = 256
{-# LINE 959 "FreeType/Core/Base.hsc" #-}
pattern FT_FSTYPE_BITMAP_EMBEDDING_ONLY        = 512
{-# LINE 960 "FreeType/Core/Base.hsc" #-}