Coverage Report

Created: 2024-07-05 06:13

/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
}