|
Packit |
78deda |
/* pgmtofs.c - convert portable graymap to Usenix FaceSaver(tm) format
|
|
Packit |
78deda |
**
|
|
Packit |
78deda |
** Copyright (C) 1991 by Jef Poskanzer.
|
|
Packit |
78deda |
**
|
|
Packit |
78deda |
** Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
78deda |
** documentation for any purpose and without fee is hereby granted, provided
|
|
Packit |
78deda |
** that the above copyright notice appear in all copies and that both that
|
|
Packit |
78deda |
** copyright notice and this permission notice appear in supporting
|
|
Packit |
78deda |
** documentation. This software is provided "as is" without express or
|
|
Packit |
78deda |
** implied warranty.
|
|
Packit |
78deda |
*/
|
|
Packit |
78deda |
|
|
Packit |
78deda |
#include "pgm.h"
|
|
Packit |
78deda |
|
|
Packit |
78deda |
static void putinit ARGS(( int cols, int rows, int bps ));
|
|
Packit |
78deda |
static void putitem ARGS(( void ));
|
|
Packit |
78deda |
static void putgray ARGS(( gray g ));
|
|
Packit |
78deda |
static void putrest ARGS(( void ));
|
|
Packit |
78deda |
|
|
Packit |
78deda |
int
|
|
Packit |
78deda |
main( argc, argv )
|
|
Packit |
78deda |
int argc;
|
|
Packit |
78deda |
char* argv[];
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
FILE* ifp;
|
|
Packit |
78deda |
gray** grays;
|
|
Packit |
78deda |
register gray* gP;
|
|
Packit |
78deda |
int argn, rows, cols, bps, padright, row, col;
|
|
Packit |
78deda |
gray maxval, nmaxval;
|
|
Packit |
78deda |
const char* const usage = "[pgmfile]";
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pgm_init( &argc, argv );
|
|
Packit |
78deda |
|
|
Packit |
78deda |
argn = 1;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if ( argn < argc )
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
ifp = pm_openr( argv[argn] );
|
|
Packit |
78deda |
++argn;
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
else
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
ifp = stdin;
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if ( argn != argc )
|
|
Packit |
78deda |
pm_usage( usage );
|
|
Packit |
78deda |
|
|
Packit |
78deda |
grays = pgm_readpgm( ifp, &cols, &rows, &maxval );
|
|
Packit |
78deda |
pm_close( ifp );
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* Figure out bps. */
|
|
Packit |
78deda |
bps = pm_maxvaltobits( (int) maxval );
|
|
Packit |
78deda |
if ( bps > 2 && bps < 4 )
|
|
Packit |
78deda |
bps = 4;
|
|
Packit |
78deda |
else if ( bps > 4 && bps < 8 )
|
|
Packit |
78deda |
bps = 8;
|
|
Packit |
78deda |
else if ( bps > 8 )
|
|
Packit |
78deda |
pm_error(
|
|
Packit |
78deda |
"maxval of %d is too large for FaceSaver(tm)", maxval );
|
|
Packit |
78deda |
nmaxval = pm_bitstomaxval( bps );
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* Compute padding to round cols * bps up to the nearest multiple of 8. */
|
|
Packit |
78deda |
padright = ( ( cols * bps + 7 ) / 8 ) * 8 - cols * bps;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
putinit( cols, rows, bps );
|
|
Packit |
78deda |
for ( row = rows - 1; row >= 0; --row )
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
for ( col = 0, gP = grays[row]; col < cols; ++col, ++gP )
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
if ( maxval != nmaxval )
|
|
Packit |
78deda |
*gP = (int) *gP * nmaxval / maxval;
|
|
Packit |
78deda |
putgray( *gP );
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
for ( col = 0; col < padright; ++col )
|
|
Packit |
78deda |
putgray( 0 );
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
putrest( );
|
|
Packit |
78deda |
|
|
Packit |
78deda |
exit( 0 );
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
static int bitspersample, item, bitsperitem, bitshift, itemsperline, items;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
static void
|
|
Packit |
78deda |
putinit( cols, rows, bps )
|
|
Packit |
78deda |
int cols, rows, bps;
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
printf( "FirstName: \n" );
|
|
Packit |
78deda |
printf( "LastName: \n" );
|
|
Packit |
78deda |
printf( "E-mail: \n" );
|
|
Packit |
78deda |
printf( "Telephone: \n" );
|
|
Packit |
78deda |
printf( "Company: \n" );
|
|
Packit |
78deda |
printf( "Address1: \n" );
|
|
Packit |
78deda |
printf( "Address2: \n" );
|
|
Packit |
78deda |
printf( "CityStateZip: \n" );
|
|
Packit |
78deda |
printf( "Date: \n" );
|
|
Packit |
78deda |
printf( "PicData: %d %d %d\n", cols, rows, bps );
|
|
Packit |
78deda |
printf( "Image: %d %d %d\n", cols, rows, bps );
|
|
Packit |
78deda |
printf( "\n" );
|
|
Packit |
78deda |
|
|
Packit |
78deda |
bitspersample = bps;
|
|
Packit |
78deda |
itemsperline = items = 0;
|
|
Packit |
78deda |
item = 0;
|
|
Packit |
78deda |
bitsperitem = 0;
|
|
Packit |
78deda |
bitshift = 8 - bitspersample;
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
static void
|
|
Packit |
78deda |
putitem( )
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
const char* const hexits = "0123456789abcdef";
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if ( itemsperline == 30 )
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
putchar( '\n' );
|
|
Packit |
78deda |
itemsperline = 0;
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
putchar( hexits[item >> 4] );
|
|
Packit |
78deda |
putchar( hexits[item & 15] );
|
|
Packit |
78deda |
++itemsperline;
|
|
Packit |
78deda |
++items;
|
|
Packit |
78deda |
item = 0;
|
|
Packit |
78deda |
bitsperitem = 0;
|
|
Packit |
78deda |
bitshift = 8 - bitspersample;
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
static void
|
|
Packit |
78deda |
putgray( gray g )
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
if ( bitsperitem == 8 )
|
|
Packit |
78deda |
putitem( );
|
|
Packit |
78deda |
item += g << bitshift;
|
|
Packit |
78deda |
bitsperitem += bitspersample;
|
|
Packit |
78deda |
bitshift -= bitspersample;
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
static void
|
|
Packit |
78deda |
putrest( )
|
|
Packit |
78deda |
{
|
|
Packit |
78deda |
if ( bitsperitem > 0 )
|
|
Packit |
78deda |
putitem( );
|
|
Packit |
78deda |
printf( "\n" );
|
|
Packit |
78deda |
}
|