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



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

{-# LANGUAGE Trustworthy #-}



{-# LINE 4 "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







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



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

--

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



type POINT =

  ( LONG  -- x

  , LONG  -- y

  )



sizeofPOINT :: Int

sizeofPOINT = (8)

{-# LINE 77 "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 85 "Graphics\\Win32\\GDI\\Types.hsc" #-}

  y <- (\hsc_ptr -> peekByteOff hsc_ptr 4) p

{-# LINE 86 "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 91 "Graphics\\Win32\\GDI\\Types.hsc" #-}

  (\hsc_ptr -> pokeByteOff hsc_ptr 4) p y

{-# LINE 92 "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 109 "Graphics\\Win32\\GDI\\Types.hsc" #-}



peekRECT :: Ptr RECT -> IO RECT

peekRECT p = do

  left   <- (\hsc_ptr -> peekByteOff hsc_ptr 0) p

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

  top    <- (\hsc_ptr -> peekByteOff hsc_ptr 4) p

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

  right  <- (\hsc_ptr -> peekByteOff hsc_ptr 8) p

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

  bottom <- (\hsc_ptr -> peekByteOff hsc_ptr 12) p

{-# LINE 116 "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 121 "Graphics\\Win32\\GDI\\Types.hsc" #-}

  (\hsc_ptr -> pokeByteOff hsc_ptr 4)    p top

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

  (\hsc_ptr -> pokeByteOff hsc_ptr 8)  p right

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

  (\hsc_ptr -> pokeByteOff hsc_ptr 12) p bottom

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



type SIZE =

  ( LONG  -- cx

  , LONG  -- cy

  )



allocaSIZE :: (Ptr SIZE -> IO a) -> IO a

allocaSIZE =

  allocaBytes ((8))

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



peekSIZE :: Ptr SIZE -> IO SIZE

peekSIZE p = do

  cx <- (\hsc_ptr -> peekByteOff hsc_ptr 0) p

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

  cy <- (\hsc_ptr -> peekByteOff hsc_ptr 4) p

{-# LINE 138 "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 143 "Graphics\\Win32\\GDI\\Types.hsc" #-}

  (\hsc_ptr -> pokeByteOff hsc_ptr 4) p cy

{-# LINE 144 "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     = castUINTPtrToPtr 1

hWND_NOTOPMOST  :: HWND

hWND_NOTOPMOST  = castUINTPtrToPtr 18446744073709551614

hWND_TOP        :: HWND

hWND_TOP        = castUINTPtrToPtr 0

hWND_TOPMOST    :: HWND

hWND_TOPMOST    = castUINTPtrToPtr 18446744073709551615



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



type   HMENU      = HANDLE

type MbHMENU      = Maybe HMENU



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

-- COLORREF

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



type COLORREF   = Word32

{-# LINE 233 "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 271 "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 280 "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 289 "Graphics\\Win32\\GDI\\Types.hsc" #-}



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



type BackgroundMode = INT

tRANSPARENT   :: BackgroundMode

tRANSPARENT   =  1

oPAQUE        :: BackgroundMode

oPAQUE        =  2



{-# LINE 297 "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 309 "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 322 "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 336 "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 347 "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 357 "Graphics\\Win32\\GDI\\Types.hsc" #-}



gDI_ERROR  :: Num a => a

gDI_ERROR   = 4294967295

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



cLR_INVALID :: COLORREF

cLR_INVALID = 4294967295

{-# LINE 363 "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 381 "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

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