Blame converter/pbm/ybmtopbm.c

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
}