diff options
Diffstat (limited to 'converter/pgm/pgmtosbig.c')
-rw-r--r-- | converter/pgm/pgmtosbig.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/converter/pgm/pgmtosbig.c b/converter/pgm/pgmtosbig.c new file mode 100644 index 00000000..0a302dd8 --- /dev/null +++ b/converter/pgm/pgmtosbig.c @@ -0,0 +1,130 @@ +/*============================================================================= + pgmtosbig +=============================================================================== + + This program converts from PGM to a simple subset of SBIG. + + By Bryan Henderson January 19, 2015. + + Contributed to the public domain by its author. +=============================================================================*/ +#include <string.h> + +#include "pm.h" +#include "nstring.h" +#include "pgm.h" + + + +#define SBIG_HEADER_LENGTH 2048 /* File header length */ + +#define CTLZ "\x1A" + + +struct SbigHeader { +/*---------------------------------------------------------------------------- + The information in an SBIG file header. + + This is only the information this program cares about; the header + may have much more information in it. +-----------------------------------------------------------------------------*/ + unsigned int height; + unsigned int width; + unsigned int saturationLevel; +}; + + + +static void +addUintParm(char * const buffer, + const char * const name, + unsigned int const value) { + + const char * line; + + pm_asprintf(&line, "%s=%u\n\r", name, value); + + strcat(buffer, line); + + pm_strfree(line); +} + + + +static void +writeSbigHeader(FILE * const ofP, + struct SbigHeader const hdr) { + + char buffer[SBIG_HEADER_LENGTH]; + + memset(&buffer[0], 0x00, sizeof(buffer)); + + buffer[0] = '\0'; + + /* N.B. LF-CR instead of CRLF. That's what the spec says. */ + + strcat(buffer, "ST-6 Image\n\r" ); + + addUintParm(buffer, "Height", hdr.height); + + addUintParm(buffer, "Width", hdr.width); + + addUintParm(buffer, "Sat_level", hdr.saturationLevel); + + strcat(buffer, "End\n\r" CTLZ); + + fwrite(buffer, 1, sizeof(buffer), ofP); +} + + + +int +main(int argc, const char * argv[]) { + + FILE * ifP; + gray * grayrow; + int rows; + int cols; + int format; + struct SbigHeader hdr; + unsigned int row; + gray maxval; + const char * inputFile; + + pm_proginit(&argc, argv); + + if (argc-1 < 1) + inputFile = "-"; + else { + inputFile = argv[1]; + + if (argc-1 > 2) + pm_error("Too many arguments. The only argument is the optional " + "input file name"); + } + + ifP = pm_openr(inputFile); + + pgm_readpgminit(ifP, &cols, &rows, &maxval, &format); + + grayrow = pgm_allocrow(cols); + + hdr.height = rows; + hdr.width = cols; + hdr.saturationLevel = maxval; + + writeSbigHeader(stdout, hdr); + + for (row = 0; row < rows; ++row) { + unsigned int col; + + pgm_readpgmrow(ifP, grayrow, cols, maxval, format); + + for (col = 0; col < cols; ++col) + pm_writelittleshort(stdout, grayrow[col]); + } + + pm_close(ifP); + + return 0; +} |