{-# LANGUAGE ScopedTypeVariables #-}

{-# LINE 2 "./Graphics/UI/Gtk/Gdk/Drawable.chs" #-}
-- -*-haskell-*-
-- GIMP Toolkit (GTK) Drawable
--
-- Author : Axel Simon
--
-- Created: 22 September 2002
--
-- Copyright (C) 2002-2005 Axel Simon
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Lesser General Public
-- License as published by the Free Software Foundation; either
-- version 2.1 of the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Lesser General Public License for more details.
--
-- TODO
--
-- if gdk_visuals are implemented, do: get_visual
--
-- if gdk_colormaps are implemented, do: set_colormap, get_colormap
--
-- |
-- Maintainer : gtk2hs-users@lists.sourceforge.net
-- Stability : provisional
-- Portability : portable (depends on GHC)
--
-- Drawing primitives.
--
-- This module defines drawing primitives that can operate on 'DrawWindow's
-- and 'Pixmap's.
--
-- This module is empty when built with Gtk3 because GTKDrawable has been
-- removed.
module Graphics.UI.Gtk.Gdk.Drawable (

  Drawable,
  DrawableClass,
  castToDrawable, gTypeDrawable,
  toDrawable,
  drawableGetDepth,
  drawableGetSize,
  drawableGetClipRegion,
  drawableGetVisibleRegion,
  drawableGetID,
  Point,
  drawPoint,
  drawPoints,
  drawLine,
  drawLines,

  Dither(..),
  drawPixbuf,

  drawSegments,
  drawRectangle,
  drawArc,
  drawPolygon,
  drawGlyphs,
  drawLayoutLine,
  drawLayoutLineWithColors,
  drawLayout,
  drawLayoutWithColors,
  drawDrawable,

) where


import Control.Monad (liftM)

import System.Glib.FFI
import Graphics.UI.Gtk.General.Structs (Point, drawableGetID)
import Graphics.Rendering.Pango.Structs
import Graphics.Rendering.Pango.Types
{-# LINE 79 "./Graphics/UI/Gtk/Gdk/Drawable.chs" #-}
import Graphics.Rendering.Pango.BasicTypes
{-# LINE 80 "./Graphics/UI/Gtk/Gdk/Drawable.chs" #-}
import Graphics.UI.Gtk.Types
{-# LINE 81 "./Graphics/UI/Gtk/Gdk/Drawable.chs" #-}

import Graphics.UI.Gtk.Gdk.Region (Region, makeNewRegion)

import Graphics.UI.Gtk.Gdk.Enums (Dither(..))


{-# LINE 87 "./Graphics/UI/Gtk/Gdk/Drawable.chs" #-}

-- methods

-- | Get the size of pixels.
--
-- * Returns the number of bits which are use to store information on each
-- pixels in this 'Drawable'.
--
drawableGetDepth :: DrawableClass d => d -> IO Int
drawableGetDepth :: forall d. DrawableClass d => d -> IO Int
drawableGetDepth d
d = (CInt -> Int) -> IO CInt -> IO Int
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (IO CInt -> IO Int) -> IO CInt -> IO Int
forall a b. (a -> b) -> a -> b
$
                     (\(Drawable ForeignPtr Drawable
arg1) -> ForeignPtr Drawable -> (Ptr Drawable -> IO CInt) -> IO CInt
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO CInt) -> IO CInt)
-> (Ptr Drawable -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->Ptr Drawable -> IO CInt
gdk_drawable_get_depth Ptr Drawable
argPtr1) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d)

-- | Retrieve the size of the 'Drawable'.
--
-- * The result might not be up-to-date if there are still resizing messages
-- to be processed.
--
drawableGetSize :: DrawableClass d => d -> IO (Int, Int)
drawableGetSize :: forall d. DrawableClass d => d -> IO (Int, Int)
drawableGetSize d
d = (Ptr CInt -> IO (Int, Int)) -> IO (Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO (Int, Int)) -> IO (Int, Int))
-> (Ptr CInt -> IO (Int, Int)) -> IO (Int, Int)
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
wPtr -> (Ptr CInt -> IO (Int, Int)) -> IO (Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO (Int, Int)) -> IO (Int, Int))
-> (Ptr CInt -> IO (Int, Int)) -> IO (Int, Int)
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
hPtr -> do
  (\(Drawable ForeignPtr Drawable
arg1) Ptr CInt
arg2 Ptr CInt
arg3 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->Ptr Drawable -> Ptr CInt -> Ptr CInt -> IO ()
gdk_drawable_get_size Ptr Drawable
argPtr1 Ptr CInt
arg2 Ptr CInt
arg3) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d) Ptr CInt
wPtr Ptr CInt
hPtr
  (CInt
w::(CInt)) <- Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek Ptr CInt
wPtr
  (CInt
h::(CInt)) <- Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek Ptr CInt
hPtr
  (Int, Int) -> IO (Int, Int)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
w, CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
h)

