home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / PCX2TXT.ZIP / pcx2txt.c next >
C/C++ Source or Header  |  1994-11-15  |  4KB  |  156 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAXLEN 70
  5. #define NO_ERR 0
  6. #define OUTFILE_ERR 1
  7. #define INFILE_ERR 2
  8. #define BUFFERGET_ERR 3
  9.  
  10. typedef struct PCX_HEADER {
  11.   char manufacturer;
  12.   char version;
  13.   char encoding;
  14.   char bits_per_pixel;
  15.   int  xmin,ymin;
  16.   int  xmax,ymax;
  17.   int  hres;
  18.   int  vres;
  19.   char palette16[48];
  20.   char reserved;
  21.   char color_planes;
  22.   int  bytes_per_line;
  23.   int  palette_type;
  24.   char filler[58];
  25. } pcx_header;
  26.  
  27. struct IMG {
  28.   char far *buffer;
  29.   unsigned int xsize;
  30.   unsigned int ysize;
  31. } image;
  32.  
  33.  
  34. char *ERROR[4]  = { { "No Errors"},
  35.                     { "Could not create OUTPUT file."},
  36.                     { "Could not open INPUT file."},
  37.                     { "Could not ALLOCATE memory."} };
  38.  
  39. int MakeText(char *outname)
  40. {
  41.  
  42.   FILE *outstream;
  43.   char far *BufferPtr;
  44.   unsigned int i, len, line_length;
  45.   unsigned int dotcount=0, dotplot;
  46.  
  47.   BufferPtr = image.buffer;
  48.   len = image.xsize * image.ysize;
  49.   dotplot = len/30;
  50.   outstream = fopen(outname,"w+t");
  51.   if (outstream == (FILE *)NULL)
  52.   {
  53.     fprintf(stderr,"Can't open output file [ %s ]!\n", outname);
  54.     return(1);
  55.   }
  56.   fprintf(outstream,"// FM Flat mode image file\n");
  57.   fprintf(outstream,"// Original Save File: %s\n",outname);
  58.   fprintf(outstream,"// Size =%u\n", image.xsize*image.ysize);
  59.   fprintf(outstream,"// Xsize=%u, Ysize=%u\n", image.xsize, image.ysize);
  60.   fprintf(outstream,"unsigned char far IMAGE[] = {\n");
  61.   fprintf(outstream,"  "); line_length=2;
  62.   printf("0%           50%          100%\n");
  63.   printf("+----------------------------+\n");
  64.   for(i = 0; i < len; i++, dotcount++)
  65.   {
  66.     if(dotcount == dotplot)
  67.     {
  68.       dotcount=0;
  69.       printf("+");
  70.     }
  71.     fprintf(outstream,"0x%+0.2X,",BufferPtr[i]);
  72.     line_length+=5;
  73.     if(line_length > MAXLEN)
  74.     {
  75.       fprintf(outstream,"\n  ");
  76.       line_length=2;
  77.     }
  78.   }
  79.   printf("\ndone\n");
  80.   fseek(outstream,-1,SEEK_END);
  81.   fclose(outstream);
  82.   return(0);
  83. }
  84.  
  85. int loadpcx(char * filename)
  86. {
  87.   FILE *infile;
  88.   char far * ImagePtr;
  89.   unsigned int x, i=0;
  90.   unsigned int Points;
  91.   int c;
  92.   pcx_header pcxhead;
  93.   if ((infile=fopen(filename,"rb"))==NULL) return(2);
  94.   fseek(infile,0L,SEEK_SET);
  95.   fread(&pcxhead,sizeof(pcx_header),1,infile);
  96.   image.xsize = (pcxhead.xmax-pcxhead.xmin) + 1;
  97.   image.ysize = (pcxhead.ymax-pcxhead.ymin) + 1;
  98.   Points = image.xsize * image.ysize;
  99.   image.buffer = (char far *) malloc(Points);
  100.   if(image.buffer==NULL) return(3);
  101.   ImagePtr=image.buffer;
  102.   for (i=0;i<Points;++i)
  103.   {
  104.     c=fgetc(infile) & 0xff;
  105.     if((c & 0xc0) == 0xc0) 
  106.     {
  107.       x=c & 0x3f;
  108.       c=fgetc(infile);
  109.       while(x--)
  110.       {
  111.         *(ImagePtr++)=c;
  112.         i++;
  113.       }
  114.       i--;
  115.     }
  116.     else
  117.     {
  118.       *(ImagePtr++)=c;
  119.     }
  120.   }
  121.   fclose(infile);
  122.   return(0);
  123. }
  124.  
  125. void ExitFunction(void)
  126. {
  127.   if(image.buffer) free(image.buffer);
  128. }
  129.  
  130. void DisplayError(int error)
  131. {
  132.   printf("ERROR: %s\n", ERROR[error]);
  133.   exit(error);
  134. }
  135.  
  136. void main(int argc, char *argv[])
  137. {
  138.   int error;
  139.   atexit(ExitFunction);
  140.   printf("\n\n\n");
  141.   printf("PCX to TEXT file converter, By Mark C. Williston\n");
  142.   printf("------------------------------------------------\n");
  143.   printf("Converts 256 color PCX files to TEXT files which\n");
  144.   printf("can be directly compiled in C programs.  Handles\n");
  145.   printf("image files 64K or less.\n");
  146.   printf("------------------------------------------------\n");
  147.   if(argc<3)
  148.   {
  149.     printf("Usage - PCX2TXT filename.PCX filename.ext\n");
  150.     exit(-1);
  151.   }
  152.   error = loadpcx(argv[1]);
  153.   if(error) DisplayError(error);
  154.   MakeText(argv[2]);
  155. }
  156.