{-# LINE 1 "src/SFML/Graphics/BlendMode.hsc" #-}
module SFML.Graphics.BlendMode
{-# LINE 2 "src/SFML/Graphics/BlendMode.hsc" #-}
(
    BlendFactor(..)
,   BlendEquation(..)
,   BlendMode(..)
,   blendAlpha
,   blendAdd
,   blendMultiply
,   blendNone
)
where


import Control.Applicative ((<$>), (<*>))
import Foreign.C.Types (CInt)
import Foreign.Ptr
import Foreign.Storable


{-# LINE 20 "src/SFML/Graphics/BlendMode.hsc" #-}



{-# LINE 23 "src/SFML/Graphics/BlendMode.hsc" #-}


-- | Enumeration of the blending factors
data BlendFactor
    = BlendFactorZero             -- ^ (0, 0, 0, 0)
    | BlendFactorOne              -- ^ (1, 1, 1, 1)
    | BlendFactorSrcColor         -- ^ (src.r, src.g, src.b, src.a)
    | BlendFactorOneMinusSrcColor -- ^ (1, 1, 1, 1) - (src.r, src.g, src.b, src.a)
    | BlendFactorDstColor         -- ^ (dst.r, dst.g, dst.b, dst.a)
    | BlendFactorOneMinusDstColor -- ^ (1, 1, 1, 1) - (dst.r, dst.g, dst.b, dst.a)
    | BlendFactorSrcAlpha         -- ^ (src.a, src.a, src.a, src.a)
    | BlendFactorOneMinusSrcAlpha -- ^ (1, 1, 1, 1) - (src.a, src.a, src.a, src.a)
    | BlendFactorDstAlpha         -- ^ (dst.a, dst.a, dst.a, dst.a)
    | BlendFactorOneMinusDstAlpha -- ^ (1, 1, 1, 1) - (dst.a, dst.a, dst.a, dst.a)
    deriving (Eq, Enum, Bounded, Show)


-- | Enumeration of the blending equations
data BlendEquation
    = BlendEquationAdd      -- ^ Pixel = Src * SrcFactor + Dst * DstFactor
    | BlendEquationSubtract -- ^ Pixel = Src * SrcFactor - Dst * DstFactor
    deriving (Eq, Enum, Bounded, Show)


-- | Available blending modes for drawing.
data BlendMode
    = BlendMode
    { colorSrcFactor :: BlendFactor    -- ^ Source blending factor for the color channels
    , colorDstFactor :: BlendFactor    -- ^ Destination blending factor for the color channels
    , colorEquation  :: BlendEquation  -- ^ Blending equation for the color channels
    , alphaSrcFactor :: BlendFactor    -- ^ Source blending factor for the alpha channel
    , alphaDstFactor :: BlendFactor    -- ^ Destination blending factor for the alpha channel
    , alphaEquation  :: BlendEquation  -- ^ Blending equation for the alpha channel
    } deriving (Eq, Show)


instance Storable BlendFactor where
    sizeOf _ = (4)
{-# LINE 61 "src/SFML/Graphics/BlendMode.hsc" #-}
    alignment _ = 4
{-# LINE 62 "src/SFML/Graphics/BlendMode.hsc" #-}

    peek ptr = fmap (toEnum . fromIntegral) $ peek (castPtr ptr :: Ptr CInt)
    poke ptr bm = poke (castPtr ptr :: Ptr CInt) (fromIntegral . fromEnum $ bm)


instance Storable BlendEquation where
    sizeOf _ = (4)
{-# LINE 69 "src/SFML/Graphics/BlendMode.hsc" #-}
    alignment _ = 4
{-# LINE 70 "src/SFML/Graphics/BlendMode.hsc" #-}

    peek ptr = fmap (toEnum . fromIntegral) $ peek (castPtr ptr :: Ptr CInt)
    poke ptr bm = poke (castPtr ptr :: Ptr CInt) (fromIntegral . fromEnum $ bm)


instance Storable BlendMode where
    sizeOf _ = (24)
{-# LINE 77 "src/SFML/Graphics/BlendMode.hsc" #-}
    alignment _ = 4
{-# LINE 78 "src/SFML/Graphics/BlendMode.hsc" #-}

    peek ptr = BlendMode <$> (\hsc_ptr -> peekByteOff hsc_ptr 0)  ptr
{-# LINE 80 "src/SFML/Graphics/BlendMode.hsc" #-}
                         <*> (\hsc_ptr -> peekByteOff hsc_ptr 4)  ptr
{-# LINE 81 "src/SFML/Graphics/BlendMode.hsc" #-}
                         <*> (\hsc_ptr -> peekByteOff hsc_ptr 8)   ptr
{-# LINE 82 "src/SFML/Graphics/BlendMode.hsc" #-}
                         <*> (\hsc_ptr -> peekByteOff hsc_ptr 12)  ptr
{-# LINE 83 "src/SFML/Graphics/BlendMode.hsc" #-}
                         <*> (\hsc_ptr -> peekByteOff hsc_ptr 16)  ptr
{-# LINE 84 "src/SFML/Graphics/BlendMode.hsc" #-}
                         <*> (\hsc_ptr -> peekByteOff hsc_ptr 20)   ptr
{-# LINE 85 "src/SFML/Graphics/BlendMode.hsc" #-}
    poke ptr bm = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (colorSrcFactor bm)
{-# LINE 87 "src/SFML/Graphics/BlendMode.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 4) ptr (colorDstFactor bm)
{-# LINE 88 "src/SFML/Graphics/BlendMode.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8)  ptr (colorEquation  bm)
{-# LINE 89 "src/SFML/Graphics/BlendMode.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 12) ptr (alphaSrcFactor bm)
{-# LINE 90 "src/SFML/Graphics/BlendMode.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr (alphaDstFactor bm)
{-# LINE 91 "src/SFML/Graphics/BlendMode.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 20)  ptr (alphaEquation  bm)
{-# LINE 92 "src/SFML/Graphics/BlendMode.hsc" #-}


blendAlpha = BlendMode BlendFactorSrcAlpha
                       BlendFactorOneMinusSrcAlpha
                       BlendEquationAdd
                       BlendFactorOne
                       BlendFactorOneMinusSrcAlpha
                       BlendEquationAdd


blendAdd = BlendMode BlendFactorSrcAlpha
                     BlendFactorOne
                     BlendEquationAdd
                     BlendFactorOne
                     BlendFactorOne
                     BlendEquationAdd


blendMultiply = BlendMode BlendFactorDstColor
                          BlendFactorZero
                          BlendEquationAdd
                          BlendFactorDstColor
                          BlendFactorZero
                          BlendEquationAdd


blendNone = BlendMode BlendFactorOne
                      BlendFactorZero
                      BlendEquationAdd
                      BlendFactorOne
                      BlendFactorZero
                      BlendEquationAdd