-- | Determine where not to draw.
--
-- * Computes the region of a drawable that potentially can be written
-- to by drawing primitives. This region will not take into account the
-- clip region for the GC, and may also not take into account other
-- factors such as if the window is obscured by other windows, but no
-- area outside of this region will be affected by drawing primitives.
--
drawableGetClipRegion :: DrawableClass d => d -> IO Region
drawableGetClipRegion :: forall d. DrawableClass d => d -> IO Region
drawableGetClipRegion d
d = do
  Ptr Region
rPtr <- (\(Drawable ForeignPtr Drawable
arg1) -> ForeignPtr Drawable
-> (Ptr Drawable -> IO (Ptr Region)) -> IO (Ptr Region)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO (Ptr Region)) -> IO (Ptr Region))
-> (Ptr Drawable -> IO (Ptr Region)) -> IO (Ptr Region)
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->Ptr Drawable -> IO (Ptr Region)
gdk_drawable_get_clip_region Ptr Drawable
argPtr1) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d)
  Ptr Region -> IO Region
makeNewRegion Ptr Region
rPtr

-- | Determine what not to redraw.
--
-- * Computes the region of a drawable that is potentially visible.
-- This does not necessarily take into account if the window is obscured
-- by other windows, but no area outside of this region is visible.
--
drawableGetVisibleRegion :: DrawableClass d => d -> IO Region
drawableGetVisibleRegion :: forall d. DrawableClass d => d -> IO Region
drawableGetVisibleRegion d
d = do
  Ptr Region
rPtr <- (\(Drawable ForeignPtr Drawable
arg1) -> ForeignPtr Drawable
-> (Ptr Drawable -> IO (Ptr Region)) -> IO (Ptr Region)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO (Ptr Region)) -> IO (Ptr Region))
-> (Ptr Drawable -> IO (Ptr Region)) -> IO (Ptr Region)
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->Ptr Drawable -> IO (Ptr Region)
gdk_drawable_get_visible_region Ptr Drawable
argPtr1) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d)
  Ptr Region -> IO Region
makeNewRegion Ptr Region
rPtr

-- | Draw a point into a 'Drawable'.
--
drawPoint :: DrawableClass d => d -> GC -> Point -> IO ()
drawPoint :: forall d. DrawableClass d => d -> GC -> (Int, Int) -> IO ()
drawPoint d
d GC
gc (Int
x,Int
y) = (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) CInt
arg3 CInt
arg4 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->Ptr Drawable -> Ptr GC -> CInt -> CInt -> IO ()
gdk_draw_point Ptr Drawable
argPtr1 Ptr GC
argPtr2 CInt
arg3 CInt
arg4) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d)
  (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y)


-- | Draw several points into a 'Drawable'.
--
-- * This function is more efficient than calling 'drawPoint' on
-- several points.
--
drawPoints :: DrawableClass d => d -> GC -> [Point] -> IO ()
drawPoints :: forall d. DrawableClass d => d -> GC -> [(Int, Int)] -> IO ()
drawPoints d
d GC
gc [] = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
drawPoints d
d GC
gc [(Int, Int)]
points =
  [CInt] -> (Ptr CInt -> IO ()) -> IO ()
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray (((Int, Int) -> [CInt]) -> [(Int, Int)] -> [CInt]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\(Int
x,Int
y) -> [Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x, Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y]) [(Int, Int)]
points) ((Ptr CInt -> IO ()) -> IO ()) -> (Ptr CInt -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
  \(Ptr CInt
aPtr :: Ptr (CInt)) -> (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) Ptr ()
arg3 CInt
arg4 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->Ptr Drawable -> Ptr GC -> Ptr () -> CInt -> IO ()
gdk_draw_points Ptr Drawable
argPtr1 Ptr GC
argPtr2 Ptr ()
arg3 CInt
arg4) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d)
    (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc) (Ptr CInt -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr CInt
aPtr) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([(Int, Int)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
points))

-- | Draw a line into a 'Drawable'.
--
-- * The parameters are x1, y1, x2, y2.
--
-- * Drawing several separate lines can be done more efficiently by
-- 'drawSegments'.
--
drawLine :: DrawableClass d => d -> GC -> Point -> Point -> IO ()
drawLine :: forall d.
DrawableClass d =>
d -> GC -> (Int, Int) -> (Int, Int) -> IO ()
drawLine d
d GC
gc (Int
x1,Int
y1) (Int
x2,Int
y2) = (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) CInt
arg3 CInt
arg4 CInt
arg5 CInt
arg6 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->Ptr Drawable -> Ptr GC -> CInt -> CInt -> CInt -> CInt -> IO ()
gdk_draw_line Ptr Drawable
argPtr1 Ptr GC
argPtr2 CInt
arg3 CInt
arg4 CInt
arg5 CInt
arg6) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d)
  (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x1) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y1) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x2)
  (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y2)

