!~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy z { | } ~       ,None0#"! &%$)('#"! &%$)('None .gloss%Mix two colors with the given ratios./glossAdd RGB components of a color component-wise, then normalise them to the highest resulting one. The alpha components are averaged.0gloss8Make a dimmer version of a color, scaling towards black.1gloss:Make a brighter version of a color, scaling towards white.2glossLighten a color, adding white.3glossDarken a color, adding black.4glossSet the red value of a -.5glossSet the green value of a -.6glossSet the blue value of a -.7glossSet the alpha value of a -.8glossA greyness of a given order.!Range is 0 = black, to 1 = white.gloss<Normalise a color to the value of its largest RGB component..glossProportion of first color.glossProportion of second color.gloss First color.gloss Second color.glossResulting color.*+,-./0123456789:;<=>?@ABCDEF-,+*./0123456789:;<=>?@ABCDEFSafe!Ggloss.Describes how Gloss should display its output.Hgloss;Display in a window with the given name, size and position.IglossDisplay full screen.GHIGHINone"7Mgloss,Add two vectors, or add a vector to a point.Ngloss8Subtract two vectors, or subtract a vector from a point.OglossNegate a vector.PglossMultiply a scalar by a vector.MNOPMNPOM6N6P7Safe$QglossConvert degrees to radiansRglossConvert radians to degreesSgloss3Normalize an angle to be between 0 and 2*pi radiansQRSQRSNoneAOTgloss$A blank picture, with nothing in it.Ugloss+A convex polygon filled with a solid color.VglossA line along an arbitrary path.WglossA circle with the given radius.XglossbA circle with the given thickness and radius. If the thickness is 0 then this is equivalent to .Ygloss^A circular arc drawn counter-clockwise between two angles (in degrees) at the given radius.ZglossA circular arc drawn counter-clockwise between two angles (in degrees), with the given radius and thickness. If the thickness is 0 then this is equivalent to .[gloss%Some text to draw with a vector font.\glossA bitmap image]glossa subsection of a bitmap image first argument selects a sub section in the bitmap second argument determines the bitmap data^gloss A picture drawn with this color._gloss6A picture translated by the given x and y coordinates.`gloss<A picture rotated clockwise by the given angle (in degrees).agloss.A picture scaled by the given x and y factors.bgloss'A picture consisting of several others.cglossA closed loop along a path.dgloss%A solid circle with the given radius.eglossLA solid arc, drawn counter-clockwise between two angles at the given radius.fglossA wireframe sector of a circle. An arc is draw counter-clockwise from the first to the second angle at the given radius. Lines are drawn from the origin to the ends of the arc.ggloss9A path representing a rectangle centered about the originhgloss0A wireframe rectangle centered about the origin.igloss9A wireframe rectangle in the y > 0 half of the x-y plane.jglossCA path representing a rectangle in the y > 0 half of the x-y plane.kgloss,A solid rectangle centered about the origin.lgloss5A solid rectangle in the y > 0 half of the x-y plane.gglosswidth of rectangleglossheight of rectangle,  TUVWXYZ[\]^_`abcdefghijkl,  TUVWXYZ[\]^_`abcdefghkjilNoneM mglossThe m represents the global transformation applied to the displayed picture. When the user pans, zooms, or rotates the display then this changes the m.oglossGlobal translation.pglossGlobal rotation (in degrees).qgloss-Global scaling (of both x and y coordinates).rgloss"The initial state of the viewport.sgloss:Translates, rotates, and scales an image according to the m.tgloss5Takes a point using screen coordinates, and uses the mA to convert it to Picture coordinates. This is the inverse of s for points.glossConvert degrees to radiansglossMultiply a vector by a scalar.glossIRotate a vector by an angle (in radians). +ve angle is counter-clockwise.mnopqrstmnopqrstNoneQ-ugloss&Functions to asynchronously control a Gloss display.wgloss0Indicate that we want the picture to be redrawn.xglossGModify the current viewport, also indicating that it should be redrawn.uvwxuvwx None=Y yglossThe magnitude of a vector.zgloss5The angle of this vector, relative to the +ve x-axis.{glossThe dot product of two vectors.|glossThe determinant of two vectors.}glossMultiply a vector by a scalar.~glossIRotate a vector by an angle (in radians). +ve angle is counter-clockwise.gloss9Compute the inner angle (in radians) between two vectors.gloss/Normalise a vector, so it has a magnitude of 1.glossjProduce a unit vector at a given angle relative to the +ve x-axis. The provided angle is in radians. yz{|}~ yz{|}~ None^qglossTest whether a point lies within a rectangular box that is oriented on the x-y plane. The points P1-P2 are opposing points of the box, but need not be in a particular order. S P2 +-------+ | | | + P0 | | | +-------+ P1   NoneQ glossLCheck if line segment (P1-P2) clears a box (P3-P4) by being well outside it.gloss(Given an infinite line which intersects P1 and P19, return the point on that line that is closest to P3glossoGiven an infinite line which intersects P1 and P2, let P4 be the point on the line that is closest to P3.FReturn an indication of where on the line P4 is relative to P1 and P2. a if P4 == P1 then 0 if P4 == P2 then 1 if P4 is halfway between P1 and P2 then 0.5 F | P1 | P4 +---- P3 | P2 | glossGiven four points specifying two lines, get the point where the two lines cross, if any. Note that the lines extend off to infinity, so the intersection point might not line between either of the two pairs of points. N \ / P1 P4 \ / + / \ P3 P2 / \ glossGet the point where a segment P1-P2 crosses an infinite line P3-P4 , if any.gloss@Get the point where a segment crosses a horizontal line, if any. a + P1 / -------+--------- / y0 P2 + gloss>Get the point where a segment crosses a vertical line, if any. u | | + P1 | / + / | P2 + | | x0 glossGet the point where a segment P1-P2 crosses another segement P3-P4 , if any.gloss>Check if an arbitrary segment intersects a horizontal segment. a + P2 / (xa, y3) +---+----+ (xb, y3) / P1 + gloss<Check if an arbitrary segment intersects a vertical segment.  (x3, yb) + | + P1 | / + / | P2 + | + (x3, ya) glossP1 First point of segment.glossP2 Second point of segment.glossP3 Lower left point of box.glossP4 Upper right point of box.glossP1glossP2glossP3gloss/the point on the line P1-P2 that is closest to P3glossP1glossP2glossP3glossP1glossP2glossP3glossP4glossP1glossP2glossP3glossP4glossP1 First point of segment.glossP2 Second point of segment.glossy value of line.glossP1 First point of segment.glossP2 Second point of segment.glossx value of line.glossP1glossP2glossP3glossP4glossP1 First point of segment.glossP2 Second point of segment.gloss#(y3) y value of horizontal segment.gloss,(xa) Leftmost x value of horizontal segment.gloss-(xb) Rightmost x value of horizontal segment.gloss$(x3, y3) Intersection point, if any.glossP1 First point of segment.glossP2 Second point of segment.gloss (x3) x value of vertical segmentgloss((ya) Lowest y value of vertical segment.gloss)(yb) Highest y value of vertical segment.gloss$(x3, y3) Intersection point, if any. NoneOgloss5Convert one of our Colors to OpenGL's representation.Safek glossAnimation Stategloss!Whether the animation is running.gloss0How many times we've entered the animation loop.gloss1Whether this is the first frame of the animation.gloss1Number of msec the animation has been running forglossDThe time when we entered the display callback for the current frame.glossxClamp the minimum time between frames to this value (in seconds) Setting this to < 10ms probably isn't worthwhile.glossBThe time when the last call to the users render function finished.glossJThe time when displayInWindow last finished (after sleeping to clamp fps). gloss#How long it took to draw this frame !" #SafeSX!$gloss$Arguments: (Width,Height) in pixels.%gloss No arguments.&gloss!Arguments: (PosX,PosY) in pixels.'glossUArguments: KeyType, Key Up / Down, Ctrl / Alt / Shift pressed, latest mouse location.(gloss"Display callback has no arguments.)glossDThe functions every backend window managed backend needs to support.The Backend module interfaces with the window manager, and handles opening and closing the window, and managing key events etc.It doesn't know anything about drawing lines or setting colors. When we get a display callback, Gloss will perform OpenGL actions, and the backend needs to have OpenGL in a state where it's able to accept them.*glossInitialize the state used by the backend. If you don't use any state, make a Unit-like type; see the GLUT backend for an example.+glossPerform any initialization that needs to happen before opening a window The Boolean flag indicates if any debug information should be printed to the terminal,gloss3Perform any deinitialization and close the backend.-gloss*Open a window with the given display mode..gloss3Dump information about the backend to the terminal./glossInstall the display callbacks.0gloss"Install the window close callback.1glossInstall the reshape callbacks.2gloss%Install the keymouse press callbacks.3gloss#Install the mouse motion callbacks.4glossInstall the idle callbacks.5glossThe mainloop of the backend.6gloss6A function that signals that screen has to be updated.7gloss=Function that returns (width,height) of the window in pixels.8glossUFunction that reports the time elapsed since the application started. (in seconds)9gloss3Function that puts the current thread to sleep for n seconds.:glossCheck if this is an ; callback.vGHI<=;>?@$%&'()68*+,-./01234579:None>Agloss'State information for the GLUT backend.BglossInitial GLUT state.Cgloss0Oneshot timer callback that re-registers itself.DglossCall back when glut is idle.Egloss-Convert GLUTs key codes to our internal ones.Fgloss.Convert GLUTs key states to our internal ones.Ggloss.Convert GLUTs key states to our internal ones.ABH Nonegloss&Get the size of the screen, in pixels.UThis will be the size of the rendered gloss image when fullscreen mode is enabled.NonezGHI<=;>?@$%&'()68*+,-./01234579:ABHINoneSXJglossVHandles animation timing details. Call this function at the start of each frame.KglossTHandles animation timing details. Call this function at the end of each frame.JKSafe) <=;>?@$%&'(SafeQSX¥LNoneąMgloss-Dump internal state of the OpenGL framebufferNgloss-Dump internal state of the fragment renderer.MN NoneSXKglossPossible input events.OPNoneQݤgloss[State for controlling the viewport. These are used by the viewport control component.glossThe command list for the viewport controller. These can be safely overwridden at any time by deleting or adding entries to the list. Entries at the front of the list take precedence.gloss@How much to scale the world by for each step of the mouse wheel.glossCHow many degrees to rotate the world by for each pixel of x motion.gloss7Ratio to scale the world by for each pixel of y motion.glossdDuring viewport translation, where the mouse was clicked on the window to start the translate.gloss_During viewport rotation, where the mouse was clicked on the window to starte the rotate.glossZDuring viewport scale, where the mouse was clicked on the window to start the scale.glossThe current viewport.gloss-The commands suported by the view controller.gloss\The default commands. Left click pans, wheel zooms, right click rotates, "r" key resets.QglossECheck if the provided key combination is some gloss viewport command.RglossECheck if the provided key combination is some gloss viewport command.glossThe initial view state.gloss-Initial view state, with user defined config.glossApply an event to a .glossLike , but returns S if no update was needed.Tgloss Zoom in a  by the scale step.Ugloss Zoom out a  by the scale step.VglossOffset a viewport.WglossApply a translation to the .XglossApply a rotation to the .YglossApply a scale to the .!Safe@ZglossSimulation state[gloss!The iteration number we're up to.\gloss>How many simulation setps to take for each second of real time]gloss6How many seconds worth of simulation we've done so far^glossInitial control stateZ_[\]^"NoneSX`glosswThe graphics library calls back on this function when it's finished drawing and it's time to do some computation.`glossthe simulation stateglossthe animation stateaglossaction to get the m. We don't use an a0 directly because sometimes we hold a ref to a m% (in Game) and sometimes a ref to a  ViewState.glossthe current worldglossfn to advance the worldgloss;how much time to advance world by in single step mode`#NoneSXxbglossNCallback to handle keyboard and mouse button events for controlling the .b$NoneSXFcglossWCallback to handle keyboard and mouse button events for controlling the viewport.c%NonedglossWCallback to handle keyboard and mouse button events for controlling the viewport.de&NonefglossEOpen a window and use the supplied callbacks to handle window events.fglossColor to use when clearing.glossCallbacks to use.glossEGive the backend back to the caller before entering the main loop.f'NoneSXgglossInitial state of the backendgloss Display mode.glossBackground color.gloss@Number of simulation steps to take for each second of real time.glossThe initial model.gloss-A function to convert the model to a picture.glossA function to step the model one iteration. It is passed the current viewport and the amount of time for this simulation step (in seconds).gNoneSXglossRun a finite-time-step simulation in a window. You decide how the model is represented, how to convert the model to a picture, and how to advance the model for each unit of time. This function does the rest.>Once the window is open you can use the same commands as with display.gloss Display mode.glossBackground color.gloss@Number of simulation steps to take for each second of real time.glossThe initial model.gloss-A function to convert the model to a picture.glossA function to step the model one iteration. It is passed the current viewport and the amount of time for this simulation step (in seconds).R  *+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijklmnopqmnopqNoneSX  gloss Display mode.glossBackground color.gloss@Number of simulation steps to take for each second of real time.glossThe initial model.gloss-A function to convert the model to a picture.glossA function to step the model one iteration. It is passed the current viewport and the amount of time for this simulation step (in seconds).R  *+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijklmnopq  mnopq(NoneSXhglossCallback for KeyMouse events.iglossCallback for Motion events.jgloss"Callback for Handle reshape event.kglossInitial state of the backend.glossDisplay config.glossBackground color.glossThe initial world.gloss*A function to produce the current picture.gloss"A function to handle input events.glossEat the controllerhglossref to world stateglossfn to handle input eventsiglossref to world stateglossfn to handle input eventsk None glossDOpen a new window and interact with an infrequently updated picture. Similar to  displayIO), except that you manage your own events. gloss Display mode.glossBackground color.glossInitial world state.gloss*A function to produce the current picture.gloss"A function to handle input events.gloss(Callback to take the display controller.  *+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijkluvwx _ uvwx)NoneSX(lglossCallback for KeyMouse events.mglossCallback for Motion events.ngloss"Callback for Handle reshape event.o glossInitial state of the backendgloss Display mode.glossBackground color.gloss@Number of simulation steps to take for each second of real time.glossThe initial world.gloss-A function to convert the world to a picture.gloss"A function to handle input events.glosssA function to step the world one iteration. It is passed the period of time (in seconds) needing to be advanced.gloss(Whether to use the callback_exit or not.lglossref to world stateglossfn to handle input eventsmglossref to world stateglossfn to handle input eventsoNoneX02 glossPlay a game in a window. Like simulate', but you manage your own input events. gloss Display mode.glossBackground color.gloss@Number of simulation steps to take for each second of real time.glossThe initial world.gloss*A function to convert the world a picture.gloss"A function to handle input events.glosssA function to step the world one iteration. It is passed the period of time (in seconds) needing to be advanced.  *+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijkl [ NoneX;A gloss@Play a game in a window, using IO actions to build the pictures. gloss Display mode.glossBackground color.gloss@Number of simulation steps to take for each second of real time.glossThe initial world.gloss)An action to convert the world a picture.gloss"A function to handle input events.glosssA function to step the world one iteration. It is passed the period of time (in seconds) needing to be advanced.  *+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijkl [ *NoneApglossInitial state of the backend.glossDisplay config.glossBackground color.glossMake the picture to draw.glossEat the controllerpNoneD gloss0Open a new window and display the given picture. gloss Display mode.glossBackground color.glossThe picture to draw.M  *+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijkl  Noneegloss>Open a new window and display an infrequently updated picture.>Once the window is open you can use the same commands as with display.]This wrapper is intended for mostly static pictures that do not need to be updated more than once per second. For example, the picture could show network activity over the last minute, a daily stock price, or a weather forecast. If you want to show a real-time animation where the frames are redrawn more frequently then use the animate wrapper instead.The provided picture generating action will be invoked, and the display redrawn in two situation: 1) We receive a display event, like someone clicks on the window. 2) When w^ has been set, some indeterminate time between the last redraw, and one second from that.Note that calling w indicates that the picture should be redrawn, but does not cause this to happen immediately, due to limitations in the GLUT and GLFW window managers. The display runs on a one second timer interrupt, and if there have been no display events we need to wait for the next timer interrupt before redrawing. Having the timer interrupt period at 1 second keeps the CPU usage due to the context switches at under 1%.]Also note that the picture generating action is called for every display event, so if the user pans the display then it will be invoked at 10hz or more during the pan. If you are generating the picture by reading some on-disk files then you should track when the files were last updated and cache the picture between updates. Caching the picture avoids repeatedly reading and re-parsing your files during a pan. Consider storing your current picture in an IORef, passing an action that just reads this IORef, and forking a new thread that watches your files for updates.gloss Display mode.glossBackground color.gloss&Action to produce the current picture.gloss(Callback to take the display controller.Q  *+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijkluvwxuvwx+Nonek1qglossInitial State of the backendgloss/Whether to allow the image to be panned around.gloss Display mode.glossBackground color.glossqFunction to produce the next frame of animation. It is passed the time in seconds since the program started.glossEat the controller.qNonep gloss2Open a new window and display the given animation.>Once the window is open you can use the same commands as with display.gloss Display mode.glossBackground color.glossrFunction to produce the next frame of animation. It is passed the time in seconds since the program started.M  *+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijkl,Noneqg  #"! &%$)('*+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijkl  GHI  None}^gloss2Open a new window and display the given animation.>Once the window is open you can use the same commands as with display.glossLike 1 but don't allow the display to be panned around.gloss Display mode.glossBackground color.glossrFunction to produce the next frame of animation. It is passed the time in seconds since the program started.gloss(Callback to take the display controller.gloss Display mode.glossBackground color.glossrFunction to produce the next frame of animation. It is passed the time in seconds since the program started.gloss(Callback to take the display controller.R  *+,-./0123456789:;<=>?@ABCDEFGHITUVWXYZ[\]^_`abcdefghijkluvwxuvwxr-./-.0-.1-.2-.3-.4-.5-.6-.7-.8-.9-.:-.;-.<-.=-.>-.?-.@-.A-.B-.C-.D-.E-.F-.G-.H-IJ-IK-IL-IL-IM-IN-IO-IP-IQ-IQ-IR-IS-IT-IU-IV-IW-XY-XZ-X[-X=\]^_`abcdefghijklmnopqrstuvwxyz{|}~          !"#$%&'()*+,-./01 23456789:;<=>?@ABCDE<FGHIJKLMNOPQRSTUVWXYZ[\]^_`uabcdefghijklmnopq r stuvwxyz{|}~!<!!!!G!<"v#$%%&'(((())))*+%gloss-1.13.1.1-AlylxR1O4piBak8w3PWxtmGraphics.Gloss.Data.Bitmap$Graphics.Gloss.Data.Point.ArithmeticGraphics.Gloss.Data.PictureGraphics.Gloss.Data.ColorGraphics.Gloss.Data.DisplayGraphics.Gloss.Geometry.AngleGraphics.Gloss.Data.ViewPortGraphics.Gloss.Data.ControllerGraphics.Gloss.Data.VectorGraphics.Gloss.Data.PointGraphics.Gloss.Geometry.Line$Graphics.Gloss.Interface.IO.Interact$Graphics.Gloss.Interface.EnvironmentGraphics.Gloss.Data.ViewState&Graphics.Gloss.Interface.Pure.Simulate$Graphics.Gloss.Interface.IO.Simulate"Graphics.Gloss.Interface.Pure.Game Graphics.Gloss.Interface.IO.Game%Graphics.Gloss.Interface.Pure.Display#Graphics.Gloss.Interface.IO.Display%Graphics.Gloss.Interface.Pure.Animate#Graphics.Gloss.Interface.IO.AnimateGraphics.Gloss.Internals.Color0Graphics.Gloss.Internals.Interface.Animate.State0Graphics.Gloss.Internals.Interface.Backend.Types/Graphics.Gloss.Internals.Interface.Backend.GLUT*Graphics.Gloss.Internals.Interface.Backend1Graphics.Gloss.Internals.Interface.Animate.Timing+Graphics.Gloss.Internals.Interface.Callback.Graphics.Gloss.Internals.Interface.Common.Exit(Graphics.Gloss.Internals.Interface.Debug(Graphics.Gloss.Internals.Interface.Event1Graphics.Gloss.Internals.Interface.Simulate.State0Graphics.Gloss.Internals.Interface.Simulate.Idle5Graphics.Gloss.Internals.Interface.ViewState.KeyMouse3Graphics.Gloss.Internals.Interface.ViewState.Motion4Graphics.Gloss.Internals.Interface.ViewState.Reshape)Graphics.Gloss.Internals.Interface.Window+Graphics.Gloss.Internals.Interface.Simulate+Graphics.Gloss.Internals.Interface.Interact'Graphics.Gloss.Internals.Interface.Game*Graphics.Gloss.Internals.Interface.Display*Graphics.Gloss.Internals.Interface.AnimateGraphics.Gloss/gloss-rendering-1.13.1.1-6YIsTsNpqcjD74C7EwMOnI%Graphics.Gloss.Internals.Data.PictureloadBMPbitmapDataOfBMP bitmapOfBMPbitmapDataOfByteStringbitmapOfByteStringbitmapDataOfForeignPtrbitmapOfForeignPtrPointVectorPathPicturesScaleRotate TranslateColor BitmapSectionBitmapTextThickArcArc ThickCircleCircleLinePolygonBlankPicture)Graphics.Gloss.Internals.Rendering.BitmaprectSizerectPos Rectangle bitmapSize BitmapData pixelFormatrowOrder BitmapFormat BottomToTop TopToBottomRowOrderPxABGRPxRGBA PixelFormat#Graphics.Gloss.Internals.Data.Color rgbaOfColor makeColorI makeColor mixColors addColorsdimbrightlightdarkwithRed withGreenwithBlue withAlphagreyNblackwhiteredgreenblueyellowcyanmagentarosevioletazure aquamarine chartreuseorangeDisplayInWindow FullScreen $fEqDisplay $fReadDisplay $fShowDisplay+-negate*degToRadradToDegnormalizeAngleblankpolygonlinecircle thickCirclearcthickArctextbitmap bitmapSectioncolor translaterotatescalepictureslineLoop circleSolidarcSolid sectorWire rectanglePath rectangleWirerectangleUpperWirerectangleUpperPathrectangleSolidrectangleUpperSolidViewPortviewPortTranslateviewPortRotate viewPortScale viewPortInitapplyViewPortToPictureinvertViewPort ControllercontrollerSetRedrawcontrollerModifyViewPortmagVargVdotVdetVmulSVrotateVangleVV normalizeVunitVectorAtAngle pointInBox segClearsBoxclosestPointOnLineclosestPointOnLineParamintersectLineLineintersectSegLineintersectSegHorzLineintersectSegVertLineintersectSegSegintersectSegHorzSegintersectSegVertSeg Modifiersshiftctrlalt SpecialKey KeyUnknownKeySpaceKeyEscKeyF1KeyF2KeyF3KeyF4KeyF5KeyF6KeyF7KeyF8KeyF9KeyF10KeyF11KeyF12KeyF13KeyF14KeyF15KeyF16KeyF17KeyF18KeyF19KeyF20KeyF21KeyF22KeyF23KeyF24KeyF25KeyUpKeyDownKeyLeftKeyRightKeyTabKeyEnter KeyBackspace KeyInsert KeyNumLockKeyBegin KeyDelete KeyPageUp KeyPageDownKeyHomeKeyEnd KeyShiftL KeyShiftRKeyCtrlLKeyCtrlRKeyAltLKeyAltRKeyPad0KeyPad1KeyPad2KeyPad3KeyPad4KeyPad5KeyPad6KeyPad7KeyPad8KeyPad9 KeyPadDivideKeyPadMultiplyKeyPadSubtract KeyPadAdd KeyPadDecimal KeyPadEqual KeyPadEnterKeyStateDownUp MouseButton LeftButton MiddleButton RightButtonWheelUp WheelDownAdditionalButtonKeyChar getScreenSizeEventEventKey EventMotion EventResize ViewStateviewStateCommandsviewStateScaleStepviewStateRotateFactorviewStateScaleFactorviewStateTranslateMarkviewStateRotateMarkviewStateScaleMarkviewStateViewPort CommandConfigCommandCRestore CTranslateCRotateCScale CBumpZoomOut CBumpZoomIn CBumpLeft CBumpRightCBumpUp CBumpDownCBumpClockwiseCBumpCClockwisedefaultCommandConfig viewStateInitviewStateInitWithConfigupdateViewStateWithEventupdateViewStateWithEventMaybe $fShowCommand $fEqCommand $fOrdCommandsimulate simulateIO interactIOplayplayIOdisplay displayIOanimate animateIOanimateFixedIOnormalizeColorglColor4OfColorState stateAnimatestateAnimateCountstateAnimateStartstateAnimateTimestateDisplayTimestateDisplayTimeClampstateGateTimeStartstateGateTimeEndstateGateTimeElapsedstateDisplayTimeLast stateInitReshapeCallback IdleCallbackMotionCallbackKeyboardMouseCallbackDisplayCallbackBackendinitBackendStateinitializeBackend exitBackend openWindowdumpBackendStateinstallDisplayCallbackinstallWindowCloseCallbackinstallReshapeCallbackinstallKeyMouseCallbackinstallMotionCallbackinstallIdleCallback runMainLoop postRedisplaygetWindowDimensions elapsedTimesleepisIdleCallbackIdleCallbackKeyMouseMotionReshape GLUTState glutStateInit timerCallback callbackIdle glutKeyToKeyglutKeyStateToKeyStateglutModifiersToModifiersinitializeGLUTdefaultBackendState animateBegin animateEnd callback_exitdumpFramebufferStatedumpFragmentState keyMouseEvent motionEvent isCommand isCommand2base GHC.MaybeNothing controlZoomIncontrolZoomOut motionBumpmotionTranslate motionRotate motionScalestateIterationstateResolution stateSimTimecallback_simulate_idle GHC.IORefIORefcallback_viewState_keyMousecallback_viewState_motioncallback_viewState_reshapeviewState_reshape createWindowsimulateWithBackendIOcallback_keyMousecallback_motioncallback_reshapeinteractWithBackendplayWithBackendIOdisplayWithBackendanimateWithBackendIO