home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 309.lha / PBM_PLUS / pbm / pbmtomacp.c < prev    next >
C/C++ Source or Header  |  1980-12-04  |  6KB  |  282 lines

  1. /* pbmtomacp.c - read a portable bitmap and produce a MacPaint bitmap file
  2. **
  3. ** Copyright (C) 1988 by Douwe vand der Schaaf.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include "pbm.h"
  15. #include "macp.h"
  16.  
  17. #define TRUE        1
  18. #define FALSE        0
  19. #define EQUAL        1
  20. #define UNEQUAL        0
  21.  
  22. FILE *fdout;
  23. char *usage = "[-l left] [-r right] [-b bottom] [-t top] [pbmfile]";
  24.  
  25. main(argc, argv)
  26. int argc;
  27. char *argv[];
  28. { int c;
  29.   FILE *ifd;
  30.   register bit **bits, **bitsr;
  31.   int argn, rows, cols;
  32.   int left,bottom,right,top;
  33.   int lflg, rflg, tflg, bflg, errflg;
  34.   char name[100];
  35.  
  36.   pm_progname = argv[0];
  37.  
  38.   argn = 1;
  39.   fdout = stdout;
  40.   errflg = lflg = rflg = tflg = bflg = 0;
  41.  
  42.   while ( argn < argc && argv[argn][0] == '-' )
  43.   { switch ( argv[argn][1] )
  44.     { case 'l':
  45.       lflg++;
  46.       argn++;
  47.       left = atoi( argv[argn] );
  48.       break;
  49.  
  50.       case 'r':
  51.       rflg++;
  52.       argn++;
  53.       right = atoi( argv[argn] );
  54.       break;
  55.  
  56.       case 't':
  57.       tflg++;
  58.       argn++;
  59.       top = atoi( argv[argn] );
  60.       break;
  61.  
  62.       case 'b':
  63.       bflg++;
  64.       argn++;
  65.       bottom = atoi( argv[argn] );
  66.       break;
  67.  
  68.       case '?':
  69.       default:
  70.       pm_usage( usage );
  71.     }
  72.     argn++;
  73.   }
  74.  
  75.   if ( argn == argc )
  76.   { ifd = stdin;
  77.     strcpy( name, "noname" );
  78.   }
  79.   else
  80.   { ifd = pm_openr( argv[argn] );
  81.     strcpy( name, argv[argn] );
  82.   }
  83.  
  84.   bitsr = pbm_readpbm( ifd, &cols, &rows );
  85.  
  86.   pm_close( ifd );
  87.  
  88.   bits = pbm_allocarray( MAX_COLS, MAX_LINES );
  89.  
  90.   if( !lflg )
  91.     left = 0;
  92.  
  93.   if( rflg )
  94.   { if( right - left >= MAX_COLS )
  95.       right = left + MAX_COLS - 1;
  96.   }
  97.   else
  98.     right = ( left + MAX_COLS > cols ) ? ( cols - 1 ) : ( left + MAX_COLS - 1 );
  99.  
  100.   if( !tflg )
  101.     top = 0;
  102.  
  103.   if( bflg )
  104.   { if( bottom - top >= MAX_LINES )
  105.       bottom = top + MAX_LINES - 1;
  106.   }
  107.   else
  108.     bottom = ( top + MAX_LINES > rows ) ?
  109.            ( rows - 1 ) : ( top + MAX_LINES - 1 );
  110.   
  111.     if( right <= left || left < 0 || right - left + 1 > MAX_COLS )
  112.       pm_error("error in right (= %d) and/or left (=%d)",right,left, 0,0,0 );
  113.     if( bottom <= top || top < 0 || bottom - top + 1 > MAX_LINES )
  114.       pm_error("error in bottom (= %d) and/or top (=%d)",bottom,top, 0,0,0 );
  115.  
  116.   fillbits( bits, bitsr, top, left, bottom, right );
  117.  
  118.   writemacp( bits );
  119.  
  120. } /* main */
  121.  
  122. /* - - - - - - - - - - - - - - - - - - - - - - - - - - */
  123.  
  124. /* centreer het over te zenden plaatje in het MacPaint document
  125.  *
  126.  * Het plaatje wordt vanaf al of niet opgegeven (left, bottom)
  127.  * in een pbm bitmap van de juist macpaint afmetingen gezet,
  128.  * en eventueel afgekapt.
  129.  */
  130. fillbits( bits, bitsr, top, left, bottom, right )
  131. bit **bits, **bitsr;
  132. int top, left, bottom, right;
  133. { register bit *bi, *bir;
  134.   register int i, j;
  135.   register int bottomr, leftr, topr, rightr;
  136.   int width, height;
  137.  
  138.   width = right - left + 1;
  139.   leftr = (MAX_COLS - width) / 2;
  140.   rightr = leftr + width - 1;
  141.  
  142.   height = bottom - top + 1;
  143.   topr = ( MAX_LINES - height ) / 2;
  144.   bottomr = topr + height - 1;
  145.  
  146.   for( i = 0; i < topr; i++ )
  147.   { bi = bits[i];
  148.     for( j = 0; j < MAX_COLS; j++ )
  149.       *bi++ = 0;
  150.   }
  151.  
  152.   for( i = topr; i <= bottomr; i++ )
  153.   { bi = bits[i];
  154.     { for( j = 0; j < leftr; j++ )
  155.     *bi++ = 0;
  156.       bir = bitsr[ i - topr + top ];
  157.       for( j = leftr; j <= rightr; j++ )
  158.     *bi++ = bir[j - leftr + left];
  159.       for( j = rightr + 1; j < MAX_COLS; j++ )
  160.     *bi++ = 0;
  161.   } }
  162.  
  163.   for( i = bottomr + 1; i < MAX_LINES; i++ )
  164.   { bi = bits[i];
  165.     for( j = 0; j < MAX_COLS; j++ )
  166.       *bi++ = 0;
  167.   }
  168. } /* fillbits */
  169.       
  170. /* - - - - - - - - - - - - - - - - - - - - - - - - - - */
  171.  
  172. writemacp( bits )
  173. bit **bits;
  174. { register int i;
  175.   bit pb[MAX_COLS * 2];
  176.   int npb;
  177.  
  178.   header();
  179.   for( i=0; i < MAX_LINES; i++ )
  180.   { npb = packit( pb, bits[i] );
  181.     sendbytes( pb, npb );
  182.   }
  183. } /* writemacp */
  184.  
  185. /* - - - - - - - - - - - - - - - - - - - - - - - - - - */
  186.  
  187. /* pack regel van MacPaint doc in Apple's format
  188.  * return value = # of bytes in pb 
  189.  */
  190. int
  191. packit( pb, bits )
  192. bit *pb, *bits;
  193. { register int charcount, npb, newcount, flg;
  194.   bit temp[72];
  195.   bit *count, *srcb, *destb, save;
  196.  
  197.   srcb = bits; destb = temp;
  198.   filltemp( destb, srcb );
  199.   srcb = temp;
  200.   destb = pb;
  201.   npb = 0;
  202.   charcount = BYTES_WIDE;
  203.   flg = EQUAL;
  204.   while( charcount )
  205.   { save = *srcb++;
  206.     charcount--;
  207.     newcount = 1;
  208.     while( (*srcb == save) && charcount )
  209.     { srcb++;
  210.       newcount++;
  211.       charcount--;
  212.     }
  213.     if( newcount > 2 )
  214.     { count = destb++;
  215.       *count = 257 - newcount;
  216.       *destb++ = save;
  217.       npb += 2;
  218.       flg = EQUAL;
  219.     }
  220.     else
  221.     { if( flg == EQUAL )
  222.       { count = destb++;
  223.     *count = newcount - 1;
  224.     npb++;
  225.       }
  226.       else
  227.     *count += newcount;
  228.       while( newcount-- )
  229.       { *destb++ = save;
  230.         npb++;
  231.       }
  232.       flg = UNEQUAL;
  233.   } }
  234.   return npb;
  235. } /* packit */
  236.  
  237. /* - - - - - - - - - - - - - - - - - - - - - - - - - - */
  238.  
  239. filltemp( dest, src )
  240. bit *src, *dest;
  241. { register unsigned char ch, zero, acht;
  242.   register int i, j;
  243.  
  244.   zero = '\0';
  245.   acht = 8;
  246.   i = BYTES_WIDE;
  247.   while( i-- )
  248.   { ch = zero; 
  249.     j = acht;
  250.     while( j-- )
  251.     { ch <<= 1;
  252.       if( *src++ )
  253.     ch++;
  254.     }
  255.     *dest++ = ch;
  256.   }
  257. } /* filltemp */
  258.  
  259. /* - - - - - - - - - - - - - - - - - - - - - - - - - - */
  260.  
  261. sendbytes( pb, npb )
  262. bit *pb;
  263. register int npb;
  264. { register bit *b;
  265.  
  266.   b = pb;
  267.   while( npb-- )
  268.     putc( *b++, fdout );
  269. } /* sendbytes */
  270.  
  271. /* - - - - - - - - - - - - - - - - - - - - - - - - - - */
  272.  
  273. header()
  274. { register int i;
  275.   register char ch;
  276.  
  277.   /* header contains nothing ... */
  278.   ch = '\0';
  279.   for(i = 0; i < HEADER_LENGTH; i++ )
  280.     putc( ch, fdout );
  281. } /* header */
  282.