    {-# INCLUDE <windows.h> #-}
    {-# LINE 1 "Graphics\Win32\GDI\Types.hsc" #-}
    -----------------------------------------------------------------------------
    {-# LINE 2 "Graphics\Win32\GDI\Types.hsc" #-}
    -- |
    -- Module      :  Graphics.Win32.GDI.Types
    -- Copyright   :  (c) Alastair Reid, 1997-2003
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  Esa Ilari Vuokko <ei@vuokko.info>
    -- Stability   :  provisional
    -- Portability :  portable
    --
    -- A collection of FFI declarations for interfacing with Win32.
    --
    -----------------------------------------------------------------------------

    module Graphics.Win32.GDI.Types
    {-  -- still incomplete
    	( POINT,        marshall_point, unmarshall_point
    	, ListPOINT,    marshall_ListPOINT_
    	, ListLenPOINT, marshall_ListLenPOINT_
    	, RECT,         marshall_rect, unmarshall_rect
    	, SIZE,         marshall_size, unmarshall_size
    	, nullPtr
    	, HBITMAP	, MbHBITMAP
    	, HFONT		, MbHFONT
    	, HCURSOR	, MbHCURSOR
    	, HICON		, MbHICON
    	, HRGN		, MbHRGN
    	, PRGN
    	, HPALETTE	, MbHPALETTE
    	, HBRUSH	, MbHBRUSH
    	, HPEN		, MbHPEN
    	, HACCEL	--, MbHACCEL
    	, HDC		, MbHDC
    	, HDWP          , MbHDWP
    	, HWND		, MbHWND
    	, HMENU		, MbHMENU
    	, PolyFillMode
    	, ArcDirection
    	, MbArcDirection
    	, GraphicsMode
    	, MbGraphicsMode
    	, BackgroundMode
    	, HatchStyle
    	, StretchBltMode
    	, COLORREF
    	, TextAlignment
    	, ClippingMode
    	, RegionType
    	, gDI_ERROR
    	)
    -}
    	where

    import System.Win32.Types

    import Control.Monad( zipWithM_ )
    import Foreign

    {-# LINE 60 "Graphics\Win32\GDI\Types.hsc" #-}

    {-# CFILES cbits/HsGDI.c #-}

    ----------------------------------------------------------------
    --
    ----------------------------------------------------------------

    type POINT =
      ( LONG  -- x
      , LONG  -- y
      )

    sizeofPOINT :: Int
    sizeofPOINT = (8)
    {-# LINE 74 "Graphics\Win32\GDI\Types.hsc" #-}

    allocaPOINT :: (Ptr POINT -> IO a) -> IO a
    allocaPOINT =
      allocaBytes sizeofPOINT

    peekPOINT :: Ptr POINT -> IO POINT
    peekPOINT p = do
      x <- (\hsc_ptr -> peekByteOff hsc_ptr 0) p
    {-# LINE 82 "Graphics\Win32\GDI\Types.hsc" #-}
      y <- (\hsc_ptr -> peekByteOff hsc_ptr 4) p
    {-# LINE 83 "Graphics\Win32\GDI\Types.hsc" #-}
      return (x,y)

    pokePOINT :: Ptr POINT -> POINT -> IO ()
    pokePOINT p (x,y) = do
      (\hsc_ptr -> pokeByteOff hsc_ptr 0) p x
    {-# LINE 88 "Graphics\Win32\GDI\Types.hsc" #-}
      (\hsc_ptr -> pokeByteOff hsc_ptr 4) p y
    {-# LINE 89 "Graphics\Win32\GDI\Types.hsc" #-}

    withPOINT :: POINT -> (Ptr POINT -> IO a) -> IO a
    withPOINT p f =
      allocaPOINT $ \ ptr -> do
      pokePOINT ptr p
      f ptr

    type RECT =
      ( LONG  -- left
      , LONG  -- top
      , LONG  -- right
      , LONG  -- bottom
      )

    allocaRECT :: (Ptr RECT -> IO a) -> IO a
    allocaRECT =
      allocaBytes ((16))
    {-# LINE 106 "Graphics\Win32\GDI\Types.hsc" #-}

    peekRECT :: Ptr RECT -> IO RECT
    peekRECT p = do
      left   <- (\hsc_ptr -> peekByteOff hsc_ptr 0) p
    {-# LINE 110 "Graphics\Win32\GDI\Types.hsc" #-}
      top    <- (\hsc_ptr -> peekByteOff hsc_ptr 4) p
    {-# LINE 111 "Graphics\Win32\GDI\Types.hsc" #-}
      right  <- (\hsc_ptr -> peekByteOff hsc_ptr 8) p
    {-# LINE 112 "Graphics\Win32\GDI\Types.hsc" #-}
      bottom <- (\hsc_ptr -> peekByteOff hsc_ptr 12) p
    {-# LINE 113 "Graphics\Win32\GDI\Types.hsc" #-}
      return (left, top, right, bottom)

    pokeRECT :: Ptr RECT -> RECT -> IO ()
    pokeRECT p (left, top, right, bottom) = do
      (\hsc_ptr -> pokeByteOff hsc_ptr 0)   p left
    {-# LINE 118 "Graphics\Win32\GDI\Types.hsc" #-}
      (\hsc_ptr -> pokeByteOff hsc_ptr 4)    p top
    {-# LINE 119 "Graphics\Win32\GDI\Types.hsc" #-}
      (\hsc_ptr -> pokeByteOff hsc_ptr 8)  p right
    {-# LINE 120 "Graphics\Win32\GDI\Types.hsc" #-}
      (\hsc_ptr -> pokeByteOff hsc_ptr 12) p bottom
    {-# LINE 121 "Graphics\Win32\GDI\Types.hsc" #-}

    type SIZE =
      ( LONG  -- cx
      , LONG  -- cy
      )

    allocaSIZE :: (Ptr SIZE -> IO a) -> IO a
    allocaSIZE =
      allocaBytes ((8))
    {-# LINE 130 "Graphics\Win32\GDI\Types.hsc" #-}

    peekSIZE :: Ptr SIZE -> IO SIZE
    peekSIZE p = do
      cx <- (\hsc_ptr -> peekByteOff hsc_ptr 0) p
    {-# LINE 134 "Graphics\Win32\GDI\Types.hsc" #-}
      cy <- (\hsc_ptr -> peekByteOff hsc_ptr 4) p
    {-# LINE 135 "Graphics\Win32\GDI\Types.hsc" #-}
      return (cx,cy)

    pokeSIZE :: Ptr SIZE -> SIZE -> IO ()
    pokeSIZE p (cx,cy) = do
      (\hsc_ptr -> pokeByteOff hsc_ptr 0) p cx
    {-# LINE 140 "Graphics\Win32\GDI\Types.hsc" #-}
      (\hsc_ptr -> pokeByteOff hsc_ptr 4) p cy
    {-# LINE 141 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    withPOINTArray :: [POINT] -> (Ptr POINT -> Int -> IO a) -> IO a
    withPOINTArray xs f = allocaBytes (sizeofPOINT * len) $ \ ptr -> do
      pokePOINTArray ptr xs
      f ptr len
     where
      len = length xs

    pokePOINTArray :: Ptr POINT -> [POINT] -> IO ()
    pokePOINTArray ptr xs = zipWithM_ (setPOINT ptr) [0..] xs

    setPOINT :: Ptr POINT -> Int -> POINT -> IO ()
    setPOINT ptr off = pokePOINT (ptr `plusPtr` (off*sizeofPOINT))

    type   LPRECT   = Ptr RECT
    type MbLPRECT   = Maybe LPRECT

    withRECT :: RECT -> (Ptr RECT -> IO a) -> IO a
    withRECT r f =
      allocaRECT $ \ ptr -> do
      pokeRECT ptr r
      f ptr

    getRECT :: LPRECT -> IO RECT
    getRECT = peekRECT

    ----------------------------------------------------------------
    -- (GDI related) Handles
    ----------------------------------------------------------------

    type   HBITMAP    = HANDLE
    type MbHBITMAP    = Maybe HBITMAP

    type   HFONT      = HANDLE
    type MbHFONT      = Maybe HFONT

    type   HCURSOR    = HICON
    type MbHCURSOR    = Maybe HCURSOR

    type   HICON      = HANDLE
    type MbHICON      = Maybe HICON

    -- This is not the only handle / resource that should be
    -- finalised for you, but it's a start.
    -- ToDo.

    type   HRGN       = ForeignHANDLE
    type   PRGN       = HANDLE

    type MbHRGN       = Maybe HRGN

    type   HPALETTE   = HANDLE
    type MbHPALETTE   = Maybe HPALETTE

    type   HBRUSH     = HANDLE
    type MbHBRUSH     = Maybe HBRUSH

    type   HPEN       = HANDLE
    type MbHPEN       = Maybe HPEN

    type   HACCEL     = HANDLE

    type   HDC        = HANDLE
    type MbHDC        = Maybe HDC

    type   HDWP       = HANDLE
    type MbHDWP       = Maybe HDWP

    type   HWND       = HANDLE
    type MbHWND       = Maybe HWND

    hWND_BOTTOM     :: HWND
    hWND_BOTTOM     = castUINTToPtr 1
    hWND_NOTOPMOST  :: HWND
    hWND_NOTOPMOST  = castUINTToPtr 4294967294
    hWND_TOP        :: HWND
    hWND_TOP        = castUINTToPtr 0
    hWND_TOPMOST    :: HWND
    hWND_TOPMOST    = castUINTToPtr 4294967295

    {-# LINE 221 "Graphics\Win32\GDI\Types.hsc" #-}

    type   HMENU      = HANDLE
    type MbHMENU      = Maybe HMENU

    ----------------------------------------------------------------
    -- COLORREF
    ----------------------------------------------------------------

    type COLORREF   = Word32
    {-# LINE 230 "Graphics\Win32\GDI\Types.hsc" #-}

    foreign import ccall unsafe "HsGDI.h"
      rgb :: BYTE -> BYTE -> BYTE -> COLORREF

    foreign import ccall unsafe "HsGDI.h"
      getRValue :: COLORREF -> BYTE

    foreign import ccall unsafe "HsGDI.h"
      getGValue :: COLORREF -> BYTE

    foreign import ccall unsafe "HsGDI.h"
      getBValue :: COLORREF -> BYTE

    foreign import ccall unsafe "HsGDI.h"
      pALETTERGB :: BYTE -> BYTE -> BYTE -> COLORREF

    foreign import ccall unsafe "HsGDI.h"
      pALETTEINDEX :: WORD -> COLORREF

    ----------------------------------------------------------------
    -- RasterOp macro
    ----------------------------------------------------------------

    type RasterOp3 = Word32
    type RasterOp4 = Word32

    foreign import ccall unsafe "HsGDI.h"
      mAKEROP4 :: RasterOp3 -> RasterOp3 -> RasterOp4

    ----------------------------------------------------------------
    -- Miscellaneous enumerations
    ----------------------------------------------------------------

    type PolyFillMode   = INT
    aLTERNATE         :: PolyFillMode
    aLTERNATE         =  1
    wINDING           :: PolyFillMode
    wINDING           =  2

    {-# LINE 268 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    type ArcDirection   = INT
    type MbArcDirection = Maybe ArcDirection
    aD_COUNTERCLOCKWISE  :: ArcDirection
    aD_COUNTERCLOCKWISE  =  1
    aD_CLOCKWISE         :: ArcDirection
    aD_CLOCKWISE         =  2

    {-# LINE 277 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    type GraphicsMode   = DWORD
    type MbGraphicsMode = Maybe GraphicsMode
    gM_COMPATIBLE     :: GraphicsMode
    gM_COMPATIBLE     =  1
    gM_ADVANCED       :: GraphicsMode
    gM_ADVANCED       =  2

    {-# LINE 286 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    type BackgroundMode = INT
    tRANSPARENT   :: BackgroundMode
    tRANSPARENT   =  1
    oPAQUE        :: BackgroundMode
    oPAQUE        =  2

    {-# LINE 294 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    type HatchStyle   = INT
    hS_HORIZONTAL   :: HatchStyle
    hS_HORIZONTAL   =  0
    hS_VERTICAL     :: HatchStyle
    hS_VERTICAL     =  1
    hS_FDIAGONAL    :: HatchStyle
    hS_FDIAGONAL    =  2
    hS_BDIAGONAL    :: HatchStyle
    hS_BDIAGONAL    =  3
    hS_CROSS        :: HatchStyle
    hS_CROSS        =  4
    hS_DIAGCROSS    :: HatchStyle
    hS_DIAGCROSS    =  5

    {-# LINE 306 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    type StretchBltMode    = INT
    bLACKONWHITE         :: StretchBltMode
    bLACKONWHITE         =  1
    wHITEONBLACK         :: StretchBltMode
    wHITEONBLACK         =  2
    cOLORONCOLOR         :: StretchBltMode
    cOLORONCOLOR         =  3
    hALFTONE             :: StretchBltMode
    hALFTONE             =  4
    sTRETCH_ANDSCANS     :: StretchBltMode
    sTRETCH_ANDSCANS     =  1
    sTRETCH_ORSCANS      :: StretchBltMode
    sTRETCH_ORSCANS      =  2
    sTRETCH_DELETESCANS  :: StretchBltMode
    sTRETCH_DELETESCANS  =  3

    {-# LINE 319 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    type TextAlignment = UINT
    tA_NOUPDATECP    :: TextAlignment
    tA_NOUPDATECP    =  0
    tA_UPDATECP      :: TextAlignment
    tA_UPDATECP      =  1
    tA_LEFT          :: TextAlignment
    tA_LEFT          =  0
    tA_RIGHT         :: TextAlignment
    tA_RIGHT         =  2
    tA_CENTER        :: TextAlignment
    tA_CENTER        =  6
    tA_TOP           :: TextAlignment
    tA_TOP           =  0
    tA_BOTTOM        :: TextAlignment
    tA_BOTTOM        =  8
    tA_BASELINE      :: TextAlignment
    tA_BASELINE      =  24

    {-# LINE 333 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    type ClippingMode  = INT
    rGN_AND          :: ClippingMode
    rGN_AND          =  1
    rGN_OR           :: ClippingMode
    rGN_OR           =  2
    rGN_XOR          :: ClippingMode
    rGN_XOR          =  3
    rGN_DIFF         :: ClippingMode
    rGN_DIFF         =  4
    rGN_COPY         :: ClippingMode
    rGN_COPY         =  5

    {-# LINE 344 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    type RegionType    = INT
    eRROR            :: RegionType
    eRROR            =  0
    nULLREGION       :: RegionType
    nULLREGION       =  1
    sIMPLEREGION     :: RegionType
    sIMPLEREGION     =  2
    cOMPLEXREGION    :: RegionType
    cOMPLEXREGION    =  3

    {-# LINE 354 "Graphics\Win32\GDI\Types.hsc" #-}

    gDI_ERROR  :: Num a => a
    gDI_ERROR   = 4294967295
    {-# LINE 357 "Graphics\Win32\GDI\Types.hsc" #-}

    cLR_INVALID :: COLORREF
    cLR_INVALID = 4294967295
    {-# LINE 360 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------

    oBJ_PEN          :: UINT
    oBJ_PEN          =  1
    oBJ_BRUSH        :: UINT
    oBJ_BRUSH        =  2
    oBJ_DC           :: UINT
    oBJ_DC           =  3
    oBJ_METADC       :: UINT
    oBJ_METADC       =  4
    oBJ_PAL          :: UINT
    oBJ_PAL          =  5
    oBJ_FONT         :: UINT
    oBJ_FONT         =  6
    oBJ_BITMAP       :: UINT
    oBJ_BITMAP       =  7
    oBJ_REGION       :: UINT
    oBJ_REGION       =  8
    oBJ_METAFILE     :: UINT
    oBJ_METAFILE     =  9
    oBJ_MEMDC        :: UINT
    oBJ_MEMDC        =  10
    oBJ_EXTPEN       :: UINT
    oBJ_EXTPEN       =  11
    oBJ_ENHMETADC    :: UINT
    oBJ_ENHMETADC    =  12
    oBJ_ENHMETAFILE  :: UINT
    oBJ_ENHMETAFILE  =  13

    {-# LINE 378 "Graphics\Win32\GDI\Types.hsc" #-}

    ----------------------------------------------------------------
    -- Miscellaneous primitives
    ----------------------------------------------------------------

    -- Can't pass structs with current FFI, so use C wrappers

    foreign import ccall unsafe "HsGDI.h"
      prim_ChildWindowFromPoint :: HWND -> Ptr POINT -> IO HWND
    foreign import ccall unsafe "HsGDI.h"
      prim_ChildWindowFromPointEx :: HWND -> Ptr POINT -> DWORD -> IO HWND
    foreign import ccall unsafe "HsGDI.h"
      prim_MenuItemFromPoint :: HWND -> HMENU -> Ptr POINT -> IO UINT

    ----------------------------------------------------------------
    -- End
    ----------------------------------------------------------------