{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc)

The 'GI.Pango.Structs.GlyphString.GlyphString' structure is used to store strings
of glyphs with geometry and visual attribute information.
The storage for the glyph information is owned
by the structure which simplifies memory management.
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.Pango.Structs.GlyphString
    (

-- * Exported types
    GlyphString(..)                         ,
    newZeroGlyphString                      ,
    noGlyphString                           ,


 -- * Methods
-- ** copy #method:copy#

#if ENABLE_OVERLOADING
    GlyphStringCopyMethodInfo               ,
#endif
    glyphStringCopy                         ,


-- ** extents #method:extents#

#if ENABLE_OVERLOADING
    GlyphStringExtentsMethodInfo            ,
#endif
    glyphStringExtents                      ,


-- ** extentsRange #method:extentsRange#

#if ENABLE_OVERLOADING
    GlyphStringExtentsRangeMethodInfo       ,
#endif
    glyphStringExtentsRange                 ,


-- ** free #method:free#

#if ENABLE_OVERLOADING
    GlyphStringFreeMethodInfo               ,
#endif
    glyphStringFree                         ,


-- ** getLogicalWidths #method:getLogicalWidths#

#if ENABLE_OVERLOADING
    GlyphStringGetLogicalWidthsMethodInfo   ,
#endif
    glyphStringGetLogicalWidths             ,


-- ** getWidth #method:getWidth#

#if ENABLE_OVERLOADING
    GlyphStringGetWidthMethodInfo           ,
#endif
    glyphStringGetWidth                     ,


-- ** indexToX #method:indexToX#

#if ENABLE_OVERLOADING
    GlyphStringIndexToXMethodInfo           ,
#endif
    glyphStringIndexToX                     ,


-- ** new #method:new#

    glyphStringNew                          ,


-- ** setSize #method:setSize#

#if ENABLE_OVERLOADING
    GlyphStringSetSizeMethodInfo            ,
#endif
    glyphStringSetSize                      ,


-- ** xToIndex #method:xToIndex#

#if ENABLE_OVERLOADING
    GlyphStringXToIndexMethodInfo           ,
#endif
    glyphStringXToIndex                     ,




 -- * Properties
-- ** logClusters #attr:logClusters#
{- | logical cluster info, indexed by the byte index
               within the text corresponding to the glyph string.
-}
    getGlyphStringLogClusters               ,
#if ENABLE_OVERLOADING
    glyphString_logClusters                 ,
#endif
    setGlyphStringLogClusters               ,


-- ** numGlyphs #attr:numGlyphs#
{- | number of the glyphs in this glyph string.
-}
    getGlyphStringNumGlyphs                 ,
#if ENABLE_OVERLOADING
    glyphString_numGlyphs                   ,
#endif
    setGlyphStringNumGlyphs                 ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP
import qualified GHC.OverloadedLabels as OL

import {-# SOURCE #-} qualified GI.Pango.Objects.Font as Pango.Font
import {-# SOURCE #-} qualified GI.Pango.Structs.Analysis as Pango.Analysis
import {-# SOURCE #-} qualified GI.Pango.Structs.Rectangle as Pango.Rectangle

-- | Memory-managed wrapper type.
newtype GlyphString = GlyphString (ManagedPtr GlyphString)
foreign import ccall "pango_glyph_string_get_type" c_pango_glyph_string_get_type ::
    IO GType

instance BoxedObject GlyphString where
    boxedType _ = c_pango_glyph_string_get_type

-- | Construct a `GlyphString` struct initialized to zero.
newZeroGlyphString :: MonadIO m => m GlyphString
newZeroGlyphString = liftIO $ callocBoxedBytes 32 >>= wrapBoxed GlyphString

instance tag ~ 'AttrSet => Constructible GlyphString tag where
    new _ attrs = do
        o <- newZeroGlyphString
        GI.Attributes.set o attrs
        return o


-- | A convenience alias for `Nothing` :: `Maybe` `GlyphString`.
noGlyphString :: Maybe GlyphString
noGlyphString = Nothing

{- |
Get the value of the “@num_glyphs@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' glyphString #numGlyphs
@
-}
getGlyphStringNumGlyphs :: MonadIO m => GlyphString -> m Int32
getGlyphStringNumGlyphs s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO Int32
    return val

{- |
Set the value of the “@num_glyphs@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' glyphString [ #numGlyphs 'Data.GI.Base.Attributes.:=' value ]
@
-}
setGlyphStringNumGlyphs :: MonadIO m => GlyphString -> Int32 -> m ()
setGlyphStringNumGlyphs s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 0) (val :: Int32)

#if ENABLE_OVERLOADING
data GlyphStringNumGlyphsFieldInfo
instance AttrInfo GlyphStringNumGlyphsFieldInfo where
    type AttrAllowedOps GlyphStringNumGlyphsFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint GlyphStringNumGlyphsFieldInfo = (~) Int32
    type AttrBaseTypeConstraint GlyphStringNumGlyphsFieldInfo = (~) GlyphString
    type AttrGetType GlyphStringNumGlyphsFieldInfo = Int32
    type AttrLabel GlyphStringNumGlyphsFieldInfo = "num_glyphs"
    type AttrOrigin GlyphStringNumGlyphsFieldInfo = GlyphString
    attrGet _ = getGlyphStringNumGlyphs
    attrSet _ = setGlyphStringNumGlyphs
    attrConstruct = undefined
    attrClear _ = undefined

glyphString_numGlyphs :: AttrLabelProxy "numGlyphs"
glyphString_numGlyphs = AttrLabelProxy

#endif


-- XXX Skipped attribute for "GlyphString:glyphs" :: Not implemented: "Don't know how to unpack C array of type TCArray False (-1) 0 (TInterface (Name {namespace = \"Pango\", name = \"GlyphInfo\"}))"
{- |
Get the value of the “@log_clusters@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.get' glyphString #logClusters
@
-}
getGlyphStringLogClusters :: MonadIO m => GlyphString -> m Int32
getGlyphStringLogClusters s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 16) :: IO Int32
    return val

{- |
Set the value of the “@log_clusters@” field.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Attributes.set' glyphString [ #logClusters 'Data.GI.Base.Attributes.:=' value ]
@
-}
setGlyphStringLogClusters :: MonadIO m => GlyphString -> Int32 -> m ()
setGlyphStringLogClusters s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 16) (val :: Int32)

#if ENABLE_OVERLOADING
data GlyphStringLogClustersFieldInfo
instance AttrInfo GlyphStringLogClustersFieldInfo where
    type AttrAllowedOps GlyphStringLogClustersFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint GlyphStringLogClustersFieldInfo = (~) Int32
    type AttrBaseTypeConstraint GlyphStringLogClustersFieldInfo = (~) GlyphString
    type AttrGetType GlyphStringLogClustersFieldInfo = Int32
    type AttrLabel GlyphStringLogClustersFieldInfo = "log_clusters"
    type AttrOrigin GlyphStringLogClustersFieldInfo = GlyphString
    attrGet _ = getGlyphStringLogClusters
    attrSet _ = setGlyphStringLogClusters
    attrConstruct = undefined
    attrClear _ = undefined

glyphString_logClusters :: AttrLabelProxy "logClusters"
glyphString_logClusters = AttrLabelProxy

#endif



#if ENABLE_OVERLOADING
instance O.HasAttributeList GlyphString
type instance O.AttributeList GlyphString = GlyphStringAttributeList
type GlyphStringAttributeList = ('[ '("numGlyphs", GlyphStringNumGlyphsFieldInfo), '("logClusters", GlyphStringLogClustersFieldInfo)] :: [(Symbol, *)])
#endif

-- method GlyphString::new
-- method type : Constructor
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Pango", name = "GlyphString"}))
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_new" pango_glyph_string_new ::
    IO (Ptr GlyphString)

{- |
Create a new 'GI.Pango.Structs.GlyphString.GlyphString'.
-}
glyphStringNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m GlyphString
    {- ^ __Returns:__ the newly allocated 'GI.Pango.Structs.GlyphString.GlyphString', which
              should be freed with 'GI.Pango.Structs.GlyphString.glyphStringFree'. -}
glyphStringNew  = liftIO $ do
    result <- pango_glyph_string_new
    checkUnexpectedReturnNULL "glyphStringNew" result
    result' <- (wrapBoxed GlyphString) result
    return result'

#if ENABLE_OVERLOADING
#endif

-- method GlyphString::copy
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "string", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString, may be %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Pango", name = "GlyphString"}))
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_copy" pango_glyph_string_copy ::
    Ptr GlyphString ->                      -- string : TInterface (Name {namespace = "Pango", name = "GlyphString"})
    IO (Ptr GlyphString)

{- |
Copy a glyph string and associated storage.
-}
glyphStringCopy ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GlyphString
    {- ^ /@string@/: a 'GI.Pango.Structs.GlyphString.GlyphString', may be 'Nothing' -}
    -> m (Maybe GlyphString)
    {- ^ __Returns:__ the newly allocated 'GI.Pango.Structs.GlyphString.GlyphString',
              which should be freed with 'GI.Pango.Structs.GlyphString.glyphStringFree',
              or 'Nothing' if /@string@/ was 'Nothing'. -}
glyphStringCopy string = liftIO $ do
    string' <- unsafeManagedPtrGetPtr string
    result <- pango_glyph_string_copy string'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (wrapBoxed GlyphString) result'
        return result''
    touchManagedPtr string
    return maybeResult

#if ENABLE_OVERLOADING
data GlyphStringCopyMethodInfo
instance (signature ~ (m (Maybe GlyphString)), MonadIO m) => O.MethodInfo GlyphStringCopyMethodInfo GlyphString signature where
    overloadedMethod _ = glyphStringCopy

#endif

-- method GlyphString::extents
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "font", argType = TInterface (Name {namespace = "Pango", name = "Font"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoFont", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "ink_rect", argType = TInterface (Name {namespace = "Pango", name = "Rectangle"}), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "rectangle used to store the extents of the glyph string\n           as drawn or %NULL to indicate that the result is not needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing},Arg {argCName = "logical_rect", argType = TInterface (Name {namespace = "Pango", name = "Rectangle"}), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "rectangle used to store the logical extents of the\n           glyph string or %NULL to indicate that the result is not needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_extents" pango_glyph_string_extents ::
    Ptr GlyphString ->                      -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"})
    Ptr Pango.Font.Font ->                  -- font : TInterface (Name {namespace = "Pango", name = "Font"})
    Ptr Pango.Rectangle.Rectangle ->        -- ink_rect : TInterface (Name {namespace = "Pango", name = "Rectangle"})
    Ptr Pango.Rectangle.Rectangle ->        -- logical_rect : TInterface (Name {namespace = "Pango", name = "Rectangle"})
    IO ()

{- |
Compute the logical and ink extents of a glyph string. See the documentation
for 'GI.Pango.Objects.Font.fontGetGlyphExtents' for details about the interpretation
of the rectangles.
-}
glyphStringExtents ::
    (B.CallStack.HasCallStack, MonadIO m, Pango.Font.IsFont a) =>
    GlyphString
    {- ^ /@glyphs@/: a 'GI.Pango.Structs.GlyphString.GlyphString' -}
    -> a
    {- ^ /@font@/: a 'GI.Pango.Objects.Font.Font' -}
    -> m ((Pango.Rectangle.Rectangle, Pango.Rectangle.Rectangle))
glyphStringExtents glyphs font = liftIO $ do
    glyphs' <- unsafeManagedPtrGetPtr glyphs
    font' <- unsafeManagedPtrCastPtr font
    inkRect <- callocBytes 16 :: IO (Ptr Pango.Rectangle.Rectangle)
    logicalRect <- callocBytes 16 :: IO (Ptr Pango.Rectangle.Rectangle)
    pango_glyph_string_extents glyphs' font' inkRect logicalRect
    inkRect' <- (wrapPtr Pango.Rectangle.Rectangle) inkRect
    logicalRect' <- (wrapPtr Pango.Rectangle.Rectangle) logicalRect
    touchManagedPtr glyphs
    touchManagedPtr font
    return (inkRect', logicalRect')

#if ENABLE_OVERLOADING
data GlyphStringExtentsMethodInfo
instance (signature ~ (a -> m ((Pango.Rectangle.Rectangle, Pango.Rectangle.Rectangle))), MonadIO m, Pango.Font.IsFont a) => O.MethodInfo GlyphStringExtentsMethodInfo GlyphString signature where
    overloadedMethod _ = glyphStringExtents

#endif

-- method GlyphString::extents_range
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "start", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "start index", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "end", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "end index (the range is the set of bytes with\n\t      indices such that start <= index < end)", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "font", argType = TInterface (Name {namespace = "Pango", name = "Font"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoFont", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "ink_rect", argType = TInterface (Name {namespace = "Pango", name = "Rectangle"}), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "rectangle used to\n           store the extents of the glyph string range as drawn or\n           %NULL to indicate that the result is not needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing},Arg {argCName = "logical_rect", argType = TInterface (Name {namespace = "Pango", name = "Rectangle"}), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "rectangle used to\n           store the logical extents of the glyph string range or\n           %NULL to indicate that the result is not needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_extents_range" pango_glyph_string_extents_range ::
    Ptr GlyphString ->                      -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"})
    Int32 ->                                -- start : TBasicType TInt
    Int32 ->                                -- end : TBasicType TInt
    Ptr Pango.Font.Font ->                  -- font : TInterface (Name {namespace = "Pango", name = "Font"})
    Ptr Pango.Rectangle.Rectangle ->        -- ink_rect : TInterface (Name {namespace = "Pango", name = "Rectangle"})
    Ptr Pango.Rectangle.Rectangle ->        -- logical_rect : TInterface (Name {namespace = "Pango", name = "Rectangle"})
    IO ()

{- |
Computes the extents of a sub-portion of a glyph string. The extents are
relative to the start of the glyph string range (the origin of their
coordinate system is at the start of the range, not at the start of the entire
glyph string).
-}
glyphStringExtentsRange ::
    (B.CallStack.HasCallStack, MonadIO m, Pango.Font.IsFont a) =>
    GlyphString
    {- ^ /@glyphs@/: a 'GI.Pango.Structs.GlyphString.GlyphString' -}
    -> Int32
    {- ^ /@start@/: start index -}
    -> Int32
    {- ^ /@end@/: end index (the range is the set of bytes with
	      indices such that start \<= index \< end) -}
    -> a
    {- ^ /@font@/: a 'GI.Pango.Objects.Font.Font' -}
    -> m ((Pango.Rectangle.Rectangle, Pango.Rectangle.Rectangle))
glyphStringExtentsRange glyphs start end font = liftIO $ do
    glyphs' <- unsafeManagedPtrGetPtr glyphs
    font' <- unsafeManagedPtrCastPtr font
    inkRect <- callocBytes 16 :: IO (Ptr Pango.Rectangle.Rectangle)
    logicalRect <- callocBytes 16 :: IO (Ptr Pango.Rectangle.Rectangle)
    pango_glyph_string_extents_range glyphs' start end font' inkRect logicalRect
    inkRect' <- (wrapPtr Pango.Rectangle.Rectangle) inkRect
    logicalRect' <- (wrapPtr Pango.Rectangle.Rectangle) logicalRect
    touchManagedPtr glyphs
    touchManagedPtr font
    return (inkRect', logicalRect')

#if ENABLE_OVERLOADING
data GlyphStringExtentsRangeMethodInfo
instance (signature ~ (Int32 -> Int32 -> a -> m ((Pango.Rectangle.Rectangle, Pango.Rectangle.Rectangle))), MonadIO m, Pango.Font.IsFont a) => O.MethodInfo GlyphStringExtentsRangeMethodInfo GlyphString signature where
    overloadedMethod _ = glyphStringExtentsRange

#endif

-- method GlyphString::free
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "string", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString, may be %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_free" pango_glyph_string_free ::
    Ptr GlyphString ->                      -- string : TInterface (Name {namespace = "Pango", name = "GlyphString"})
    IO ()

{- |
Free a glyph string and associated storage.
-}
glyphStringFree ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GlyphString
    {- ^ /@string@/: a 'GI.Pango.Structs.GlyphString.GlyphString', may be 'Nothing' -}
    -> m ()
glyphStringFree string = liftIO $ do
    string' <- unsafeManagedPtrGetPtr string
    pango_glyph_string_free string'
    touchManagedPtr string
    return ()

#if ENABLE_OVERLOADING
data GlyphStringFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo GlyphStringFreeMethodInfo GlyphString signature where
    overloadedMethod _ = glyphStringFree

#endif

-- method GlyphString::get_logical_widths
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "text", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the text corresponding to the glyphs", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "length", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the length of @text, in bytes", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "embedding_level", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the embedding level of the string", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "logical_widths", argType = TCArray False (-1) (-1) (TBasicType TInt), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an array whose length is the number of\n                 characters in text (equal to g_utf8_strlen (text,\n                 length) unless text has NUL bytes) to be filled in\n                 with the resulting character widths.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_get_logical_widths" pango_glyph_string_get_logical_widths ::
    Ptr GlyphString ->                      -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"})
    CString ->                              -- text : TBasicType TUTF8
    Int32 ->                                -- length : TBasicType TInt
    Int32 ->                                -- embedding_level : TBasicType TInt
    Ptr Int32 ->                            -- logical_widths : TCArray False (-1) (-1) (TBasicType TInt)
    IO ()

{- |
Given a 'GI.Pango.Structs.GlyphString.GlyphString' resulting from 'GI.Pango.Functions.shape' and the corresponding
text, determine the screen width corresponding to each character. When
multiple characters compose a single cluster, the width of the entire
cluster is divided equally among the characters.

See also 'GI.Pango.Structs.GlyphItem.glyphItemGetLogicalWidths'.
-}
glyphStringGetLogicalWidths ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GlyphString
    {- ^ /@glyphs@/: a 'GI.Pango.Structs.GlyphString.GlyphString' -}
    -> T.Text
    {- ^ /@text@/: the text corresponding to the glyphs -}
    -> Int32
    {- ^ /@length@/: the length of /@text@/, in bytes -}
    -> Int32
    {- ^ /@embeddingLevel@/: the embedding level of the string -}
    -> [Int32]
    {- ^ /@logicalWidths@/: an array whose length is the number of
                 characters in text (equal to g_utf8_strlen (text,
                 length) unless text has NUL bytes) to be filled in
                 with the resulting character widths. -}
    -> m ()
glyphStringGetLogicalWidths glyphs text length_ embeddingLevel logicalWidths = liftIO $ do
    glyphs' <- unsafeManagedPtrGetPtr glyphs
    text' <- textToCString text
    logicalWidths' <- packStorableArray logicalWidths
    pango_glyph_string_get_logical_widths glyphs' text' length_ embeddingLevel logicalWidths'
    touchManagedPtr glyphs
    freeMem text'
    freeMem logicalWidths'
    return ()

#if ENABLE_OVERLOADING
data GlyphStringGetLogicalWidthsMethodInfo
instance (signature ~ (T.Text -> Int32 -> Int32 -> [Int32] -> m ()), MonadIO m) => O.MethodInfo GlyphStringGetLogicalWidthsMethodInfo GlyphString signature where
    overloadedMethod _ = glyphStringGetLogicalWidths

#endif

-- method GlyphString::get_width
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_get_width" pango_glyph_string_get_width ::
    Ptr GlyphString ->                      -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"})
    IO Int32

{- |
Computes the logical width of the glyph string as can also be computed
using 'GI.Pango.Structs.GlyphString.glyphStringExtents'.  However, since this only computes the
width, it\'s much faster.  This is in fact only a convenience function that
computes the sum of geometry.width for each glyph in the /@glyphs@/.

/Since: 1.14/
-}
glyphStringGetWidth ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GlyphString
    {- ^ /@glyphs@/: a 'GI.Pango.Structs.GlyphString.GlyphString' -}
    -> m Int32
    {- ^ __Returns:__ the logical width of the glyph string. -}
glyphStringGetWidth glyphs = liftIO $ do
    glyphs' <- unsafeManagedPtrGetPtr glyphs
    result <- pango_glyph_string_get_width glyphs'
    touchManagedPtr glyphs
    return result

#if ENABLE_OVERLOADING
data GlyphStringGetWidthMethodInfo
instance (signature ~ (m Int32), MonadIO m) => O.MethodInfo GlyphStringGetWidthMethodInfo GlyphString signature where
    overloadedMethod _ = glyphStringGetWidth

#endif

-- method GlyphString::index_to_x
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the glyphs return from pango_shape()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "text", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the text for the run", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "length", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the number of bytes (not characters) in @text.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "analysis", argType = TInterface (Name {namespace = "Pango", name = "Analysis"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the analysis information return from pango_itemize()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "index_", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the byte index within @text", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "trailing", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "whether we should compute the result for the beginning (%FALSE)\n            or end (%TRUE) of the character.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "x_pos", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store result", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_index_to_x" pango_glyph_string_index_to_x ::
    Ptr GlyphString ->                      -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"})
    CString ->                              -- text : TBasicType TUTF8
    Int32 ->                                -- length : TBasicType TInt
    Ptr Pango.Analysis.Analysis ->          -- analysis : TInterface (Name {namespace = "Pango", name = "Analysis"})
    Int32 ->                                -- index_ : TBasicType TInt
    CInt ->                                 -- trailing : TBasicType TBoolean
    Ptr Int32 ->                            -- x_pos : TBasicType TInt
    IO ()

{- |
Converts from character position to x position. (X position
is measured from the left edge of the run). Character positions
are computed by dividing up each cluster into equal portions.
-}
glyphStringIndexToX ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GlyphString
    {- ^ /@glyphs@/: the glyphs return from 'GI.Pango.Functions.shape' -}
    -> T.Text
    {- ^ /@text@/: the text for the run -}
    -> Int32
    {- ^ /@length@/: the number of bytes (not characters) in /@text@/. -}
    -> Pango.Analysis.Analysis
    {- ^ /@analysis@/: the analysis information return from 'GI.Pango.Functions.itemize' -}
    -> Int32
    {- ^ /@index_@/: the byte index within /@text@/ -}
    -> Bool
    {- ^ /@trailing@/: whether we should compute the result for the beginning ('False')
            or end ('True') of the character. -}
    -> m (Int32)
glyphStringIndexToX glyphs text length_ analysis index_ trailing = liftIO $ do
    glyphs' <- unsafeManagedPtrGetPtr glyphs
    text' <- textToCString text
    analysis' <- unsafeManagedPtrGetPtr analysis
    let trailing' = (fromIntegral . fromEnum) trailing
    xPos <- allocMem :: IO (Ptr Int32)
    pango_glyph_string_index_to_x glyphs' text' length_ analysis' index_ trailing' xPos
    xPos' <- peek xPos
    touchManagedPtr glyphs
    touchManagedPtr analysis
    freeMem text'
    freeMem xPos
    return xPos'

#if ENABLE_OVERLOADING
data GlyphStringIndexToXMethodInfo
instance (signature ~ (T.Text -> Int32 -> Pango.Analysis.Analysis -> Int32 -> Bool -> m (Int32)), MonadIO m) => O.MethodInfo GlyphStringIndexToXMethodInfo GlyphString signature where
    overloadedMethod _ = glyphStringIndexToX

#endif

-- method GlyphString::set_size
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "string", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoGlyphString.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "new_len", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the new length of the string.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_set_size" pango_glyph_string_set_size ::
    Ptr GlyphString ->                      -- string : TInterface (Name {namespace = "Pango", name = "GlyphString"})
    Int32 ->                                -- new_len : TBasicType TInt
    IO ()

{- |
Resize a glyph string to the given length.
-}
glyphStringSetSize ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GlyphString
    {- ^ /@string@/: a 'GI.Pango.Structs.GlyphString.GlyphString'. -}
    -> Int32
    {- ^ /@newLen@/: the new length of the string. -}
    -> m ()
glyphStringSetSize string newLen = liftIO $ do
    string' <- unsafeManagedPtrGetPtr string
    pango_glyph_string_set_size string' newLen
    touchManagedPtr string
    return ()

#if ENABLE_OVERLOADING
data GlyphStringSetSizeMethodInfo
instance (signature ~ (Int32 -> m ()), MonadIO m) => O.MethodInfo GlyphStringSetSizeMethodInfo GlyphString signature where
    overloadedMethod _ = glyphStringSetSize

#endif

-- method GlyphString::x_to_index
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "glyphs", argType = TInterface (Name {namespace = "Pango", name = "GlyphString"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the glyphs returned from pango_shape()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "text", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the text for the run", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "length", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the number of bytes (not characters) in text.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "analysis", argType = TInterface (Name {namespace = "Pango", name = "Analysis"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the analysis information return from pango_itemize()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "x_pos", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the x offset (in Pango units)", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "index_", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store calculated byte index within @text", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "trailing", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store a boolean indicating\n            whether the user clicked on the leading or trailing\n            edge of the character.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "pango_glyph_string_x_to_index" pango_glyph_string_x_to_index ::
    Ptr GlyphString ->                      -- glyphs : TInterface (Name {namespace = "Pango", name = "GlyphString"})
    CString ->                              -- text : TBasicType TUTF8
    Int32 ->                                -- length : TBasicType TInt
    Ptr Pango.Analysis.Analysis ->          -- analysis : TInterface (Name {namespace = "Pango", name = "Analysis"})
    Int32 ->                                -- x_pos : TBasicType TInt
    Ptr Int32 ->                            -- index_ : TBasicType TInt
    Ptr Int32 ->                            -- trailing : TBasicType TInt
    IO ()

{- |
Convert from x offset to character position. Character positions
are computed by dividing up each cluster into equal portions.
In scripts where positioning within a cluster is not allowed
(such as Thai), the returned value may not be a valid cursor
position; the caller must combine the result with the logical
attributes for the text to compute the valid cursor position.
-}
glyphStringXToIndex ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GlyphString
    {- ^ /@glyphs@/: the glyphs returned from 'GI.Pango.Functions.shape' -}
    -> T.Text
    {- ^ /@text@/: the text for the run -}
    -> Int32
    {- ^ /@length@/: the number of bytes (not characters) in text. -}
    -> Pango.Analysis.Analysis
    {- ^ /@analysis@/: the analysis information return from 'GI.Pango.Functions.itemize' -}
    -> Int32
    {- ^ /@xPos@/: the x offset (in Pango units) -}
    -> m ((Int32, Int32))
glyphStringXToIndex glyphs text length_ analysis xPos = liftIO $ do
    glyphs' <- unsafeManagedPtrGetPtr glyphs
    text' <- textToCString text
    analysis' <- unsafeManagedPtrGetPtr analysis
    index_ <- allocMem :: IO (Ptr Int32)
    trailing <- allocMem :: IO (Ptr Int32)
    pango_glyph_string_x_to_index glyphs' text' length_ analysis' xPos index_ trailing
    index_' <- peek index_
    trailing' <- peek trailing
    touchManagedPtr glyphs
    touchManagedPtr analysis
    freeMem text'
    freeMem index_
    freeMem trailing
    return (index_', trailing')

#if ENABLE_OVERLOADING
data GlyphStringXToIndexMethodInfo
instance (signature ~ (T.Text -> Int32 -> Pango.Analysis.Analysis -> Int32 -> m ((Int32, Int32))), MonadIO m) => O.MethodInfo GlyphStringXToIndexMethodInfo GlyphString signature where
    overloadedMethod _ = glyphStringXToIndex

#endif

#if ENABLE_OVERLOADING
type family ResolveGlyphStringMethod (t :: Symbol) (o :: *) :: * where
    ResolveGlyphStringMethod "copy" o = GlyphStringCopyMethodInfo
    ResolveGlyphStringMethod "extents" o = GlyphStringExtentsMethodInfo
    ResolveGlyphStringMethod "extentsRange" o = GlyphStringExtentsRangeMethodInfo
    ResolveGlyphStringMethod "free" o = GlyphStringFreeMethodInfo
    ResolveGlyphStringMethod "indexToX" o = GlyphStringIndexToXMethodInfo
    ResolveGlyphStringMethod "xToIndex" o = GlyphStringXToIndexMethodInfo
    ResolveGlyphStringMethod "getLogicalWidths" o = GlyphStringGetLogicalWidthsMethodInfo
    ResolveGlyphStringMethod "getWidth" o = GlyphStringGetWidthMethodInfo
    ResolveGlyphStringMethod "setSize" o = GlyphStringSetSizeMethodInfo
    ResolveGlyphStringMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveGlyphStringMethod t GlyphString, O.MethodInfo info GlyphString p) => OL.IsLabel t (GlyphString -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

#endif