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

    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 \
           (!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.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.Text as T
    import qualified Data.ByteString.Char8 as B
    import qualified Data.Map as Map
    import qualified Foreign.Ptr as FP

    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) => O.IsLabelProxy t (GlyphString -> p) where
        fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveGlyphStringMethod t GlyphString, O.MethodInfo info GlyphString p) => O.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

    #endif