/***********
 * 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)
 ***********/

void 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)
 ***********/
void 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)
 ***********/

void 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()*/
