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