-- | Draw several lines.
--
-- * The function uses the current line width, dashing and especially the
-- joining specification in the graphics context (in contrast to
-- 'drawSegments'.
--
drawLines :: DrawableClass d => d -> GC -> [Point] -> IO ()
drawLines :: forall d. DrawableClass d => d -> GC -> [(Int, Int)] -> IO ()
drawLines d
d GC
gc [] = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
drawLines d
d GC
gc [(Int, Int)]
points =
  [CInt] -> (Ptr CInt -> IO ()) -> IO ()
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray (((Int, Int) -> [CInt]) -> [(Int, Int)] -> [CInt]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\(Int
x,Int
y) -> [Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x, Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y]) [(Int, Int)]
points) ((Ptr CInt -> IO ()) -> IO ()) -> (Ptr CInt -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
  \(Ptr CInt
aPtr :: Ptr (CInt)) -> (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) Ptr ()
arg3 CInt
arg4 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->Ptr Drawable -> Ptr GC -> Ptr () -> CInt -> IO ()
gdk_draw_lines Ptr Drawable
argPtr1 Ptr GC
argPtr2 Ptr ()
arg3 CInt
arg4) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d)
    (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc) (Ptr CInt -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr CInt
aPtr) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([(Int, Int)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
points))


-- | Render a 'Pixbuf'.
--
-- * Usage:
-- @drawPixbuf d gc pb srcX srcY destX destY srcWidth srcHeight dither xDither yDither@
-- Renders a rectangular portion of a 'Pixbuf' to a
-- 'Drawable'. The @srcX@, @srcY@,
-- @srcWidth@ and @srcHeight@ specify what part of the
-- 'Pixbuf' should be rendered. The latter two values may be
-- @-1@ in which case the width and height are taken from
-- @pb@. The image is placed at @destX@, @destY@.
-- If you render parts of an image at a time, set @ditherX@ and
-- @ditherY@ to the origin of the image you are rendering.
--
-- * Since 2.2.
--
drawPixbuf :: DrawableClass d => d -> GC -> Pixbuf -> Int -> Int ->
                                 Int -> Int -> Int -> Int -> Dither ->
                                 Int -> Int -> IO ()
drawPixbuf :: forall d.
DrawableClass d =>
d
-> GC
-> Pixbuf
-> Int
-> Int
-> Int
-> Int
-> Int
-> Int
-> Dither
-> Int
-> Int
-> IO ()
drawPixbuf d
d GC
gc Pixbuf
pb Int
srcX Int
srcY Int
destX Int
destY Int
srcWidth Int
srcHeight Dither
dither
  Int
xDither Int
yDither = (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) (Pixbuf ForeignPtr Pixbuf
arg3) CInt
arg4 CInt
arg5 CInt
arg6 CInt
arg7 CInt
arg8 CInt
arg9 CInt
arg10 CInt
arg11 CInt
arg12 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->ForeignPtr Pixbuf -> (Ptr Pixbuf -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Pixbuf
arg3 ((Ptr Pixbuf -> IO ()) -> IO ()) -> (Ptr Pixbuf -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Pixbuf
argPtr3 ->Ptr Drawable
-> Ptr GC
-> Ptr Pixbuf
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> IO ()
gdk_draw_pixbuf Ptr Drawable
argPtr1 Ptr GC
argPtr2 Ptr Pixbuf
argPtr3 CInt
arg4 CInt
arg5 CInt
arg6 CInt
arg7 CInt
arg8 CInt
arg9 CInt
arg10 CInt
arg11 CInt
arg12) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d)
    GC
gc Pixbuf
pb (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
srcX) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
srcY) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
destX)
    (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
destY) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
srcWidth) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
srcHeight)
    ((Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CInt) -> (Dither -> Int) -> Dither -> CInt
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dither -> Int
forall a. Enum a => a -> Int
fromEnum) Dither
dither) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
xDither)
    (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
yDither)



-- | Draw several unconnected lines.
--
-- * This method draws several unrelated lines.
--
drawSegments :: DrawableClass d => d -> GC -> [(Point,Point)] -> IO ()
drawSegments :: forall d.
DrawableClass d =>
d -> GC -> [((Int, Int), (Int, Int))] -> IO ()
drawSegments d
d GC
gc [] = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
drawSegments d
d GC
gc [((Int, Int), (Int, Int))]
pps = [CInt] -> (Ptr CInt -> IO ()) -> IO ()
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray ((((Int, Int), (Int, Int)) -> [CInt])
-> [((Int, Int), (Int, Int))] -> [CInt]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\((Int
x1,Int
y1),(Int
x2,Int
y2)) ->
  [Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x1, Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y1, Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x2, Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y2])
  [((Int, Int), (Int, Int))]
