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