home *** CD-ROM | disk | FTP | other *** search
- /***********
- * movespan()
- *
- * Move a span of common values into frame buffer memory. Assume that
- * the frame buffer is organized as one byte per pixel; consecutive pixels
- * occupy consecutive bytes. We assume that the longest span has 16 pixels;
- * longer spans may be handled by coding additional cases. See
- * movelongspan() for an alternative.
- *
- * PARAMETERS:
- * here : pointer to the first pixel to be set
- * val : the value (e.g intensity) to be placed at each pixel
- * n : the number of pixels to be illuminated
- *
- * AUTHOR: Thom Grace, CS Dept, Illinois Institute of Technology,
- * Chicago, IL 60616 (grace@iitmax.iit.edu)
- ***********/
-
- movespan(unsigned char *here, unsigned char val, int n) {
- /*This is simple: fall into the proper place in the switch*/
- switch(n) {
- case 16: *(here++) = val;
- case 15: *(here++) = val;
- case 14: *(here++) = val;
- case 13: *(here++) = val;
- case 12: *(here++) = val;
- case 11: *(here++) = val;
- case 10: *(here++) = val;
- case 9: *(here++) = val;
- case 8: *(here++) = val;
- case 7: *(here++) = val;
- case 6: *(here++) = val;
- case 5: *(here++) = val;
- case 4: *(here++) = val;
- case 3: *(here++) = val;
- case 2: *(here++) = val;
- case 1: *(here++) = val;
- case 0: return;
- }
- } /*end of movespan()*/
-
-
- /***********
- * movelongspan()
- *
- * This will move an arbitrarily long sequence of constant values into
- * frame buffer memory. Loops are partially unrolled, requiring about
- * 1/16 of the overhead of movespan(). Note that the number of switch
- * cases should be one less than the number of statements in the loop
- * which should be the same as the constant in the loop condition.
- *
- * PARAMETERS: here : pointer to first pixel to be set;
- * val : value to be placed at each pixel;
- * n : number of pixels to be illuminated.
- *
- * AUTHOR: Thom Grace, CS Dept, Illinois Institute of Technology,
- * Chicago, IL 60616 (grace@iitmax.iit.edu)
- ***********/
- movelongspan(unsigned char *here, unsigned char val, int n) {
- /*Illuminate 16 pixels at a time, as long as we are able*/
- while (n >= 16) {
- *(here++)=val; *(here++)=val; *(here++)=val; *(here++)=val;
- *(here++)=val; *(here++)=val; *(here++)=val; *(here++)=val;
- *(here++)=val; *(here++)=val; *(here++)=val; *(here++)=val;
- *(here++)=val; *(here++)=val; *(here++)=val; *(here++)=val;
- n -= 16; /*count off those pixels*/
- }
- /*Now fall into the proper place in the switch*/
- switch(n) {
- case 16: *(here++) = val;
- case 15: *(here++) = val;
- case 14: *(here++) = val;
- case 13: *(here++) = val;
- case 12: *(here++) = val;
- case 11: *(here++) = val;
- case 10: *(here++) = val;
- case 9: *(here++) = val;
- case 8: *(here++) = val;
- case 7: *(here++) = val;
- case 6: *(here++) = val;
- case 5: *(here++) = val;
- case 4: *(here++) = val;
- case 3: *(here++) = val;
- case 2: *(here++) = val;
- case 1: *(here++) = val;
- case 0: return;
- }
- } /*end of movespan()*/
-
-
- /***********
- * shadespan()
- *
- * This will move a span of shade values into frame buffer memory.
- * The shades are computed by the addition of a shading constant. This
- * assumes that the frame buffer is organized as one byte per pixel and
- * that consecutive pixels occupy consecutive bytes. This also assumes
- * that the longest span is of length 16; see previous code for ideas on
- * how to alleviate this limitation.
- *
- * PARAMETERS:
- * here : pointer to the first pixel to be set
- * val : the value (e.g intensity) to be placed at the first
- * pixel MINUS the parameter disp (see below)
- * n : the number of pixels to be illuminated
- * disp : the shading constant
- *
- * AUTHOR: Thom Grace, CS Dept, Illinois Institute Of Technology,
- * Chicago, IL 60616 (grace@iitmax.iit.edu)
- ***********/
-
- shadespan(unsigned char *here, unsigned char val, int n, int disp)
- {
- /*Each pixel is filled with the incremented intensity*/
- switch(n) {
- case 16: *(here++) = (val += disp);
- case 15: *(here++) = (val += disp);
- case 14: *(here++) = (val += disp);
- case 13: *(here++) = (val += disp);
- case 12: *(here++) = (val += disp);
- case 11: *(here++) = (val += disp);
- case 10: *(here++) = (val += disp);
- case 9: *(here++) = (val += disp);
- case 8: *(here++) = (val += disp);
- case 7: *(here++) = (val += disp);
- case 6: *(here++) = (val += disp);
- case 5: *(here++) = (val += disp);
- case 4: *(here++) = (val += disp);
- case 3: *(here++) = (val += disp);
- case 2: *(here++) = (val += disp);
- case 1: *(here++) = (val += disp);
- case 0: return;
- }
- } /*end of movespan()*/
-