pps) ((Ptr CInt -> IO ()) -> IO ()) -> (Ptr CInt -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \(Ptr CInt
aPtr :: Ptr (CInt)) ->
    (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) Ptr ()
arg3 CInt
arg4 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->Ptr Drawable -> Ptr GC -> Ptr () -> CInt -> IO ()
gdk_draw_segments Ptr Drawable
argPtr1 Ptr GC
argPtr2 Ptr ()
arg3 CInt
arg4) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d) (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc)
    (Ptr CInt -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr CInt
aPtr) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([((Int, Int), (Int, Int))] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [((Int, Int), (Int, Int))]
pps))

-- | Draw a rectangular object.
--
-- * Draws a rectangular outline or filled rectangle, using the
-- foreground color and other attributes of the 'GC'.
--
-- * A rectangle drawn filled is 1 pixel smaller in both dimensions
-- than a rectangle outlined. Calling 'drawRectangle' w gc
-- True 0 0 20 20 results in a filled rectangle 20 pixels wide and 20
-- pixels high. Calling 'drawRectangle' d gc False 0 0 20 20
-- results in an outlined rectangle with corners at (0, 0), (0, 20), (20,
-- 20), and (20, 0), which makes it 21 pixels wide and 21 pixels high.
--
drawRectangle :: DrawableClass d => d -- ^ drawable
  -> GC -- ^ graphics context
  -> Bool -- ^ filled
  -> Int -- ^ x
  -> Int -- ^ y
  -> Int -- ^ width
  -> Int -- ^ height
  -> IO ()
drawRectangle :: forall d.
DrawableClass d =>
d -> GC -> Bool -> Int -> Int -> Int -> Int -> IO ()
drawRectangle d
d GC
gc Bool
filled Int
x Int
y Int
width Int
height = (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) CInt
arg3 CInt
arg4 CInt
arg5 CInt
arg6 CInt
arg7 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->Ptr Drawable
-> Ptr GC -> CInt -> CInt -> CInt -> CInt -> CInt -> IO ()
gdk_draw_rectangle Ptr Drawable
argPtr1 Ptr GC
argPtr2 CInt
arg3 CInt
arg4 CInt
arg5 CInt
arg6 CInt
arg7)
{-# LINE 240 "./Graphics/UI/Gtk/Gdk/Drawable.chs" #-}
  (toDrawable d) (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc) (Bool -> CInt
forall a. Num a => Bool -> a
fromBool Bool
filled) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x)
  (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
width) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
height)

-- | Draws an arc or a filled 'pie slice'.
--
-- * The arc is defined by the bounding rectangle of the entire
-- ellipse, and the start and end angles of the part of the ellipse to be
-- drawn.
--
-- * The starting angle @aStart@ is relative to the 3 o'clock
-- position, counter-clockwise, in 1\/64ths of a degree. @aEnd@
-- is measured similarly, but relative to @aStart@.
--
drawArc :: DrawableClass d => d -> GC -> Bool -> Int -> Int ->
                                 Int -> Int -> Int -> Int -> IO ()
drawArc :: forall d.
DrawableClass d =>
d -> GC -> Bool -> Int -> Int -> Int -> Int -> Int -> Int -> IO ()
drawArc d
d GC
gc Bool
filled Int
x Int
y Int
width Int
height Int
aStart Int
aEnd =
  (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) CInt
arg3 CInt
arg4 CInt
arg5 CInt
arg6 CInt
arg7 CInt
arg8 CInt
arg9 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->Ptr Drawable
-> Ptr GC
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> IO ()
gdk_draw_arc Ptr Drawable
argPtr1 Ptr GC
argPtr2 CInt
arg3 CInt
arg4 CInt
arg5 CInt
arg6 CInt
arg7 CInt
arg8 CInt
arg9) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d) (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc) (Bool -> CInt
forall a. Num a => Bool -> a
fromBool Bool
filled)
  (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
width) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
height)
  (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
aStart) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
aEnd)

