CS 248 - Introduction to Computer Graphics
Spring Quarter, 1995
Marc Levoy
Handout #4
Demos on Monday, April 24
Writeups due on Tuesday, April 25 by 5:00pm
Your assignment is to write a 24-bit paint program that runs on the Sweet Hall SGI workstations. You will use your program to prepare texture maps for the shader in assignment #4.
To eliminate X or GL hacking, teaching assistant Apostolos (Toli) Lerios has written a software package that displays any number of windows, henceforth called canvases, and a programmable number of sliders and several kinds of buttons. You will need at least two canvases, one for your painting and one for your brush shape visualization. The size of these canvases is programmable.
The support package handles all mouse events and cursor display outside the canvas. You handle mouse events inside the canvas. In particular, you are responsible for displaying a software cursor in the canvas as shown in class. Use any shape and coloration you like. Your cursor should be clearly visible over any image, but it should avoid obscuring too much of the area being painted. Implement clipping of the software cursor and brush action to the boundaries of the canvas to allow unimpeded painting of pixels near the boundary even if the brush straddles the boundary. If your clipping is working correctly, you should be able to paint the lower-leftmost pixel in your canvas using the upper-rightmost pixel in your brush even though most of the brush is beyond the canvas boundaries. Note that in keeping with the usual X convention, you retain control of the mouse when it wanders beyond the canvas boundaries as long as the button stays pressed.
Painting should start when the left mouse button is pushed and the mouse is in the canvas. It should stop when the button is released. Depending on the sort of tinting you implement, you might wish to continue painting at full throttle even if the mouse is held motionless, or you might wish to apply a new brush instance only if the mouse moves some minimum distance. Experiment with different effects. The support package allows you to modify the rate at which you receive mouse events if the mouse is held motionless while the button is pushed.
The support package runs on most X-compatible workstations. If you are working on a 24-bit workstation with hardware gamma correction (such as our SGIs), the package allows you to display your 24-bit painting directly. If you are working on an 8-bit color workstation with no hardware gamma correction, the package automatically dithers and gamma corrects your painting prior to display.
The package is described in the file /usr/class/cs248/support/xsupport/README. Everything you need to know is contained in this file. To use the package, you must program in C or C++. If you use an incompatible language or platform, you should write a software package that mimics our user interface as closely as possible as this will greatly facilitate grading. Remember that all demos must be given in the Sweet Hall SGI lab. To help us judge the performance of your program, it should be executing on a Sweet Hall SGI workstation as well as displaying there during your demo.
To facilitate debugging (and grading) of this and future assignments, allow the
user to display the red, green, or blue components of your image in isolation
by setting the appropriate mode flags on your canvases. See Toli's
documentation for details. Use radio buttons to switch between modes. For
more help with your debugging, we suggest using the "supersnoop" (for SGIs) or
"xmag" (for Sparcs and Decstations) standalone pixel magnification utilities.
If you want a test background image, large and small versions of an alpine
pasture are available. To get an intuition for how RGB and HSV color mixing
work, play with the SGI "cedit" utility. Use the right mouse button to switch
modes. See /usr/class/cs248/bin/README for details on where to find
supersnoop and xmag. The alpine pasture is in /usr/class/cs248/data/textures.
Signup sheets will be posted in the Sweet Hall lab a few days before Monday, April 24. Each team will sign up for a 1-hour slot on Monday sometime during which they will be called upon to give a 15-minute demo. All demos must be given in the lab. By 5:00pm on Tuesday, April 25, you must submit an on-line commented copy of your source code and a brief (1-2 pages) hardcopy description of the functionality implemented. See /usr/class/cs248/submissions/README for instructions on submitting your code on-line. Bins for turning in and retrieving the hardcopy description of your functionality are located near Sarah's office. The assignment will be graded on correctness (40 points), efficiency (20 points), programming style (20 points), and the elegance of your user interface (20 points).
You may work alone or in teams of two. For a team effort, you must implement two of the following bells and whistles. Alternatives are acceptable if approved in advance. If you have completed the assignment and wish to earn extra credit, you may add more bells and whistles.
For the error diffusion dithering and colormap quantization bells, you'll need to display a colormapped image. Toli's package does not give you access to the colormap, but you can easily simulate one on the SGI workstations by displaying appropriately quantized 24-bit values. This scheme won't work on an 8-bit workstation, where Toli's dithering will interfere with your simulated colormapping or dithering.