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

import Prelude hiding (id, error)

import Foreign
import Foreign.C

import KB.Text.Shape.FFI.Enums
import KB.Text.Shape.FFI.Flags
import KB.Text.Shape.FFI.Handles
import KB.Text.Shape.FFI.Structs



{- $doc
This is a quick guess that stops at the first glyph that has a strong script/direction associated to it.

It is convenient, but only works if you are sure your input text is mono-script and mono-direction.
-}

-- | @void kbts_GuessTextProperties(void *Text, int TextSizeInBytes, kbts_text_format Format, kbts_direction *Direction, kbts_script *Script);@
foreign import ccall "kbts_GuessTextProperties" kbts_GuessTextProperties
  :: Ptr () -- ^ Text
  -> CInt -- ^ TextSizeInBytes
  -> TextFormat
  -> Ptr Direction
  -> Ptr Script
  -> IO ()

-- | @void kbts_GuessTextPropertiesUtf32(const int *Utf32, int Utf32Count, kbts_direction *Direction, kbts_script *Script);@
foreign import ccall "kbts_GuessTextPropertiesUtf32" kbts_GuessTextPropertiesUtf32
  :: Ptr CInt
  -> CInt -- ^ Utf32Count
  -> Ptr Direction
  -> Ptr Script
  -> IO ()

-- | @void kbts_GuessTextPropertiesUtf8(const char *Utf8, int Utf8Length, kbts_direction *Direction, kbts_script *Script);@
foreign import ccall "kbts_GuessTextPropertiesUtf8" kbts_GuessTextPropertiesUtf8
  :: Ptr CChar
  -> CInt -- ^ Utf8Length
  -> Ptr Direction
  -> Ptr Script
  -> IO ()

-- | @void kbts_BreakBegin(kbts_break_state *State, kbts_direction ParagraphDirection, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags);@
foreign import ccall "kbts_BreakBegin" kbts_BreakBegin
  :: BreakState
  -> Direction -- ^ ParagraphDirection
  -> JapaneseLineBreakStyle
  -> BreakConfigFlags
  -> IO ()

-- | @void kbts_BreakAddCodepoint(kbts_break_state *State, int Codepoint, int PositionIncrement, int EndOfText);@
foreign import ccall "kbts_BreakAddCodepoint" kbts_BreakAddCodepoint
  :: BreakState
  -> CInt -- ^ Codepoint
  -> CInt -- ^ PositionIncrement
  -> CInt -- ^ EndOfText
  -> IO ()

-- | @void kbts_BreakEnd(kbts_break_state *State);@
foreign import ccall "kbts_BreakEnd" kbts_BreakEnd
  :: BreakState
  -> IO ()

-- | @int kbts_Break(kbts_break_state *State, kbts_break *Break);@
foreign import ccall "kbts_Break" kbts_Break
  :: BreakState
  -> Ptr Break
  -> IO CInt

-- | @void kbts_BreakEntireString(kbts_direction Direction, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags, const void *Input, int InputSizeInBytes, kbts_text_format InputFormat, kbts_break *Breaks, int BreakCapacity, int *BreakCount, kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount);@
foreign import ccall "kbts_BreakEntireString" kbts_BreakEntireString
  :: Direction
  -> JapaneseLineBreakStyle
  -> BreakConfigFlags
  -> Ptr () -- ^ Input
  -> CInt -- ^ InputSizeInBytes
  -> TextFormat
  -> Ptr Break
  -> CInt -- ^ BreakCapacity
  -> Ptr CInt -- ^ BreakCount
  -> Ptr BreakFlags
  -> CInt -- ^ BreakFlagCapacity
  -> Ptr CInt -- ^ BreakFlagCount
  -> IO ()

-- | @void kbts_BreakEntireStringUtf32(kbts_direction Direction, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags, const int *Utf32, int Utf32Count, kbts_break *Breaks, int BreakCapacity, int *BreakCount, kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount);@
foreign import ccall "kbts_BreakEntireStringUtf32" kbts_BreakEntireStringUtf32
  :: Direction
  -> JapaneseLineBreakStyle
  -> BreakConfigFlags
  -> Ptr () -- ^ Input
  -> CInt -- ^ Utf32Count
  -> Ptr Break
  -> CInt -- ^ BreakCapacity
  -> Ptr CInt -- ^ BreakCount
  -> Ptr BreakFlags
  -> CInt -- ^ BreakFlagCapacity
  -> Ptr CInt -- ^ BreakFlagCount
  -> IO ()

-- | @void kbts_BreakEntireStringUtf8(kbts_direction Direction, kbts_japanese_line_break_style JapaneseLineBreakStyle, kbts_break_config_flags ConfigFlags, const char *Utf8, int Utf8Length, kbts_break *Breaks, int BreakCapacity, int *BreakCount, kbts_break_flags *BreakFlags, int BreakFlagCapacity, int *BreakFlagCount);@
foreign import ccall "kbts_BreakEntireStringUtf8" kbts_BreakEntireStringUtf8
  :: Direction
  -> JapaneseLineBreakStyle
  -> BreakConfigFlags
  -> Ptr () -- ^ Input
  -> CInt -- ^ Utf8Length
  -> IO ()