comparison mupdf-source/source/fitz/bitmap.c @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
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 {
290 fz_bitmap *bit;
291
292 /* Stride is 32 bit aligned. We may want to make this 64 bit if we use SSE2 etc. */
293 int stride = ((n * w + 31) & ~31) >> 3;
294 if (h < 0 || ((size_t)h > (size_t)(SIZE_MAX / stride)))
295 fz_throw(ctx, FZ_ERROR_LIMIT, "bitmap too large");
296
297 bit = fz_malloc_struct(ctx, fz_bitmap);
298 fz_try(ctx)
299 {
300 bit->refs = 1;
301 bit->w = w;
302 bit->h = h;
303 bit->n = n;
304 bit->xres = xres;
305 bit->yres = yres;
306 bit->stride = stride;
307 bit->samples = Memento_label(fz_malloc(ctx, (size_t)h * bit->stride), "bitmap_samples");
308 }
309 fz_catch(ctx)
310 {
311 fz_free(ctx, bit);
312 fz_rethrow(ctx);
313 }
314
315 return bit;
316 }
317
318 fz_bitmap *
319 fz_keep_bitmap(fz_context *ctx, fz_bitmap *bit)
320 {
321 return fz_keep_imp(ctx, bit, &bit->refs);
322 }
323
324 void
325 fz_drop_bitmap(fz_context *ctx, fz_bitmap *bit)
326 {
327 if (fz_drop_imp(ctx, bit, &bit->refs))
328 {
329 fz_free(ctx, bit->samples);
330 fz_free(ctx, bit);
331 }
332 }
333
334 void
335 fz_clear_bitmap(fz_context *ctx, fz_bitmap *bit)
336 {
337 memset(bit->samples, 0, (size_t)bit->stride * bit->h);
338 }
339
340 static void
341 pbm_write_header(fz_context *ctx, fz_band_writer *writer, fz_colorspace *cs)
342 {
343 fz_output *out = writer->out;
344 int w = writer->w;
345 int h = writer->h;
346
347 if (writer->s != 0)
348 fz_throw(ctx, FZ_ERROR_ARGUMENT, "pbms cannot contain spot colors");
349 if (writer->n != 1)
350 fz_throw(ctx, FZ_ERROR_ARGUMENT, "too many color components in bitmap");
351
352 fz_write_printf(ctx, out, "P4\n%d %d\n", w, h);
353 }
354
355 static void
356 pkm_write_header(fz_context *ctx, fz_band_writer *writer, fz_colorspace *cs)
357 {
358 fz_output *out = writer->out;
359 int w = writer->w;
360 int h = writer->h;
361
362 if (writer->s != 0)
363 fz_throw(ctx, FZ_ERROR_ARGUMENT, "pkms cannot contain spot colors");
364 if (writer->n != 4)
365 fz_throw(ctx, FZ_ERROR_ARGUMENT, "wrong number of color components in bitmap");
366
367 fz_write_printf(ctx, out, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE CMYK\nENDHDR\n", w, h);
368 }
369
370 void
371 fz_write_bitmap_as_pbm(fz_context *ctx, fz_output *out, fz_bitmap *bitmap)
372 {
373 fz_band_writer *writer;
374
375 if (bitmap->n != 1)
376 fz_throw(ctx, FZ_ERROR_ARGUMENT, "bitmap must be monochrome to save as PBM");
377
378 writer = fz_new_pbm_band_writer(ctx, out);
379 fz_try(ctx)
380 {
381 fz_write_header(ctx, writer, bitmap->w, bitmap->h, 1, 0, 0, 0, 0, NULL, NULL);
382 fz_write_band(ctx, writer, bitmap->stride, bitmap->h, bitmap->samples);
383 fz_close_band_writer(ctx, writer);
384 }
385 fz_always(ctx)
386 fz_drop_band_writer(ctx, writer);
387 fz_catch(ctx)
388 fz_rethrow(ctx);
389 }
390
391 void
392 fz_write_bitmap_as_pkm(fz_context *ctx, fz_output *out, fz_bitmap *bitmap)
393 {
394 fz_band_writer *writer;
395
396 if (bitmap->n != 4)
397 fz_throw(ctx, FZ_ERROR_ARGUMENT, "bitmap must be CMYK to save as PKM");
398
399 writer = fz_new_pkm_band_writer(ctx, out);
400 fz_try(ctx)
401 {
402 fz_write_header(ctx, writer, bitmap->w, bitmap->h, 4, 0, 0, 0, 0, NULL, NULL);
403 fz_write_band(ctx, writer, bitmap->stride, bitmap->h, bitmap->samples);
404 fz_close_band_writer(ctx, writer);
405 }
406 fz_always(ctx)
407 fz_drop_band_writer(ctx, writer);
408 fz_catch(ctx)
409 fz_rethrow(ctx);
410 }
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 {
415 fz_output *out = writer->out;
416 int w = writer->w;
417 int h = writer->h;
418 int bytestride;
419 int end = band_start + band_height;
420
421 if (end > h)
422 end = h;
423 end -= band_start;
424
425 bytestride = (w + 7) >> 3;
426 while (end--)
427 {
428 fz_write_data(ctx, out, p, bytestride);
429 p += stride;
430 }
431 }
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 {
436 fz_output *out = writer->out;
437 int w = writer->w;
438 int h = writer->h;
439 int bytestride;
440 int end = band_start + band_height;
441
442
443 if (end > h)
444 end = h;
445 end -= band_start;
446
447 bytestride = stride - (w>>1);
448 while (end--)
449 {
450 int ww = w-1;
451 while (ww > 0)
452 {
453 fz_write_data(ctx, out, &pkm[8 * *p++], 8);
454 ww -= 2;
455 }
456 if (ww == 0)
457 fz_write_data(ctx, out, &pkm[8 * *p], 4);
458 p += bytestride;
459 }
460 }
461
462 fz_band_writer *fz_new_pbm_band_writer(fz_context *ctx, fz_output *out)
463 {
464 fz_band_writer *writer = fz_new_band_writer(ctx, fz_band_writer, out);
465
466 writer->header = pbm_write_header;
467 writer->band = pbm_write_band;
468
469 return writer;
470 }
471
472 fz_band_writer *fz_new_pkm_band_writer(fz_context *ctx, fz_output *out)
473 {
474 fz_band_writer *writer = fz_new_band_writer(ctx, fz_band_writer, out);
475
476 writer->header = pkm_write_header;
477 writer->band = pkm_write_band;
478
479 return writer;
480 }
481
482 void
483 fz_save_bitmap_as_pbm(fz_context *ctx, fz_bitmap *bitmap, const char *filename)
484 {
485 fz_output *out = fz_new_output_with_path(ctx, filename, 0);
486 fz_try(ctx)
487 {
488 fz_write_bitmap_as_pbm(ctx, out, bitmap);
489 fz_close_output(ctx, out);
490 }
491 fz_always(ctx)
492 fz_drop_output(ctx, out);
493 fz_catch(ctx)
494 fz_rethrow(ctx);
495 }
496
497 void
498 fz_save_bitmap_as_pkm(fz_context *ctx, fz_bitmap *bitmap, const char *filename)
499 {
500 fz_output *out = fz_new_output_with_path(ctx, filename, 0);
501 fz_try(ctx)
502 {
503 fz_write_bitmap_as_pkm(ctx, out, bitmap);
504 fz_close_output(ctx, out);
505 }
506 fz_always(ctx)
507 fz_drop_output(ctx, out);
508 fz_catch(ctx)
509 fz_rethrow(ctx);
510 }
511
512 void
513 fz_save_pixmap_as_pbm(fz_context *ctx, fz_pixmap *pixmap, const char *filename)
514 {
515 fz_bitmap *bitmap = fz_new_bitmap_from_pixmap(ctx, pixmap, NULL);
516 fz_try(ctx)
517 fz_save_bitmap_as_pbm(ctx, bitmap, filename);
518 fz_always(ctx)
519 fz_drop_bitmap(ctx, bitmap);
520 fz_catch(ctx)
521 fz_rethrow(ctx);
522 }
523
524 void
525 fz_save_pixmap_as_pkm(fz_context *ctx, fz_pixmap *pixmap, const char *filename)
526 {
527 fz_bitmap *bitmap = fz_new_bitmap_from_pixmap(ctx, pixmap, NULL);
528 fz_try(ctx)
529 fz_save_bitmap_as_pkm(ctx, bitmap, filename);
530 fz_always(ctx)
531 fz_drop_bitmap(ctx, bitmap);
532 fz_catch(ctx)
533 fz_rethrow(ctx);
534 }
535
536 void fz_bitmap_details(fz_bitmap *bit, int *w, int *h, int *n, int *stride)
537 {
538 if (!bit)
539 {
540 if (w)
541 *w = 0;
542 if (h)
543 *h = 0;
544 if (n)
545 *n = 0;
546 if (stride)
547 *stride = 0;
548 return;
549 }
550 if (w)
551 *w = bit->w;
552 if (h)
553 *h = bit->h;
554 if (n)
555 *n = bit->n;
556 if (stride)
557 *stride = bit->stride;
558 }