diff options
Diffstat (limited to 'converter/pbm/pbmtopi3.c')
-rw-r--r-- | converter/pbm/pbmtopi3.c | 163 |
1 files changed, 72 insertions, 91 deletions
diff --git a/converter/pbm/pbmtopi3.c b/converter/pbm/pbmtopi3.c index 6a60af62..791bcb50 100644 --- a/converter/pbm/pbmtopi3.c +++ b/converter/pbm/pbmtopi3.c @@ -1,4 +1,4 @@ -/* pbmtopi3.c - read a portable bitmap and produce a Atari Degas .pi3 file +/* pbmtopi3.c - read a PBM image and produce a Atari Degas .pi3 file ** ** Module created from other pbmplus tools by David Beckemeyer. ** @@ -12,106 +12,87 @@ ** implied warranty. */ +/* Output file should always be 32034 bytes. */ + #include <stdio.h> +#include "pm_c_util.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; +putinit(FILE * const ofP) { + + unsigned int i; + + pm_writebigshort(ofP, (short) 2); + pm_writebigshort(ofP, (short) 0x777); + + for (i = 1; i < 16; ++i) { + pm_writebigshort (ofP, (short) 0); } +} -static void -putbit( bit b ) - { - if (bitsperitem == 8) - putitem( ); - ++bitsperitem; - if ( b == PBM_BLACK ) - item += 1 << bitshift; - --bitshift; + + +int +main(int argc, const char ** argv) { + + unsigned int const outRows = 400; + unsigned int const outCols = 640; + unsigned int const outColByteCt = pbm_packed_bytes(outCols); + + FILE * ifP; + + int inRows, inCols, format; + unsigned int row; + unsigned int inColByteCt; + unsigned int i; + bit * bitrow; + + pm_proginit(&argc, argv); + + if (argc-1 < 1) + ifP = stdin; + else { + ifP = pm_openr(argv[1]); + + if (argc-1 > 1) + pm_error("Too many arguments. The only possible argument " + "is the input file name"); } -static void -putrest( ) - { - if ( bitsperitem > 0 ) - putitem( ); + pbm_readpbminit(ifP, &inCols, &inRows, &format); + + inColByteCt = pbm_packed_bytes(inCols); + + bitrow = pbm_allocrow_packed(MAX(outCols, inCols)); + + /* Add padding to round cols up to 640 */ + for (i = inColByteCt; i < outColByteCt; ++i) + bitrow[i] = 0x00; + + putinit(stdout); + + for (row = 0; row < MIN(inRows, outRows); ++row) { + pbm_readpbmrow_packed(ifP, bitrow, inCols, format); + pbm_cleanrowend_packed(bitrow, inCols); + fwrite (bitrow, outColByteCt, 1, stdout); } + pm_close(ifP); -static void -putitem( ) - { - putc (item, stdout); - item = 0; - bitsperitem = 0; - bitshift = 7; + if (row < outRows) { + unsigned int i; + + /* Clear entire row */ + for (i = 0; i < outColByteCt; ++i) + bitrow[i] = 0x00; + + while (row++ < outRows) + fwrite(bitrow, outColByteCt, 1, stdout); } + + pbm_freerow_packed(bitrow); + + return 0; +} |