    {- |
    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.Objects.FontFace.FontFace' structure is used to represent a group of fonts with
    the same family, slant, weight, width, but varying sizes.
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Pango.Objects.FontFace
        (

    -- * Exported types
        FontFace(..)                            ,
        IsFontFace                              ,
        toFontFace                              ,
        noFontFace                              ,

     -- * Methods
    -- ** describe #method:describe#

    #if ENABLE_OVERLOADING
        FontFaceDescribeMethodInfo              ,
    #endif
        fontFaceDescribe                        ,

    -- ** getFaceName #method:getFaceName#

    #if ENABLE_OVERLOADING
        FontFaceGetFaceNameMethodInfo           ,
    #endif
        fontFaceGetFaceName                     ,

    -- ** isSynthesized #method:isSynthesized#

    #if ENABLE_OVERLOADING
        FontFaceIsSynthesizedMethodInfo         ,
    #endif
        fontFaceIsSynthesized                   ,

    -- ** listSizes #method:listSizes#

    #if ENABLE_OVERLOADING
        FontFaceListSizesMethodInfo             ,
    #endif
        fontFaceListSizes                       ,

        ) 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 qualified GI.GObject.Objects.Object as GObject.Object
    import {-# SOURCE #-} qualified GI.Pango.Structs.FontDescription as Pango.FontDescription

    -- | Memory-managed wrapper type.
    newtype FontFace = FontFace (ManagedPtr FontFace)
    foreign import ccall "pango_font_face_get_type"
        c_pango_font_face_get_type :: IO GType

    instance GObject FontFace where
        gobjectType _ = c_pango_font_face_get_type

    -- | Type class for types which can be safely cast to `FontFace`, for instance with `toFontFace`.
    class GObject o => IsFontFace o
    #if MIN_VERSION_base(4,9,0)
    instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError FontFace a) =>
        IsFontFace a
    #endif
    instance IsFontFace FontFace
    instance GObject.Object.IsObject FontFace

    -- | Cast to `FontFace`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
    toFontFace :: (MonadIO m, IsFontFace o) => o -> m FontFace
    toFontFace = liftIO . unsafeCastTo FontFace

    -- | A convenience alias for `Nothing` :: `Maybe` `FontFace`.
    noFontFace :: Maybe FontFace
    noFontFace = Nothing

    #if ENABLE_OVERLOADING
    type family ResolveFontFaceMethod (t :: Symbol) (o :: *) :: * where
        ResolveFontFaceMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
        ResolveFontFaceMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
        ResolveFontFaceMethod "describe" o = FontFaceDescribeMethodInfo
        ResolveFontFaceMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
        ResolveFontFaceMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
        ResolveFontFaceMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
        ResolveFontFaceMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
        ResolveFontFaceMethod "isSynthesized" o = FontFaceIsSynthesizedMethodInfo
        ResolveFontFaceMethod "listSizes" o = FontFaceListSizesMethodInfo
        ResolveFontFaceMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
        ResolveFontFaceMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
        ResolveFontFaceMethod "ref" o = GObject.Object.ObjectRefMethodInfo
        ResolveFontFaceMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
        ResolveFontFaceMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
        ResolveFontFaceMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
        ResolveFontFaceMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
        ResolveFontFaceMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
        ResolveFontFaceMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
        ResolveFontFaceMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
        ResolveFontFaceMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
        ResolveFontFaceMethod "getFaceName" o = FontFaceGetFaceNameMethodInfo
        ResolveFontFaceMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
        ResolveFontFaceMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
        ResolveFontFaceMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
        ResolveFontFaceMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveFontFaceMethod l o = O.MethodResolutionFailed l o

    instance (info ~ ResolveFontFaceMethod t FontFace, O.MethodInfo info FontFace p) => O.IsLabelProxy t (FontFace -> p) where
        fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

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

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList FontFace
    type instance O.AttributeList FontFace = FontFaceAttributeList
    type FontFaceAttributeList = ('[ ] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    #endif

    #if ENABLE_OVERLOADING
    type instance O.SignalList FontFace = FontFaceSignalList
    type FontFaceSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

    #endif

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

    foreign import ccall "pango_font_face_describe" pango_font_face_describe ::
        Ptr FontFace ->                         -- face : TInterface (Name {namespace = "Pango", name = "FontFace"})
        IO (Ptr Pango.FontDescription.FontDescription)

    {- |
    Returns the family, style, variant, weight and stretch of
    a 'GI.Pango.Objects.FontFace.FontFace'. The size field of the resulting font description
    will be unset.
    -}
    fontFaceDescribe ::
        (B.CallStack.HasCallStack, MonadIO m, IsFontFace a) =>
        a
        {- ^ /@face@/: a 'GI.Pango.Objects.FontFace.FontFace' -}
        -> m Pango.FontDescription.FontDescription
        {- ^ __Returns:__ a newly-created 'GI.Pango.Structs.FontDescription.FontDescription' structure
     holding the description of the face. Use 'GI.Pango.Structs.FontDescription.fontDescriptionFree'
     to free the result. -}
    fontFaceDescribe face = liftIO $ do
        face' <- unsafeManagedPtrCastPtr face
        result <- pango_font_face_describe face'
        checkUnexpectedReturnNULL "fontFaceDescribe" result
        result' <- (wrapBoxed Pango.FontDescription.FontDescription) result
        touchManagedPtr face
        return result'

    #if ENABLE_OVERLOADING
    data FontFaceDescribeMethodInfo
    instance (signature ~ (m Pango.FontDescription.FontDescription), MonadIO m, IsFontFace a) => O.MethodInfo FontFaceDescribeMethodInfo a signature where
        overloadedMethod _ = fontFaceDescribe

    #endif

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

    foreign import ccall "pango_font_face_get_face_name" pango_font_face_get_face_name ::
        Ptr FontFace ->                         -- face : TInterface (Name {namespace = "Pango", name = "FontFace"})
        IO CString

    {- |
    Gets a name representing the style of this face among the
    different faces in the 'GI.Pango.Objects.FontFamily.FontFamily' for the face. This
    name is unique among all faces in the family and is suitable
    for displaying to users.
    -}
    fontFaceGetFaceName ::
        (B.CallStack.HasCallStack, MonadIO m, IsFontFace a) =>
        a
        {- ^ /@face@/: a 'GI.Pango.Objects.FontFace.FontFace'. -}
        -> m T.Text
        {- ^ __Returns:__ the face name for the face. This string is
      owned by the face object and must not be modified or freed. -}
    fontFaceGetFaceName face = liftIO $ do
        face' <- unsafeManagedPtrCastPtr face
        result <- pango_font_face_get_face_name face'
        checkUnexpectedReturnNULL "fontFaceGetFaceName" result
        result' <- cstringToText result
        touchManagedPtr face
        return result'

    #if ENABLE_OVERLOADING
    data FontFaceGetFaceNameMethodInfo
    instance (signature ~ (m T.Text), MonadIO m, IsFontFace a) => O.MethodInfo FontFaceGetFaceNameMethodInfo a signature where
        overloadedMethod _ = fontFaceGetFaceName

    #endif

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

    foreign import ccall "pango_font_face_is_synthesized" pango_font_face_is_synthesized ::
        Ptr FontFace ->                         -- face : TInterface (Name {namespace = "Pango", name = "FontFace"})
        IO CInt

    {- |
    Returns whether a 'GI.Pango.Objects.FontFace.FontFace' is synthesized by the underlying
    font rendering engine from another face, perhaps by shearing, emboldening,
    or lightening it.

    /Since: 1.18/
    -}
    fontFaceIsSynthesized ::
        (B.CallStack.HasCallStack, MonadIO m, IsFontFace a) =>
        a
        {- ^ /@face@/: a 'GI.Pango.Objects.FontFace.FontFace' -}
        -> m Bool
        {- ^ __Returns:__ whether /@face@/ is synthesized. -}
    fontFaceIsSynthesized face = liftIO $ do
        face' <- unsafeManagedPtrCastPtr face
        result <- pango_font_face_is_synthesized face'
        let result' = (/= 0) result
        touchManagedPtr face
        return result'

    #if ENABLE_OVERLOADING
    data FontFaceIsSynthesizedMethodInfo
    instance (signature ~ (m Bool), MonadIO m, IsFontFace a) => O.MethodInfo FontFaceIsSynthesizedMethodInfo a signature where
        overloadedMethod _ = fontFaceIsSynthesized

    #endif

    -- method FontFace::list_sizes
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "face", argType = TInterface (Name {namespace = "Pango", name = "FontFace"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoFontFace.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "sizes", argType = TCArray False (-1) 2 (TBasicType TInt), direction = DirectionOut, mayBeNull = True, argDoc = Documentation {rawDocText = Just "\n        location to store a pointer to an array of int. This array\n        should be freed with g_free().", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "n_sizes", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store the number of elements in @sizes", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
    -- Lengths : [Arg {argCName = "n_sizes", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store the number of elements in @sizes", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "pango_font_face_list_sizes" pango_font_face_list_sizes ::
        Ptr FontFace ->                         -- face : TInterface (Name {namespace = "Pango", name = "FontFace"})
        Ptr (Ptr Int32) ->                      -- sizes : TCArray False (-1) 2 (TBasicType TInt)
        Ptr Int32 ->                            -- n_sizes : TBasicType TInt
        IO ()

    {- |
    List the available sizes for a font. This is only applicable to bitmap
    fonts. For scalable fonts, stores 'Nothing' at the location pointed to by
    /@sizes@/ and 0 at the location pointed to by /@nSizes@/. The sizes returned
    are in Pango units and are sorted in ascending order.

    /Since: 1.4/
    -}
    fontFaceListSizes ::
        (B.CallStack.HasCallStack, MonadIO m, IsFontFace a) =>
        a
        {- ^ /@face@/: a 'GI.Pango.Objects.FontFace.FontFace'. -}
        -> m ((Maybe [Int32]))
    fontFaceListSizes face = liftIO $ do
        face' <- unsafeManagedPtrCastPtr face
        sizes <- allocMem :: IO (Ptr (Ptr Int32))
        nSizes <- allocMem :: IO (Ptr Int32)
        pango_font_face_list_sizes face' sizes nSizes
        nSizes' <- peek nSizes
        sizes' <- peek sizes
        maybeSizes' <- convertIfNonNull sizes' $ \sizes'' -> do
            sizes''' <- (unpackStorableArrayWithLength nSizes') sizes''
            freeMem sizes''
            return sizes'''
        touchManagedPtr face
        freeMem sizes
        freeMem nSizes
        return maybeSizes'

    #if ENABLE_OVERLOADING
    data FontFaceListSizesMethodInfo
    instance (signature ~ (m ((Maybe [Int32]))), MonadIO m, IsFontFace a) => O.MethodInfo FontFaceListSizesMethodInfo a signature where
        overloadedMethod _ = fontFaceListSizes

    #endif