00001 #include <stdio.h> 00002 #include <stdlib.h> 00003 #include <unistd.h> 00004 #include <fcntl.h> 00005 #include <errno.h> 00006 #include <string.h> 00007 #include <sys/ioctl.h> 00008 #include <sys/time.h> 00009 00010 typedef unsigned short ui16; 00011 00012 int vflag; 00013 00014 void 00015 usage (void) 00016 { 00017 fprintf (stderr, "usage: getvab filename\n"); 00018 exit (1); 00019 } 00020 00021 int 00022 PCX_D (void *src_raw,void *dest_raw,unsigned src_size) 00023 { 00024 char *src = src_raw; 00025 char *dest = dest_raw; 00026 char num; 00027 char *orig_dest = dest; 00028 do { 00029 if ((*src&0xc0)==0xc0) { 00030 num=*(src++)&0x3f; src_size--; 00031 while ((num--)>0) {*(dest++)=*src;} 00032 src++;src_size--; 00033 } else { 00034 (*dest++)=*(src++);src_size--; 00035 }; 00036 } while(src_size); 00037 return (dest - orig_dest); 00038 } 00039 00040 unsigned char cbuf[1000 * 1000]; 00041 unsigned char pixels [1000 * 1000]; 00042 00043 int 00044 main (int argc, char **argv) 00045 { 00046 int c; 00047 char *filename; 00048 FILE *f; 00049 FILE *outf; 00050 int i; 00051 int pixel; 00052 unsigned char *up; 00053 int plr; 00054 char outname[1000]; 00055 00056 while ((c = getopt (argc, argv, "")) != EOF) { 00057 switch (c) { 00058 default: 00059 usage (); 00060 } 00061 } 00062 00063 if (argc - optind != 1) 00064 usage (); 00065 00066 filename = argv[optind]; 00067 00068 if ((f = fopen (filename, "rb")) == NULL) { 00069 fprintf (stderr, "can't open %s\n", filename); 00070 exit (1); 00071 } 00072 00073 struct bImg { 00074 unsigned char pal[768]; 00075 ui16 fSize; 00076 } M; 00077 00078 for (plr = 0; plr < 2; plr++) { 00079 fread (&M, 1, sizeof M, f); 00080 fread (&cbuf, M.fSize, 1, f); 00081 PCX_D (cbuf, pixels, M.fSize); 00082 00083 sprintf (outname, "vab%d.ppm", plr); 00084 outf = fopen (outname, "wb"); 00085 fprintf (outf, "P6\n320 200\n255\n"); 00086 for (i = 0; i < 320*200; i++) { 00087 pixel = pixels[i]; 00088 up = &M.pal[pixel * 3]; 00089 putc (*up++*4, outf); 00090 putc (*up++*4, outf); 00091 putc (*up++*4, outf); 00092 } 00093 fclose (outf); 00094 } 00095 00096 return (0); 00097 } 00098