Blame converter/pbm/brushtopbm.c

Packit 78deda
/* brushtopbm.c - read a doodle brush file and write a PBM image
Packit 78deda
**
Packit 78deda
** Copyright (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 "pbm.h"
Packit 78deda
Packit 78deda
#define HEADERSIZE 16   /* 16 is just a guess at the header size */
Packit 78deda
Packit 78deda
Packit 78deda
Packit 78deda
static void
Packit 78deda
getinit(FILE *         const ifP,
Packit 78deda
        unsigned int * const colsP,
Packit 78deda
        unsigned int * const rowsP) {
Packit 78deda
Packit 78deda
    unsigned char header[HEADERSIZE];
Packit 78deda
    size_t bytesRead;
Packit 78deda
Packit 78deda
    bytesRead = fread(header, sizeof(header), 1, ifP);
Packit 78deda
    if (bytesRead !=1)
Packit 78deda
        pm_error("Error reading header");   
Packit 78deda
Packit 78deda
    if (header[0] != 1)
Packit 78deda
        pm_error("bad magic number 1");
Packit 78deda
    if (header[1] != 0)
Packit 78deda
        pm_error("bad magic number 2");
Packit 78deda
Packit 78deda
    *colsP =  (header[2] << 8) + header[3];  /* Max 65535 */
Packit 78deda
    *rowsP =  (header[4] << 8) + header[5];  /* Max 65535 */
Packit 78deda
}
Packit 78deda
Packit 78deda
Packit 78deda
Packit 78deda
static void
Packit 78deda
validateEof(FILE * const ifP) {
Packit 78deda
Packit 78deda
    int rc;
Packit 78deda
    rc = getc(ifP);
Packit 78deda
    if (rc != EOF)
Packit 78deda
        pm_message("Extraneous data at end of file");
Packit 78deda
}
Packit 78deda
Packit 78deda
Packit 78deda
/*
Packit 78deda
   The routine for converting the raster closely resembles the pbm
Packit 78deda
   case of pnminvert.  Input is padded up to 16 bit border.
Packit 78deda
   afu December 2013
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
    unsigned int rows, cols, row;
Packit 78deda
Packit 78deda
    pm_proginit(&argc, argv);
Packit 78deda
Packit 78deda
    if (argc-1 > 0) {
Packit 78deda
        ifP = pm_openr(argv[1]);
Packit 78deda
        if (argc-1 > 1)
Packit 78deda
            pm_error("Too many arguments (%u).  "
Packit 78deda
                     "The only argument is the brush file name.", argc-1);
Packit 78deda
    } else
Packit 78deda
        ifP = stdin;
Packit 78deda
Packit 78deda
    getinit(ifP, &cols, &rows);
Packit 78deda
Packit 78deda
    pbm_writepbminit(stdout, cols, rows, 0);
Packit 78deda
Packit 78deda
    bitrow = pbm_allocrow_packed(cols + 16);
Packit 78deda
Packit 78deda
    for (row = 0; row < rows; ++row) {
Packit 78deda
        unsigned int const inRowBytes = ((cols + 15) / 16) * 2;
Packit 78deda
        unsigned int i;
Packit 78deda
        size_t bytesRead;
Packit 78deda
Packit 78deda
        bytesRead = fread (bitrow, 1, inRowBytes, ifP); 
Packit 78deda
        if (bytesRead != inRowBytes)
Packit 78deda
            pm_error("Error reading a row of data from brushfile");
Packit 78deda
Packit 78deda
        for (i = 0; i < inRowBytes; ++i)
Packit 78deda
            bitrow[i] = ~bitrow[i];
Packit 78deda
Packit 78deda
        /* Clean off remainder of fractional last character */
Packit 78deda
        pbm_cleanrowend_packed(bitrow, cols);
Packit 78deda
Packit 78deda
        pbm_writepbmrow_packed(stdout, bitrow, cols, 0);
Packit 78deda
    }
Packit 78deda
Packit 78deda
    validateEof(ifP);
Packit 78deda
Packit 78deda
    pm_close(ifP);
Packit 78deda
    pm_close(stdout);
Packit 78deda
    
Packit 78deda
    return 0;
Packit 78deda
}