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

  1. /* libpbm2.c - pbm utility library part 2
  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. #include "pbm.h"
  15. #include "libpbm.h"
  16.  
  17. static bit
  18. pbm_getbit( file )
  19. FILE *file;
  20.     {
  21.     register char ch;
  22.  
  23.     do
  24.     {
  25.     ch = pbm_getc( file );
  26.     }
  27.     while ( ch == ' ' || ch == '\t' || ch == '\n' );
  28.  
  29.     if ( ch != '0' && ch != '1' )
  30.     pm_error( "junk in file where bits should be", 0,0,0,0,0 );
  31.  
  32.     return ( ch == '1' ) ? 1 : 0;
  33.     }
  34.  
  35. int
  36. pbm_readmagicnumber( file )
  37. FILE *file;
  38.     {
  39.     int ich1, ich2;
  40.  
  41.     ich1 = getc( file );
  42.     if ( ich1 == EOF )
  43.     pm_error( "premature EOF reading magic number", 0,0,0,0,0 );
  44.     ich2 = getc( file );
  45.     if ( ich2 == EOF )
  46.     pm_error( "premature EOF reading magic number", 0,0,0,0,0 );
  47.     return ich1 * 256 + ich2;
  48.     }
  49.  
  50. void
  51. pbm_readpbminitrest( file, colsP, rowsP )
  52. FILE *file;
  53. int *colsP, *rowsP;
  54.     {
  55.     /* Read size. */
  56.     *colsP = pbm_getint( file );
  57.     *rowsP = pbm_getint( file );
  58.     }
  59.  
  60. void
  61. pbm_readpbminit( file, colsP, rowsP, formatP )
  62. FILE *file;
  63. int *colsP, *rowsP, *formatP;
  64.     {
  65.     /* Check magic number. */
  66.     *formatP = pbm_readmagicnumber( file );
  67.     switch ( *formatP )
  68.     {
  69.         case PBM_FORMAT:
  70.         case RPBM_FORMAT:
  71.     pbm_readpbminitrest( file, colsP, rowsP );
  72.     break;
  73.  
  74.     default:
  75.     pm_error( "bad magic number - not a pbm file", 0,0,0,0,0 );
  76.     }
  77.     }
  78.  
  79. void
  80. pbm_readpbmrow( file, bitrow, cols, format )
  81. FILE *file;
  82. bit *bitrow;
  83. int cols, format;
  84.     {
  85.     register int col, bitshift;
  86.     register unsigned char item;
  87.     register bit *bP;
  88.  
  89.     switch ( format )
  90.     {
  91.     case PBM_FORMAT:
  92.     for ( col = 0, bP = bitrow; col < cols; col++, bP++ )
  93.         *bP = pbm_getbit( file );
  94.     break;
  95.  
  96.     case RPBM_FORMAT:
  97.     bitshift = -1;
  98.     for ( col = 0, bP = bitrow; col < cols; col++, bP++ )
  99.         {
  100.         if ( bitshift == -1 )
  101.         {
  102.         item = pbm_getrawbyte( file );
  103.         bitshift = 7;
  104.         }
  105.         *bP = ( item >> bitshift ) & 1;
  106.         bitshift--;
  107.         }
  108.     break;
  109.  
  110.     default:
  111.     pm_error( "can't happen", 0,0,0,0,0 );
  112.     }
  113.     }
  114.  
  115. bit **
  116. pbm_readpbm( file, colsP, rowsP )
  117. FILE *file;
  118. int *colsP, *rowsP;
  119.     {
  120.     register bit **bits;
  121.     int format, row;
  122.  
  123.     pbm_readpbminit( file, colsP, rowsP, &format );
  124.  
  125.     bits = pbm_allocarray( *colsP, *rowsP );
  126.  
  127.     for ( row = 0; row < *rowsP; row++ )
  128.     pbm_readpbmrow( file, bits[row], *colsP, format );
  129.  
  130.     return bits;
  131.     }
  132.