-- | Draws an outlined or filled polygon.
--
-- * The polygon is closed automatically, connecting the last point to
-- the first point if necessary.
--
drawPolygon :: DrawableClass d => d -> GC -> Bool -> [Point] -> IO ()
drawPolygon :: forall d.
DrawableClass d =>
d -> GC -> Bool -> [(Int, Int)] -> IO ()
drawPolygon d
_ GC
_ Bool
_ [] = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
drawPolygon d
d GC
gc Bool
filled [(Int, Int)]
points =
  [CInt] -> (Ptr CInt -> IO ()) -> IO ()
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray (((Int, Int) -> [CInt]) -> [(Int, Int)] -> [CInt]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\(Int
x,Int
y) -> [Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x, Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y]) [(Int, Int)]
points) ((Ptr CInt -> IO ()) -> IO ()) -> (Ptr CInt -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
  \(Ptr CInt
aPtr::Ptr (CInt)) -> (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) CInt
arg3 Ptr ()
arg4 CInt
arg5 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->Ptr Drawable -> Ptr GC -> CInt -> Ptr () -> CInt -> IO ()
gdk_draw_polygon Ptr Drawable
argPtr1 Ptr GC
argPtr2 CInt
arg3 Ptr ()
arg4 CInt
arg5) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d)
  (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc) (Bool -> CInt
forall a. Num a => Bool -> a
fromBool Bool
filled) (Ptr CInt -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr CInt
aPtr) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([(Int, Int)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, Int)]
points))

-- | Draw a segment of text.
--
-- * This function draws a segment of text. These segments are the result
-- of itemizing a string into segments with the same characteristics
-- (font, text direction, etc.) using
-- 'Graphics.Rendering.Pango.Rendering.itemize'. Each item is then turned
-- into a shapes by calling 'Graphics.Rendering.Pango.Rendering.shape'.
-- These shapes can then be drawn onto screen using this function.
-- A simpler interface, that also takes care of breaking a paragraph
-- into several lines is a 'Graphics.Rendering.Pango.Layout.LayoutLine'.
--
drawGlyphs :: DrawableClass d => d -> GC -> Int -> Int -> GlyphItem -> IO ()
drawGlyphs :: forall d.
DrawableClass d =>
d -> GC -> Int -> Int -> GlyphItem -> IO ()
drawGlyphs d
d GC
gc Int
x Int
y (GlyphItem PangoItem
pi GlyphStringRaw
gs) = do
  Font
