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

  1. /* pbmtorast.c - read a portable bitmap and produce a Sun rasterfile
  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. /* 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.     register bit *bitrow, *bP;
  25.     int argn, pr_type, linesize;
  26.     int rows, cols, format, row, col;
  27.     struct pixrect *pr;
  28.     short *data, *sp;
  29.     int bitcount;
  30.     char *usage = "[-s] [pbmfile]";
  31.  
  32.     pm_progname = argv[0];
  33.  
  34.     argn = 1;
  35.     pr_type = RT_BYTE_ENCODED;
  36.  
  37.     if ( argc - argn >= 1 && argv[argn][0] == '-' )
  38.     {
  39.     if ( ( argv[argn][1] == 's' || argv[argn][1] == 'S' ) &&
  40.          argv[argn][2] == '\0' )
  41.         {
  42.         pr_type = RT_STANDARD;
  43.         argn++;
  44.         }
  45.     else
  46.         pm_usage( usage );
  47.     }
  48.  
  49.     if ( argc - argn > 1 )
  50.     pm_usage( usage );
  51.  
  52.     if ( argc - argn == 1 )
  53.     ifd = pm_openr( argv[argn] );
  54.     else
  55.     ifd = stdin;
  56.  
  57.     pbm_readpbminit( ifd, &cols, &rows, &format );
  58.     bitrow = pbm_allocrow( cols );
  59.     
  60.     if ( (pr = mem_create(cols, rows, 1)) == NULL )
  61.     pm_error( "unable to create new pixrect", 0,0,0,0,0 );
  62.  
  63.     data = ( (struct mpr_data *) pr->pr_data )->md_image;
  64.     linesize = ( (struct mpr_data *) pr->pr_data )->md_linebytes;
  65.  
  66.     for ( row = 0; row < rows; row++ )
  67.     {
  68.     pbm_readpbmrow( ifd, bitrow, cols, format );
  69.     sp = data;
  70.     bitcount = 15;
  71.     for ( col = 0, bP = bitrow; col < cols; col++, bP++ )
  72.         {
  73.         if ( *bP == PBM_BLACK )
  74.         *sp |= 1 << bitcount;
  75.         bitcount--;
  76.         if ( bitcount < 0 )
  77.         {
  78.         sp++;
  79.         bitcount = 15;
  80.         }
  81.         }
  82.     data += linesize / sizeof(short);
  83.     }
  84.  
  85.     pm_close( ifd );
  86.  
  87. #ifdef sun386
  88.     /* Force a flip to 80386 format. */
  89.     ( (struct mpr_data *) pr->pr_data )->md_flags &= ! MP_I386;
  90.     pr_flip( pr );
  91. #endif sun386
  92.  
  93.     pr_dump( pr, stdout, NULL, pr_type, 0 );
  94.  
  95.     exit( 0 );
  96.     }
  97.