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