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

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

 Since: 0.26
-}

module GI.Poppler.Structs.Quadrilateral
    ( 

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


 -- * Methods
-- ** copy #method:copy#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    QuadrilateralCopyMethodInfo             ,
#endif
    quadrilateralCopy                       ,


-- ** free #method:free#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    QuadrilateralFreeMethodInfo             ,
#endif
    quadrilateralFree                       ,


-- ** new #method:new#
    quadrilateralNew                        ,




 -- * Properties
-- ** p1 #attr:p1#
    getQuadrilateralP1                      ,
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    quadrilateral_p1                        ,
#endif


-- ** p2 #attr:p2#
    getQuadrilateralP2                      ,
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    quadrilateral_p2                        ,
#endif


-- ** p3 #attr:p3#
    getQuadrilateralP3                      ,
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    quadrilateral_p3                        ,
#endif


-- ** p4 #attr:p4#
    getQuadrilateralP4                      ,
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    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.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
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.Poppler.Structs.Point as Poppler.Point

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


noQuadrilateral :: Maybe Quadrilateral
noQuadrilateral = Nothing

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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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


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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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


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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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


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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
#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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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 defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data QuadrilateralFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo QuadrilateralFreeMethodInfo Quadrilateral signature where
    overloadedMethod _ = quadrilateralFree

#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
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) => O.IsLabelProxy t (Quadrilateral -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

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

#endif