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

A 'GI.Poppler.Structs.Quadrilateral.Quadrilateral' is used to describe rectangle-like polygon
 with arbitrary inclination on a page.

 Since: 0.26
-}

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

module GI.Poppler.Structs.Quadrilateral
    (

-- * Exported types
    Quadrilateral(..)                       ,
    newZeroQuadrilateral                    ,
    noQuadrilateral                         ,


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

#if ENABLE_OVERLOADING
    QuadrilateralCopyMethodInfo             ,
#endif
    quadrilateralCopy                       ,


-- ** free #method:free#

#if ENABLE_OVERLOADING
    QuadrilateralFreeMethodInfo             ,
#endif
    quadrilateralFree                       ,


-- ** new #method:new#

    quadrilateralNew                        ,




 -- * Properties
-- ** p1 #attr:p1#
{- | a 'GI.Poppler.Structs.Point.Point' with the first vertex coordinates
-}
    getQuadrilateralP1                      ,
#if ENABLE_OVERLOADING
    quadrilateral_p1                        ,
#endif


-- ** p2 #attr:p2#
{- | a 'GI.Poppler.Structs.Point.Point' with the second vertex coordinates
-}
    getQuadrilateralP2                      ,
#if ENABLE_OVERLOADING
    quadrilateral_p2                        ,
#endif


-- ** p3 #attr:p3#
{- | a 'GI.Poppler.Structs.Point.Point' with the third vertex coordinates
-}
    getQuadrilateralP3                      ,
#if ENABLE_OVERLOADING
    quadrilateral_p3                        ,
#endif


-- ** p4 #attr:p4#
{- | a 'GI.Poppler.Structs.Point.Point' with the fourth vertex coordinates
-}
    getQuadrilateralP4                      ,
#if ENABLE_OVERLOADING
    quadrilateral_p4                        ,
#endif




    ) 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.Poppler.Structs.Point as Poppler.Point

-- | Memory-managed wrapper type.
newtype Quadrilateral = Quadrilateral (ManagedPtr Quadrilateral)
foreign import ccall "poppler_quadrilateral_get_type" c_poppler_quadrilateral_get_type ::
    IO GType

instance BoxedObject Quadrilateral where
    boxedType _ = c_poppler_quadrilateral_get_type

-- | Construct a `Quadrilateral` struct initialized to zero.
newZeroQuadrilateral :: MonadIO m => m Quadrilateral
newZeroQuadrilateral = liftIO $ callocBoxedBytes 64 >>= wrapBoxed Quadrilateral

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


-- | A convenience alias for `Nothing` :: `Maybe` `Quadrilateral`.
noQuadrilateral :: Maybe Quadrilateral
noQuadrilateral = Nothing

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

@
'Data.GI.Base.Attributes.get' quadrilateral #p1
@
-}
getQuadrilateralP1 :: MonadIO m => Quadrilateral -> m Poppler.Point.Point
getQuadrilateralP1 s = liftIO $ withManagedPtr s $ \ptr -> do
    let val = ptr `plusPtr` 0 :: (Ptr Poppler.Point.Point)
    val' <- (newBoxed Poppler.Point.Point) val
    return val'

#if ENABLE_OVERLOADING
data QuadrilateralP1FieldInfo
instance AttrInfo QuadrilateralP1FieldInfo where
    type AttrAllowedOps QuadrilateralP1FieldInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint QuadrilateralP1FieldInfo = (~) (Ptr Poppler.Point.Point)
    type AttrBaseTypeConstraint QuadrilateralP1FieldInfo = (~) Quadrilateral
    type AttrGetType QuadrilateralP1FieldInfo = Poppler.Point.Point
    type AttrLabel QuadrilateralP1FieldInfo = "p1"
    type AttrOrigin QuadrilateralP1FieldInfo = Quadrilateral
    attrGet _ = getQuadrilateralP1
    attrSet _ = undefined
    attrConstruct = undefined
    attrClear _ = undefined

