1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/* pbmtoybm.c - read a pbm and write a file for Bennet Yee's 'xbm' and 'face'
** programs.
**
** Written by Jamie Zawinski based on code (C) 1988 by Jef Poskanzer.
**
** Permission to use, copy, modify, and distribute this software and its
** documentation for any purpose and without fee is hereby granted, provided
** that the above copyright notice appear in all copies and that both that
** copyright notice and this permission notice appear in supporting
** documentation. This software is provided "as is" without express or
** implied warranty.
**
** Feb 2010 afu
** Added dimension check to prevent short int from overflowing
** Changed code style (ANSI-style function definitions, etc.)
*/
#include <stdio.h>
#include "pm.h"
#include "pbm.h"
#include "bitreverse.h"
#define YBM_MAGIC ( ( '!' << 8 ) | '!' )
#define INT16MAX 32767
static void
putinit(int const cols,
int const rows) {
pm_writebigshort(stdout, YBM_MAGIC);
pm_writebigshort(stdout, cols);
pm_writebigshort(stdout, rows);
}
int
main(int argc, const char *argv[]) {
FILE * ifP;
bit * bitrow;
int rows;
int cols;
int format;
unsigned int row;
const char * inputFileName;
pm_proginit(&argc, argv);
if (argc-1 < 1)
inputFileName = "-";
else {
inputFileName = argv[1];
if (argc-1 > 1)
pm_error("Too many arguments. The only argument is the optional "
"input file name");
}
ifP = pm_openr(inputFileName);
pbm_readpbminit(ifP, &cols, &rows, &format);
if (rows > INT16MAX || cols > INT16MAX)
pm_error("Input image is too large.");
bitrow = pbm_allocrow_packed(cols + 8);
putinit(cols, rows);
bitrow[pbm_packed_bytes(cols + 8) - 1] = 0x00;
for (row = 0; row < rows; ++row) {
uint16_t * const itemrow = (uint16_t *) bitrow;
unsigned int const itemCt = (cols + 15) / 16;
unsigned int i;
pbm_readpbmrow_packed(ifP, bitrow, cols, format);
pbm_cleanrowend_packed(bitrow, cols);
for (i = 0; i < pbm_packed_bytes(cols); ++i)
bitrow[i] = bitreverse[bitrow[i]];
for (i = 0; i < itemCt; ++i)
pm_writebigshort(stdout, itemrow[i]);
}
pbm_freerow_packed(bitrow);
if (ifP != stdin)
fclose(ifP);
return 0;
}
|