imgsplit.c

Go to the documentation of this file.
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 

Generated on Fri Sep 28 00:35:45 2007 for raceintospace by  doxygen 1.5.3