    #if __GLASGOW_HASKELL__ >= 709
    {-# LANGUAGE Safe #-}
    #else
    {-# LANGUAGE Trustworthy #-}
    #endif
    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Graphics.Win32.GDI.Graphics2D
    -- 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
    --
    -- 2D graphics operations
    --
    -----------------------------------------------------------------------------

    module Graphics.Win32.GDI.Graphics2D
            where

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

    import Foreign

    #include "windows_cconv.h"

    ----------------------------------------------------------------
    -- Lines and Curves
    ----------------------------------------------------------------

    moveToEx :: HDC -> Int32 -> Int32 -> IO POINT
    moveToEx :: HDC -> Int32 -> Int32 -> IO POINT
    moveToEx HDC
    dc Int32
    x Int32
    y =
      forall a. (Ptr POINT -> IO a) -> IO a
    allocaPOINT forall a b. (a -> b) -> a -> b
    $ \ Ptr POINT
    p_point -> do
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "MoveToEx" forall a b. (a -> b) -> a -> b
    $ HDC -> Int32 -> Int32 -> Ptr POINT -> IO Bool
    c_MoveToEx HDC
    dc Int32
    x Int32
    y Ptr POINT
    p_point
      Ptr POINT -> IO POINT
    peekPOINT Ptr POINT
    p_point
    foreign import WINDOWS_CCONV unsafe "windows.h MoveToEx"
      c_MoveToEx :: HDC -> Int32 -> Int32 -> Ptr POINT -> IO Bool

    lineTo :: HDC -> Int32 -> Int32 -> IO ()
    lineTo :: HDC -> Int32 -> Int32 -> IO ()
    lineTo HDC
    dc Int32
    x Int32
    y =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "LineTo" forall a b. (a -> b) -> a -> b
    $ HDC -> Int32 -> Int32 -> IO Bool
    c_LineTo HDC
    dc Int32
    x Int32
    y
    foreign import WINDOWS_CCONV unsafe "windows.h LineTo"
      c_LineTo :: HDC -> Int32 -> Int32 -> IO Bool

    polyline :: HDC -> [POINT] -> IO ()
    polyline :: HDC -> [POINT] -> IO ()
    polyline HDC
    dc [POINT]
    points =
      forall a. [POINT] -> (Ptr POINT -> Int -> IO a) -> IO a
    withPOINTArray [POINT]
    points forall a b. (a -> b) -> a -> b
    $ \ Ptr POINT
    pount_array Int
    npoints ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "Polyline" forall a b. (a -> b) -> a -> b
    $ HDC -> Ptr POINT -> Int -> IO Bool
    c_Polyline HDC
    dc Ptr POINT
    pount_array Int
    npoints
    foreign import WINDOWS_CCONV unsafe "windows.h Polyline"
      c_Polyline :: HDC -> Ptr POINT -> Int -> IO Bool

    polylineTo :: HDC -> [POINT] -> IO ()
    polylineTo :: HDC -> [POINT] -> IO ()
    polylineTo HDC
    dc [POINT]
    points =
      forall a. [POINT] -> (Ptr POINT -> Int -> IO a) -> IO a
    withPOINTArray [POINT]
    points forall a b. (a -> b) -> a -> b
    $ \ Ptr POINT
    pount_array Int
    npoints ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "PolylineTo" forall a b. (a -> b) -> a -> b
    $ HDC -> Ptr POINT -> Int -> IO Bool
    c_PolylineTo HDC
    dc Ptr POINT
    pount_array Int
    npoints
    foreign import WINDOWS_CCONV unsafe "windows.h PolylineTo"
      c_PolylineTo :: HDC -> Ptr POINT -> Int -> IO Bool

    polygon :: HDC -> [POINT] -> IO ()
    polygon :: HDC -> [POINT] -> IO ()
    polygon HDC
    dc [POINT]
    points =
      forall a. [POINT] -> (Ptr POINT -> Int -> IO a) -> IO a
    withPOINTArray [POINT]
    points forall a b. (a -> b) -> a -> b
    $ \ Ptr POINT
    pount_array Int
    npoints ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "Polygon" forall a b. (a -> b) -> a -> b
    $ HDC -> Ptr POINT -> Int -> IO Bool
    c_Polygon HDC
    dc Ptr POINT
    pount_array Int
    npoints
    foreign import WINDOWS_CCONV unsafe "windows.h Polygon"
      c_Polygon :: HDC -> Ptr POINT -> Int -> IO Bool

    polyBezier :: HDC -> [POINT] -> IO ()
    polyBezier :: HDC -> [POINT] -> IO ()
    polyBezier HDC
    dc [POINT]
    points =
      forall a. [POINT] -> (Ptr POINT -> Int -> IO a) -> IO a
    withPOINTArray [POINT]
    points forall a b. (a -> b) -> a -> b
    $ \ Ptr POINT
    pount_array Int
    npoints ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "PolyBezier" forall a b. (a -> b) -> a -> b
    $ HDC -> Ptr POINT -> Int -> IO Bool
    c_PolyBezier HDC
    dc Ptr POINT
    pount_array Int
    npoints
    foreign import WINDOWS_CCONV unsafe "windows.h PolyBezier"
      c_PolyBezier :: HDC -> Ptr POINT -> Int -> IO Bool

    polyBezierTo :: HDC -> [POINT] -> IO ()
    polyBezierTo :: HDC -> [POINT] -> IO ()
    polyBezierTo HDC
    dc [POINT]
    points =
      forall a. [POINT] -> (Ptr POINT -> Int -> IO a) -> IO a
    withPOINTArray [POINT]
    points forall a b. (a -> b) -> a -> b
    $ \ Ptr POINT
    pount_array Int
    npoints ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "PolyBezierTo" forall a b. (a -> b) -> a -> b
    $ HDC -> Ptr POINT -> Int -> IO Bool
    c_PolyBezierTo HDC
    dc Ptr POINT
    pount_array Int
    npoints
    foreign import WINDOWS_CCONV unsafe "windows.h PolyBezierTo"
      c_PolyBezierTo :: HDC -> Ptr POINT -> Int -> IO Bool

    arc :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    arc :: HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> IO ()
    arc HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    x1 Int32
    y1 Int32
    x2 Int32
    y2 =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "Arc" forall a b. (a -> b) -> a -> b
    $ HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> IO Bool
    c_Arc HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    x1 Int32
    y1 Int32
    x2 Int32
    y2
    foreign import WINDOWS_CCONV unsafe "windows.h Arc"
      c_Arc :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool

    arcTo :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    arcTo :: HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> IO ()
    arcTo HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    x1 Int32
    y1 Int32
    x2 Int32
    y2 =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "ArcTo" forall a b. (a -> b) -> a -> b
    $ HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> IO Bool
    c_ArcTo HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    x1 Int32
    y1 Int32
    x2 Int32
    y2
    foreign import WINDOWS_CCONV unsafe "windows.h ArcTo"
      c_ArcTo :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool

    angleArc :: HDC -> Int32 -> Int32 -> WORD -> Float -> Float -> IO ()
    angleArc :: HDC -> Int32 -> Int32 -> WORD -> Float -> Float -> IO ()
    angleArc HDC
    dc Int32
    x Int32
    y WORD
    r Float
    start Float
    sweep =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "AngleArc" forall a b. (a -> b) -> a -> b
    $ HDC -> Int32 -> Int32 -> WORD -> Float -> Float -> IO Bool
    c_AngleArc HDC
    dc Int32
    x Int32
    y WORD
    r Float
    start Float
    sweep
    foreign import WINDOWS_CCONV unsafe "windows.h AngleArc"
      c_AngleArc :: HDC -> Int32 -> Int32 -> WORD -> Float -> Float -> IO Bool

    ----------------------------------------------------------------
    -- Filled Shapes
    ----------------------------------------------------------------

    -- ToDo: We ought to be able to specify a colour instead of the
    -- Brush by adding 1 to colour number.

    fillRect :: HDC -> RECT -> HBRUSH -> IO ()
    fillRect :: HDC -> RECT -> HDC -> IO ()
    fillRect HDC
    dc RECT
    rect HDC
    brush =
      forall a. RECT -> (Ptr RECT -> IO a) -> IO a
    withRECT RECT
    rect forall a b. (a -> b) -> a -> b
    $ \ Ptr RECT
    c_rect ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "FillRect" forall a b. (a -> b) -> a -> b
    $ HDC -> Ptr RECT -> HDC -> IO Bool
    c_FillRect HDC
    dc Ptr RECT
    c_rect HDC
    brush
    foreign import WINDOWS_CCONV unsafe "windows.h FillRect"
      c_FillRect :: HDC -> Ptr RECT -> HBRUSH -> IO Bool

    frameRect :: HDC -> RECT -> HBRUSH -> IO ()
    frameRect :: HDC -> RECT -> HDC -> IO ()
    frameRect HDC
    dc RECT
    rect HDC
    brush =
      forall a. RECT -> (Ptr RECT -> IO a) -> IO a
    withRECT RECT
    rect forall a b. (a -> b) -> a -> b
    $ \ Ptr RECT
    c_rect ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "FrameRect" forall a b. (a -> b) -> a -> b
    $ HDC -> Ptr RECT -> HDC -> IO Bool
    c_FrameRect HDC
    dc Ptr RECT
    c_rect HDC
    brush
    foreign import WINDOWS_CCONV unsafe "windows.h FrameRect"
      c_FrameRect :: HDC -> Ptr RECT -> HBRUSH -> IO Bool

    invertRect :: HDC -> RECT -> IO ()
    invertRect :: HDC -> RECT -> IO ()
    invertRect HDC
    dc RECT
    rect =
      forall a. RECT -> (Ptr RECT -> IO a) -> IO a
    withRECT RECT
    rect forall a b. (a -> b) -> a -> b
    $ \ Ptr RECT
    c_rect ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "InvertRect" forall a b. (a -> b) -> a -> b
    $ HDC -> Ptr RECT -> IO Bool
    c_InvertRect HDC
    dc Ptr RECT
    c_rect
    foreign import WINDOWS_CCONV unsafe "windows.h InvertRect"
      c_InvertRect :: HDC -> Ptr RECT -> IO Bool

    rectangle :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    rectangle :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    rectangle HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "Rectangle" forall a b. (a -> b) -> a -> b
    $ HDC -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool
    c_Rectangle HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom
    foreign import WINDOWS_CCONV unsafe "windows.h Rectangle"
      c_Rectangle :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool

    roundRect :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    roundRect :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    roundRect HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    w Int32
    h =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "RoundRect" forall a b. (a -> b) -> a -> b
    $ HDC
    -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool
    c_RoundRect HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    w Int32
    h
    foreign import WINDOWS_CCONV unsafe "windows.h RoundRect"
      c_RoundRect :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool

    ellipse :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    ellipse :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    ellipse HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "Ellipse" forall a b. (a -> b) -> a -> b
    $ HDC -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool
    c_Ellipse HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom
    foreign import WINDOWS_CCONV unsafe "windows.h Ellipse"
      c_Ellipse :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool

    chord :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    chord :: HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> IO ()
    chord HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    x1 Int32
    y1 Int32
    x2 Int32
    y2 =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "Chord" forall a b. (a -> b) -> a -> b
    $ HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> IO Bool
    c_Chord HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    x1 Int32
    y1 Int32
    x2 Int32
    y2
    foreign import WINDOWS_CCONV unsafe "windows.h Chord"
      c_Chord :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool

    pie :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO ()
    pie :: HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> IO ()
    pie HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    x1 Int32
    y1 Int32
    x2 Int32
    y2 =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "Pie" forall a b. (a -> b) -> a -> b
    $ HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> IO Bool
    c_Pie HDC
    dc Int32
    left Int32
    top Int32
    right Int32
    bottom Int32
    x1 Int32
    y1 Int32
    x2 Int32
    y2
    foreign import WINDOWS_CCONV unsafe "windows.h Pie"
      c_Pie :: HDC -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> Int32 -> IO Bool

    ----------------------------------------------------------------
    -- Bitmaps
    ----------------------------------------------------------------

    bitBlt :: HDC -> INT -> INT -> INT -> INT -> HDC -> INT -> INT -> RasterOp3 -> IO ()
    bitBlt :: HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> HDC
    -> Int32
    -> Int32
    -> RasterOp3
    -> IO ()
    bitBlt HDC
    dcDest Int32
    xDest Int32
    yDest Int32
    w Int32
    h HDC
    dcSrc Int32
    xSrc Int32
    ySrc RasterOp3
    rop =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "BitBlt" forall a b. (a -> b) -> a -> b
    $ HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> HDC
    -> Int32
    -> Int32
    -> RasterOp3
    -> IO Bool
    c_BitBlt HDC
    dcDest Int32
    xDest Int32
    yDest Int32
    w Int32
    h HDC
    dcSrc Int32
    xSrc Int32
    ySrc RasterOp3
    rop
    foreign import WINDOWS_CCONV unsafe "windows.h BitBlt"
      c_BitBlt :: HDC -> INT -> INT -> INT -> INT -> HDC -> INT -> INT -> RasterOp3 -> IO Bool

    maskBlt :: HDC -> INT -> INT -> INT -> INT -> HDC -> INT -> INT -> HBITMAP -> INT -> INT -> RasterOp4 -> IO ()
    maskBlt :: HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> HDC
    -> Int32
    -> Int32
    -> HDC
    -> Int32
    -> Int32
    -> RasterOp3
    -> IO ()
    maskBlt HDC
    dcDest Int32
    xDest Int32
    yDest Int32
    w Int32
    h HDC
    dcSrc Int32
    xSrc Int32
    ySrc HDC
    bm Int32
    xMask Int32
    yMask RasterOp3
    rop =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "MaskBlt" forall a b. (a -> b) -> a -> b
    $
        HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> HDC
    -> Int32
    -> Int32
    -> HDC
    -> Int32
    -> Int32
    -> RasterOp3
    -> IO Bool
    c_MaskBlt HDC
    dcDest Int32
    xDest Int32
    yDest Int32
    w Int32
    h HDC
    dcSrc Int32
    xSrc Int32
    ySrc HDC
    bm Int32
    xMask Int32
    yMask RasterOp3
    rop
    foreign import WINDOWS_CCONV unsafe "windows.h MaskBlt"
      c_MaskBlt :: HDC -> INT -> INT -> INT -> INT -> HDC -> INT -> INT -> HBITMAP -> INT -> INT -> RasterOp4 -> IO Bool

    stretchBlt :: HDC -> INT -> INT -> INT -> INT -> HDC -> INT -> INT -> INT -> INT -> RasterOp3 -> IO ()
    stretchBlt :: HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> RasterOp3
    -> IO ()
    stretchBlt HDC
    dcDest Int32
    xDest Int32
    yDest Int32
    wDest Int32
    hDest HDC
    hdcSrc Int32
    xSrc Int32
    ySrc Int32
    wSrc Int32
    hSrc RasterOp3
    rop =
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "StretchBlt" forall a b. (a -> b) -> a -> b
    $
        HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> RasterOp3
    -> IO Bool
    c_StretchBlt HDC
    dcDest Int32
    xDest Int32
    yDest Int32
    wDest Int32
    hDest HDC
    hdcSrc Int32
    xSrc Int32
    ySrc Int32
    wSrc Int32
    hSrc RasterOp3
    rop
    foreign import WINDOWS_CCONV unsafe "windows.h StretchBlt"
      c_StretchBlt :: HDC -> INT -> INT -> INT -> INT -> HDC -> INT -> INT -> INT -> INT -> RasterOp3 -> IO Bool

    -- We deviate slightly from the Win32 interface

    -- %C typedef POINT ThreePts[3];

    -- Old 2nd line:
    -- %start POINT vertices[3];

    plgBlt :: HDC -> POINT -> POINT -> POINT -> HDC -> INT -> INT -> INT -> INT -> MbHBITMAP -> INT -> INT -> IO ()
    plgBlt :: HDC
    -> POINT
    -> POINT
    -> POINT
    -> HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> MbHBITMAP
    -> Int32
    -> Int32
    -> IO ()
    plgBlt HDC
    hdDest POINT
    p1 POINT
    p2 POINT
    p3 HDC
    hdSrc Int32
    x Int32
    y Int32
    w Int32
    h MbHBITMAP
    mb_bm Int32
    xMask Int32
    yMask =
      forall a. [POINT] -> (Ptr POINT -> Int -> IO a) -> IO a
    withPOINTArray [POINT
    p1,POINT
    p2,POINT
    p3] forall a b. (a -> b) -> a -> b
    $ \ Ptr POINT
    vertices Int
    _ ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "PlgBlt" forall a b. (a -> b) -> a -> b
    $
        HDC
    -> Ptr POINT
    -> HDC
    -> Int32
    -> Int32
    -> Int32
    -> Int32
    -> HDC
    -> Int32
    -> Int32
    -> IO Bool
    c_PlgBlt HDC
    hdDest Ptr POINT
    vertices HDC
    hdSrc Int32
    x Int32
    y Int32
    w Int32
    h (forall a. Maybe (Ptr a) -> Ptr a
    maybePtr MbHBITMAP
    mb_bm) Int32
    xMask Int32
    yMask
    foreign import WINDOWS_CCONV unsafe "windows.h PlgBlt"
      c_PlgBlt :: HDC -> Ptr POINT -> HDC -> INT -> INT -> INT -> INT -> HBITMAP -> INT -> INT -> IO Bool

    ----------------------------------------------------------------
    -- Fonts and Text
    ----------------------------------------------------------------

    textOut :: HDC -> INT -> INT -> String -> IO ()
    textOut :: HDC -> Int32 -> Int32 -> String -> IO ()
    textOut HDC
    dc Int32
    x Int32
    y String
    str =
      forall a. String -> ((LPTSTR, Int) -> IO a) -> IO a
    withTStringLen String
    str forall a b. (a -> b) -> a -> b
    $ \ (LPTSTR
    c_str, Int
    len) ->
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "TextOut" forall a b. (a -> b) -> a -> b
    $ HDC -> Int32 -> Int32 -> LPTSTR -> Int -> IO Bool
    c_TextOut HDC
    dc Int32
    x Int32
    y LPTSTR
    c_str Int
    len
    foreign import WINDOWS_CCONV unsafe "windows.h TextOutW"
      c_TextOut :: HDC -> INT -> INT -> LPCTSTR -> Int -> IO Bool

    -- missing TabbedTextOut from WinFonts.ss; GSL ???

    getTextExtentPoint32 :: HDC -> String -> IO SIZE
    getTextExtentPoint32 :: HDC -> String -> IO POINT
    getTextExtentPoint32 HDC
    dc String
    str =
      forall a. String -> ((LPTSTR, Int) -> IO a) -> IO a
    withTStringLen String
    str forall a b. (a -> b) -> a -> b
    $ \ (LPTSTR
    c_str, Int
    len) ->
      forall a. (Ptr POINT -> IO a) -> IO a
    allocaSIZE forall a b. (a -> b) -> a -> b
    $ \ Ptr POINT
    p_size -> do
      String -> IO Bool -> IO ()
    failIfFalse_ String
    "GetTextExtentPoint32" forall a b. (a -> b) -> a -> b
    $
        HDC -> LPTSTR -> Int -> Ptr POINT -> IO Bool
    c_GetTextExtentPoint32 HDC
    dc LPTSTR
    c_str Int
    len Ptr POINT
    p_size
      Ptr POINT -> IO POINT
    peekSIZE Ptr POINT
    p_size
    foreign import WINDOWS_CCONV unsafe "windows.h GetTextExtentPoint32W"
      c_GetTextExtentPoint32 :: HDC -> LPCTSTR -> Int -> Ptr SIZE -> IO Bool

    -- missing getTabbedTextExtent from WinFonts.ss; GSL ???
    -- missing SetTextJustification from WinFonts.ss; GSL ???
    -- missing a whole family of techandfamily functionality; GSL ???
    -- missing DrawText and DrawTextFormat in WinFonts.ss; GSL ???

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