/src/ghostpdl/base/gxsamplp.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* Copyright (C) 2001-2023 Artifex Software, Inc. |
2 | | All Rights Reserved. |
3 | | |
4 | | This software is provided AS-IS with no warranty, either express or |
5 | | implied. |
6 | | |
7 | | This software is distributed under license and may not be copied, |
8 | | modified or distributed except as expressly authorized under the terms |
9 | | of the license contained in the file LICENSE in this distribution. |
10 | | |
11 | | Refer to licensing information at http://www.artifex.com or contact |
12 | | Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco, |
13 | | CA 94129, USA, for further information. |
14 | | */ |
15 | | |
16 | | |
17 | | /* Templates for sample lookup and expansion */ |
18 | | |
19 | | /* This module is allowed to include several times into a single .c file. |
20 | | The following macros to be defined in advance : |
21 | | MULTIPLE_MAPS - 1 if num_components_per_plane > 0 and |
22 | | components use different maps, 0 otherwise. |
23 | | TEMPLATE_sample_unpack_1 - a name for the function |
24 | | TEMPLATE_sample_unpack_2 - a name for the function |
25 | | TEMPLATE_sample_unpack_4 - a name for the function |
26 | | TEMPLATE_sample_unpack_8 - a name for the function |
27 | | */ |
28 | | |
29 | | #if defined(TEMPLATE_sample_unpack_1) && defined(TEMPLATE_sample_unpack_2) && defined(TEMPLATE_sample_unpack_4) && defined(TEMPLATE_sample_unpack_8) |
30 | | |
31 | | #include "valgrind.h" |
32 | | |
33 | | #if MULTIPLE_MAPS |
34 | 0 | # define NEXT_MAP map = smap[++smap_index % num_components_per_plane].table.lookup4x1to32 |
35 | 0 | # define NEXT_MAP8 map = smap[++smap_index % num_components_per_plane].table.lookup8 |
36 | 0 | # define DEFINE_SMAP_INDEX int smap_index = 0; |
37 | | #else |
38 | | # define NEXT_MAP |
39 | | # define NEXT_MAP8 |
40 | | # define DEFINE_SMAP_INDEX |
41 | | #endif |
42 | | |
43 | | const byte * |
44 | | TEMPLATE_sample_unpack_1(byte * bptr, int *pdata_x, const byte * data, int data_x, |
45 | | uint dsize, const sample_map *smap, int spread, |
46 | | int num_components_per_plane) |
47 | 0 | { |
48 | 0 | const sample_lookup_t * ptab = &smap->table; |
49 | 0 | const byte *psrc = data + (data_x >> 3); |
50 | 0 | int left = dsize - (data_x >> 3); |
51 | 0 | DEFINE_SMAP_INDEX |
52 | |
|
53 | 0 | #ifdef PACIFY_VALGRIND |
54 | 0 | byte *bend = bptr + left*spread; |
55 | 0 | byte vbits = 0; |
56 | | |
57 | | /* Allow for undefined bits at the end */ |
58 | 0 | VALGRIND_GET_VBITS(&psrc[left-1], &vbits, 1); |
59 | | /* At least the top bit must be defined. If not, |
60 | | * don't change anything, and let valgrind complain. */ |
61 | 0 | if ((vbits & 0x80) == 0) { |
62 | 0 | byte zero = 0; |
63 | 0 | VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1); |
64 | 0 | } |
65 | 0 | #endif |
66 | |
|
67 | 0 | if (spread == 1) { |
68 | 0 | bits32 *bufp = (bits32 *) bptr; |
69 | 0 | const bits32 *map = &ptab->lookup4x1to32[0]; |
70 | 0 | uint b; |
71 | |
|
72 | 0 | if (left & 1) { |
73 | 0 | b = psrc[0]; |
74 | 0 | bufp[0] = map[b >> 4]; |
75 | 0 | NEXT_MAP; |
76 | 0 | bufp[1] = map[b & 0xf]; |
77 | 0 | NEXT_MAP; |
78 | 0 | psrc++, bufp += 2; |
79 | 0 | } |
80 | 0 | left >>= 1; |
81 | 0 | while (left--) { |
82 | 0 | b = psrc[0]; |
83 | 0 | bufp[0] = map[b >> 4]; |
84 | 0 | NEXT_MAP; |
85 | 0 | bufp[1] = map[b & 0xf]; |
86 | 0 | NEXT_MAP; |
87 | 0 | b = psrc[1]; |
88 | 0 | bufp[2] = map[b >> 4]; |
89 | 0 | NEXT_MAP; |
90 | 0 | bufp[3] = map[b & 0xf]; |
91 | 0 | NEXT_MAP; |
92 | 0 | psrc += 2, bufp += 4; |
93 | 0 | } |
94 | 0 | } else { |
95 | 0 | byte *bufp = bptr; |
96 | 0 | const byte *map = &ptab->lookup8[0]; |
97 | |
|
98 | 0 | while (left--) { |
99 | 0 | uint b = *psrc++; |
100 | |
|
101 | 0 | *bufp = map[b >> 7]; |
102 | 0 | NEXT_MAP8; |
103 | 0 | bufp += spread; |
104 | 0 | *bufp = map[(b >> 6) & 1]; |
105 | 0 | NEXT_MAP8; |
106 | 0 | bufp += spread; |
107 | 0 | *bufp = map[(b >> 5) & 1]; |
108 | 0 | NEXT_MAP8; |
109 | 0 | bufp += spread; |
110 | 0 | *bufp = map[(b >> 4) & 1]; |
111 | 0 | NEXT_MAP8; |
112 | 0 | bufp += spread; |
113 | 0 | *bufp = map[(b >> 3) & 1]; |
114 | 0 | NEXT_MAP8; |
115 | 0 | bufp += spread; |
116 | 0 | *bufp = map[(b >> 2) & 1]; |
117 | 0 | NEXT_MAP8; |
118 | 0 | bufp += spread; |
119 | 0 | *bufp = map[(b >> 1) & 1]; |
120 | 0 | NEXT_MAP8; |
121 | 0 | bufp += spread; |
122 | 0 | *bufp = map[b & 1]; |
123 | 0 | NEXT_MAP8; |
124 | 0 | bufp += spread; |
125 | 0 | } |
126 | 0 | } |
127 | 0 | #ifdef PACIFY_VALGRIND |
128 | | /* Put any undefinedness back, and carry it over to the output. */ |
129 | 0 | VALGRIND_SET_VBITS(psrc-1, &vbits, 1); |
130 | 0 | { |
131 | 0 | byte ones = 0xff; |
132 | 0 | if (vbits & 0x40) |
133 | 0 | VALGRIND_SET_VBITS(bend - spread*7, &ones, 1); |
134 | 0 | if (vbits & 0x20) |
135 | 0 | VALGRIND_SET_VBITS(bend - spread*6, &ones, 1); |
136 | 0 | if (vbits & 0x10) |
137 | 0 | VALGRIND_SET_VBITS(bend - spread*5, &ones, 1); |
138 | 0 | if (vbits & 0x08) |
139 | 0 | VALGRIND_SET_VBITS(bend - spread*4, &ones, 1); |
140 | 0 | if (vbits & 0x04) |
141 | 0 | VALGRIND_SET_VBITS(bend - spread*3, &ones, 1); |
142 | 0 | if (vbits & 0x02) |
143 | 0 | VALGRIND_SET_VBITS(bend - spread*2, &ones, 1); |
144 | 0 | if (vbits & 0x01) |
145 | 0 | VALGRIND_SET_VBITS(bend - spread*1, &ones, 1); |
146 | 0 | } |
147 | 0 | #endif |
148 | 0 | *pdata_x = data_x & 7; |
149 | 0 | return bptr; |
150 | 0 | } Unexecuted instantiation: sample_unpack_1 Unexecuted instantiation: sample_unpack_1_interleaved |
151 | | |
152 | | #undef NEXT_MAP |
153 | | |
154 | | #if MULTIPLE_MAPS |
155 | 0 | # define NEXT_MAP map = smap[++smap_index % num_components_per_plane].table.lookup2x2to16 |
156 | | #else |
157 | | # define NEXT_MAP |
158 | | #endif |
159 | | |
160 | | const byte * |
161 | | TEMPLATE_sample_unpack_2(byte * bptr, int *pdata_x, const byte * data, int data_x, |
162 | | uint dsize, const sample_map *smap, int spread, |
163 | | int num_components_per_plane) |
164 | 0 | { |
165 | 0 | const sample_lookup_t * ptab = &smap->table; |
166 | 0 | const byte *psrc = data + (data_x >> 2); |
167 | 0 | int left = dsize - (data_x >> 2); |
168 | 0 | DEFINE_SMAP_INDEX |
169 | |
|
170 | 0 | #ifdef PACIFY_VALGRIND |
171 | 0 | byte *bend = bptr + left*spread; |
172 | 0 | byte vbits = 0; |
173 | | |
174 | | /* Allow for undefined bits at the end */ |
175 | 0 | VALGRIND_GET_VBITS(&psrc[left-1], &vbits, 1); |
176 | | /* At least the top 2 bits must be defined. If not, |
177 | | * don't change anything, and let valgrind complain. */ |
178 | 0 | if ((vbits & 0xC0) == 0) { |
179 | 0 | byte zero = 0; |
180 | 0 | VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1); |
181 | 0 | } |
182 | 0 | #endif |
183 | |
|
184 | 0 | if (spread == 1) { |
185 | 0 | bits16 *bufp = (bits16 *) bptr; |
186 | 0 | const bits16 *map = &ptab->lookup2x2to16[0]; |
187 | |
|
188 | 0 | while (left--) { |
189 | 0 | uint b = *psrc++; |
190 | |
|
191 | 0 | *bufp++ = map[b >> 4]; |
192 | 0 | NEXT_MAP; |
193 | 0 | *bufp++ = map[b & 0xf]; |
194 | 0 | NEXT_MAP; |
195 | 0 | } |
196 | 0 | } else { |
197 | 0 | byte *bufp = bptr; |
198 | 0 | const byte *map = &ptab->lookup8[0]; |
199 | |
|
200 | 0 | while (left--) { |
201 | 0 | unsigned b = *psrc++; |
202 | |
|
203 | 0 | *bufp = map[b >> 6]; |
204 | 0 | NEXT_MAP8; |
205 | 0 | bufp += spread; |
206 | 0 | *bufp = map[(b >> 4) & 3]; |
207 | 0 | NEXT_MAP8; |
208 | 0 | bufp += spread; |
209 | 0 | *bufp = map[(b >> 2) & 3]; |
210 | 0 | NEXT_MAP8; |
211 | 0 | bufp += spread; |
212 | 0 | *bufp = map[b & 3]; |
213 | 0 | NEXT_MAP8; |
214 | 0 | bufp += spread; |
215 | 0 | } |
216 | 0 | } |
217 | 0 | *pdata_x = data_x & 3; |
218 | 0 | #ifdef PACIFY_VALGRIND |
219 | | /* Put any undefinedness back, and carry it over to the output. */ |
220 | 0 | VALGRIND_SET_VBITS(psrc-1, &vbits, 1); |
221 | 0 | { |
222 | 0 | byte ones = 0xff; |
223 | 0 | if (vbits & 0x30) |
224 | 0 | VALGRIND_SET_VBITS(bend - spread*3, &ones, 1); |
225 | 0 | if (vbits & 0x0C) |
226 | 0 | VALGRIND_SET_VBITS(bend - spread*2, &ones, 1); |
227 | 0 | if (vbits & 0x03) |
228 | 0 | VALGRIND_SET_VBITS(bend - spread*1, &ones, 1); |
229 | 0 | } |
230 | 0 | #endif |
231 | 0 | return bptr; |
232 | 0 | } Unexecuted instantiation: sample_unpack_2 Unexecuted instantiation: sample_unpack_2_interleaved |
233 | | |
234 | | #undef NEXT_MAP |
235 | | |
236 | | const byte * |
237 | | TEMPLATE_sample_unpack_4(byte * bptr, int *pdata_x, const byte * data, int data_x, |
238 | | uint dsize, const sample_map *smap, int spread, |
239 | | int num_components_per_plane) |
240 | 340 | { |
241 | 340 | const sample_lookup_t * ptab = &smap->table; |
242 | 340 | byte *bufp = bptr; |
243 | 340 | const byte *psrc = data + (data_x >> 1); |
244 | 340 | int left = dsize - (data_x >> 1); |
245 | 340 | const byte *map = &ptab->lookup8[0]; |
246 | 340 | DEFINE_SMAP_INDEX |
247 | | |
248 | 340 | #ifdef PACIFY_VALGRIND |
249 | 340 | byte vbits = 0; |
250 | | |
251 | | /* Allow for undefined bits at the end */ |
252 | 340 | VALGRIND_GET_VBITS(&psrc[left-1], &vbits, 1); |
253 | | /* At least the top 4 bits must be defined. If not, |
254 | | * don't change anything, and let valgrind complain. */ |
255 | 340 | if ((vbits & 0xf0) == 0) { |
256 | 340 | byte zero = 0; |
257 | 340 | VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1); |
258 | 340 | } |
259 | 340 | #endif |
260 | | |
261 | 16.6k | while (left--) { |
262 | 16.3k | uint b = *psrc++; |
263 | | |
264 | 16.3k | *bufp = map[b >> 4]; |
265 | 16.3k | NEXT_MAP8; |
266 | 16.3k | bufp += spread; |
267 | 16.3k | *bufp = map[b & 0xf]; |
268 | 16.3k | NEXT_MAP8; |
269 | 16.3k | bufp += spread; |
270 | 16.3k | } |
271 | 340 | #ifdef PACIFY_VALGRIND |
272 | | /* Put any undefinedness back, and carry it over to the output. */ |
273 | 340 | VALGRIND_SET_VBITS(psrc-1, &vbits, 1); |
274 | 340 | if ((vbits & 0x0f) != 0) { |
275 | 0 | byte ones = 0xFF; |
276 | 0 | VALGRIND_SET_VBITS(bufp-spread, &ones, 1); |
277 | 0 | } |
278 | 340 | #endif |
279 | 340 | *pdata_x = data_x & 1; |
280 | 340 | return bptr; |
281 | 340 | } Line | Count | Source | 240 | 340 | { | 241 | 340 | const sample_lookup_t * ptab = &smap->table; | 242 | 340 | byte *bufp = bptr; | 243 | 340 | const byte *psrc = data + (data_x >> 1); | 244 | 340 | int left = dsize - (data_x >> 1); | 245 | 340 | const byte *map = &ptab->lookup8[0]; | 246 | 340 | DEFINE_SMAP_INDEX | 247 | | | 248 | 340 | #ifdef PACIFY_VALGRIND | 249 | 340 | byte vbits = 0; | 250 | | | 251 | | /* Allow for undefined bits at the end */ | 252 | 340 | VALGRIND_GET_VBITS(&psrc[left-1], &vbits, 1); | 253 | | /* At least the top 4 bits must be defined. If not, | 254 | | * don't change anything, and let valgrind complain. */ | 255 | 340 | if ((vbits & 0xf0) == 0) { | 256 | 340 | byte zero = 0; | 257 | 340 | VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1); | 258 | 340 | } | 259 | 340 | #endif | 260 | | | 261 | 16.6k | while (left--) { | 262 | 16.3k | uint b = *psrc++; | 263 | | | 264 | 16.3k | *bufp = map[b >> 4]; | 265 | 16.3k | NEXT_MAP8; | 266 | 16.3k | bufp += spread; | 267 | 16.3k | *bufp = map[b & 0xf]; | 268 | 16.3k | NEXT_MAP8; | 269 | 16.3k | bufp += spread; | 270 | 16.3k | } | 271 | 340 | #ifdef PACIFY_VALGRIND | 272 | | /* Put any undefinedness back, and carry it over to the output. */ | 273 | 340 | VALGRIND_SET_VBITS(psrc-1, &vbits, 1); | 274 | 340 | if ((vbits & 0x0f) != 0) { | 275 | 0 | byte ones = 0xFF; | 276 | 0 | VALGRIND_SET_VBITS(bufp-spread, &ones, 1); | 277 | 0 | } | 278 | 340 | #endif | 279 | 340 | *pdata_x = data_x & 1; | 280 | 340 | return bptr; | 281 | 340 | } |
Unexecuted instantiation: sample_unpack_4_interleaved |
282 | | |
283 | | const byte * |
284 | | TEMPLATE_sample_unpack_8(byte * bptr, int *pdata_x, const byte * data, int data_x, |
285 | | uint dsize, const sample_map *smap, int spread, |
286 | | int num_components_per_plane) |
287 | 257k | { |
288 | 257k | const sample_lookup_t * ptab = &smap->table; |
289 | 257k | byte *bufp = bptr; |
290 | 257k | const byte *psrc = data + data_x; |
291 | 257k | DEFINE_SMAP_INDEX |
292 | | |
293 | 257k | *pdata_x = 0; |
294 | 257k | if (spread == 1) { |
295 | 257k | if (MULTIPLE_MAPS || |
296 | 257k | ptab->lookup8[0] != 0 || |
297 | 257k | ptab->lookup8[255] != 255 |
298 | 257k | ) { |
299 | 6.40k | uint left = dsize - data_x; |
300 | 6.40k | const byte *map = &ptab->lookup8[0]; |
301 | | |
302 | 8.33M | while (left--) { |
303 | 8.33M | *bufp++ = map[*psrc++]; |
304 | 8.33M | NEXT_MAP8; |
305 | 8.33M | } |
306 | 251k | } else { /* No copying needed, and we'll use the data right away. */ |
307 | 251k | return psrc; |
308 | 251k | } |
309 | 257k | } else { |
310 | 0 | int left = dsize - data_x; |
311 | 0 | const byte *map = &ptab->lookup8[0]; |
312 | |
|
313 | 0 | for (; left--; psrc++, bufp += spread) { |
314 | 0 | *bufp = map[*psrc]; |
315 | 0 | NEXT_MAP8; |
316 | 0 | } |
317 | 0 | } |
318 | 6.40k | return bptr; |
319 | 257k | } Line | Count | Source | 287 | 257k | { | 288 | 257k | const sample_lookup_t * ptab = &smap->table; | 289 | 257k | byte *bufp = bptr; | 290 | 257k | const byte *psrc = data + data_x; | 291 | 257k | DEFINE_SMAP_INDEX | 292 | | | 293 | 257k | *pdata_x = 0; | 294 | 257k | if (spread == 1) { | 295 | 257k | if (MULTIPLE_MAPS || | 296 | 257k | ptab->lookup8[0] != 0 || | 297 | 257k | ptab->lookup8[255] != 255 | 298 | 257k | ) { | 299 | 6.40k | uint left = dsize - data_x; | 300 | 6.40k | const byte *map = &ptab->lookup8[0]; | 301 | | | 302 | 8.33M | while (left--) { | 303 | 8.33M | *bufp++ = map[*psrc++]; | 304 | 8.33M | NEXT_MAP8; | 305 | 8.33M | } | 306 | 251k | } else { /* No copying needed, and we'll use the data right away. */ | 307 | 251k | return psrc; | 308 | 251k | } | 309 | 257k | } else { | 310 | 0 | int left = dsize - data_x; | 311 | 0 | const byte *map = &ptab->lookup8[0]; | 312 | |
| 313 | 0 | for (; left--; psrc++, bufp += spread) { | 314 | 0 | *bufp = map[*psrc]; | 315 | 0 | NEXT_MAP8; | 316 | 0 | } | 317 | 0 | } | 318 | 6.40k | return bptr; | 319 | 257k | } |
Unexecuted instantiation: sample_unpack_8_interleaved |
320 | | |
321 | | #undef NEXT_MAP |
322 | | #undef NEXT_MAP8 |
323 | | #undef DEFINE_SMAP_INDEX |
324 | | |
325 | | #else |
326 | | int dummy; |
327 | | #endif |