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