font <- PangoItem -> IO Font
pangoItemGetFont PangoItem
pi
  (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) (Font ForeignPtr Font
arg3) CInt
arg4 CInt
arg5 (GlyphStringRaw ForeignPtr GlyphStringRaw
arg6) -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->ForeignPtr Font -> (Ptr Font -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Font
arg3 ((Ptr Font -> IO ()) -> IO ()) -> (Ptr Font -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Font
argPtr3 ->ForeignPtr GlyphStringRaw -> (Ptr GlyphStringRaw -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GlyphStringRaw
arg6 ((Ptr GlyphStringRaw -> IO ()) -> IO ())
-> (Ptr GlyphStringRaw -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GlyphStringRaw
argPtr6 ->Ptr Drawable
-> Ptr GC
-> Ptr Font
-> CInt
-> CInt
-> Ptr GlyphStringRaw
-> IO ()
gdk_draw_glyphs Ptr Drawable
argPtr1 Ptr GC
argPtr2 Ptr Font
argPtr3 CInt
arg4 CInt
arg5 Ptr GlyphStringRaw
argPtr6) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d) (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc) Font
font
    (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) GlyphStringRaw
gs

--
-- | Draw a single line of text.
--
-- * The @x@ coordinate specifies the start of the string,
-- the @y@ coordinate specifies the base line.
--
drawLayoutLine :: DrawableClass d => d -> GC -> Int -> Int -> LayoutLine ->
                                     IO ()
drawLayoutLine :: forall d.
DrawableClass d =>
d -> GC -> Int -> Int -> LayoutLine -> IO ()
drawLayoutLine d
d GC
gc Int
x Int
y (LayoutLine IORef PangoString
_ LayoutLineRaw
ll) =
  (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) CInt
arg3 CInt
arg4 (LayoutLineRaw ForeignPtr LayoutLineRaw
arg5) -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->ForeignPtr LayoutLineRaw -> (Ptr LayoutLineRaw -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr LayoutLineRaw
arg5 ((Ptr LayoutLineRaw -> IO ()) -> IO ())
-> (Ptr LayoutLineRaw -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr LayoutLineRaw
argPtr5 ->Ptr Drawable
-> Ptr GC -> CInt -> CInt -> Ptr LayoutLineRaw -> IO ()
gdk_draw_layout_line Ptr Drawable
argPtr1 Ptr GC
argPtr2 CInt
arg3 CInt
arg4 Ptr LayoutLineRaw
argPtr5) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d) (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc)
    (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) LayoutLineRaw
ll

-- | Draw a single line of text.
--
-- * The @x@ coordinate specifies the start of the string,
-- the @y@ coordinate specifies the base line.
--
-- * If both colors are @Nothing@ this function will behave like
-- 'drawLayoutLine' in that it uses the default colors from
-- the graphics context.
--
drawLayoutLineWithColors :: DrawableClass d => d -> GC -> Int -> Int ->
                            LayoutLine -> Maybe Color -> Maybe Color -> IO ()
drawLayoutLineWithColors :: forall d.
DrawableClass d =>
d
-> GC
-> Int
-> Int
-> LayoutLine
-> Maybe Color
-> Maybe Color
-> IO ()
drawLayoutLineWithColors d
d GC
gc Int
x Int
y (LayoutLine IORef PangoString
_ LayoutLineRaw
ll) Maybe Color
foreground Maybe Color
background = let
    withMB :: Storable a => Maybe a -> (Ptr a -> IO b) -> IO b
    withMB :: forall a b. Storable a => Maybe a -> (Ptr a -> IO b) -> IO b
withMB Maybe a
Nothing Ptr a -> IO b
f = Ptr a -> IO b
f Ptr a
forall a. Ptr a
nullPtr
    withMB (Just a
x) Ptr a -> IO b
f = a -> (Ptr a -> IO b) -> IO b
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with a
x Ptr a -> IO b
f
  in
    Maybe Color -> (Ptr Color -> IO ()) -> IO ()
forall a b. Storable a => Maybe a -> (Ptr a -> IO b) -> IO b
withMB Maybe Color
foreground ((Ptr Color -> IO ()) -> IO ()) -> (Ptr Color -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Color
fPtr -> Maybe Color -> (Ptr Color -> IO ()) -> IO ()
forall a b. Storable a => Maybe a -> (Ptr a -> IO b) -> IO b
withMB Maybe Color
background ((Ptr Color -> IO ()) -> IO ()) -> (Ptr Color -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Color
bPtr ->
    (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) CInt
arg3 CInt
arg4 (LayoutLineRaw ForeignPtr LayoutLineRaw
arg5) Ptr ()
arg6 Ptr ()
arg7 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->ForeignPtr LayoutLineRaw -> (Ptr LayoutLineRaw -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr LayoutLineRaw
arg5 ((Ptr LayoutLineRaw -> IO ()) -> IO ())
-> (Ptr LayoutLineRaw -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr LayoutLineRaw
argPtr5 ->Ptr Drawable
-> Ptr GC
-> CInt
-> CInt
-> Ptr LayoutLineRaw
-> Ptr ()
-> Ptr ()
-> IO ()
gdk_draw_layout_line_with_colors Ptr Drawable
argPtr1 Ptr GC
argPtr2 CInt
arg3 CInt
arg4 Ptr LayoutLineRaw
argPtr5 Ptr ()
arg6 Ptr ()
arg7) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d) (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc)
      (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) LayoutLineRaw
ll (Ptr Color -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr Color
fPtr) (Ptr Color -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr Color
bPtr)


-- | Draw a paragraph of text.
--
-- * The @x@ and @y@ values specify the upper left
-- point of the layout.
--
drawLayout :: DrawableClass d => d -> GC -> Int -> Int -> PangoLayout -> IO ()
drawLayout :: forall d.
DrawableClass d =>
d -> GC -> Int -> Int -> PangoLayout -> IO ()
drawLayout d
d GC
gc Int
x Int
y (PangoLayout IORef PangoString
_ PangoLayoutRaw
pl) =
  (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) CInt
arg3 CInt
arg4 (PangoLayoutRaw ForeignPtr PangoLayoutRaw
arg5) -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->ForeignPtr PangoLayoutRaw -> (Ptr PangoLayoutRaw -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr PangoLayoutRaw
arg5 ((Ptr PangoLayoutRaw -> IO ()) -> IO ())
-> (Ptr PangoLayoutRaw -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr PangoLayoutRaw
argPtr5 ->Ptr Drawable
-> Ptr GC -> CInt -> CInt -> Ptr PangoLayoutRaw -> IO ()
gdk_draw_layout Ptr Drawable
argPtr1 Ptr GC
argPtr2 CInt
arg3 CInt
arg4 Ptr PangoLayoutRaw
argPtr5) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d) (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc)
    (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) PangoLayoutRaw
pl

-- | Draw a paragraph of text.
--
-- * The @x@ and @y@ values specify the upper left
-- point of the layout.
--
-- * If both colors are @Nothing@ this function will behave like
-- 'drawLayout' in that it uses the default colors from
-- the graphics context.
--
drawLayoutWithColors :: DrawableClass d => d -> GC -> Int -> Int ->
                        PangoLayout -> Maybe Color -> Maybe Color -> IO ()
drawLayoutWithColors :: forall d.
DrawableClass d =>
d
-> GC
-> Int
-> Int
-> PangoLayout
-> Maybe Color
-> Maybe Color
-> IO ()
drawLayoutWithColors d
d GC
gc Int
x Int
y (PangoLayout IORef PangoString
_ PangoLayoutRaw
pl) Maybe Color
foreground Maybe Color
background = let
    withMB :: Storable a => Maybe a -> (Ptr a -> IO b) -> IO b
    withMB :: forall a b. Storable a => Maybe a -> (Ptr a -> IO b) -> IO b
withMB Maybe a
Nothing Ptr a -> IO b
f = Ptr a -> IO b
f Ptr a
forall a. Ptr a
nullPtr
    withMB (Just a
x) Ptr a -> IO b
f = a -> (Ptr a -> IO b) -> IO b
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with a
x Ptr a -> IO b
f
  in
    Maybe Color -> (Ptr Color -> IO ()) -> IO ()
forall a b. Storable a => Maybe a -> (Ptr a -> IO b) -> IO b
withMB Maybe Color
foreground ((Ptr Color -> IO ()) -> IO ()) -> (Ptr Color -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Color
fPtr -> Maybe Color -> (Ptr Color -> IO ()) -> IO ()
forall a b. Storable a => Maybe a -> (Ptr a -> IO b) -> IO b
withMB Maybe Color
background ((Ptr Color -> IO ()) -> IO ()) -> (Ptr Color -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Color
bPtr ->
    (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) CInt
arg3 CInt
arg4 (PangoLayoutRaw ForeignPtr PangoLayoutRaw
arg5) Ptr ()
arg6 Ptr ()
arg7 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->ForeignPtr PangoLayoutRaw -> (Ptr PangoLayoutRaw -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr PangoLayoutRaw
arg5 ((Ptr PangoLayoutRaw -> IO ()) -> IO ())
-> (Ptr PangoLayoutRaw -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr PangoLayoutRaw
argPtr5 ->Ptr Drawable
-> Ptr GC
-> CInt
-> CInt
-> Ptr PangoLayoutRaw
-> Ptr ()
-> Ptr ()
-> IO ()
gdk_draw_layout_with_colors Ptr Drawable
argPtr1 Ptr GC
argPtr2 CInt
arg3 CInt
arg4 Ptr PangoLayoutRaw
argPtr5 Ptr ()
arg6 Ptr ()
arg7) (d -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable d
d) (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc)
      (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) PangoLayoutRaw
pl (Ptr Color -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr Color
fPtr) (Ptr Color -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr Color
bPtr)


-- | Copies another 'Drawable'.
--
-- * Copies the (width,height) region of the @src@ at coordinates
-- (@xSrc@, @ySrc@) to coordinates (@xDest@,
-- @yDest@) in the @dest@. The @width@ and\/or
-- @height@ may be given as -1, in which case the entire source
-- drawable will be copied.
--
-- * Most fields in @gc@ are not used for this operation, but
-- notably the clip mask or clip region will be honored. The source and
-- destination drawables must have the same visual and colormap, or
-- errors will result. (On X11, failure to match visual\/colormap results
-- in a BadMatch error from the X server.) A common cause of this
-- problem is an attempt to draw a bitmap to a color drawable. The way to
-- draw a bitmap is to set the bitmap as a clip mask on your
-- 'GC', then use 'drawRectangle' to draw a
-- rectangle clipped to the bitmap.
--
drawDrawable :: (DrawableClass src, DrawableClass dest)
  => dest -- ^ destination drawable
  -> GC -- ^ graphics context
  -> src -- ^ source drawable
  -> Int -- ^ @xSrc@
  -> Int -- ^ @ySrc@
  -> Int -- ^ @xDest@
  -> Int -- ^ @yDest@
  -> Int -- ^ @width@
  -> Int -- ^ @height@
  -> IO ()
drawDrawable :: forall src dest.
(DrawableClass src, DrawableClass dest) =>
dest
-> GC -> src -> Int -> Int -> Int -> Int -> Int -> Int -> IO ()
drawDrawable dest
dest GC
gc src
src Int
xSrc Int
ySrc Int
xDest Int
yDest Int
width Int
height =
  (\(Drawable ForeignPtr Drawable
arg1) (GC ForeignPtr GC
arg2) (Drawable ForeignPtr Drawable
arg3) CInt
arg4 CInt
arg5 CInt
arg6 CInt
arg7 CInt
arg8 CInt
arg9 -> ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg1 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr1 ->ForeignPtr GC -> (Ptr GC -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr GC
arg2 ((Ptr GC -> IO ()) -> IO ()) -> (Ptr GC -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr GC
argPtr2 ->ForeignPtr Drawable -> (Ptr Drawable -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Drawable
arg3 ((Ptr Drawable -> IO ()) -> IO ())
-> (Ptr Drawable -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Drawable
argPtr3 ->Ptr Drawable
-> Ptr GC
-> Ptr Drawable
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> CInt
-> IO ()
gdk_draw_drawable Ptr Drawable
argPtr1 Ptr GC
argPtr2 Ptr Drawable
argPtr3 CInt
arg4 CInt
arg5 CInt
arg6 CInt
arg7 CInt
arg8 CInt
arg9) (dest -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable dest
dest) (GC -> GC
forall o. GCClass o => o -> GC
toGC GC
gc)
  (src -> Drawable
forall o. DrawableClass o => o -> Drawable
toDrawable src
src)
  (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
xSrc) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ySrc) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
xDest)
  (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
yDest) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
width) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
height)

foreign import ccall unsafe "gdk_drawable_get_depth"
  gdk_drawable_get_depth :: ((Ptr Drawable) -> (IO CInt))

foreign import ccall unsafe "gdk_drawable_get_size"
  gdk_drawable_get_size :: ((Ptr Drawable) -> ((Ptr CInt) -> ((Ptr CInt) -> (IO ()))))

foreign import ccall unsafe "gdk_drawable_get_clip_region"
  gdk_drawable_get_clip_region :: ((Ptr Drawable) -> (IO (Ptr Region)))

foreign import ccall unsafe "gdk_drawable_get_visible_region"
  gdk_drawable_get_visible_region :: ((Ptr Drawable) -> (IO (Ptr Region)))

foreign import ccall unsafe "gdk_draw_point"
  gdk_draw_point :: ((Ptr Drawable) -> ((Ptr GC) -> (CInt -> (CInt -> (IO ())))))

foreign import ccall unsafe "gdk_draw_points"
  gdk_draw_points :: ((Ptr Drawable) -> ((Ptr GC) -> ((Ptr ()) -> (CInt -> (IO ())))))

foreign import ccall unsafe "gdk_draw_line"
  gdk_draw_line :: ((Ptr Drawable) -> ((Ptr GC) -> (CInt -> (CInt -> (CInt -> (CInt -> (IO ())))))))

foreign import ccall unsafe "gdk_draw_lines"
  gdk_draw_lines :: ((Ptr Drawable) -> ((Ptr GC) -> ((Ptr ()) -> (CInt -> (IO ())))))

foreign import ccall unsafe "gdk_draw_pixbuf"
  gdk_draw_pixbuf :: ((Ptr Drawable) -> ((Ptr GC) -> ((Ptr Pixbuf) -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (IO ())))))))))))))

