packages feed

clutterhs-0.1: Graphics/UI/Clutter/CairoTexture.chs

-- -*-haskell-*-
--  Clutter Cairo Texture
--
--  Author : Matthew Arsenault
--
--  Created: 2 Oct 2009
--
--  Copyright (C) 2009 Matthew Arsenault
--
--  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 3 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.
--
{-# LANGUAGE ForeignFunctionInterface  #-}

#include <clutter/clutter.h>

{# context lib="clutter" prefix="clutter" #}

-- | CairoTexture — Texture with Cairo integration
module Graphics.UI.Clutter.CairoTexture (
-- * Description
-- | 'CairoTexture' is a 'Texture' that displays the contents of a
-- Cairo context. The 'CairoTexture' actor will create a Cairo image
-- surface which will then be uploaded to a GL texture when needed.
--
-- 'CairoTexture' will provide a 'Cairo' context by using the
-- 'cairoTextureCreate' and 'cairoTextureCreateRegion' functions; you
-- can use the Cairo API to draw on the context.
--
-- As soon as the context is destroyed, the contents of the surface
-- will be uploaded into the 'CairoTexture' actor:
--
-- Although a new 'Cairo' is created each time you call
-- 'cairoTextureCreate' or 'cairoTextureCreateRegion', it uses the
-- same 'Surface' each time. You can call 'cairoTextureClear' to erase
-- the contents between calls.
--
-- * Warning
--
--  Note that you should never use the code above inside the "paint"
--  or "pick" virtual functions or signal handlers because it will
--  lead to performance degradation.
--
-- * Note
--
-- Since 'CairoTexture' uses a Cairo image surface internally all
-- the drawing operations will be performed in software and not using
-- hardware acceleration. This can lead to performance degradation if
-- the contents of the texture change frequently.
--
-- 'CairoTexture' is available since Clutter 1.0.
--

-- * Class Hierarchy
-- |
-- @
-- |  'GObject'
-- |   +----'Actor'
-- |         +----'Texture'
-- |               +----'CairoTexture'
-- @

-- * Types
  CairoTexture,
  CairoTextureClass,

-- * Constructors
  cairoTextureNew,

-- * Methods
  cairoTextureSetSurfaceSize,
  cairoTextureGetSurfaceSize,

  cairoTextureCreate,

  cairoTextureCreateRegion,
  cairoTextureClear,

  cairoSetSourceColor,

-- * Attributes
  cairoTextureSurfaceHeight,
  cairoTextureSurfaceWidth
  ) where

{# import Graphics.UI.Clutter.Types #}
{# import Graphics.UI.Clutter.Utility #}

import C2HS
import System.Glib.Attributes
import System.Glib.Properties
import Graphics.Rendering.Cairo.Types (Cairo)

--TODO: CairoTextureClass

-- stop c2hs complaining about Ptr () not being Ptr Cairo
{# pointer *cairo_t as CairoPtr foreign -> Cairo nocode #}

-- | Creates a new 'CairoTexture' actor, with a surface of width by
--   height pixels.
--
-- [@width@] the width of the surface
--
-- [@height@] the height of the surface
--
-- [@Returns@] the newly created 'CairoTexture' actor
--
-- * Since 1.0
--
{# fun unsafe cairo_texture_new as ^ { `Int', `Int' } -> `CairoTexture' newCairoTexture* #}


-- | Resizes the Cairo surface used by self to width and height.
--
-- [@self@] a 'CairoTexture'
--
-- [@width@] the new width of the surface
--
-- [@height@] the new height of the surface
--
-- * Since 1.0
--
{# fun unsafe cairo_texture_set_surface_size as ^
       { withCairoTexture* `CairoTexture', `Int', `Int' } -> `()' #}

-- | Retrieves the surface width and height for self.
--
-- [@self@] a 'CairoTexture'
--
-- [@Returns@] (Surface width, Surface height)
--
-- * Since 1.0
--
{# fun unsafe cairo_texture_get_surface_size as ^
       { withCairoTexture* `CairoTexture', alloca- `Int' peekIntConv*, alloca- `Int' peekIntConv* } -> `()' #}



--CHECKME: the cairo_destroy to upload the contents?
-- | Creates a new Cairo context for the cairo texture. It is similar
--   to using 'cairoTextureCreateRegion' with x_offset and y_offset of
--   0, width equal to the cairo texture surface width and height
--   equal to the cairo texture surface height.
--
-- * Warning
--
-- Do not call this function within the paint virtual function or from
-- a callback to the "paint" signal.
--
-- [@self@] a 'CairoTexture'
--
-- [@Returns@] a newly created Cairo context. Use cairo_destroy() to
-- upload the contents of the context when done drawing
--
-- * Since 1.0
--
{# fun unsafe cairo_texture_create as ^
       { withCairoTexture* `CairoTexture' } -> `Cairo' newCairo #}


-- | Creates a new Cairo context that will updat the region defined by
--  x_offset, y_offset, width and height.
--
-- * Warning
--
-- Do not call this function within the paint virtual function or from
-- a callback to the "paint" signal.
--
-- [@self@] a 'CairoTexture'
--
-- [@x_offset@] offset of the region on the X axis
--
-- [@y_offset@] offset of the region on the Y axis
--
-- [@width@] width of the region, or -1 for the full surface width
--
-- [@height@] height of the region, or -1 for the full surface height
--
-- [@Returns@] a newly created Cairo context. Use cairo_destroy() to
-- upload the contents of the context when done drawing
--
-- * Since 1.0
--
{# fun unsafe cairo_texture_create_region as ^
       { withCairoTexture* `CairoTexture', `Int', `Int', `Int', `Int' } -> `Cairo' newCairo #}

-- | Clears self's internal drawing surface, so that the next upload
--   will replace the previous contents of the 'CairoTexture' rather
--   than adding to it.
--
-- [@self@] a 'CairoTexture'
--
-- * Since 1.0
--
{# fun unsafe cairo_texture_clear as ^ { withCairoTexture* `CairoTexture' } -> `()' #}

-- | Utility function for setting the source color of cr using a
--  'Color'.
--
-- [@cr@] a Cairo context
--
-- [@color@] a 'Color'
--
-- * Since 1.0
--
{# fun unsafe cairo_set_source_color as ^
       { withCairo `Cairo', withColor* `Color' } -> `()' #}


cairoTextureSurfaceHeight :: (CairoTextureClass self) => Attr self Word
cairoTextureSurfaceHeight = clutterNewAttrFromUIntProperty "surface-height"

cairoTextureSurfaceWidth :: (CairoTextureClass self) => Attr self Word
cairoTextureSurfaceWidth = clutterNewAttrFromUIntProperty "surface-width"