1 #include "mupdf/fitz.h"
2 
3 #include <string.h>
4 
5 static const unsigned char pkm[256*8] =
6 {
7 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
9 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
10 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
11 	0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
12 	0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
13 	0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00,
14 	0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
15 	0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
16 	0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
17 	0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00,
18 	0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF,
19 	0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
20 	0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
21 	0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
22 	0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
23 	0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
24 	0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
25 	0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
26 	0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
27 	0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00,
28 	0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
29 	0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
30 	0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
31 	0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
32 	0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
33 	0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00,
34 	0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
35 	0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
36 	0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
37 	0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
38 	0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
39 	0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
40 	0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
41 	0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
42 	0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF,
43 	0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
44 	0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF,
45 	0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00,
46 	0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
47 	0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
48 	0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF,
49 	0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
50 	0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF,
51 	0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00,
52 	0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
53 	0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
54 	0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
55 	0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
56 	0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF,
57 	0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00,
58 	0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
59 	0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00,
60 	0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
61 	0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
62 	0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
63 	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
64 	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
65 	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00,
66 	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
67 	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
68 	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
69 	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
70 	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
71 	0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72 	0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
73 	0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
74 	0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
75 	0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
76 	0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
77 	0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00,
78 	0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
79 	0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
80 	0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
81 	0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00,
82 	0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF,
83 	0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
84 	0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
85 	0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
86 	0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
87 	0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
88 	0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
89 	0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
90 	0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
91 	0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00,
92 	0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
93 	0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
94 	0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
95 	0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
96 	0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
97 	0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00,
98 	0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
99 	0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
100 	0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
101 	0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
102 	0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
103 	0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
104 	0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
105 	0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
106 	0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF,
107 	0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
108 	0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF,
109 	0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00,
110 	0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
111 	0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
112 	0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF,
113 	0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
114 	0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF,
115 	0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00,
116 	0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
117 	0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
118 	0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
119 	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
120 	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF,
121 	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00,
122 	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
123 	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00,
124 	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
125 	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
126 	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
127 	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
128 	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
129 	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00,
130 	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
131 	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
132 	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
133 	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
134 	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
135 	0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
136 	0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
137 	0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
138 	0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
139 	0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
140 	0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
141 	0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00,
142 	0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
143 	0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
144 	0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
145 	0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00,
146 	0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF,
147 	0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
148 	0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
149 	0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
150 	0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
151 	0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
152 	0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
153 	0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
154 	0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
155 	0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00,
156 	0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
157 	0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
158 	0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
159 	0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
160 	0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
161 	0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00,
162 	0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
163 	0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
164 	0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
165 	0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
166 	0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
167 	0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
168 	0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
169 	0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
170 	0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF,
171 	0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
172 	0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF,
173 	0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00,
174 	0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
175 	0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
176 	0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF,
177 	0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
178 	0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF,
179 	0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00,
180 	0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
181 	0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
182 	0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
183 	0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
184 	0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF,
185 	0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00,
186 	0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
187 	0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00,
188 	0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
189 	0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
190 	0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
191 	0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
192 	0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
193 	0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00,
194 	0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
195 	0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
196 	0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
197 	0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
198 	0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
199 	0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 	0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
201 	0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
202 	0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
203 	0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
204 	0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
205 	0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00,
206 	0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
207 	0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
208 	0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
209 	0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00,
210 	0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF,
211 	0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
212 	0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
213 	0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
214 	0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
215 	0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
216 	0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
217 	0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
218 	0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
219 	0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00,
220 	0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
221 	0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
222 	0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
223 	0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
224 	0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
225 	0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00,
226 	0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
227 	0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
228 	0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
229 	0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
230 	0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
231 	0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
232 	0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
233 	0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
234 	0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF,
235 	0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
236 	0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF,
237 	0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00,
238 	0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
239 	0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
240 	0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF,
241 	0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
242 	0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF,
243 	0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00,
244 	0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
245 	0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00,
246 	0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
247 	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
248 	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF,
249 	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00,
250 	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
251 	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00,
252 	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
253 	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
254 	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
255 	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
256 	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
257 	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00,
258 	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
259 	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
260 	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,
261 	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
262 	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
263 };
264 
265 fz_bitmap *
fz_new_bitmap(fz_context * ctx,int w,int h,int n,int xres,int yres)266 fz_new_bitmap(fz_context *ctx, int w, int h, int n, int xres, int yres)
267 {
268 	fz_bitmap *bit;
269 
270 	/* Stride is 32 bit aligned. We may want to make this 64 bit if we use SSE2 etc. */
271 	int stride = ((n * w + 31) & ~31) >> 3;
272 	if (h < 0 || ((size_t)h > (size_t)(SIZE_MAX / stride)))
273 		fz_throw(ctx, FZ_ERROR_MEMORY, "bitmap too large");
274 
275 	bit = fz_malloc_struct(ctx, fz_bitmap);
276 	fz_try(ctx)
277 	{
278 		bit->refs = 1;
279 		bit->w = w;
280 		bit->h = h;
281 		bit->n = n;
282 		bit->xres = xres;
283 		bit->yres = yres;
284 		bit->stride = stride;
285 		bit->samples = Memento_label(fz_malloc(ctx, (size_t)h * bit->stride), "bitmap_samples");
286 	}
287 	fz_catch(ctx)
288 	{
289 		fz_free(ctx, bit);
290 		fz_rethrow(ctx);
291 	}
292 
293 	return bit;
294 }
295 
296 fz_bitmap *
fz_keep_bitmap(fz_context * ctx,fz_bitmap * bit)297 fz_keep_bitmap(fz_context *ctx, fz_bitmap *bit)
298 {
299 	return fz_keep_imp(ctx, bit, &bit->refs);
300 }
301 
302 void
fz_drop_bitmap(fz_context * ctx,fz_bitmap * bit)303 fz_drop_bitmap(fz_context *ctx, fz_bitmap *bit)
304 {
305 	if (fz_drop_imp(ctx, bit, &bit->refs))
306 	{
307 		fz_free(ctx, bit->samples);
308 		fz_free(ctx, bit);
309 	}
310 }
311 
312 void
fz_clear_bitmap(fz_context * ctx,fz_bitmap * bit)313 fz_clear_bitmap(fz_context *ctx, fz_bitmap *bit)
314 {
315 	memset(bit->samples, 0, (size_t)bit->stride * bit->h);
316 }
317 
318 static void
pbm_write_header(fz_context * ctx,fz_band_writer * writer,fz_colorspace * cs)319 pbm_write_header(fz_context *ctx, fz_band_writer *writer, fz_colorspace *cs)
320 {
321 	fz_output *out = writer->out;
322 	int w = writer->w;
323 	int h = writer->h;
324 
325 	if (writer->s != 0)
326 		fz_throw(ctx, FZ_ERROR_GENERIC, "pbms cannot contain spot colors");
327 
328 	fz_write_printf(ctx, out, "P4\n%d %d\n", w, h);
329 }
330 
331 static void
pkm_write_header(fz_context * ctx,fz_band_writer * writer,fz_colorspace * cs)332 pkm_write_header(fz_context *ctx, fz_band_writer *writer, fz_colorspace *cs)
333 {
334 	fz_output *out = writer->out;
335 	int w = writer->w;
336 	int h = writer->h;
337 
338 	if (writer->s != 0)
339 		fz_throw(ctx, FZ_ERROR_GENERIC, "pkms cannot contain spot colors");
340 
341 	fz_write_printf(ctx, out, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE CMYK\nENDHDR\n", w, h);
342 }
343 
344 void
fz_write_bitmap_as_pbm(fz_context * ctx,fz_output * out,fz_bitmap * bitmap)345 fz_write_bitmap_as_pbm(fz_context *ctx, fz_output *out, fz_bitmap *bitmap)
346 {
347 	fz_band_writer *writer;
348 
349 	if (bitmap->n != 1)
350 		fz_throw(ctx, FZ_ERROR_GENERIC, "bitmap must be monochrome to save as PBM");
351 
352 	writer = fz_new_pbm_band_writer(ctx, out);
353 	fz_try(ctx)
354 	{
355 		fz_write_header(ctx, writer, bitmap->w, bitmap->h, 1, 0, 0, 0, 0, NULL, NULL);
356 		fz_write_band(ctx, writer, bitmap->stride, bitmap->h, bitmap->samples);
357 	}
358 	fz_always(ctx)
359 		fz_drop_band_writer(ctx, writer);
360 	fz_catch(ctx)
361 		fz_rethrow(ctx);
362 }
363 
364 void
fz_write_bitmap_as_pkm(fz_context * ctx,fz_output * out,fz_bitmap * bitmap)365 fz_write_bitmap_as_pkm(fz_context *ctx, fz_output *out, fz_bitmap *bitmap)
366 {
367 	fz_band_writer *writer;
368 
369 	if (bitmap->n != 4)
370 		fz_throw(ctx, FZ_ERROR_GENERIC, "bitmap must be CMYK to save as PKM");
371 
372 	writer = fz_new_pkm_band_writer(ctx, out);
373 	fz_try(ctx)
374 	{
375 		fz_write_header(ctx, writer, bitmap->w, bitmap->h, 4, 0, 0, 0, 0, NULL, NULL);
376 		fz_write_band(ctx, writer, bitmap->stride, bitmap->h, bitmap->samples);
377 	}
378 	fz_always(ctx)
379 		fz_drop_band_writer(ctx, writer);
380 	fz_catch(ctx)
381 		fz_rethrow(ctx);
382 }
383 
384 static void
pbm_write_band(fz_context * ctx,fz_band_writer * writer,int stride,int band_start,int band_height,const unsigned char * p)385 pbm_write_band(fz_context *ctx, fz_band_writer *writer, int stride, int band_start, int band_height, const unsigned char *p)
386 {
387 	fz_output *out = writer->out;
388 	int w = writer->w;
389 	int h = writer->h;
390 	int n = writer->n;
391 	int bytestride;
392 	int end = band_start + band_height;
393 
394 	if (n != 1)
395 		fz_throw(ctx, FZ_ERROR_GENERIC, "too many color components in bitmap");
396 
397 	if (end > h)
398 		end = h;
399 	end -= band_start;
400 
401 	bytestride = (w + 7) >> 3;
402 	while (end--)
403 	{
404 		fz_write_data(ctx, out, p, bytestride);
405 		p += stride;
406 	}
407 }
408 
409 static void
pkm_write_band(fz_context * ctx,fz_band_writer * writer,int stride,int band_start,int band_height,const unsigned char * p)410 pkm_write_band(fz_context *ctx, fz_band_writer *writer, int stride, int band_start, int band_height, const unsigned char *p)
411 {
412 	fz_output *out = writer->out;
413 	int w = writer->w;
414 	int h = writer->h;
415 	int n = writer->n;
416 	int bytestride;
417 	int end = band_start + band_height;
418 
419 	if (n != 4)
420 		fz_throw(ctx, FZ_ERROR_GENERIC, "wrong number of color components in bitmap");
421 
422 	if (end > h)
423 		end = h;
424 	end -= band_start;
425 
426 	bytestride = stride - (w>>1);
427 	while (end--)
428 	{
429 		int ww = w-1;
430 		while (ww > 0)
431 		{
432 			fz_write_data(ctx, out, &pkm[8 * *p++], 8);
433 			ww -= 2;
434 		}
435 		if (ww == 0)
436 			fz_write_data(ctx, out, &pkm[8 * *p], 4);
437 		p += bytestride;
438 	}
439 }
440 
fz_new_pbm_band_writer(fz_context * ctx,fz_output * out)441 fz_band_writer *fz_new_pbm_band_writer(fz_context *ctx, fz_output *out)
442 {
443 	fz_band_writer *writer = fz_new_band_writer(ctx, fz_band_writer, out);
444 
445 	writer->header = pbm_write_header;
446 	writer->band = pbm_write_band;
447 
448 	return writer;
449 }
450 
fz_new_pkm_band_writer(fz_context * ctx,fz_output * out)451 fz_band_writer *fz_new_pkm_band_writer(fz_context *ctx, fz_output *out)
452 {
453 	fz_band_writer *writer = fz_new_band_writer(ctx, fz_band_writer, out);
454 
455 	writer->header = pkm_write_header;
456 	writer->band = pkm_write_band;
457 
458 	return writer;
459 }
460 
461 void
fz_save_bitmap_as_pbm(fz_context * ctx,fz_bitmap * bitmap,const char * filename)462 fz_save_bitmap_as_pbm(fz_context *ctx, fz_bitmap *bitmap, const char *filename)
463 {
464 	fz_output *out = fz_new_output_with_path(ctx, filename, 0);
465 	fz_try(ctx)
466 	{
467 		fz_write_bitmap_as_pbm(ctx, out, bitmap);
468 		fz_close_output(ctx, out);
469 	}
470 	fz_always(ctx)
471 		fz_drop_output(ctx, out);
472 	fz_catch(ctx)
473 		fz_rethrow(ctx);
474 }
475 
476 void
fz_save_bitmap_as_pkm(fz_context * ctx,fz_bitmap * bitmap,const char * filename)477 fz_save_bitmap_as_pkm(fz_context *ctx, fz_bitmap *bitmap, const char *filename)
478 {
479 	fz_output *out = fz_new_output_with_path(ctx, filename, 0);
480 	fz_try(ctx)
481 	{
482 		fz_write_bitmap_as_pkm(ctx, out, bitmap);
483 		fz_close_output(ctx, out);
484 	}
485 	fz_always(ctx)
486 		fz_drop_output(ctx, out);
487 	fz_catch(ctx)
488 		fz_rethrow(ctx);
489 }
490 
491 void
fz_save_pixmap_as_pbm(fz_context * ctx,fz_pixmap * pixmap,const char * filename)492 fz_save_pixmap_as_pbm(fz_context *ctx, fz_pixmap *pixmap, const char *filename)
493 {
494 	fz_bitmap *bitmap = fz_new_bitmap_from_pixmap(ctx, pixmap, NULL);
495 	fz_try(ctx)
496 		fz_save_bitmap_as_pbm(ctx, bitmap, filename);
497 	fz_always(ctx)
498 		fz_drop_bitmap(ctx, bitmap);
499 	fz_catch(ctx)
500 		fz_rethrow(ctx);
501 }
502 
503 void
fz_save_pixmap_as_pkm(fz_context * ctx,fz_pixmap * pixmap,const char * filename)504 fz_save_pixmap_as_pkm(fz_context *ctx, fz_pixmap *pixmap, const char *filename)
505 {
506 	fz_bitmap *bitmap = fz_new_bitmap_from_pixmap(ctx, pixmap, NULL);
507 	fz_try(ctx)
508 		fz_save_bitmap_as_pkm(ctx, bitmap, filename);
509 	fz_always(ctx)
510 		fz_drop_bitmap(ctx, bitmap);
511 	fz_catch(ctx)
512 		fz_rethrow(ctx);
513 }
514 
fz_bitmap_details(fz_bitmap * bit,int * w,int * h,int * n,int * stride)515 void fz_bitmap_details(fz_bitmap *bit, int *w, int *h, int *n, int *stride)
516 {
517 	if (!bit)
518 	{
519 		if (w)
520 			*w = 0;
521 		if (h)
522 			*h = 0;
523 		if (n)
524 			*n = 0;
525 		if (stride)
526 			*stride = 0;
527 		return;
528 	}
529 	if (w)
530 		*w = bit->w;
531 	if (h)
532 		*h = bit->h;
533 	if (n)
534 		*n = bit->n;
535 	if (stride)
536 		*stride = bit->stride;
537 }
538