foreign import ccall unsafe "gdk_draw_segments"
  gdk_draw_segments :: ((Ptr Drawable) -> ((Ptr GC) -> ((Ptr ()) -> (CInt -> (IO ())))))

foreign import ccall unsafe "gdk_draw_rectangle"
  gdk_draw_rectangle :: ((Ptr Drawable) -> ((Ptr GC) -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (IO ()))))))))

foreign import ccall unsafe "gdk_draw_arc"
  gdk_draw_arc :: ((Ptr Drawable) -> ((Ptr GC) -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (IO ()))))))))))

foreign import ccall unsafe "gdk_draw_polygon"
  gdk_draw_polygon :: ((Ptr Drawable) -> ((Ptr GC) -> (CInt -> ((Ptr ()) -> (CInt -> (IO ()))))))

foreign import ccall unsafe "gdk_draw_glyphs"
  gdk_draw_glyphs :: ((Ptr Drawable) -> ((Ptr GC) -> ((Ptr Font) -> (CInt -> (CInt -> ((Ptr GlyphStringRaw) -> (IO ())))))))

foreign import ccall unsafe "gdk_draw_layout_line"
  gdk_draw_layout_line :: ((Ptr Drawable) -> ((Ptr GC) -> (CInt -> (CInt -> ((Ptr LayoutLineRaw) -> (IO ()))))))

foreign import ccall unsafe "gdk_draw_layout_line_with_colors"
  gdk_draw_layout_line_with_colors :: ((Ptr Drawable) -> ((Ptr GC) -> (CInt -> (CInt -> ((Ptr LayoutLineRaw) -> ((Ptr ()) -> ((Ptr ()) -> (IO ()))))))))

foreign import ccall unsafe "gdk_draw_layout"
  gdk_draw_layout :: ((Ptr Drawable) -> ((Ptr GC) -> (CInt -> (CInt -> ((Ptr PangoLayoutRaw) -> (IO ()))))))

foreign import ccall unsafe "gdk_draw_layout_with_colors"
  gdk_draw_layout_with_colors :: ((Ptr Drawable) -> ((Ptr GC) -> (CInt -> (CInt -> ((Ptr PangoLayoutRaw) -> ((Ptr ()) -> ((Ptr ()) -> (IO ()))))))))

foreign import ccall unsafe "gdk_draw_drawable"
  gdk_draw_drawable :: ((Ptr Drawable) -> ((Ptr GC) -> ((Ptr Drawable) -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (CInt -> (IO ()))))))))))