#if __GLASGOW_HASKELL__ >= 709
{-# LANGUAGE Safe #-}
#else
{-# LANGUAGE Trustworthy #-}
#endif
-----------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Win32.GDI.Region
-- 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.Region where

import System.Win32.Types
import Graphics.Win32.GDI.Types

import Foreign

#include "windows_cconv.h"

----------------------------------------------------------------
-- Regions
----------------------------------------------------------------

badRegion :: RegionType -> Bool
badRegion :: RegionType -> Bool
badRegion RegionType
n = RegionType
n RegionType -> RegionType -> Bool
forall a. Eq a => a -> a -> Bool
== RegionType
0 Bool -> Bool -> Bool
|| RegionType
n RegionType -> RegionType -> Bool
forall a. Eq a => a -> a -> Bool
== RegionType
forall a. Num a => a
gDI_ERROR

combineRgn :: HRGN -> HRGN -> HRGN -> ClippingMode -> IO RegionType
combineRgn :: HRGN -> HRGN -> HRGN -> RegionType -> IO RegionType
combineRgn HRGN
dest HRGN
src1 HRGN
src2 RegionType
mode =
  HRGN -> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
dest ((Ptr () -> IO RegionType) -> IO RegionType)
-> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_dest ->
  HRGN -> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
src1 ((Ptr () -> IO RegionType) -> IO RegionType)
-> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_src1 ->
  HRGN -> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
src2 ((Ptr () -> IO RegionType) -> IO RegionType)
-> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_src2 ->
  (RegionType -> Bool) -> String -> IO RegionType -> IO RegionType
forall a. (a -> Bool) -> String -> IO a -> IO a
failIf RegionType -> Bool
badRegion String
"CombineRgn" (IO RegionType -> IO RegionType) -> IO RegionType -> IO RegionType
forall a b. (a -> b) -> a -> b
$ Ptr () -> Ptr () -> Ptr () -> RegionType -> IO RegionType
c_CombineRgn Ptr ()
p_dest Ptr ()
p_src1 Ptr ()
p_src2 RegionType
mode
foreign import WINDOWS_CCONV unsafe "windows.h CombineRgn"
  c_CombineRgn :: PRGN -> PRGN -> PRGN -> ClippingMode -> IO RegionType

offsetRgn :: HRGN -> INT -> INT -> IO RegionType
offsetRgn :: HRGN -> RegionType -> RegionType -> IO RegionType
offsetRgn HRGN
rgn RegionType
xoff RegionType
yoff =
  HRGN -> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
rgn ((Ptr () -> IO RegionType) -> IO RegionType)
-> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_rgn ->
  (RegionType -> Bool) -> String -> IO RegionType -> IO RegionType
forall a. (a -> Bool) -> String -> IO a -> IO a
failIf RegionType -> Bool
badRegion String
"OffsetRgn" (IO RegionType -> IO RegionType) -> IO RegionType -> IO RegionType
forall a b. (a -> b) -> a -> b
$ Ptr () -> RegionType -> RegionType -> IO RegionType
c_OffsetRgn Ptr ()
p_rgn RegionType
xoff RegionType
yoff
foreign import WINDOWS_CCONV unsafe "windows.h OffsetRgn"
  c_OffsetRgn :: PRGN -> INT -> INT -> IO RegionType

getRgnBox :: HRGN -> LPRECT -> IO RegionType
getRgnBox :: HRGN -> LPRECT -> IO RegionType
getRgnBox HRGN
rgn LPRECT
p_rect =
  HRGN -> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
rgn ((Ptr () -> IO RegionType) -> IO RegionType)
-> (Ptr () -> IO RegionType) -> IO RegionType
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_rgn ->
  (RegionType -> Bool) -> String -> IO RegionType -> IO RegionType
forall a. (a -> Bool) -> String -> IO a -> IO a
failIf RegionType -> Bool
badRegion String
"GetRgnBox" (IO RegionType -> IO RegionType) -> IO RegionType -> IO RegionType
forall a b. (a -> b) -> a -> b
$ Ptr () -> LPRECT -> IO RegionType
c_GetRgnBox Ptr ()
p_rgn LPRECT
p_rect
foreign import WINDOWS_CCONV unsafe "windows.h GetRgnBox"
  c_GetRgnBox :: PRGN -> LPRECT -> IO RegionType

createEllipticRgn :: INT -> INT -> INT -> INT -> IO HRGN
createEllipticRgn :: RegionType -> RegionType -> RegionType -> RegionType -> IO HRGN
createEllipticRgn RegionType
x0 RegionType
y0 RegionType
x1 RegionType
y1 = do
  Ptr ()
ptr <- String -> IO (Ptr ()) -> IO (Ptr ())
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"CreateEllipticRgn" (IO (Ptr ()) -> IO (Ptr ())) -> IO (Ptr ()) -> IO (Ptr ())
forall a b. (a -> b) -> a -> b
$ RegionType -> RegionType -> RegionType -> RegionType -> IO (Ptr ())
c_CreateEllipticRgn RegionType
x0 RegionType
y0 RegionType
x1 RegionType
y1
  Ptr () -> IO HRGN
newForeignHANDLE Ptr ()
ptr
foreign import WINDOWS_CCONV unsafe "windows.h CreateEllipticRgn"
  c_CreateEllipticRgn :: INT -> INT -> INT -> INT -> IO PRGN

createEllipticRgnIndirect :: LPRECT -> IO HRGN
createEllipticRgnIndirect :: LPRECT -> IO HRGN
createEllipticRgnIndirect LPRECT
rp = do
  Ptr ()
ptr <- String -> IO (Ptr ()) -> IO (Ptr ())
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"CreateEllipticRgnIndirect" (IO (Ptr ()) -> IO (Ptr ())) -> IO (Ptr ()) -> IO (Ptr ())
forall a b. (a -> b) -> a -> b
$ LPRECT -> IO (Ptr ())
c_CreateEllipticRgnIndirect LPRECT
rp
  Ptr () -> IO HRGN
newForeignHANDLE Ptr ()
ptr
foreign import WINDOWS_CCONV unsafe "windows.h CreateEllipticRgnIndirect"
  c_CreateEllipticRgnIndirect :: LPRECT -> IO PRGN

createRectRgn :: INT -> INT -> INT -> INT -> IO HRGN
createRectRgn :: RegionType -> RegionType -> RegionType -> RegionType -> IO HRGN
createRectRgn RegionType
x0 RegionType
y0 RegionType
x1 RegionType
y1 = do
  Ptr ()
ptr <- String -> IO (Ptr ()) -> IO (Ptr ())
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"CreateRectRgn" (IO (Ptr ()) -> IO (Ptr ())) -> IO (Ptr ()) -> IO (Ptr ())
forall a b. (a -> b) -> a -> b
$ RegionType -> RegionType -> RegionType -> RegionType -> IO (Ptr ())
c_CreateRectRgn RegionType
x0 RegionType
y0 RegionType
x1 RegionType
y1
  Ptr () -> IO HRGN
newForeignHANDLE Ptr ()
ptr
foreign import WINDOWS_CCONV unsafe "windows.h CreateRectRgn"
  c_CreateRectRgn :: INT -> INT -> INT -> INT -> IO PRGN

createRectRgnIndirect :: LPRECT -> IO HRGN
createRectRgnIndirect :: LPRECT -> IO HRGN
createRectRgnIndirect LPRECT
rp = do
  Ptr ()
ptr <- String -> IO (Ptr ()) -> IO (Ptr ())
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"CreateRectRgnIndirect" (IO (Ptr ()) -> IO (Ptr ())) -> IO (Ptr ()) -> IO (Ptr ())
forall a b. (a -> b) -> a -> b
$ LPRECT -> IO (Ptr ())
c_CreateRectRgnIndirect LPRECT
rp
  Ptr () -> IO HRGN
newForeignHANDLE Ptr ()
ptr
foreign import WINDOWS_CCONV unsafe "windows.h CreateRectRgnIndirect"
  c_CreateRectRgnIndirect :: LPRECT -> IO PRGN

createRoundRectRgn :: INT -> INT -> INT -> INT -> INT -> INT -> IO HRGN
createRoundRectRgn :: RegionType
-> RegionType
-> RegionType
-> RegionType
-> RegionType
-> RegionType
-> IO HRGN
createRoundRectRgn RegionType
x0 RegionType
y0 RegionType
x1 RegionType
y1 RegionType
h RegionType
w = do
  Ptr ()
ptr <- String -> IO (Ptr ()) -> IO (Ptr ())
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"CreateRoundRectRgn" (IO (Ptr ()) -> IO (Ptr ())) -> IO (Ptr ()) -> IO (Ptr ())
forall a b. (a -> b) -> a -> b
$ RegionType
-> RegionType
-> RegionType
-> RegionType
-> RegionType
-> RegionType
-> IO (Ptr ())
c_CreateRoundRectRgn RegionType
x0 RegionType
y0 RegionType
x1 RegionType
y1 RegionType
h RegionType
w
  Ptr () -> IO HRGN
newForeignHANDLE Ptr ()
ptr
foreign import WINDOWS_CCONV unsafe "windows.h CreateRoundRectRgn"
  c_CreateRoundRectRgn :: INT -> INT -> INT -> INT -> INT -> INT -> IO PRGN

createPolygonRgn :: [POINT] -> PolyFillMode -> IO HRGN
createPolygonRgn :: [POINT] -> RegionType -> IO HRGN
createPolygonRgn [POINT]
ps RegionType
mode =
  [POINT] -> (Ptr POINT -> Int -> IO HRGN) -> IO HRGN
forall a. [POINT] -> (Ptr POINT -> Int -> IO a) -> IO a
withPOINTArray [POINT]
ps ((Ptr POINT -> Int -> IO HRGN) -> IO HRGN)
-> (Ptr POINT -> Int -> IO HRGN) -> IO HRGN
forall a b. (a -> b) -> a -> b
$ \ Ptr POINT
point_array Int
npoints -> do
  Ptr ()
ptr <- String -> IO (Ptr ()) -> IO (Ptr ())
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"CreatePolygonRgn" (IO (Ptr ()) -> IO (Ptr ())) -> IO (Ptr ()) -> IO (Ptr ())
forall a b. (a -> b) -> a -> b
$
    Ptr POINT -> Int -> RegionType -> IO (Ptr ())
c_CreatePolygonRgn Ptr POINT
point_array Int
npoints RegionType
mode
  Ptr () -> IO HRGN
newForeignHANDLE Ptr ()
ptr
foreign import WINDOWS_CCONV unsafe "windows.h CreatePolygonRgn"
  c_CreatePolygonRgn :: Ptr POINT -> Int -> PolyFillMode -> IO PRGN

-- Needs to do proper error test for EqualRgn; GSL ???

foreign import WINDOWS_CCONV unsafe "windows.h EqualRgn"
  equalRgn :: PRGN -> PRGN -> IO Bool

fillRgn :: HDC -> HRGN -> HBRUSH -> IO ()
fillRgn :: Ptr () -> HRGN -> Ptr () -> IO ()
fillRgn Ptr ()
dc HRGN
rgn Ptr ()
brush =
  HRGN -> (Ptr () -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
rgn ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_rgn ->
  String -> IO Bool -> IO ()
failIfFalse_ String
"FillRgn" (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr () -> Ptr () -> Ptr () -> IO Bool
c_FillRgn Ptr ()
dc Ptr ()
p_rgn Ptr ()
brush
foreign import WINDOWS_CCONV unsafe "windows.h FillRgn"
  c_FillRgn :: HDC -> PRGN -> HBRUSH -> IO Bool

invertRgn :: HDC -> HRGN -> IO ()
invertRgn :: Ptr () -> HRGN -> IO ()
invertRgn Ptr ()
dc HRGN
rgn =
  HRGN -> (Ptr () -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
rgn ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_rgn ->
  String -> IO Bool -> IO ()
failIfFalse_ String
"InvertRgn" (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr () -> Ptr () -> IO Bool
c_InvertRgn Ptr ()
dc Ptr ()
p_rgn
foreign import WINDOWS_CCONV unsafe "windows.h InvertRgn"
  c_InvertRgn :: HDC -> PRGN -> IO Bool

paintRgn :: HDC -> HRGN -> IO ()
paintRgn :: Ptr () -> HRGN -> IO ()
paintRgn Ptr ()
dc HRGN
rgn =
  HRGN -> (Ptr () -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
rgn ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_rgn ->
  String -> IO Bool -> IO ()
failIfFalse_ String
"PaintRgn" (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr () -> Ptr () -> IO Bool
c_PaintRgn Ptr ()
dc Ptr ()
p_rgn
foreign import WINDOWS_CCONV unsafe "windows.h PaintRgn"
  c_PaintRgn :: HDC -> PRGN -> IO Bool

frameRgn :: HDC -> HRGN -> HBRUSH -> Int -> Int -> IO ()
frameRgn :: Ptr () -> HRGN -> Ptr () -> Int -> Int -> IO ()
frameRgn Ptr ()
dc HRGN
rgn Ptr ()
brush Int
w Int
h =
  HRGN -> (Ptr () -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
rgn ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_rgn ->
  String -> IO Bool -> IO ()
failIfFalse_ String
"FrameRgn" (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr () -> Ptr () -> Ptr () -> Int -> Int -> IO Bool
c_FrameRgn Ptr ()
dc Ptr ()
p_rgn Ptr ()
brush Int
w Int
h
foreign import WINDOWS_CCONV unsafe "windows.h FrameRgn"
  c_FrameRgn :: HDC -> PRGN -> HBRUSH -> Int -> Int -> IO Bool

ptInRegion :: HRGN -> Int -> Int -> IO Bool
ptInRegion :: HRGN -> Int -> Int -> IO Bool
ptInRegion HRGN
rgn Int
x Int
y =
  HRGN -> (Ptr () -> IO Bool) -> IO Bool
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
rgn ((Ptr () -> IO Bool) -> IO Bool) -> (Ptr () -> IO Bool) -> IO Bool
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_rgn ->
  Ptr () -> Int -> Int -> IO Bool
c_PtInRegion Ptr ()
p_rgn Int
x Int
y
foreign import WINDOWS_CCONV unsafe "windows.h PtInRegion"
  c_PtInRegion :: PRGN -> Int -> Int -> IO Bool

rectInRegion :: HRGN -> RECT -> IO Bool
rectInRegion :: HRGN -> RECT -> IO Bool
rectInRegion HRGN
rgn RECT
rect =
  HRGN -> (Ptr () -> IO Bool) -> IO Bool
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr HRGN
rgn ((Ptr () -> IO Bool) -> IO Bool) -> (Ptr () -> IO Bool) -> IO Bool
forall a b. (a -> b) -> a -> b
$ \ Ptr ()
p_rgn ->
  RECT -> (LPRECT -> IO Bool) -> IO Bool
forall a. RECT -> (LPRECT -> IO a) -> IO a
withRECT RECT
rect ((LPRECT -> IO Bool) -> IO Bool) -> (LPRECT -> IO Bool) -> IO Bool
forall a b. (a -> b) -> a -> b
$ Ptr () -> LPRECT -> IO Bool
c_RectInRegion Ptr ()
p_rgn
foreign import WINDOWS_CCONV unsafe "windows.h RectInRegion"
  c_RectInRegion :: PRGN -> Ptr RECT -> IO Bool

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