home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / netpbma.zip / pbm / macptopbm.c < prev    next >
C/C++ Source or Header  |  1993-12-07  |  3KB  |  141 lines

  1. /* macptopbm.c - read a MacPaint file and produce a portable bitmap
  2. **
  3. ** Copyright (C) 1988 by Jef Poskanzer.
  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 "pbm.h"
  14. #include "macp.h"
  15.  
  16. static void ReadMacPaintFile ARGS(( FILE* file, int extraskip, int* scanLineP, unsigned char Pic[MAX_LINES][BYTES_WIDE] ));
  17.  
  18. static unsigned char Pic[MAX_LINES][BYTES_WIDE];
  19.  
  20. int
  21. main( argc, argv )
  22.     int argc;
  23.     char* argv[];
  24.     {
  25.     FILE* ifp;
  26.     bit* bitrow;
  27.     int argn, extraskip, scanLine, rows, cols, row, bcol, i;
  28.     char* usage = "[-extraskip N] [macpfile]";
  29.  
  30.  
  31.     pbm_init( &argc, argv );
  32.  
  33.     argn = 1;
  34.     extraskip = 0;
  35.  
  36.     /* Check for flags. */
  37.     if ( argn < argc && argv[argn][0] == '-' && argv[argn][1] != '\0' )
  38.     {
  39.     if ( pm_keymatch( argv[argn], "-extraskip", 2 ) )
  40.         {
  41.         argn++;
  42.         if ( argn == argc || sscanf( argv[argn], "%d", &extraskip ) != 1 )
  43.         pm_usage( usage );
  44.         }
  45.     else
  46.         pm_usage( usage );
  47.     argn++;
  48.     }
  49.  
  50.     if ( argn < argc )
  51.     {
  52.     ifp = pm_openr( argv[argn] );
  53.     argn++;
  54.     }
  55.     else
  56.     ifp = stdin;
  57.  
  58.     if ( argn != argc )
  59.     pm_usage( usage );
  60.  
  61.     ReadMacPaintFile( ifp, extraskip, &scanLine, Pic );
  62.  
  63.     pm_close( ifp );
  64.  
  65.     cols = BYTES_WIDE * 8;
  66.     rows = scanLine;
  67.     pbm_writepbminit( stdout, cols, rows, 0 );
  68.     bitrow = pbm_allocrow( cols );
  69.  
  70.     for ( row = 0; row < rows; row++ )
  71.     {
  72.     for ( bcol = 0; bcol < BYTES_WIDE; bcol++ )
  73.         for ( i = 0; i < 8; i++ )
  74.         bitrow[bcol * 8 + i] =
  75.             ( (Pic[row][bcol] >> (7 - i)) & 1 ) ? PBM_BLACK : PBM_WHITE;
  76.     pbm_writepbmrow( stdout, bitrow, cols, 0 );
  77.     }
  78.  
  79.     pm_close( stdout );
  80.     exit( 0 );
  81.     }
  82.  
  83. /*
  84. ** Some of the following routine is:
  85. **
  86. **                Copyright 1987 by Patrick J. Naughton
  87. **                         All Rights Reserved
  88. ** Permission to use, copy, modify, and distribute this software and its
  89. ** documentation for any purpose and without fee is hereby granted,
  90. ** provided that the above copyright notice appear in all copies and that
  91. ** both that copyright notice and this permission notice appear in
  92. ** supporting documentation.
  93. */
  94.  
  95. static void
  96. ReadMacPaintFile( file, extraskip, scanLineP, Pic )
  97.     FILE* file;
  98.     int extraskip;
  99.     int* scanLineP;
  100.     unsigned char Pic[MAX_LINES][BYTES_WIDE];
  101.     {
  102.     unsigned int i, j, k;
  103.     unsigned char ch;
  104.  
  105.     /* Skip over the header. */
  106.     for ( i = 0; i < extraskip; i++ )
  107.     getc( file );
  108.     for ( i = 0; i < HEADER_LENGTH; i++ )
  109.     getc( file );
  110.  
  111.     *scanLineP = 0;
  112.     k = 0;
  113.  
  114.     while ( *scanLineP < MAX_LINES )
  115.     {
  116.     ch = (unsigned char) getc( file );    /* Count byte */
  117.     i = (unsigned int) ch;
  118.     if ( ch < 0x80 )
  119.         {    /* Unpack next (I+1) chars as is */
  120.         for ( j = 0; j <= i; j++ )
  121.         if ( *scanLineP < MAX_LINES )
  122.             {
  123.             Pic[*scanLineP][k++] = (unsigned char) getc( file );
  124.             if ( ! (k %= BYTES_WIDE) )
  125.             *scanLineP += 1;
  126.             }
  127.         }
  128.     else
  129.         {    /* Repeat next char (2's comp I) times */
  130.         ch = getc( file );
  131.         for ( j = 0; j <= 256 - i; j++ )
  132.         if ( *scanLineP < MAX_LINES )
  133.             {
  134.             Pic[*scanLineP][k++] = (unsigned char) ch;
  135.             if ( ! (k %= BYTES_WIDE) )
  136.             *scanLineP += 1;
  137.             }
  138.         }
  139.     }
  140.     }
  141.