home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume2 / pbm / Part1 / rasttopbm.c < prev    next >
C/C++ Source or Header  |  1991-08-07  |  3KB  |  149 lines

  1. /* rasttopbm.c - read a Sun raster 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. #include "pbm.h"
  15.  
  16. /* Because of the following include, this program compiles only on Suns. */
  17. #include <pixrect/pixrect_hs.h>
  18.  
  19. main( argc, argv )
  20. int argc;
  21. char *argv[];
  22.     {
  23.     FILE *ifd;
  24.     bit **bits;
  25.     int rows, cols, row, col, shortcount, mask;
  26.     int linesize;
  27.     short *data;
  28.  
  29.     if ( argc > 2 )
  30.     {
  31.     fprintf( stderr, "usage: %s [rastfile]\n", argv[0] );
  32.     exit( 1 );
  33.     }
  34.  
  35.     if ( argc == 2 )
  36.     {
  37.     ifd = fopen( argv[1], "r" );
  38.     if ( ifd == NULL )
  39.         {
  40.         fprintf( stderr, "%s: can't open.\n", argv[1] );
  41.         exit( 1 );
  42.         }
  43.     }
  44.     else
  45.     ifd = stdin;
  46.  
  47.     if ( ReadRasterFile( ifd, &cols, &rows, &linesize, &data ) < 0 )
  48.     {
  49.     fprintf( stderr, "%s: can't load.\n", argv[1] );
  50.     exit( 1 );
  51.     }
  52.  
  53.     if ( ifd != stdin )
  54.     fclose( ifd );
  55.  
  56.     bits = pbm_allocarray( cols, rows );
  57.  
  58.     for ( row = 0; row < rows; row++ )
  59.     {
  60.     shortcount = 0;
  61.     mask = 0x8000;
  62.     for ( col = 0; col < cols; col++ )
  63.         {
  64.         if ( mask == 0 )
  65.         {
  66.         shortcount++;
  67.         mask = 0x8000;
  68.         }
  69.         bits[row][col] = ( *(data + shortcount) & mask ) ? 1 : 0;
  70.         mask = mask >> 1;
  71.         }
  72.     data += linesize / sizeof(short);
  73.     }
  74.  
  75.     pbm_writepbm( stdout, bits, cols, rows );
  76.  
  77.     exit( 0 );
  78.     }
  79.  
  80.  
  81. int
  82. ReadRasterFile( file, width, height, linebytes, data )
  83. FILE *file;
  84. int *width, *height;
  85. int *linebytes;
  86. short **data;
  87.     {
  88.     struct rasterfile header;
  89.     struct pixrect *pr, *pr_load_image();
  90.     int status, firsttime, value, i, data_length;
  91.  
  92.     if ( file == NULL )
  93.     return ( -1 );
  94.  
  95.     *width = *height = -1;
  96.  
  97.  
  98.     /* Get the raster file's header. */
  99.     if ( pr_load_header( file, &header ) != 0 )
  100.     {
  101.     fprintf( stderr, "Unable to read in raster file header.\n");
  102.     return ( -1 );
  103.     }
  104.  
  105.     /* PBM can only handle monochrome bitmaps. */
  106.     if ( header.ras_depth != 1 )
  107.     {
  108.     fprintf( stderr, "Invalid depth.\n" );
  109.     return ( -1 );
  110.     }
  111.  
  112.     *width = header.ras_width;
  113.     *height = header.ras_height;
  114.     if ( *width <= 0 )
  115.     {
  116.     fprintf( stderr, "Invalid width: %d.\n", *width );
  117.     return ( -1 );
  118.     }
  119.     
  120.     if ( *height <= 0 )
  121.     {
  122.     fprintf( stderr, "Invalid height: %d.\n", *height );
  123.     return ( -1 );
  124.     }
  125.  
  126.     /* If there is a color map, skip over it. */
  127.     if ( header.ras_maptype != RMT_NONE && header.ras_maplength != 0 )
  128.     {
  129.     if (pr_load_colormap(file, &header, NULL) != 0)
  130.         {
  131.         fprintf( stderr, "Unable to skip colormap data.\n");
  132.         return ( -1 );
  133.         }
  134.     }
  135.  
  136.     /* Now load the data.  The pixrect returned is a memory pixrect. */
  137.     if ( (pr = pr_load_image(file, &header, NULL)) == NULL )
  138.     {
  139.     fprintf(
  140.         stderr, "Unable to read in the image from the raster file.\n");
  141.     return ( -1 );
  142.     }
  143.  
  144.     *linebytes = ((struct mpr_data *)pr->pr_data)->md_linebytes;
  145.     *data = ((struct mpr_data *)pr->pr_data)->md_image;
  146.  
  147.     return ( 0 );
  148.     }
  149.