|Portability||needs GADTs and rank n types|
|Maintainer||Luke Palmer <email@example.com>|
Drawing combinators as a functional interface to OpenGL (for 2D drawings only... for now).
This module is intended to be imported
qualified, as in:
import Graphics.DrawingCombinators as Draw
It is recommended that you use this module in combination
with SDL; it has not been tested in any other environments.
For some reason the GL picking stuff (
sample) crashes GHCi,
but it works okay compiled.
- module Graphics.DrawingCombinators.Affine
- data Image a
- render :: Image a -> IO ()
- clearRender :: Image a -> IO ()
- sample :: R2 -> Image a -> IO a
- init :: IO ()
- point :: R2 -> Image Any
- line :: R2 -> R2 -> Image Any
- regularPoly :: Int -> Image Any
- circle :: Image Any
- convexPoly :: [R2] -> Image Any
- (%%) :: Affine -> Image a -> Image a
- data Color = Color R R R R
- modulate :: Color -> Color -> Color
- tint :: Color -> Image a -> Image a
- data Sprite
- data SpriteScaling
- surfaceToSprite :: SpriteScaling -> Surface -> IO Sprite
- imageToSprite :: SpriteScaling -> FilePath -> IO Sprite
- sprite :: Sprite -> Image Any
- data Font
- openFont :: String -> Int -> IO Font
- text :: Font -> String -> Image Any
The type of images.
[[Image a]] = R2 -> (Color, a)
Draw an Image on the screen in the current OpenGL coordinate system (which, in absense of information, is (-1,-1) in the lower left and (1,1) in the upper right).
render, but clears the screen first. This is so
you can use this module and pretend that OpenGL doesn't
exist at all.
Sample the value of the image at a point.
[[sample p i]] = snd ([[i]] [[p]])
The geomertic combinators all return an
is a wrapper around
(False, (||)) as its
This is so you can use the
Monoid instance on
automatically get the union of primitives. So:
circle `mappend` (translate (1,0) %% circle)
Will have the value
Any True when either of the circles is
sampled. To extract the Bool, use
getAny, or pattern match
Any True and
Any False instead of
A single pixel at the specified point.
[[point p]] r | [[r]] == [[p]] = (one, Any True) | otherwise = (zero, Any False)
An (imperfect) unit circle centered at the origin. Implemented as:
circle = regularPoly 24
Transform an image by an
[[tr % im]] = [[im]] . inverse [[tr]]
Color is defined in the usual computer graphics sense, of a 4 vector containing red, green, blue, and alpha.
The Monoid instance is given by alpha transparency blending, so:
mempty = Color 1 1 1 1 mappend c@(Color _ _ _ a) c'@(Color _ _ _ a') = a*c + (1-a)*c'
Where multiplication is componentwise. In the semantcs the
one are used, which are defined as:
zero = Color 0 0 0 0 one = Color 1 1 1 1
Modulate two colors by each other.
modulate (Color r g b a) (Color r' g' b' a') = Color (r*r') (g*g') (b*b') (a*a')
Tint an image by a color; i.e. modulate the colors of an image by a color.
[[tint c im]] = first (modulate c) . [[im]] where first f (x,y) = (f x, y)
Sprites (images from files)
Indicate how a non-square image is to be mapped to a sprite.
Load an image from a file and create a sprite out of it.
The image of a sprite at the origin.
[[sprite s]] p | p `elem` [-1,1]^2 = ([[s]] p, Any True) | otherwise = (zero, Any False)
Load a TTF font from a file with the given point size (higher numbers mean smoother text but more expensive rendering).