/* pbmtopi3.c - read a portable bitmap and produce a Atari Degas .pi3 file ** ** Module created from other pbmplus tools by David Beckemeyer. ** ** Copyright (C) 1988 by David Beckemeyer and Jef Poskanzer. ** ** Permission to use, copy, modify, and distribute this software and its ** documentation for any purpose and without fee is hereby granted, provided ** that the above copyright notice appear in all copies and that both that ** copyright notice and this permission notice appear in supporting ** documentation. This software is provided "as is" without express or ** implied warranty. */ #include #include "pbm.h" #include "pm_c_util.h" static void putinit ARGS(( void )); static void putbit ARGS(( bit b )); static void putrest ARGS(( void )); static void putitem ARGS(( void )); int main( argc, argv ) int argc; char* argv[]; { FILE* ifp; bit* bitrow; register bit* bP; int inrows, incols, format, padright, row, col; int const outcols = 640; int const outrows = 400; pbm_init( &argc, argv ); if ( argc > 2 ) pm_usage( "[pbmfile]" ); if ( argc == 2 ) ifp = pm_openr( argv[1] ); else ifp = stdin; pbm_readpbminit( ifp, &incols, &inrows, &format ); bitrow = pbm_allocrow( MAX(incols, outcols) ); /* Compute padding to round cols up to 640 */ if(incols < outcols) padright = outcols - incols; else padright = 0; putinit( ); for ( row = 0; row < MIN(inrows, outrows); ++row ) { pbm_readpbmrow( ifp, bitrow, incols, format ); for ( col = 0, bP = bitrow; col < MIN(incols, outcols); ++col, ++bP ) putbit( *bP ); for ( col = 0; col < padright; ++col ) putbit( 0 ); } while (row++ < outrows) for ( col = 0; col < outcols; ++col) putbit( 0 ); pm_close( ifp ); putrest( ); exit( 0 ); } static char item; static short bitsperitem, bitshift; static void putinit( ) { int i; if (pm_writebigshort (stdout, (short) 2) == -1 || pm_writebigshort (stdout, (short) 0x777) == -1) pm_error ("write error"); for (i = 1; i < 16; i++) if (pm_writebigshort (stdout, (short) 0) == -1) pm_error ("write error"); item = 0; bitsperitem = 0; bitshift = 7; } static void putbit( bit b ) { if (bitsperitem == 8) putitem( ); ++bitsperitem; if ( b == PBM_BLACK ) item += 1 << bitshift; --bitshift; } static void putrest( ) { if ( bitsperitem > 0 ) putitem( ); } static void putitem( ) { putc (item, stdout); item = 0; bitsperitem = 0; bitshift = 7; }