{-# LINE 1 "src/KB/Text/Shape/FFI/API/Direct.hsc" #-}
module KB.Text.Shape.FFI.API.Direct where

import Prelude hiding (id, error)

import Foreign
import Foreign.C

import KB.Text.Shape.FFI.Allocator (Allocator)
import KB.Text.Shape.FFI.Handles
import KB.Text.Shape.FFI.Enums
import KB.Text.Shape.FFI.Structs



-- | @kbts_shape_error kbts_ShapeDirect(kbts_shape_config *Config, kbts_glyph_storage *Storage, kbts_direction RunDirection, kbts_allocator_function *Allocator, void *AllocatorData, kbts_glyph_iterator *Output);@
foreign import ccall safe "kbts_ShapeDirect" kbts_ShapeDirect
  :: ShapeConfig
  -> Ptr GlyphStorage
  -> Direction
  -> FunPtr Allocator
  -> Ptr ()
  -> Ptr GlyphIterator
  -> IO ShapeError

-- | @kbts_shape_error kbts_ShapeDirectFixedMemory(kbts_shape_config *Config, kbts_glyph_storage *Storage, kbts_direction RunDirection, void *Memory, int MemorySize, kbts_glyph_iterator *Output);@
foreign import ccall unsafe "kbts_ShapeDirectFixedMemory" kbts_ShapeDirectFixedMemory
  :: ShapeConfig
  -> Ptr GlyphStorage
  -> Direction -- ^ RunDirection
  -> Ptr () -- ^ Memory
  -> CInt -- ^ MemorySize
  -> IO ShapeError

-- A font holds all data that corresponds to a given font file.


{-# LINE 37 "src/KB/Text/Shape/FFI/API/Direct.hsc" #-}
-- | @kbts_font kbts_FontFromFile(const char *FileName, int FontIndex, kbts_allocator_function *Allocator, void *AllocatorData, void **FileData, int *FileSize);@
foreign import ccall safe "hs_FontFromFile" hs_FontFromFile
  :: Ptr CChar -- ^ FileName
  -> CInt -- ^ FontIndex
  -> FunPtr Allocator
  -> Ptr () -- ^ AllocatorData
  -> Ptr (Ptr ()) -- ^ FileData
  -> Ptr CInt -- ^ FileSize
  -> Ptr Font
  -> IO LoadFontError

{-# LINE 48 "src/KB/Text/Shape/FFI/API/Direct.hsc" #-}

-- | @int kbts_FontCount(void *FileData, int FileSize);@
foreign import ccall unsafe "kbts_FontCount" kbts_FontCount
  :: Ptr () -- ^ FileData
  -> CInt -- ^ FileSize
  -> CInt

-- | @kbts_font kbts_FontFromMemory(void *FileData, int FileSize, int FontIndex, kbts_allocator_function *Allocator, void *AllocatorData);@
foreign import ccall safe "hs_FontFromMemory" hs_FontFromMemory
  :: Ptr () -- ^ FileData
  -> CInt -- ^ FileSize
  -> CInt -- ^ FontIndex
  -> FunPtr Allocator
  -> Ptr () -- ^ AllocatorData
  -> Font
  -> IO LoadFontError

-- | @void kbts_FreeFont(kbts_font *Font);@
foreign import ccall safe "kbts_FreeFont" kbts_FreeFont
  :: Font
  -> IO ()

-- | @int kbts_FontIsValid(kbts_font *Font);@
foreign import ccall unsafe "kbts_FontIsValid" kbts_FontIsValid
  :: Font
  -> CInt

-- | Opaque token for @kbts_load_font_state@
data LoadFontState = LoadFontState -- XXX: neither a struct, nor a handle
{-
  void *FontData;
  kbts_u32 FontDataSize;

  kbts_blob_table Tables[KBTS_BLOB_TABLE_ID_COUNT];
  kbts_u32 LookupCount;
  kbts_u32 LookupSubtableCount;
  kbts_u32 GlyphCount;
  kbts_u32 ScratchSize;

  kbts_u32 GlyphLookupMatrixSizeInBytes;
  kbts_u32 GlyphLookupSubtableMatrixSizeInBytes;
  kbts_u32 TotalSize;
-}
  deriving (Int -> LoadFontState -> ShowS
[LoadFontState] -> ShowS
LoadFontState -> String
(Int -> LoadFontState -> ShowS)
-> (LoadFontState -> String)
-> ([LoadFontState] -> ShowS)
-> Show LoadFontState
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LoadFontState -> ShowS
showsPrec :: Int -> LoadFontState -> ShowS
$cshow :: LoadFontState -> String
show :: LoadFontState -> String
$cshowList :: [LoadFontState] -> ShowS
showList :: [LoadFontState] -> ShowS
Show)

instance Storable LoadFontState where
  alignment :: LoadFontState -> Int
alignment ~LoadFontState
_ = Int
8
{-# LINE 95 "src/KB/Text/Shape/FFI/API/Direct.hsc" #-}
  sizeOf ~_ = (144)
{-# LINE 96 "src/KB/Text/Shape/FFI/API/Direct.hsc" #-}
  peek _ptr = pure LoadFontState
  poke :: Ptr LoadFontState -> LoadFontState -> IO ()
poke Ptr LoadFontState
ptr LoadFontState{} = Ptr LoadFontState -> Word8 -> Int -> IO ()
forall a. Ptr a -> Word8 -> Int -> IO ()
fillBytes Ptr LoadFontState
ptr Word8
0x00 ((Int
144))
{-# LINE 98 "src/KB/Text/Shape/FFI/API/Direct.hsc" #-}

-- | @kbts_load_font_error kbts_LoadFont(kbts_font *Font, kbts_load_font_state *State, void *FontData, int FontDataSize, int FontIndex, int *ScratchSize_, int *OutputSize_);@
foreign import ccall unsafe "kbts_LoadFont" kbts_LoadFont
  :: Font
  -> Ptr LoadFontState
  -> Ptr () -- ^ FontData
  -> CInt -- ^ FontDataSize
  -> CInt -- ^ FontIndex
  -> Ptr Int -- ^ ScratchSize_
  -> Ptr Int -- ^ OutputSize_
  -> IO LoadFontError

-- | @kbts_load_font_error kbts_PlaceBlob(kbts_font *Font, kbts_load_font_state *State, void *ScratchMemory, void *OutputMemory);@
foreign import ccall unsafe "kbts_PlaceBlob" kbts_PlaceBlob
  :: Font
  -> Ptr LoadFontState
  -> Ptr () -- ^ ScratchMemory
  -> Ptr () -- ^ OutputMemory
  -> IO LoadFontError

-- | @void kbts_GetFontInfo(kbts_font *Font, kbts_font_info *Info);@
foreign import ccall unsafe "kbts_GetFontInfo" kbts_GetFontInfo
  :: Font
  -> Ptr FontInfo
  -> IO ()

-- A shape_config is a bag of pre-computed data for a specific shaping setup.

-- | @int kbts_SizeOfShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language);@
foreign import ccall unsafe "kbts_SizeOfShapeConfig" kbts_SizeOfShapeConfig
  :: Font
  -> Script
  -> Language
  -> CInt

-- | @kbts_shape_config *kbts_PlaceShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language, void *Memory);@
foreign import ccall unsafe "kbts_PlaceShapeConfig" kbts_PlaceShapeConfig
  :: Font
  -> Script
  -> Language
  -> Ptr () -- ^ Memory
  -> IO ShapeConfig

-- | @kbts_shape_config *kbts_CreateShapeConfig(kbts_font *Font, kbts_script Script, kbts_language Language, kbts_allocator_function *Allocator, void *AllocatorData);@
foreign import ccall unsafe "kbts_CreateShapeConfig" kbts_CreateShapeConfig
  :: Font
  -> Script
  -> Language
  -> FunPtr Allocator
  -> Ptr ()
  -> IO ShapeConfig

-- | @void kbts_DestroyShapeConfig(kbts_shape_config *Config);@
foreign import ccall unsafe "kbts_DestroyShapeConfig" kbts_DestroyShapeConfig
  :: ShapeConfig
  -> IO ()

-- A glyph_storage holds and recycles glyph data.

-- | @int kbts_InitializeGlyphStorage(kbts_glyph_storage *Storage, kbts_allocator_function *Allocator, void *AllocatorData)@
foreign import ccall unsafe "kbts_InitializeGlyphStorage" kbts_InitializeGlyphStorage
  :: Ptr GlyphStorage
  -> FunPtr Allocator
  -> Ptr () -- ^ AllocatorData
  -> IO Int

-- | @int kbts_InitializeGlyphStorageFixedMemory(kbts_glyph_storage *Storage, void *Memory, int MemorySize);@
foreign import ccall unsafe "kbts_InitializeGlyphStorageFixedMemory" kbts_InitializeGlyphStorageFixedMemory
  :: Ptr GlyphStorage
  -> Ptr () -- ^ Memory
  -> CInt -- ^ MemorySize
  -> IO Int

-- | @kbts_glyph *kbts_PushGlyph(kbts_glyph_storage *Storage, kbts_font *Font, int Codepoint, kbts_glyph_config *Config, int UserId);@
foreign import ccall unsafe "kbts_PushGlyph" kbts_PushGlyph
  :: Ptr GlyphStorage
  -> Font
  -> CInt -- ^ Codepoint
  -> GlyphConfig
  -> CInt
  -> IO (Ptr Glyph)

-- | @void kbts_ClearActiveGlyphs(kbts_glyph_storage *Storage);@
foreign import ccall unsafe "kbts_ClearActiveGlyphs" kbts_ClearActiveGlyphs
  :: Ptr GlyphStorage
  -> IO ()

-- | @void kbts_FreeAllGlyphs(kbts_glyph_storage *Storage);@
foreign import ccall unsafe "kbts_FreeAllGlyphs" kbts_FreeAllGlyphs
  :: Ptr GlyphStorage
  -> IO ()

-- | Wrapped @kbts_glyph kbts_CodepointToGlyph(kbts_font *Font, int Codepoint, kbts_glyph_config *Config, int UserId);@
--
-- The original returns struct by value.
foreign import ccall unsafe "hs_CodepointToGlyph" hs_CodepointToGlyph
  :: Font
  -> CInt -- ^ Codepoint
  -> GlyphConfig
  -> CInt -- ^ UserId
  -> Ptr Glyph
  -> IO ()

-- | @int kbts_CodepointToGlyphId(kbts_font *Font, int Codepoint);@
foreign import ccall unsafe "kbts_CodepointToGlyphId" kbts_CodepointToGlyphId
  :: Font
  -> CInt -- ^ Codepoint
  -> IO Int

-- | Wrapped @kbts_glyph_iterator kbts_ActiveGlyphIterator(kbts_glyph_storage *Storage);@
--
-- The original returns struct by value.
foreign import ccall unsafe "hs_ActiveGlyphIterator" hs_ActiveGlyphIterator
  :: Ptr GlyphStorage
  -> Ptr GlyphIterator
  -> IO ()

-- A glyph_config specifies glyph-specific shaping parameters.
--
-- A single glyph_config can be shared by multiple glyphs.

-- | @int kbts_SizeOfGlyphConfig(kbts_feature_override *Overrides, int OverrideCount);@
foreign import ccall unsafe "kbts_SizeOfGlyphConfig" kbts_SizeOfGlyphConfig
  :: Ptr FeatureOverride
  -> CInt -- ^ OverrideCount
  -> CInt

-- | @kbts_glyph_config *kbts_PlaceGlyphConfig(kbts_feature_override *Overrides, int OverrideCount, void *Memory);@
foreign import ccall unsafe "kbts_PlaceGlyphConfig" kbts_PlaceGlyphConfig
  :: Ptr FeatureOverride
  -> CInt -- ^ OverriderCount
  -> Ptr () -- ^ Memory
  -> IO GlyphConfig

-- | @kbts_glyph_config *kbts_CreateGlyphConfig(kbts_feature_override *Overrides, int OverrideCount, kbts_allocator_function *Allocator, void *AllocatorData);@
foreign import ccall safe "kbts_CreateGlyphConfig" kbts_CreateGlyphConfig
  :: Ptr FeatureOverride
  -> CInt -- ^ OverrideCount
  -> FunPtr Allocator
  -> Ptr () -- ^ AllocatorData
  -> IO GlyphConfig

-- | @void kbts_DestroyGlyphConfig(kbts_glyph_config *Config);@
foreign import ccall unsafe "kbts_DestroyGlyphConfig" kbts_DestroyGlyphConfig
  :: GlyphConfig
  -> IO ()