00001 #include <stdio.h> 00002 #include <stdlib.h> 00003 #include <unistd.h> 00004 00005 void 00006 usage (void) 00007 { 00008 fprintf (stderr, "usage: imgsplit\n"); 00009 exit (1); 00010 } 00011 00012 int 00013 PCX_D (char *src,char *dest,unsigned src_size) 00014 { 00015 char num; 00016 char *orig_dest = dest; 00017 do { 00018 if ((*src&0xc0)==0xc0) { 00019 num=*(src++)&0x3f; src_size--; 00020 while ((num--)>0) {*(dest++)=*src;} 00021 src++;src_size--; 00022 } else { 00023 (*dest++)=*(src++);src_size--; 00024 }; 00025 } while(src_size); 00026 return (dest - orig_dest); 00027 } 00028 00029 int 00030 read_img_frame (FILE *inf, char *rgb) 00031 { 00032 unsigned char map[256 * 3]; 00033 unsigned int len; 00034 char compressed[64 * 1024]; 00035 int idx; 00036 unsigned char *up; 00037 char ipix[320 * 200]; 00038 00039 len = fread (&map, 1, sizeof map, inf); 00040 00041 if (len == 0) 00042 return (-1); 00043 00044 if (len != sizeof map) 00045 goto bad; 00046 00047 if (fread (&len, 4, 1, inf) != 1) 00048 goto bad; 00049 00050 if (len > sizeof compressed) { 00051 fprintf (stderr, "frame too big\n"); 00052 goto bad; 00053 } 00054 00055 if (fread (compressed, 1, len, inf) != len) 00056 goto bad; 00057 00058 PCX_D (compressed, ipix, len); 00059 00060 for (idx = 0; idx < 320 * 200; idx++) { 00061 up = map + (ipix[idx] & 0xff) * 3; 00062 *rgb++ = *up++ * 4; 00063 *rgb++ = *up++ * 4; 00064 *rgb++ = *up++ * 4; 00065 } 00066 00067 return (0); 00068 00069 bad: 00070 fprintf (stderr, "bad img file\n"); 00071 exit (1); 00072 } 00073 00074 int 00075 main (int argc, char **argv) 00076 { 00077 int c; 00078 char *inname; 00079 FILE *inf; 00080 int fnum; 00081 char rgb[320 * 200 * 3]; 00082 char outname[1000]; 00083 FILE *outf; 00084 00085 while ((c = getopt (argc, argv, "")) != EOF) { 00086 switch (c) { 00087 default: 00088 usage (); 00089 } 00090 } 00091 00092 if (optind >= argc) 00093 usage (); 00094 00095 inname = argv[optind++]; 00096 00097 if (optind != argc) 00098 usage (); 00099 00100 if ((inf = fopen (inname, "rb")) == NULL) { 00101 fprintf (stderr, "can't open %s\n", inname); 00102 exit (1); 00103 } 00104 00105 fnum = 0; 00106 00107 while (1) { 00108 fnum++; 00109 00110 if (read_img_frame (inf, rgb) < 0) 00111 break; 00112 00113 sprintf (outname, "c%02d.ppm", fnum); 00114 if ((outf = fopen (outname, "wb")) == NULL) { 00115 fprintf (stderr, "can't create %s\n", outname); 00116 exit (1); 00117 } 00118 fprintf (outf, "P6\n320 200\n255\n"); 00119 fwrite (rgb, 1, 3 * 320 * 200, outf); 00120 fclose (outf); 00121 } 00122 00123 return (0); 00124 } 00125