diff options
Diffstat (limited to 'converter/pbm/pbmtomgr.c')
-rw-r--r-- | converter/pbm/pbmtomgr.c | 209 |
1 files changed, 106 insertions, 103 deletions
diff --git a/converter/pbm/pbmtomgr.c b/converter/pbm/pbmtomgr.c index acf689e1..d12e6635 100644 --- a/converter/pbm/pbmtomgr.c +++ b/converter/pbm/pbmtomgr.c @@ -1,124 +1,127 @@ -/* pbmtomgr.c - read a portable bitmap and produce a MGR bitmap -** -** Copyright (C) 1989 by 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. +/* pbmtomgr.c - read a PBM image and produce a MGR bitmap + + Copyright information is at end of file. + + You can find MGR and some MGR format test images at + ftp://sunsite.unc.edu/pub/Linux/apps/MGR/!INDEX.html */ +#include <assert.h> #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; +static void +putinit(unsigned int const rows, + unsigned int const cols) { - pbm_init( &argc, argv ); + struct b_header head; + size_t writtenCount; + + /* Because of argument restrictions: maximum dimensions: */ + assert((rows & 0xfff) == rows); + assert((cols & 0xfff) == cols); + + 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._reserved = ' '; + writtenCount = fwrite(&head, sizeof(head), 1, stdout); + if (writtenCount != 1) + pm_error("fwrite() failed to write the MGR header."); +} - if ( argc > 2 ) - pm_usage( "[pbmfile]" ); - if ( argc == 2 ) - ifp = pm_openr( argv[1] ); + +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; + unsigned int const maxDimension = 4095; + /* Dimensions are 2 characters of the header -- 12 bits */ + + 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 - ifp = stdin; - - pbm_readpbminit( ifp, &cols, &rows, &format ); - if (cols > 4095) - pm_error("Image width too large: %u (max: 4095)", cols); - if (rows > 4095) - pm_error("Image heigth too large: %u (max: 4095)", cols); - bitrow = pbm_allocrow( cols ); + inputFileName = "-"; - /* 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 ); - } + ifP = pm_openr(inputFileName); - pm_close( ifp ); + pbm_readpbminit(ifP, &cols, &rows, &format); + if (cols > maxDimension) + pm_error("Image width too large: %u (max: %u)", cols, maxDimension); + if (rows > maxDimension) + pm_error("Image height too large: %u (max: %u)", rows, maxDimension); + + bitrow = pbm_allocrow_packed(cols); + bytesPerRow = pbm_packed_bytes(cols); + padright = bytesPerRow * 8 - cols; - putrest( ); + 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; + } - exit( 0 ); + 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; +} -static unsigned char item; -static int bitsperitem, bitshift; -static void -putinit( rows, cols ) - int rows, cols; - { - struct b_header head; - 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._reserved = ' '; - fwrite( &head, sizeof(head), 1, stdout ); - - item = 0; - bitsperitem = 0; - bitshift = 7; - } +/* 2006.10 (afu) + Changed bitrow from plain to raw, read function from pbm_readpbmrow() to + pbm_readpbmrow_packed(), write function from putc() to fwrite(). -#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( ); - } + Retired bitwise transformation functions. + + Produces only new style bitmap (8 bit padding.) See mgrtopbm.c . +*/ -static void -putitem( ) - { - fwrite( &item, sizeof(item), 1, stdout ); - item = 0; - bitsperitem = 0; - bitshift = 7; - } +/* +** Copyright (C) 1989 by 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. +*/ |