quadrilateral_p1 :: AttrLabelProxy "p1"
quadrilateral_p1 = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' quadrilateral #p2
@
-}
getQuadrilateralP2 :: MonadIO m => Quadrilateral -> m Poppler.Point.Point
getQuadrilateralP2 s = liftIO $ withManagedPtr s $ \ptr -> do
    let val = ptr `plusPtr` 16 :: (Ptr Poppler.Point.Point)
    val' <- (newBoxed Poppler.Point.Point) val
    return val'

#if ENABLE_OVERLOADING
data QuadrilateralP2FieldInfo
instance AttrInfo QuadrilateralP2FieldInfo where
    type AttrAllowedOps QuadrilateralP2FieldInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint QuadrilateralP2FieldInfo = (~) (Ptr Poppler.Point.Point)
    type AttrBaseTypeConstraint QuadrilateralP2FieldInfo = (~) Quadrilateral
    type AttrGetType QuadrilateralP2FieldInfo = Poppler.Point.Point
    type AttrLabel QuadrilateralP2FieldInfo = "p2"
    type AttrOrigin QuadrilateralP2FieldInfo = Quadrilateral
    attrGet _ = getQuadrilateralP2
    attrSet _ = undefined
    attrConstruct = undefined
    attrClear _ = undefined

quadrilateral_p2 :: AttrLabelProxy "p2"
quadrilateral_p2 = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' quadrilateral #p3
@
-}
getQuadrilateralP3 :: MonadIO m => Quadrilateral -> m Poppler.Point.Point
getQuadrilateralP3 s = liftIO $ withManagedPtr s $ \ptr -> do
    let val = ptr `plusPtr` 32 :: (Ptr Poppler.Point.Point)
    val' <- (newBoxed Poppler.Point.Point) val
    return val'

#if ENABLE_OVERLOADING
data QuadrilateralP3FieldInfo
instance AttrInfo QuadrilateralP3FieldInfo where
    type AttrAllowedOps QuadrilateralP3FieldInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint QuadrilateralP3FieldInfo = (~) (Ptr Poppler.Point.Point)
    type AttrBaseTypeConstraint QuadrilateralP3FieldInfo = (~) Quadrilateral
    type AttrGetType QuadrilateralP3FieldInfo = Poppler.Point.Point
    type AttrLabel QuadrilateralP3FieldInfo = "p3"
    type AttrOrigin QuadrilateralP3FieldInfo = Quadrilateral
    attrGet _ = getQuadrilateralP3
    attrSet _ = undefined
    attrConstruct = undefined
    attrClear _ = undefined

quadrilateral_p3 :: AttrLabelProxy "p3"
quadrilateral_p3 = AttrLabelProxy

#endif


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

@
'Data.GI.Base.Attributes.get' quadrilateral #p4
@
-}
getQuadrilateralP4 :: MonadIO m => Quadrilateral -> m Poppler.Point.Point
getQuadrilateralP4 s = liftIO $ withManagedPtr s $ \ptr -> do
    let val = ptr `plusPtr` 48 :: (Ptr Poppler.Point.Point)
    val' <- (newBoxed Poppler.Point.Point) val
    return val'

#if ENABLE_OVERLOADING
data QuadrilateralP4FieldInfo
instance AttrInfo QuadrilateralP4FieldInfo where
    type AttrAllowedOps QuadrilateralP4FieldInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint QuadrilateralP4FieldInfo = (~) (Ptr Poppler.Point.Point)
    type AttrBaseTypeConstraint QuadrilateralP4FieldInfo = (~) Quadrilateral
    type AttrGetType QuadrilateralP4FieldInfo = Poppler.Point.Point
    type AttrLabel QuadrilateralP4FieldInfo = "p4"
    type AttrOrigin QuadrilateralP4FieldInfo = Quadrilateral
    attrGet _ = getQuadrilateralP4
    attrSet _ = undefined
    attrConstruct = undefined
    attrClear _ = undefined

quadrilateral_p4 :: AttrLabelProxy "p4"
quadrilateral_p4 = AttrLabelProxy

#endif



