mike@relgyro.stanford.edu (Mike Macgirvin) (12/10/88)
The following is a program I wrote to convert PC paintbrush .PCX files (as used by Ventura Publisher, etc.) to Sun rasterfiles. The original purpose was to place images scanned from a PC package into FrameMaker. There are no doubt other applications. Possible extensions include accepting and outputting color images. mike@relgyro.stanford.edu ---------------------------% SNIP SNIP SNIP %---------------------------- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # pcx2rf.c # This archive created: Fri Dec 9 16:47:34 1988 export PATH; PATH=/bin:$PATH echo shar: extracting "'pcx2rf.c'" '(3752 characters)' if test -f 'pcx2rf.c' then echo shar: will not over-write existing file "'pcx2rf.c'" else sed 's/^ X//' << \SHAR_EOF > 'pcx2rf.c' X/* pcx2rf.c */ X/* Convert single plane PC paintbrush (.PCX) file to Sun rasterfile X * format. We assume here a binary bitmap with no color information, and X * standard PCX run length encoding bitmap. The following program is X * released as is, with no warranty expressed as to its correctness or X * suitability for any particular application. The name of the author X * shall remain on any copies or derivative works. Otherwise, there are X * no restrictions as to its use, or transfer. X * X * Mike Macgirvin X * Stanford Relativity Gyro Program GP-B X * Stanford, Calif. 94503 X * ARPA: mike@relgyro.stanford.edu X * 9 DEC 88 X * X * X */ X X#include <rasterfile.h> X#include <stdio.h> X X Xstruct rasterfile ras; XFILE *fi; XFILE *fo; X Xint bytes_per_row = 0; Xint fill_req = 0; X Xunsigned char pcxhd[128]; X Xmain(argc,argv) X int argc; X char **argv; X{ X int cnt,c,n; X int xmin = 0; X int xmax = 0; X int ymin = 0; X int ymax = 0; X int status = 0; X X if(argc != 3) { X (void) fprintf(stderr,"usage: %s infile.pcx outfile.rf\n",argv[0]); X exit(0); X } X /* open files */ X if((fi = fopen(argv[1],"r")) == NULL) { X perror("pcx2rf :input file"); X exit(1); X } X if((fo = fopen(argv[2],"w")) == NULL) { X perror("pcx2rf :output file"); X exit(1); X } X /* read .PCX header */ X for(cnt = 0; cnt < 127; cnt ++) { X if((c = getc(fi)) == EOF) { X (void) fprintf(stderr,"Incomplete .PCX header\n"); X exit(1); X } X pcxhd[cnt] = c; X } X /* calculate raster header and swap bytes */ X xmin = pcxhd[4] + ( 256 * pcxhd[5]); X ymin = pcxhd[6] + ( 256 * pcxhd[7]); X xmax = pcxhd[8] + ( 256 * pcxhd[9]); X ymax = pcxhd[10]+ ( 256 * pcxhd[11]); X xmax = xmax - xmin + 1; X ymax = ymax - ymin + 1; X bytes_per_row = pcxhd[66] + (256 * pcxhd[67]); X /* Sun requires multiples of 16 bits, pad if necessary */ X if(bytes_per_row & 1) X fill_req = 1; X (void) X printf("%d pixels X %d pixels, %d bytes per row\n",xmax,ymax,bytes_per_row); X ras.ras_magic = RAS_MAGIC; X ras.ras_width = xmax; X /* if necessary, round off to 16 bits */ X if(n = xmax & 15) X ras.ras_width = xmax + (16 - n); X ras.ras_height = ymax; X ras.ras_depth = 1; X ras.ras_length = (bytes_per_row * fill_req) + ( bytes_per_row * ymax ); X ras.ras_type = 1; X ras.ras_maptype = 0; X ras.ras_maplength = 0; X /* write out rasterfile header */ X (void) fwrite((char *) &ras,sizeof(struct rasterfile),1,fo); X /* transform compressed bitmap */ X status = readpcx(); X /* we b done */ X (void) fclose(fi); X (void) fclose(fo); X X exit(status); X} X X Xreadpcx() X{ X /* goes like this: read a byte. if the two high bits are set, then the X * low 6 bits contain a repeat count, and the char to repeat is the next X * char in the file. If the two high bits are not set, then this is the X * char to write. At the end of each row, pad if necessary to multiple of X * 16 bits. We also invert the image. X */ X X int byte_cnt = 0; X int c; X int x; X int cnt; X while((c = fgetc(fi)) != EOF) { X if(c & 0xC0) { X cnt = c & 0x3F; X if((c = fgetc(fi)) == EOF) { X (void) fprintf(stderr,"Unexpected end of file on input\n"); X return(1); X } X for(x = 0; x < cnt; x ++) { X (void) fputc(255 - c,fo); X byte_cnt ++; X if(byte_cnt == bytes_per_row - 1) { X if(fill_req) (void) fputc(0,fo); X byte_cnt = 0; X } X } X } X else { X (void) fputc(255 - c,fo); X byte_cnt ++; X if(byte_cnt == bytes_per_row - 1) { X if(fill_req) (void) fputc(0,fo); X byte_cnt = 0; X } X } X } X return(0); X} X SHAR_EOF if test 3752 -ne "`wc -c < 'pcx2rf.c'`" then echo shar: error transmitting "'pcx2rf.c'" '(should have been 3752 characters)' fi fi # end of overwriting check # End of shell archive exit 0