From 620ecbee2ed1cb478e0289722d86dd72717f1cb8 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sun, 28 Jun 2015 15:34:21 +0000 Subject: Release 10.71.00 git-svn-id: http://svn.code.sf.net/p/netpbm/code/advanced@2588 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- converter/pbm/pbmtoptx.c | 135 +++++++++++++++++++++++------------------------ 1 file changed, 65 insertions(+), 70 deletions(-) (limited to 'converter/pbm/pbmtoptx.c') diff --git a/converter/pbm/pbmtoptx.c b/converter/pbm/pbmtoptx.c index 8cd60326..c0fb0f80 100644 --- a/converter/pbm/pbmtoptx.c +++ b/converter/pbm/pbmtoptx.c @@ -12,84 +12,79 @@ #include "pbm.h" -static void putinit ARGS(( void )); -static void putbit ARGS(( bit b )); -static void putrest ARGS(( void )); -static void putitem ARGS(( void )); +/* Follwing is obtained by reversing bit order (MFS-LFS) and adding 64. */ +/* Note the two escape sequences: \\ and \x7f . */ -int -main( argc, argv ) -int argc; -char *argv[]; - { - FILE *ifp; - register bit *bitrow, *bP; - int rows, cols, format, row, col; - const char * const usage = "[pbmfile]"; - - pbm_init( &argc, argv ); - - if ( argc > 2 ) - pm_usage( usage ); - - if ( argc == 2 ) - ifp = pm_openr( argv[1] ); - else - ifp = stdin; - - pbm_readpbminit( ifp, &cols, &rows, &format ); - bitrow = pbm_allocrow( 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 ); - putrest( ); - putchar( 5 ); - putchar( '\n' ); - } +static unsigned char const ptxchar[64] = + "@`PpHhXxDdTtLl\\|BbRrJjZzFfVvNn^~AaQqIiYyEeUuMm]}CcSsKk[{GgWwOo_\x7f"; - pm_close( ifp ); - - exit( 0 ); - } -static char item; -static int bitsperitem, bitshift; static void -putinit( ) - { - bitsperitem = 0; - item = 64; - bitshift = 0; - } +putBitrow(const bit * const bitrow, + unsigned int const cols) { +/*---------------------------------------------------------------------------- + Pick up items in 6 bit units from bitrow and convert each to ptx format. +----------------------------------------------------------------------------*/ + unsigned int itemCnt; -static void -putbit( bit b ) - { - if ( bitsperitem == 6 ) - putitem( ); - if ( b == PBM_BLACK ) - item += 1 << bitshift; - bitsperitem++; - bitshift++; + for (itemCnt = 0; itemCnt * 6 < cols; ++itemCnt) { + unsigned int const byteCnt = (itemCnt * 6) / 8; + bit const byteCur = bitrow[byteCnt]; + bit const byteNext = bitrow[byteCnt + 1]; + + unsigned int item; + + switch (itemCnt % 4) { + case 0: item = byteCur >> 2; break; + case 1: item = byteCur << 4 | byteNext >> 4; break; + case 2: item = byteCur << 2 | byteNext >> 6; break; + case 3: item = byteCur; break; + } + putchar(ptxchar[item & 0x3f]); } + putchar(5); putchar('\n'); /* end of row mark */ +} -static void -putrest( ) - { - if ( bitsperitem > 0 ) - putitem( ); + + +int +main(int argc, const char ** argv) { + + FILE * ifP; + bit * bitrow; + int rows, cols, format; + unsigned int row; + + 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 fil name"); } -static void -putitem( ) - { - putchar( item ); - bitsperitem = 0; - item = 64; - bitshift = 0; + pbm_readpbminit(ifP, &cols, &rows, &format); + + bitrow = pbm_allocrow_packed(cols + 8); + + bitrow[pbm_packed_bytes(cols)] = 0x00; + + for (row = 0; row < rows; ++row) { + pbm_readpbmrow_packed(ifP, bitrow, cols, format); + pbm_cleanrowend_packed(bitrow, cols); + putBitrow(bitrow, cols); } + + pbm_freerow_packed(bitrow); + pm_close(ifP); + + return 0; +} + + + -- cgit 1.4.1