|
Packit |
78deda |
/* ybmtopbm.c - read a file from Bennet Yee's 'xbm' program and write a pbm.
|
|
Packit |
78deda |
**
|
|
Packit |
78deda |
** Written by Jamie Zawinski based on code (C) 1988 by Jef Poskanzer.
|
|
Packit |
78deda |
**
|
|
Packit |
78deda |
** Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
78deda |
** documentation for any purpose and without fee is hereby granted, provided
|
|
Packit |
78deda |
** that the above copyright notice appear in all copies and that both that
|
|
Packit |
78deda |
** copyright notice and this permission notice appear in supporting
|
|
Packit |
78deda |
** documentation. This software is provided "as is" without express or
|
|
Packit |
78deda |
** implied warranty.
|
|
Packit |
78deda |
*/
|
|
Packit |
78deda |
|
|
Packit |
78deda |
#include "pm.h"
|
|
Packit |
78deda |
#include "pbm.h"
|
|
Packit |
78deda |
#include "bitreverse.h"
|
|
Packit |
78deda |
|
|
Packit |
78deda |
static short const ybmMagic = ( ( '!' << 8 ) | '!' );
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
static void
|
|
Packit |
78deda |
getinit(FILE * const ifP,
|
|
Packit |
78deda |
short * const colsP,
|
|
Packit |
78deda |
short * const rowsP,
|
|
Packit |
78deda |
short * const depthP) {
|
|
Packit |
78deda |
|
|
Packit |
78deda |
short magic;
|
|
Packit |
78deda |
int rc;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
rc = pm_readbigshort(ifP, &magic);
|
|
Packit |
78deda |
if (rc == -1)
|
|
Packit |
78deda |
pm_error("EOF / read error");
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (magic != ybmMagic)
|
|
Packit |
78deda |
pm_error("bad magic number in YBM file");
|
|
Packit |
78deda |
|
|
Packit |
78deda |
rc = pm_readbigshort(ifP, colsP);
|
|
Packit |
78deda |
if (rc == -1 )
|
|
Packit |
78deda |
pm_error("EOF / read error");
|
|
Packit |
78deda |
|
|
Packit |
78deda |
rc = pm_readbigshort(ifP, rowsP);
|
|
Packit |
78deda |
if (rc == -1)
|
|
Packit |
78deda |
pm_error("EOF / read error");
|
|
Packit |
78deda |
|
|
Packit |
78deda |
*depthP = 1;
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
int
|
|
Packit |
78deda |
main(int argc, const char * argv[]) {
|
|
Packit |
78deda |
|
|
Packit |
78deda |
FILE * ifP;
|
|
Packit |
78deda |
bit * bitrow;
|
|
Packit |
78deda |
short rows, cols;
|
|
Packit |
78deda |
unsigned int row;
|
|
Packit |
78deda |
short depth;
|
|
Packit |
78deda |
const char * inputFile;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pm_proginit(&argc, argv);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (argc-1 < 1)
|
|
Packit |
78deda |
inputFile = "-";
|
|
Packit |
78deda |
else {
|
|
Packit |
78deda |
inputFile = argv[1];
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (argc-1 > 1)
|
|
Packit |
78deda |
pm_error("Too many arguments. The only argument is the optional "
|
|
Packit |
78deda |
"input file name");
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
ifP = pm_openr(inputFile);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
getinit(ifP, &cols, &rows, &depth);
|
|
Packit |
78deda |
if (depth != 1)
|
|
Packit |
78deda |
pm_error("YBM file has depth of %u, must be 1", (unsigned)depth);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pbm_writepbminit(stdout, cols, rows, 0);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
bitrow = pbm_allocrow_packed(cols + 8);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (row = 0; row < rows; ++row) {
|
|
Packit |
78deda |
uint16_t * const itemrow = (uint16_t *) bitrow;
|
|
Packit |
78deda |
unsigned int const itemCt = (cols + 15) / 16;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
unsigned int i;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* Get raster. */
|
|
Packit |
78deda |
for (i = 0; i < itemCt; ++i) {
|
|
Packit |
78deda |
short int item;
|
|
Packit |
78deda |
pm_readbigshort(ifP, &item);
|
|
Packit |
78deda |
itemrow[i] = (uint16_t) item;
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (i = 0; i < pbm_packed_bytes(cols); ++i)
|
|
Packit |
78deda |
bitrow[i] = bitreverse[bitrow[i]];
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pbm_cleanrowend_packed(bitrow, cols);
|
|
Packit |
78deda |
pbm_writepbmrow_packed(stdout, bitrow, cols, 0);
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pbm_freerow_packed(bitrow);
|
|
Packit |
78deda |
pm_close(ifP);
|
|
Packit |
78deda |
pm_close(stdout);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
return 0;
|
|
Packit |
78deda |
}
|