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

  1. /* libppm1.c - ppm utility library part 1
  2. **
  3. ** Copyright (C) 1989 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 "ppm.h"
  15. #include "libppm.h"
  16. #include "pgm.h"
  17. #include "libpgm.h"
  18. #include "pbm.h"
  19. #include "libpbm.h"
  20.  
  21. void
  22. ppm_readppminitrest( file, colsP, rowsP, maxvalP )
  23. FILE *file;
  24. int *colsP, *rowsP;
  25. pixval *maxvalP;
  26.     {
  27.     /* Read size. */
  28.     *colsP = pbm_getint( file );
  29.     *rowsP = pbm_getint( file );
  30.  
  31.     /* Read maxval. */
  32.     *maxvalP = pbm_getint( file );
  33.     if ( *maxvalP > PPM_MAXMAXVAL )
  34.     pm_error(
  35.         "maxval too large - %d > %d", *maxvalP, PPM_MAXMAXVAL, 0,0,0 );
  36.     }
  37.  
  38. static gray *grayrow;
  39. static bit *bitrow;
  40.  
  41. pixval ppm_pbmmaxval = 1;
  42.  
  43. void
  44. ppm_readppminit( file, colsP, rowsP, maxvalP, formatP )
  45. FILE *file;
  46. int *colsP, *rowsP, *formatP;
  47. pixval *maxvalP;
  48.     {
  49.     /* Check magic number. */
  50.     *formatP = pbm_readmagicnumber( file );
  51.     switch ( *formatP )
  52.     {
  53.     case PPM_FORMAT:
  54.     case RPPM_FORMAT:
  55.     ppm_readppminitrest( file, colsP, rowsP, maxvalP );
  56.     break;
  57.  
  58.     case PGM_FORMAT:
  59.     case RPGM_FORMAT:
  60.     pgm_readpgminitrest( file, colsP, rowsP, maxvalP );
  61.     grayrow = pgm_allocrow( *colsP );
  62.     break;
  63.  
  64.     case PBM_FORMAT:
  65.     case RPBM_FORMAT:
  66.     pbm_readpbminitrest( file, colsP, rowsP );
  67.     *maxvalP = ppm_pbmmaxval;
  68.     bitrow = pbm_allocrow( *colsP );
  69.     break;
  70.  
  71.     default:
  72.     pm_error( "bad magic number - not a ppm, pgm, or pbm file", 0,0,0,0,0 );
  73.     }
  74.     }
  75.  
  76. void
  77. ppm_readppmrow( file, pixelrow, cols, maxval, format )
  78. FILE *file;
  79. pixel *pixelrow;
  80. int cols, format;
  81. pixval maxval;
  82.     {
  83.     register int col;
  84.     register pixel *pP;
  85.     register pixval r, g, b;
  86.     register gray *gP;
  87.     register bit *bP;
  88.  
  89.     switch ( format )
  90.     {
  91.     case PPM_FORMAT:
  92.     for ( col = 0, pP = pixelrow; col < cols; col++, pP++ )
  93.         {
  94.         r = pbm_getint( file );
  95. #ifdef DEBUG
  96.         if ( r > maxval )
  97.         pm_error( "r value out of bounds (%u > %u)", r, maxval, 0,0,0 );
  98. #endif DEBUG
  99.         g = pbm_getint( file );
  100. #ifdef DEBUG
  101.         if ( g > maxval )
  102.         pm_error( "g value out of bounds (%u > %u)", g, maxval, 0,0,0 );
  103. #endif DEBUG
  104.         b = pbm_getint( file );
  105. #ifdef DEBUG
  106.         if ( b > maxval )
  107.         pm_error( "b value out of bounds (%u > %u)", b, maxval, 0,0,0 );
  108. #endif DEBUG
  109.         PPM_ASSIGN( *pP, r, g, b );
  110.         }
  111.     break;
  112.  
  113.     case RPPM_FORMAT:
  114.     for ( col = 0, pP = pixelrow; col < cols; col++, pP++ )
  115.         {
  116.         r = pbm_getrawbyte( file );
  117. #ifdef DEBUG
  118.         if ( r > maxval )
  119.         pm_error( "r value out of bounds (%u > %u)", r, maxval, 0,0,0 );
  120. #endif DEBUG
  121.         g = pbm_getrawbyte( file );
  122. #ifdef DEBUG
  123.         if ( g > maxval )
  124.         pm_error( "g value out of bounds (%u > %u)", g, maxval, 0,0,0 );
  125. #endif DEBUG
  126.         b = pbm_getrawbyte( file );
  127. #ifdef DEBUG
  128.         if ( b > maxval )
  129.         pm_error( "b value out of bounds (%u > %u)", b, maxval, 0,0,0 );
  130. #endif DEBUG
  131.         PPM_ASSIGN( *pP, r, g, b );
  132.         }
  133.     break;
  134.  
  135.     case PGM_FORMAT:
  136.     case RPGM_FORMAT:
  137.     pgm_readpgmrow( file, grayrow, cols, maxval, format );
  138.     for ( col = 0, gP = grayrow, pP = pixelrow; col < cols; col++, gP++, pP++ )
  139.         {
  140.         r = *gP;
  141.         PPM_ASSIGN( *pP, r, r, r );
  142.         }
  143.     break;
  144.  
  145.     case PBM_FORMAT:
  146.     case RPBM_FORMAT:
  147.     pbm_readpbmrow( file, bitrow, cols, format );
  148.     for ( col = 0, bP = bitrow, pP = pixelrow; col < cols; col++, bP++, pP++ )
  149.         {
  150.         r = ( *bP == PBM_WHITE ) ? maxval : 0;
  151.         PPM_ASSIGN( *pP, r, r, r );
  152.         }
  153.     break;
  154.  
  155.     default:
  156.     pm_error( "can't happen", 0,0,0,0,0 );
  157.     }
  158.     }
  159.  
  160. pixel **
  161. ppm_readppm( file, colsP, rowsP, maxvalP )
  162. FILE *file;
  163. int *colsP, *rowsP;
  164. pixval *maxvalP;
  165.     {
  166.     pixel **pixels;
  167.     int row;
  168.     int format;
  169.  
  170.     ppm_readppminit( file, colsP, rowsP, maxvalP, &format );
  171.  
  172.     pixels = ppm_allocarray( *colsP, *rowsP );
  173.  
  174.     for ( row = 0; row < *rowsP; row++ )
  175.     ppm_readppmrow( file, pixels[row], *colsP, *maxvalP, format );
  176.  
  177.     return pixels;
  178.     }
  179.