    {-# LINE 1 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
    {-# LANGUAGE CPP #-}
    {- |

       Module      :  Graphics.Win32.GDI.AlphaBlend

       Copyright   :  2013 shelarcy

       License     :  BSD-style

       Maintainer  :  shelarcy@gmail.com

       Stability   :  Provisional

       Portability :  Non-portable (Win32 API)

       Provides alpha blending  functionality.

    -}
    module Graphics.Win32.GDI.AlphaBlend where
    import Foreign.Storable         ( Storable(..) )
    import Foreign.Ptr              ( Ptr )
    import Graphics.Win32.GDI.Types ( HDC )
    import System.Win32.Types       ( BOOL, BYTE, UINT )

    #include "windows_cconv.h"

    foreign import ccall unsafe "alphablend.h"
      c_AlphaBlend :: HDC -> Int -> Int -> Int -> Int -> HDC -> Int -> Int -> Int -> Int -> PBLENDFUNCTION -> IO BOOL
    {-

    We use C wrapper function to call this API.

    Because foreign stacall/ccall/capi doesn't work with non-pointer user defined type.

    We think that capi should support that when user defined type has Storable class instance

    and using CTYPE pragma in the scope.

    {-# LANGUAGE CApiFFI #-}

    data {-# CTYPE "windows.h" "BLENDFUNCTION" #-} BLENDFUNCTION =

    foreign import capi unsafe "windows.h AlphaBlend"

      c_AlphaBlend :: HDC -> Int -> Int -> Int -> Int -> HDC -> Int -> Int -> Int -> Int -> BLENDFUNCTION -> IO BOOL

    -}

    foreign import WINDOWS_CCONV unsafe "windows.h TransparentBlt"
      c_TransparentBlt :: HDC -> Int -> Int -> Int -> Int -> HDC -> Int -> Int -> Int -> Int -> UINT -> IO BOOL

    aC_SRC_OVER :: BYTE
    aC_SRC_OVER = 0
    {-# LINE 45 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}

    aC_SRC_ALPHA :: BYTE
    aC_SRC_ALPHA = 1
    {-# LINE 48 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}

    type PBLENDFUNCTION  = Ptr BLENDFUNCTION
    type LPBLENDFUNCTION = Ptr BLENDFUNCTION

    data BLENDFUNCTION = BLENDFUNCTION
        { blendOp     :: BYTE
        , blendFlags  :: BYTE
        , sourceConstantAlpha :: BYTE
        , alphaFormat :: BYTE
        } deriving (Show)

    instance Storable BLENDFUNCTION where
        sizeOf = const (4)
    {-# LINE 61 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
        alignment _ = 1
    {-# LINE 62 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
        poke buf func = do
            ((\hsc_ptr -> pokeByteOff hsc_ptr 0))     buf (blendOp func)
    {-# LINE 64 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 1))  buf (blendFlags func)
    {-# LINE 65 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 2)) buf (sourceConstantAlpha func)
    {-# LINE 66 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 3)) buf (alphaFormat func)
    {-# LINE 67 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}

        peek buf = do
            blendOp'     <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) buf
    {-# LINE 70 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
            blendFlags'  <- ((\hsc_ptr -> peekByteOff hsc_ptr 1)) buf
    {-# LINE 71 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
            sourceConstantAlpha' <-
                ((\hsc_ptr -> peekByteOff hsc_ptr 2)) buf
    {-# LINE 73 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
            alphaFormat' <- ((\hsc_ptr -> peekByteOff hsc_ptr 3)) buf
    {-# LINE 74 "libraries\\Win32\\Graphics\\Win32\\GDI\\AlphaBlend.hsc" #-}
            return $ BLENDFUNCTION blendOp' blendFlags' sourceConstantAlpha' alphaFormat'