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