úÎ=î;(      !"#$%&' *An Affine transformation from R2 to R2.   [[Affine]] = R2 -> R2 With the Monoid instance (identity, compose) (  ! [[compose a b]] = [[a]] . [[b]]   [[apply a]] = [[a]]   [[identity]] = id   [[inverse x]] = inverse [[x]] ;If the transformation is not invertible, this operation is  undefined.  ! [[translate t]] x = [[t]] x + t  = [[rotate r]] (x,y) = (cos(r)x - sin(r)y, sin(r)x + cos(r)y)  & [[scale xs ys]] (x,y) = (xs*x, ys*y) <Multiply this Affine by the top of the OpenGL matrix stack.  Don't mind this, it's an implementation detail.       tested on GHC only experimental Luke Palmer <lrpalmer@gmail.com>%)*+A Sprite represents a finite bitmap image.  [[Sprite]] = [-1,1]^2 -> Color +,7Color is defined in the usual computer graphics sense: 4 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 The type of images.   [[Image a]] = R2 -> (Color, a) 7The semantics of the instances are all consistent with type class morphism. A I.e. Functor, Applicative, and Monoid act point-wise, using the  monoid  described below. -./01=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). Like *, but clears the screen first. This is so 6 you can use this module and pretend that OpenGL doesn't  exist at all. 2KGiven a bounding box, lower left and upper right in the default coordinate 4 system (-1,-1) to (1,1), return the topmost drawing's value (with respect to  over") intersecting that bounding box. ,Sample the value of the image at a point.   [[sample i p]] = snd ([[i]] p) 4Even though this ought to be a pure function, it is not safe to  unsafePerformIO# it, because it uses OpenGL state. 34567 A single "pixel" at the specified point. 3 [[point p]] r | [[r]] == [[p]] = (one, Any True) 4 | otherwise = (zero, Any False) (A line connecting the two given points. 7A regular polygon centered at the origin with n sides. DAn (imperfect) unit circle centered at the origin. Implemented as:  circle = regularPoly 24 .A convex polygon given by the list of points. >A Bezier curve given a list of control points. It is a curve C 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 (#) if zero or one points are given. Transform an image by an  transformation. ' [[tr % im]] = [[im]] . inverse [[tr]] !#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') "CTint 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) #9Load 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) 8 | otherwise = (zero, Any False) %Load a TTF font from a file. &EThe image representing some text rendered with a font. The baseline H is at y=0, the text starts at x=0, and the height of a lowercase x is  1 unit. 'textWidth font str is the width of the text in  text font str. (  !"#$%&' !"#$%&' !"#$%&'8       !"#$%&'()*+,-./012345678!graphics-drawingcombinators-1.2.0Graphics.DrawingCombinators"Graphics.DrawingCombinators.Affinebase Data.MonoidmconcatmappendmemptyMonoidgetAnyAnyAffineR2Rcomposeapplyidentityinverse translaterotatescale multGLmatrixFontSpriteColorImagerender clearRendersamplepointline regularPolycircle convexPoly bezierCurve%%modulatetint openSpritespriteopenFonttext textWidthMgetFont spriteObjectdRenderdPickPickerRenderer selectRegiontoVertex toVertex3inSetpicker rendererImage