diff options
Diffstat (limited to 'converter/pbm/pbmtopi3.c')
-rw-r--r-- | converter/pbm/pbmtopi3.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/converter/pbm/pbmtopi3.c b/converter/pbm/pbmtopi3.c new file mode 100644 index 00000000..06023d7a --- /dev/null +++ b/converter/pbm/pbmtopi3.c @@ -0,0 +1,123 @@ +/* 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 <stdio.h> +#include "pbm.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 rows, cols, format, padright, row, col; + + + pbm_init( &argc, argv ); + + if ( argc > 2 ) + pm_usage( "[pbmfile]" ); + + if ( argc == 2 ) + ifp = pm_openr( argv[1] ); + else + ifp = stdin; + + pbm_readpbminit( ifp, &cols, &rows, &format ); + if (cols > 640) + cols = 640; + if (rows > 400) + rows = 400; + bitrow = pbm_allocrow( cols ); + + /* Compute padding to round cols up to 640 */ + padright = 640 - cols; + + putinit( ); + for ( row = 0; row < rows; ++row ) + { + pbm_readpbmrow( ifp, bitrow, cols, format ); + for ( col = 0, bP = bitrow; col < cols; ++col, ++bP ) + putbit( *bP ); + for ( col = 0; col < padright; ++col ) + putbit( 0 ); + } + while (row++ < 400) + for ( col = 0; col < 640; ++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; + } + +#if __STDC__ +static void +putbit( bit b ) +#else /*__STDC__*/ +static void +putbit( b ) + bit b; +#endif /*__STDC__*/ + { + 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; + } |