about summary refs log tree commit diff
path: root/lib/pbm.h
blob: 57ab3812829c09dfeca124a4f399c5c8aa963834 (plain) (blame)
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#ifndef PBM_H_INCLUDED
#define PBM_H_INCLUDED

#include <netpbm/pm.h>

#ifdef __cplusplus
extern "C" {
#endif
#if 0
} /* to fake out automatic code indenters */
#endif

typedef unsigned char bit;
#define PBM_WHITE 0
#define PBM_BLACK 1


/* Magic constants. */

#define PBM_MAGIC1 'P'
#define PBM_MAGIC2 '1'
#define RPBM_MAGIC2 '4'
#define PBM_FORMAT (PBM_MAGIC1 * 256 + PBM_MAGIC2)
#define RPBM_FORMAT (PBM_MAGIC1 * 256 + RPBM_MAGIC2)
#define PBM_TYPE PBM_FORMAT


/* Macro for turning a format number into a type number. */

#define PBM_FORMAT_TYPE(f) \
  ((f) == PBM_FORMAT || (f) == RPBM_FORMAT ? PBM_TYPE : -1)


/* Declarations of routines. */

void
pbm_init(int *   const argcP,
         char ** const argv);

void
pbm_nextimage(FILE *file, int * const eofP);

bit *
pbm_allocrow(unsigned int const cols);

#define pbm_allocarray(cols, rows) \
  ((bit**) pm_allocarray(cols, rows, sizeof(bit)))
#define pbm_freearray(bits, rows) pm_freearray((char**) bits, rows)
#define pbm_freerow(bitrow) pm_freerow((char*) bitrow)

/* Beware of arithmetic overflows when using pbm_packed_bytes(),
   pbm_allocrow_packed() and pbm_allocarray_packed().

   When cols is signed int, pbm_packed_bytes(cols + 8) overflows
   with large values.   Same with pamP->width which is always signed int.

   Function validateComputableSize() called by pbm_readpbminit()
   provides a margin of 10, but the "+7" uses much of it.

   To prevent overflows, cast cols or pamP->width to unsigned int
   like this: pbm_packed_bytes((unsigned int) cols +8))
*/
#define pbm_packed_bytes(cols) (((cols)+7)/8)
#define pbm_allocrow_packed(cols) \
    ((unsigned char *) pm_allocrow(pbm_packed_bytes(cols), \
                                   sizeof(unsigned char)))
#define pbm_freerow_packed(packed_bits) \
    pm_freerow((char *) packed_bits)
#define pbm_allocarray_packed(cols, rows) ((unsigned char **) \
    pm_allocarray(pbm_packed_bytes(cols), rows, sizeof(unsigned char)))
#define pbm_freearray_packed(packed_bits, rows) \
    pm_freearray((char **) packed_bits, rows)

bit**
pbm_readpbm(FILE * const file,
            int  * const colsP,
            int  * const rowsP);

void
pbm_readpbminit(FILE * const file,
                int  * const colsP,
                int  * const rowsP, int * const formatP);

void
pbm_readpbmrow(FILE * const file,
               bit  * const bitrow,
               int    const cols,
               int    const format);

void
pbm_readpbmrow_packed(FILE *          const file,
                      unsigned char * const packedBits,
                      int             const cols,
                      int             const format);

void
pbm_readpbmrow_bitoffset(FILE *          const fileP,
                         unsigned char * const packedBits,
                         int             const cols,
                         int             const format,
                         unsigned int    const offset);

void
pbm_cleanrowend_packed(unsigned char * const packedBits,
                       unsigned int    const cols);

void
pbm_writepbminit(FILE * const fileP,
                 int    const cols,
                 int    const rows,
                 int    const forceplain);

void
pbm_writepbm(FILE * const fileP,
             bit ** const bits,
             int    const cols,
             int    const rows,
             int    const forceplain);

void
pbm_writepbmrow(FILE *      const fileP,
                const bit * const bitrow,
                int         const cols,
                int         const forceplain);

void
pbm_writepbmrow_packed(FILE *                const fileP,
                       const unsigned char * const packed_bits,
                       int                   const cols,
                       int                   const forceplain);

void
pbm_writepbmrow_bitoffset(FILE *          const ifP,
                          unsigned char * const packedBits,
                          unsigned int    const cols,
                          int             const format,
                          unsigned int    const offset);

void
pbm_check(FILE * file, const enum pm_check_type check_type,
          const int format, const int cols, const int rows,
          enum pm_check_code * const retval_p);

bit
pbm_backgroundbitrow(const unsigned char * const packedBits,
                     unsigned int          const cols,
                     unsigned int          const offset);

#ifdef __cplusplus
}
#endif

#endif