1
/* Copyright (C) 2001-2006 Artifex Software, Inc.
4
This software is provided AS-IS with no warranty, either express or
7
This software is distributed under license and may not be copied, modified
8
or distributed except as expressly authorized under the terms of that
9
license. Refer to licensing information at http://www.artifex.com/
10
or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
11
San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
14
/* $Id: gxsamplp.h 8766 2008-05-21 19:46:43Z giles $ */
15
/* Templates for sample lookup and expansion */
17
/* This module is allowed to include several times into a single .c file.
18
The following macros to be defined in advance :
19
MULTIPLE_MAPS - 1 if num_components_per_plane > 0 and
20
components use different maps, 0 otherwise.
21
TEMPLATE_sample_unpack_1 - a name for the function
22
TEMPLATE_sample_unpack_2 - a name for the function
23
TEMPLATE_sample_unpack_4 - a name for the function
24
TEMPLATE_sample_unpack_8 - a name for the function
28
# define NEXT_MAP map = smap[++smap_index % num_components_per_plane].table.lookup4x1to32
29
# define NEXT_MAP8 map = smap[++smap_index % num_components_per_plane].table.lookup8
30
# define DEFINE_SMAP_INDEX int smap_index = 0;
34
# define DEFINE_SMAP_INDEX
38
TEMPLATE_sample_unpack_1(byte * bptr, int *pdata_x, const byte * data, int data_x,
39
uint dsize, const sample_map *smap, int spread,
40
int num_components_per_plane)
42
const sample_lookup_t * ptab = &smap->table;
43
const byte *psrc = data + (data_x >> 3);
44
int left = dsize - (data_x >> 3);
48
bits32 *bufp = (bits32 *) bptr;
49
const bits32 *map = &ptab->lookup4x1to32[0];
54
bufp[0] = map[b >> 4];
56
bufp[1] = map[b & 0xf];
63
bufp[0] = map[b >> 4];
65
bufp[1] = map[b & 0xf];
68
bufp[2] = map[b >> 4];
70
bufp[3] = map[b & 0xf];
76
const byte *map = &ptab->lookup8[0];
84
*bufp = map[(b >> 6) & 1];
87
*bufp = map[(b >> 5) & 1];
90
*bufp = map[(b >> 4) & 1];
93
*bufp = map[(b >> 3) & 1];
96
*bufp = map[(b >> 2) & 1];
99
*bufp = map[(b >> 1) & 1];
107
*pdata_x = data_x & 7;
114
# define NEXT_MAP map = smap[++smap_index % num_components_per_plane].table.lookup2x2to16
120
TEMPLATE_sample_unpack_2(byte * bptr, int *pdata_x, const byte * data, int data_x,
121
uint dsize, const sample_map *smap, int spread,
122
int num_components_per_plane)
124
const sample_lookup_t * ptab = &smap->table;
125
const byte *psrc = data + (data_x >> 2);
126
int left = dsize - (data_x >> 2);
130
bits16 *bufp = (bits16 *) bptr;
131
const bits16 *map = &ptab->lookup2x2to16[0];
136
*bufp++ = map[b >> 4];
138
*bufp++ = map[b & 0xf];
143
const byte *map = &ptab->lookup8[0];
146
unsigned b = *psrc++;
151
*bufp = map[(b >> 4) & 3];
154
*bufp = map[(b >> 2) & 3];
162
*pdata_x = data_x & 3;
169
TEMPLATE_sample_unpack_4(byte * bptr, int *pdata_x, const byte * data, int data_x,
170
uint dsize, const sample_map *smap, int spread,
171
int num_components_per_plane)
173
const sample_lookup_t * ptab = &smap->table;
175
const byte *psrc = data + (data_x >> 1);
176
int left = dsize - (data_x >> 1);
177
const byte *map = &ptab->lookup8[0];
186
*bufp = map[b & 0xf];
190
*pdata_x = data_x & 1;
195
TEMPLATE_sample_unpack_8(byte * bptr, int *pdata_x, const byte * data, int data_x,
196
uint dsize, const sample_map *smap, int spread,
197
int num_components_per_plane)
199
const sample_lookup_t * ptab = &smap->table;
201
const byte *psrc = data + data_x;
207
ptab->lookup8[0] != 0 ||
208
ptab->lookup8[255] != 255
210
uint left = dsize - data_x;
211
const byte *map = &ptab->lookup8[0];
214
*bufp++ = map[*psrc++];
217
} else { /* No copying needed, and we'll use the data right away. */
221
int left = dsize - data_x;
222
const byte *map = &ptab->lookup8[0];
224
for (; left--; psrc++, bufp += spread) {
234
#undef DEFINE_SMAP_INDEX