Blame converter/pgm/pgmtofs.c

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
}