home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1B / DATAFILE_PDCD1B.iso / _pocketbk / pocketbook / opl / pbm2p008_t / pbm2p008_t~ / conv / pbmtopic.c < prev    next >
C/C++ Source or Header  |  1994-02-17  |  3KB  |  136 lines

  1. #include <stdio.h>
  2. #include "pic.h"
  3.  
  4. #define ISWHITE(c) (c == ' ' || c == '\t' || c == '\n' || c == '\r')
  5.  
  6. int
  7. getnum()
  8. {
  9.   char buf[256], *bp;
  10.   int c;
  11.  
  12.   bp = buf;
  13.   while((c = getchar()) != EOF)
  14.     if(c == '#')
  15.       {
  16.     while((c = getchar()) != EOF)
  17.       if(c == '\n')
  18.         break;
  19.       }
  20.     else
  21.       if(!ISWHITE(c))
  22.     break;
  23.  
  24.   *bp++ = c;
  25.   while((c = getchar()) != EOF)
  26.     if(ISWHITE(c) || c == '#')
  27.       break;
  28.     else
  29.       *bp++ = c;
  30.   *bp++ = 0;
  31.   if(c == EOF)
  32.     {
  33.       fprintf(stderr, "Premature EOF\n");
  34.       exit(1);
  35.     }
  36.   return atoi(buf);
  37. }
  38.  
  39. main(ac, av)
  40.   int ac;
  41.   char *av[];
  42. {
  43.   extern needmotorolaorder;
  44.   int c, c1, dogray, doascii, tw, w, h,
  45.       mx, mxb, mxg, i, j, v, size;
  46.   unsigned char *bplane, *gplane, *bp, *gp;
  47.   struct P_FSIG pfsig;
  48.   struct WS_PIC_HEADER ph;
  49.  
  50.   if(ac != 1)
  51.     {
  52.       fprintf(stderr, "Usage: pbmtopic  < in > out\n");
  53.       exit(1);
  54.     }
  55.   needmotorolaorder = 0;
  56.   c = getchar(); c1 = getchar();
  57.  
  58.   if(c != 'P' || (c1 != '1' && c1 != '2' && c1 != '4' && c1 != '5'))
  59.     {
  60.       fprintf(stderr, "Only PBM/PGM images please.\n");
  61.       exit(1);
  62.     }
  63.  
  64.   if(c1 == '2' || c1 == '5') dogray = 1;
  65.   if(c1 == '1' || c1 == '2') doascii = 1;
  66.   w = getnum(); h = getnum();
  67.   if(dogray) 
  68.     {
  69.       mx = getnum();
  70.       mxb = mx / 4;
  71.       mxg = 3 * mx / 4;
  72.     }
  73.  
  74.   tw = w + ((-w & 8) ? 8 : 0); /* Magic */
  75.   size = ((tw+7)/8) * h;
  76.   bp = bplane = (unsigned char *)calloc(size, 1);
  77.   if(dogray)
  78.     gp = gplane = (unsigned char *)calloc(size, 1);
  79.  
  80.   for(i = 0; i < h; i++)
  81.     {
  82.       bp = bplane + i * ((tw+7)/8);
  83.       gp = gplane + i * ((tw+7)/8);
  84.       for(c1 = j = 0; j < w; j++)
  85.     {
  86.       if(dogray || doascii)
  87.         c = doascii ? getnum() : getchar();
  88.       else
  89.         {
  90.           if(c1 == 0)
  91.         v = getchar();
  92.           c = v & 0x80;
  93.           v <<= 1;
  94.         }
  95.       if(dogray)
  96.         {
  97.           if(c < mxb)
  98.         *bp |= (1<<c1);
  99.           else if(c < mxg)
  100.         *gp |= (1<<c1);
  101.         }
  102.       else if(c == 0)
  103.         *bp |= (1<<c1);
  104.       if(j == w-1 || ++c1 == 8)
  105.         {
  106.           c1 = 0;
  107.           bp++; gp++;
  108.         }
  109.     }
  110.     }
  111.   bcopy(PIC_MAGIC, pfsig.id, 4);
  112.   pfsig.file_ver = 0x30;
  113.   pfsig.app_ver  = 0x30;
  114.   pfsig.count = ShortSwap(dogray ? 2 : 1);
  115.   fwrite(&pfsig, sizeof(pfsig), 1, stdout);
  116.   
  117.   ph.crc = ShortSwap(docrc16(bplane, size));
  118.   ph.size.x = ShortSwap(w); 
  119.   ph.size.y = ShortSwap(h);
  120.   ph.byte_size = ShortSwap(size);
  121.   ph.offset = LongSwap(12);
  122.   fwrite(&ph, sizeof(ph), 1, stdout);
  123.  
  124.   if(dogray)
  125.     {
  126.       ph.crc = ShortSwap(docrc16(gplane, size));
  127.       ph.offset = LongSwap(size);
  128.       fwrite(&ph, sizeof(ph), 1, stdout);
  129.     }
  130.   fwrite(bplane, size, 1, stdout);
  131.   if(dogray)
  132.     fwrite(gplane, size, 1, stdout);
  133.   fflush(stdout);
  134.   exit(0);
  135. }
  136.