diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-10-21 17:29:12 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-10-21 17:29:12 +0000 |
commit | 9c181bcf2a9deaf039a8023d58755b60861da683 (patch) | |
tree | 8e26424f56144d92d99f95bb32dec040dfa47717 /converter/pbm/pbmtomgr.c | |
parent | c20a2c66cf7ce37cc3600019a164ad4dc6d9babf (diff) | |
download | netpbm-mirror-9c181bcf2a9deaf039a8023d58755b60861da683.tar.gz netpbm-mirror-9c181bcf2a9deaf039a8023d58755b60861da683.tar.xz netpbm-mirror-9c181bcf2a9deaf039a8023d58755b60861da683.zip |
Use packed PBM functions for efficiency
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@100 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/pbm/pbmtomgr.c')
-rw-r--r-- | converter/pbm/pbmtomgr.c | 169 |
1 files changed, 80 insertions, 89 deletions
diff --git a/converter/pbm/pbmtomgr.c b/converter/pbm/pbmtomgr.c index 816e2a69..56c4fdd6 100644 --- a/converter/pbm/pbmtomgr.c +++ b/converter/pbm/pbmtomgr.c @@ -1,4 +1,4 @@ -/* pbmtomgr.c - read a portable bitmap and produce a MGR bitmap +/* pbmtomgr.c - read a PBM image and produce a MGR bitmap ** ** Copyright (C) 1989 by Jef Poskanzer. ** @@ -10,105 +10,96 @@ ** implied warranty. */ -#include "pbm.h" -#include "mgr.h" - -static void putinit ARGS(( int rows, int cols )); -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; +/* 2006.10 (afu) + Changed bitrow from plain to raw, read function from pbm_readpbmrow() to + pbm_readpbmrow_packed(), write function from putc() to fwrite(). + Retired bitwise transformation functions. + + Produces only new style bitmap (8 bit padding.) See mgrtopbm.c . +*/ - 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 ); - bitrow = pbm_allocrow( cols ); - - /* Round cols up to the nearest multiple of 8. */ - padright = ( ( cols + 7 ) / 8 ) * 8 - cols; - - putinit( rows, cols ); - 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 ); - } - - pm_close( ifp ); - - putrest( ); - - exit( 0 ); - } - -static unsigned char item; -static int bitsperitem, bitshift; +#include "pbm.h" +#include "mgr.h" static void -putinit( rows, cols ) - int rows, cols; - { +putinit(unsigned int const rows, + unsigned int const cols) { + struct b_header head; + size_t writtenCount; head.magic[0] = 'y'; head.magic[1] = 'z'; - head.h_wide = ( ( cols >> 6 ) & 0x3f ) + ' '; - head.l_wide = ( cols & 0x3f ) + ' '; - head.h_high = ( ( rows >> 6 ) & 0x3f ) + ' '; - head.l_high = ( rows & 0x3f ) + ' '; - head.depth = ( 1 & 0x3f ) + ' '; + head.h_wide = ((cols >> 6) & 0x3f) + ' '; + head.l_wide = (cols & 0x3f) + ' '; + head.h_high = (( rows >> 6) & 0x3f) + ' '; + head.l_high = (rows & 0x3f) + ' '; + head.depth = (1 & 0x3f) + ' '; head._reserved = ' '; - fwrite( &head, sizeof(head), 1, stdout ); + writtenCount = fwrite(&head, sizeof(head), 1, stdout); + if (writtenCount != 1) + pm_error("fwrite() failed to write the MGR header."); +} - 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( ); - } +int +main(int argc, + char * argv[]) { + + FILE * ifP; + unsigned char * bitrow; + int rows; + int cols; + int format; + unsigned int row; + unsigned int bytesPerRow; + /* Number of packed bytes (8 columns per byte) in a row. */ + unsigned int padright; + /* Number of columns added to the right of each row to get up to + a multiple of 8, i.e. an integral number of packed bytes. + */ + const char * inputFileName; + + pbm_init(&argc, argv); + + if (argc-1 > 1) + pm_error("Too many arguments (%u). " + "Only argument is optional input file", argc-1); + if (argc-1 == 1) + inputFileName = argv[1]; + else + inputFileName = "-"; + + ifP = pm_openr(inputFileName); -static void -putitem( ) - { - fwrite( &item, sizeof(item), 1, stdout ); - item = 0; - bitsperitem = 0; - bitshift = 7; + pbm_readpbminit(ifP, &cols, &rows, &format); + + bitrow = pbm_allocrow_packed(cols); + bytesPerRow = pbm_packed_bytes(cols); + padright = bytesPerRow * 8 - cols; + + putinit(rows, cols); + + for (row = 0; row < rows; ++row) { + /* The raster formats are identical. + The row end pad bits are set to 0 in mgr. + */ + size_t bytesWritten; + + pbm_readpbmrow_packed(ifP, bitrow, cols, format); + + if (padright > 0) { + bitrow[bytesPerRow-1] >>= padright; + bitrow[bytesPerRow-1] <<= padright; + } + + bytesWritten = fwrite(bitrow, 1, bytesPerRow, stdout); + if (bytesWritten != bytesPerRow ) + pm_error("fwrite() failed to write MGR bitmap " + "to Standard Output."); } + pm_close(ifP); + return 0; +} |