-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A functional interface to 2D drawing in OpenGL -- -- This module is a functional wrapper around OpenGL, so you don't have -- to go into the deep, dark world of imperative stateful programming -- just to draw stuff. It supports 2D only (for now), with support -- drawing geometry, images, and text. @package graphics-drawingcombinators @version 1.2.2 -- | An affine transformation is a linear transformation followed by a -- translation; i.e. it is a function -- --
-- \x -> A*x + b ---- -- Where A is a linear transformation. Affine transformations are the set -- of image transformations supported by Graphics.DrawingCombinators, -- roughly translate, rotate, scale, and compositions thereof. module Graphics.DrawingCombinators.Affine type R = GLdouble type R2 = (R, R) -- | An Affine transformation from R2 to R2. -- --
-- [[Affine]] = R2 -> R2 ---- -- With the Monoid instance (identity, compose) data Affine -- |
-- [[compose a b]] = [[a]] . [[b]] --compose :: Affine -> Affine -> Affine -- |
-- [[apply a]] = [[a]] --apply :: Affine -> R2 -> R2 -- |
-- [[identity]] = id --identity :: Affine -- |
-- [[translate t]] x = [[t]] x + t --translate :: R2 -> Affine -- |
-- [[rotate r]] (x,y) = (cos(r)x - sin(r)y, sin(r)x + cos(r)y) --rotate :: R -> Affine -- |
-- [[scale xs ys]] (x,y) = (xs*x, ys*y) --scale :: R -> R -> Affine -- |
-- [[inverse x]] = inverse [[x]] ---- -- If the transformation is not invertible, this operation is undefined. inverse :: Affine -> Affine -- | Multiply this Affine by the top of the OpenGL matrix stack. Don't mind -- this, it's an implementation detail. multGLmatrix :: Affine -> IO () instance Monoid Affine -- | Drawing combinators as a functional interface to 2D graphics using -- OpenGL. -- -- This module is intended to be imported qualified, as in: -- --
-- import qualified Graphics.DrawingCombinators as Draw ---- -- Whenever possible, a denotational semantics for operations in -- this library is given. Read [[x]] as "the meaning of -- x". -- -- Intuitively, an Image a is an infinite plane of pairs -- of colors and a's. The colors are what are drawn on -- the screen when you render, and the a's are what you -- can recover from coordinates using sample. The latter allows -- you to tell, for example, what a user clicked on. -- -- The following discussion is about the associated data. If you are only -- interested in drawing, rather than mapping from coordinates to values, -- you can ignore the following and just use mappend and -- mconcat to overlay images. -- -- Wrangling the a's -- the associated data with each "pixel" -- -- is done using the Functor, Applicative, and -- Monoid instances. -- -- The primitive Images such as circle and text -- all return Image Any objects. Any is just a wrapper -- around Bool, with (||) as its monoid operator. So e.g. -- the points inside the circle will have the value Any True, -- and those outside will have the value Any False. Returning -- Any instead of plain Bool allows you to use -- Images as a monoid, e.g. mappend to overlay two -- images. But if you are doing anything with sampling, you probably want -- to map this to something. Here is a drawing with two circles that -- reports which one was hit: -- --
-- twoCircles :: Image String -- twoCircles = liftA2 test (translate (-1,0) %% circle) (translate (1,0) %% circle) -- where -- test (Any False) (Any False) = "Miss!" -- test (Any False) (Any True) = "Hit Right!" -- test (Any True) (Any False) = "Hit Left!" -- test (Any True) (Any True) = "Hit Both??!" ---- -- The last case would only be possible if the circles were overlapping. module Graphics.DrawingCombinators -- | The type of images. -- --
-- [[Image a]] = R2 -> (Color, a) ---- -- The semantics of the instances are all consistent with type class -- morphism. I.e. Functor, Applicative, and Monoid act point-wise, -- using the Color monoid described below. data Image 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 :: Image a -> IO () -- | Like render, but clears the screen first. This is so you can -- use this module and pretend that OpenGL doesn't exist at all. clearRender :: Image a -> IO () -- | Sample the value of the image at a point. -- --
-- [[sample i p]] = snd ([[i]] p) ---- -- Even though this ought to be a pure function, it is not safe to -- unsafePerformIO it, because it uses OpenGL state. sample :: Image a -> R2 -> IO a -- | A single "pixel" at the specified point. -- --
-- [[point p]] r | [[r]] == [[p]] = (one, Any True) -- | otherwise = (zero, Any False) --point :: R2 -> Image Any -- | A line connecting the two given points. line :: R2 -> R2 -> Image Any -- | A regular polygon centered at the origin with n sides. regularPoly :: (Integral a) => a -> Image Any -- | An (imperfect) unit circle centered at the origin. Implemented as: -- --
-- circle = regularPoly 24 --circle :: Image Any -- | A convex polygon given by the list of points. convexPoly :: [R2] -> Image Any -- | Transform an image by an Affine transformation. -- --
-- [[tr % im]] = [[im]] . inverse [[tr]] --(%%) :: Affine -> Image a -> Image a -- | A Bezier curve given a list of control points. It is a curve that -- begins at the first point in the list, ends at the last one, and -- smoothly interpolates between the rest. It is the empty image -- (mempty) if zero or one points are given. bezierCurve :: [R2] -> Image Any -- | Color is defined in the usual computer graphics sense: a 4 vector -- containing red, green, blue, and alpha. -- -- The Monoid instance is given by alpha composition, described at -- http://lukepalmer.wordpress.com/2010/02/05/associative-alpha-blending/ -- -- In the semantcs the values zero and one are used, -- which are defined as: -- --
-- zero = Color 0 0 0 0 -- one = Color 1 1 1 1 --data Color Color :: !R -> !R -> !R -> !R -> Color -- | 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') --modulate :: Color -> Color -> Color -- | 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) --tint :: Color -> Image a -> Image a -- | A Sprite represents a finite bitmap image. -- --
-- [[Sprite]] = [-1,1]^2 -> Color --data Sprite -- | Load an image from a file and create a sprite out of it. openSprite :: FilePath -> IO Sprite -- | The image of a sprite at the origin. -- --
-- [[sprite s]] p | p `elem` [-1,1]^2 = ([[s]] p, Any True) -- | otherwise = (zero, Any False) --sprite :: Sprite -> Image Any data Font -- | Load a TTF font from a file. openFont :: String -> IO Font -- | The image representing some text rendered with a font. The baseline is -- at y=0, the text starts at x=0, and the height of a lowercase x is 1 -- unit. text :: Font -> String -> Image Any -- | textWidth font str is the width of the text in text font -- str. textWidth :: Font -> String -> R -- | The class of monoids (types with an associative binary operation that -- has an identity). Instances should satisfy the following laws: -- --