    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Graphics.HGL.Internals.Types
    -- Copyright   :  (c) Alastair Reid, 1999-2003
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  libraries@haskell.org
    -- Stability   :  internal
    -- Portability :  portable
    --
    -- Basic types for a simple graphics library.
    --
    -----------------------------------------------------------------------------

    -- #hide
    module Graphics.HGL.Internals.Types where

    #if !X_DISPLAY_MISSING
    import qualified Graphics.X11.Xlib as X
    #else
    import Graphics.Win32.Misc(timeGetTime)
    import Control.Monad( liftM )
    #endif

    import Data.Ix(Ix)
    import Data.Word(Word8)

    ----------------------------------------------------------------
    -- Units
    ----------------------------------------------------------------

    -- | A distance on the screen, measured in pixels.
    type Dimension = Int
    -- | A position within a window, measured in pixels to the right and down
    -- from the top left corner.
    type Point     = (Int,Int)
    -- | A (width, height) pair, both measured in pixels.
    type Size      = (Int,Int)
    -- | An angle in degrees (0 to 360).
    type Angle     = Double

    -- | Time, measured in milliseconds.
    type Time = Integer

    -- | Time in milliseconds since some arbitrary epoch.
    getTime :: IO Integer
    #if !X_DISPLAY_MISSING
    getTime = X.gettimeofday_in_milliseconds
    #else
    getTime = liftM toInteger timeGetTime
    #endif

    ---------------------------------------------------------------
    -- Drawing
    ----------------------------------------------------------------

    -- | A color, comprising red, green and blue components.
    data RGB = RGB Word8 Word8 Word8

    -- | The style of line drawn by a pen.
    data Style
      = Solid
      | Dash	-- "-------"
      | Dot		-- "......."
      | DashDot	-- "_._._._"
      | DashDotDot	-- "_.._.._"
      | Null
      | InsideFrame

    -- | Background mode for drawing text.
    data BkMode
      = Opaque	-- ^ Draw text on a bounding rectangle filled with the
    		-- current background color.
      | Transparent -- ^ Draw text without a background rectangle.

    -- | How strings drawn with 'Graphics.HGL.Draw.Text.text' are positioned
    -- relative to the specified reference point.
    type Alignment = (HAlign, VAlign)

    -- | Horizontal alignment of text.
    -- Names have a tick to distinguish them from "Prelude" names.
    data HAlign
     = Left'	-- ^ align the left edge of the text with the reference point
     | Center	-- ^ center the text with the reference point
     | Right'	-- ^ align the right edge of the text with the reference point
     deriving (Enum, Eq, Ord, Ix, Show)

    -- | Vertical alignment of text.
    data VAlign
     = Top		-- ^ align the top edge of the text with the reference point
     | Baseline	-- ^ align the baseline of the text with the reference point
     | Bottom	-- ^ align the bottom edge of the text with the reference point
     deriving (Enum, Eq, Ord, Ix, Show)

    ---------------------------------------------------------------
    -- Windows
    ----------------------------------------------------------------

    -- | Title of a window.
    type Title = String

    -- | How to draw in a window.
    data RedrawMode
      = DoubleBuffered	-- ^ use a /double buffer/ to reduce flicker.
    			-- You should probably use this for animations.
      | Unbuffered		-- ^ draw directly to the window.
    			-- This runs slightly faster but is more prone
    			-- to flicker.