#if ENABLE_OVERLOADING
instance O.HasAttributeList Quadrilateral
type instance O.AttributeList Quadrilateral = QuadrilateralAttributeList
type QuadrilateralAttributeList = ('[ '("p1", QuadrilateralP1FieldInfo), '("p2", QuadrilateralP2FieldInfo), '("p3", QuadrilateralP3FieldInfo), '("p4", QuadrilateralP4FieldInfo)] :: [(Symbol, *)])
#endif

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

foreign import ccall "poppler_quadrilateral_new" poppler_quadrilateral_new ::
    IO (Ptr Quadrilateral)

{- |
Creates a new 'GI.Poppler.Structs.Quadrilateral.Quadrilateral'. It must be freed with 'GI.Poppler.Structs.Quadrilateral.quadrilateralFree' after use.

/Since: 0.26/
-}
quadrilateralNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Quadrilateral
    {- ^ __Returns:__ a new 'GI.Poppler.Structs.Quadrilateral.Quadrilateral'. -}
quadrilateralNew  = liftIO $ do
    result <- poppler_quadrilateral_new
    checkUnexpectedReturnNULL "quadrilateralNew" result
    result' <- (wrapBoxed Quadrilateral) result
    return result'

#if ENABLE_OVERLOADING
#endif

-- method Quadrilateral::copy
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "quad", argType = TInterface (Name {namespace = "Poppler", name = "Quadrilateral"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PopplerQuadrilateral to copy", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Poppler", name = "Quadrilateral"}))
-- throws : False
-- Skip return : False

foreign import ccall "poppler_quadrilateral_copy" poppler_quadrilateral_copy ::
    Ptr Quadrilateral ->                    -- quad : TInterface (Name {namespace = "Poppler", name = "Quadrilateral"})
    IO (Ptr Quadrilateral)

{- |
Creates a copy of /@quad@/. The copy must be freed with 'GI.Poppler.Structs.Quadrilateral.quadrilateralFree' after use.

/Since: 0.26/
-}
quadrilateralCopy ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Quadrilateral
    {- ^ /@quad@/: a 'GI.Poppler.Structs.Quadrilateral.Quadrilateral' to copy -}
    -> m Quadrilateral
    {- ^ __Returns:__ a new allocated copy of /@quad@/ -}
quadrilateralCopy quad = liftIO $ do
    quad' <- unsafeManagedPtrGetPtr quad
    result <- poppler_quadrilateral_copy quad'
    checkUnexpectedReturnNULL "quadrilateralCopy" result
    result' <- (wrapBoxed Quadrilateral) result
    touchManagedPtr quad
    return result'

#if ENABLE_OVERLOADING
data QuadrilateralCopyMethodInfo
instance (signature ~ (m Quadrilateral), MonadIO m) => O.MethodInfo QuadrilateralCopyMethodInfo Quadrilateral signature where
    overloadedMethod _ = quadrilateralCopy

#endif

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

foreign import ccall "poppler_quadrilateral_free" poppler_quadrilateral_free ::
    Ptr Quadrilateral ->                    -- quad : TInterface (Name {namespace = "Poppler", name = "Quadrilateral"})
    IO ()

{- |
Frees the memory used by /@quad@/

/Since: 0.26/
-}
quadrilateralFree ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Quadrilateral
    {- ^ /@quad@/: a 'GI.Poppler.Structs.Quadrilateral.Quadrilateral' -}
    -> m ()
quadrilateralFree quad = liftIO $ do
    quad' <- unsafeManagedPtrGetPtr quad
    poppler_quadrilateral_free quad'
    touchManagedPtr quad
    return ()

#if ENABLE_OVERLOADING
data QuadrilateralFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo QuadrilateralFreeMethodInfo Quadrilateral signature where
    overloadedMethod _ = quadrilateralFree

#endif

#if ENABLE_OVERLOADING
type family ResolveQuadrilateralMethod (t :: Symbol) (o :: *) :: * where
    ResolveQuadrilateralMethod "copy" o = QuadrilateralCopyMethodInfo
    ResolveQuadrilateralMethod "free" o = QuadrilateralFreeMethodInfo
    ResolveQuadrilateralMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveQuadrilateralMethod t Quadrilateral, O.MethodInfo info Quadrilateral p) => OL.IsLabel t (Quadrilateral -> 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