Listing 2 Encode Image Scan Line Functions

/* Encode a scan line and write it to a PCX file (the line is   */
/* assumed to contain the color plane scan lines in sequence,   */
/* with padding for an even number of bytes and trailing white  */
/* data for each line as appropriate)                           */

void pcx_write_line
(
  unsigned char *linep,  /* Scan line buffer pointer            */
  int length,            /* Scan line buffer length (in bytes)  */
  FILE *fp               /* PCX file pointer                    */
)
{
  int curr_data;         /* Current data byte                   */
  int prev_data;         /* Previous data byte                  */
  int data_count;        /* Data repeat count                   */
  int line_count;        /* Scan line byte count                */

  prev_data = *linep++;  /* Initialize the previous data byte   */
  data_count = 1;
  line_count = 1;

  while (line_count < length)   /* Encode scan line             */
  {
    curr_data = *linep++;       /* Get the current data byte    */
    line_count++;               /* Increment line byte count    */

    if (curr_data == prev_data) /* Repeating data bytes ?       */
    {
      data_count++;             /* Increment data repeat count  */

      if (data_count == 0x3f)   /* Max allowable repeat count ? */
      {
        pcx_encode(prev_data, data_count, fp);  /* Encode data  */
        data_count = 0;
      }
    }
    else    /* End of repeating data bytes                      */
    {
      if (data_count > 0)
        pcx_encode(prev_data, data_count, fp);  /* Encode data  */

      prev_data = curr_data;  /* Current data byte now prev     */
      data_count = 1;
    }
  }

  if (data_count > 0)     /* Any remaining data ?               */
  {
  pcx_encode(prev_data, data_count, fp);  /* Encode data        */
  }
}

/* Write an encoded byte pair (or single byte) to a file        */

void pcx_encode
(
  int data,     /* Data byte                                    */
  int count,    /* Data byte repeat count                       */
  FILE *fp      /* PCX file pointer                             */
)
{
  if (((data & 0xc0) == 0xc0) || count > 1)
  {
    putc(0xc0 | count, fp);     /* Write count byte             */
  }

  putc(data, fp);       /* Write data byte                      */
}

/* End of File */