|
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 |
}
|