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

  1. /* ppmtops.c - read a portable pixmap and produce a PostScript file
  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. #ifdef    SYSV
  15. #include <string.h>
  16. #define index strchr
  17. #else    SYSV
  18. #include <strings.h>
  19. #endif    SYSV
  20. #include "ppm.h"
  21.  
  22. #define max(a,b) ((a) > (b) ? (a) : (b))
  23.  
  24. main( argc, argv )
  25. int argc;
  26. char *argv[];
  27.     {
  28.     FILE *ifd;
  29.     register pixel *pixrow, *pP;
  30.     int argn, rows, cols, format, bps, padright, row, col;
  31.     pixval maxval;
  32.     float scale;
  33.     char name[100], *cp;
  34.     char *usage = "[-scale <x>] [ppmfile]";
  35.  
  36.     pm_progname = argv[0];
  37.  
  38.     argn = 1;
  39.     scale = 1.0;
  40.  
  41.     /* Check for flags. */
  42.     while ( argn < argc && argv[argn][0] == '-' )
  43.     {
  44.     if ( strncmp(argv[argn],"-scale",max(strlen(argv[argn]),2)) == 0 )
  45.         {
  46.         argn++;
  47.         if ( argn == argc || sscanf( argv[argn], "%f", &scale ) != 1 )
  48.         pm_usage( usage );
  49.         }
  50.     else
  51.         pm_usage( usage );
  52.     argn++;
  53.     }
  54.  
  55.     if ( argn < argc )
  56.     {
  57.     ifd = pm_openr( argv[argn] );
  58.     strcpy( name, argv[argn] );
  59.     if ( strcmp( name, "-" ) == 0 )
  60.         strcpy( name, "noname" );
  61.  
  62.     if ( ( cp = index( name, '.' ) ) != 0 )
  63.         *cp = '\0';
  64.     argn++;
  65.     }
  66.     else
  67.     {
  68.     ifd = stdin;
  69.     strcpy( name, "noname" );
  70.     }
  71.  
  72.     if ( argn != argc )
  73.     pm_usage( usage );
  74.  
  75.     ppm_readppminit( ifd, &cols, &rows, &maxval, &format );
  76.     pixrow = ppm_allocrow( cols );
  77.  
  78.     /* Figure out bps. */
  79.     bps = maxvaltobps( maxval );
  80.     
  81.     /* Compute padding to round cols * bps up to the nearest multiple of 8. */
  82.     padright = ( ( cols * bps + 7 ) / 8 ) * 8 - cols * bps;
  83.  
  84.     putinit( name, cols, rows, bps, scale );
  85.     for ( row = 0; row < rows; row++ )
  86.     {
  87.     ppm_readppmrow( ifd, pixrow, cols, maxval, format );
  88.         for ( col = 0, pP = pixrow; col < cols; col++, pP++ )
  89.         putpix( *pP );
  90.     for ( col = 0; col < padright; col++ )
  91.         putpix( maxval );
  92.         }
  93.  
  94.     pm_close( ifd );
  95.  
  96.     putrest( );
  97.  
  98.     exit( 0 );
  99.     }
  100.  
  101. int
  102. maxvaltobps( maxval )
  103. pixval maxval;
  104.     {
  105.     switch ( maxval )
  106.     {
  107.     case 1:
  108.     return 1;
  109.  
  110.     case 3:
  111.     return 2;
  112.  
  113.     case 15:
  114.     return 4;
  115.  
  116.     case 255:
  117.     return 8;
  118.  
  119. #ifdef notdef
  120.     case 7:
  121.     return 3;
  122.  
  123.     case 31:
  124.     return 5;
  125.  
  126.     case 63:
  127.     return 6;
  128.  
  129.     case 127:
  130.     return 7;
  131. #endif notdef
  132.  
  133.     default:
  134.     pm_error( "maxval of %d is not supported", maxval, 0,0,0,0 );
  135.     /* NOTREACHED */
  136.     }
  137.     }
  138.  
  139.  
  140. int bitspersample, item, bitsperitem, bitshift, itemsperline, items;
  141. #define HSBUFSIZ 384
  142.  
  143. putinit( name, cols, rows, bps, scale )
  144. char *name;
  145. int cols, rows, bps;
  146. float scale;
  147.     {
  148.     int scols, srows, llx, lly;
  149.  
  150.     scols = cols * 0.96 + 0.5;    /*   0.96 is the multiple of   */
  151.     srows = rows * 0.96 + 0.5;    /* 72/300 that is closest to 1 */
  152.     llx = 300 - ( scols / 2 );
  153.     lly = 400 - ( srows / 2 );
  154.  
  155.     printf( "%%!PS-Adobe-2.0 EPSF-2.)\n" );
  156.     printf( "%%%%Creator: ppmtops\n" );
  157.     printf( "%%%%Title: %s.ps\n", name );
  158.     printf( "%%%%Pages: 1\n" );
  159.     printf(
  160.     "%%%%BoundingBox: %d %d %d %d\n", llx, lly, llx + scols, lly + srows );
  161.     printf( "%%%%EndComments\n" );
  162.     printf( "%%%%EndProlog\n" );
  163.     printf( "%%%%Page 1 1\n" );
  164.     printf( "/picstr %d string def\n", HSBUFSIZ );
  165.     printf( "gsave\n" );
  166.     printf( "%d %d translate\n", llx, lly );
  167.     printf( "%g %g scale\n", scale, scale );
  168.     printf( "%d %d scale\n", scols, srows );
  169.     printf( "%d %d %d\n", cols, rows, bps );
  170.     printf( "[ %d 0 0 -%d 0 %d ]\n", cols, rows, rows );
  171.     printf( "{ currentfile picstr readhexstring pop }\n" );
  172.     printf( "false 3\n" );
  173.     printf( "colorimage\n" );
  174.  
  175.     bitspersample = bps;
  176.     itemsperline = items = 0;
  177.     item = 0;
  178.     bitsperitem = 0;
  179.     bitshift = 8 - bitspersample;
  180.     }
  181.  
  182. putitem( )
  183.     {
  184.     if ( itemsperline == 30 )
  185.     {
  186.     putchar( '\n' );
  187.     itemsperline = 0;
  188.     }
  189.     printf( "%02x", item );
  190.     itemsperline++;
  191.     items++;
  192.     item = 0;
  193.     bitsperitem = 0;
  194.     bitshift = 8 - bitspersample;
  195.     }
  196.  
  197. putpix( p )
  198. pixel p;
  199.     {
  200.     putgray( PPM_GETR( p ) );
  201.     putgray( PPM_GETG( p ) );
  202.     putgray( PPM_GETB( p ) );
  203.     }
  204.  
  205. putgray( g )
  206. pixval g;
  207.     {
  208.     if ( bitsperitem == 8 )
  209.     putitem( );
  210.     item += g << bitshift;
  211.     bitsperitem += bitspersample;
  212.     bitshift -= bitspersample;
  213.     }
  214.  
  215. putrest( )
  216.     {
  217.     if ( bitsperitem > 0 )
  218.     putitem( );
  219.     while ( items % HSBUFSIZ != 0 )
  220.     putitem( );
  221.     printf( "\n" );
  222.     printf( "grestore\n" );
  223.     printf( "showpage\n" );
  224.     printf( "%%%%Trailer\n" );
  225.     }
  226.