{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# OPTIONS_HADDOCK hide #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  GI.Cairo.Render.Internal
-- Copyright   :  (c) Paolo Martini 2005
-- License     :  BSD-style (see cairo/COPYRIGHT)
--
-- Maintainer  :  p.martini@neuralnoise.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Direct bindings to the cairo library.
-----------------------------------------------------------------------------
-- #hide
--
module GI.Cairo.Render.Internal (
    Render(..), bracketR
  , module GI.Cairo.Render.Types
  , module GI.Cairo.Render.Internal.Drawing.Cairo
  , module GI.Cairo.Render.Internal.Drawing.Paths
  , module GI.Cairo.Render.Internal.Drawing.Patterns
  , module GI.Cairo.Render.Internal.Drawing.Text
  , module GI.Cairo.Render.Internal.Drawing.Transformations
  , module GI.Cairo.Render.Internal.Fonts.FontOptions
  , module GI.Cairo.Render.Internal.Surfaces.Image
  , module GI.Cairo.Render.Internal.Surfaces.PDF
  , module GI.Cairo.Render.Internal.Surfaces.PNG
  , module GI.Cairo.Render.Internal.Surfaces.PS
  , module GI.Cairo.Render.Internal.Surfaces.SVG
  , module GI.Cairo.Render.Internal.Surfaces.Surface
  , module GI.Cairo.Render.Internal.Region
  , module GI.Cairo.Render.Internal.Utilities

  ) where

import GI.Cairo.Render.Types
import GI.Cairo.Render.Internal.Drawing.Cairo
import GI.Cairo.Render.Internal.Drawing.Paths
import GI.Cairo.Render.Internal.Drawing.Patterns
import GI.Cairo.Render.Internal.Drawing.Text
import GI.Cairo.Render.Internal.Drawing.Transformations
import GI.Cairo.Render.Internal.Fonts.FontOptions
import GI.Cairo.Render.Internal.Surfaces.Image
import GI.Cairo.Render.Internal.Surfaces.PDF
import GI.Cairo.Render.Internal.Surfaces.PNG
import GI.Cairo.Render.Internal.Surfaces.PS
import GI.Cairo.Render.Internal.Surfaces.SVG
import GI.Cairo.Render.Internal.Surfaces.Surface
import GI.Cairo.Render.Internal.Region
import GI.Cairo.Render.Internal.Utilities

import Control.Monad.Reader
import Control.Applicative
import Control.Exception (bracket)

-- | The Render monad. All drawing operations take place in a Render context.
-- You can obtain a Render context for a 'Surface' using 'renderWith'.
--
newtype Render m = Render { runRender :: ReaderT Cairo IO m }
  deriving (Functor, Applicative, Monad, MonadIO, MonadReader Cairo)

{-# INLINE bracketR #-}
bracketR :: IO a -> (a -> IO b) -> (a -> Render c) -> Render c
bracketR begin end action =
  Render $
  ReaderT $ \r ->
  bracket begin end
          (\s -> runReaderT (runRender $ action s) r)