Coverage Report

Created: 2025-11-16 07:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ghostpdl/base/gxsamplp.h
Line
Count
Source
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
3.40k
#   define NEXT_MAP map = smap[++smap_index % num_components_per_plane].table.lookup4x1to32
35
390k
#   define NEXT_MAP8 map = smap[++smap_index % num_components_per_plane].table.lookup8
36
1.28k
#   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
4.88M
{
48
4.88M
    const sample_lookup_t * ptab = &smap->table;
49
4.88M
    const byte *psrc = data + (data_x >> 3);
50
4.88M
    int left = dsize - (data_x >> 3);
51
4.88M
    DEFINE_SMAP_INDEX
52
53
4.88M
#ifdef PACIFY_VALGRIND
54
4.88M
    byte *bend = bptr + left*spread;
55
4.88M
    byte vbits = 0;
56
57
    /* Allow for undefined bits at the end */
58
4.88M
    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
4.88M
    if ((vbits & 0x80) == 0) {
62
4.88M
        byte zero = 0;
63
4.88M
        VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1);
64
4.88M
    }
65
4.88M
#endif
66
67
4.88M
    if (spread == 1) {
68
4.88M
        bits32 *bufp = (bits32 *) bptr;
69
4.88M
        const bits32 *map = &ptab->lookup4x1to32[0];
70
4.88M
        uint b;
71
72
4.88M
        if (left & 1) {
73
113k
            b = psrc[0];
74
113k
            bufp[0] = map[b >> 4];
75
113k
            NEXT_MAP;
76
113k
            bufp[1] = map[b & 0xf];
77
113k
            NEXT_MAP;
78
113k
            psrc++, bufp += 2;
79
113k
        }
80
4.88M
        left >>= 1;
81
29.0M
        while (left--) {
82
24.1M
            b = psrc[0];
83
24.1M
            bufp[0] = map[b >> 4];
84
24.1M
            NEXT_MAP;
85
24.1M
            bufp[1] = map[b & 0xf];
86
24.1M
            NEXT_MAP;
87
24.1M
            b = psrc[1];
88
24.1M
            bufp[2] = map[b >> 4];
89
24.1M
            NEXT_MAP;
90
24.1M
            bufp[3] = map[b & 0xf];
91
24.1M
            NEXT_MAP;
92
24.1M
            psrc += 2, bufp += 4;
93
24.1M
        }
94
4.88M
    } 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
4.88M
#ifdef PACIFY_VALGRIND
128
    /* Put any undefinedness back, and carry it over to the output. */
129
4.88M
    VALGRIND_SET_VBITS(psrc-1, &vbits, 1);
130
4.88M
    {
131
4.88M
        byte ones = 0xff;
132
4.88M
        if (vbits & 0x40)
133
4.88M
            VALGRIND_SET_VBITS(bend - spread*7, &ones, 1);
134
4.88M
        if (vbits & 0x20)
135
4.88M
            VALGRIND_SET_VBITS(bend - spread*6, &ones, 1);
136
4.88M
        if (vbits & 0x10)
137
4.88M
            VALGRIND_SET_VBITS(bend - spread*5, &ones, 1);
138
4.88M
        if (vbits & 0x08)
139
4.88M
            VALGRIND_SET_VBITS(bend - spread*4, &ones, 1);
140
4.88M
        if (vbits & 0x04)
141
4.88M
            VALGRIND_SET_VBITS(bend - spread*3, &ones, 1);
142
4.88M
        if (vbits & 0x02)
143
4.88M
            VALGRIND_SET_VBITS(bend - spread*2, &ones, 1);
144
4.88M
        if (vbits & 0x01)
145
4.88M
            VALGRIND_SET_VBITS(bend - spread*1, &ones, 1);
146
4.88M
    }
147
4.88M
#endif
148
4.88M
    *pdata_x = data_x & 7;
149
4.88M
    return bptr;
150
4.88M
}
sample_unpack_1
Line
Count
Source
47
4.88M
{
48
4.88M
    const sample_lookup_t * ptab = &smap->table;
49
4.88M
    const byte *psrc = data + (data_x >> 3);
50
4.88M
    int left = dsize - (data_x >> 3);
51
4.88M
    DEFINE_SMAP_INDEX
52
53
4.88M
#ifdef PACIFY_VALGRIND
54
4.88M
    byte *bend = bptr + left*spread;
55
4.88M
    byte vbits = 0;
56
57
    /* Allow for undefined bits at the end */
58
4.88M
    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
4.88M
    if ((vbits & 0x80) == 0) {
62
4.88M
        byte zero = 0;
63
4.88M
        VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1);
64
4.88M
    }
65
4.88M
#endif
66
67
4.88M
    if (spread == 1) {
68
4.88M
        bits32 *bufp = (bits32 *) bptr;
69
4.88M
        const bits32 *map = &ptab->lookup4x1to32[0];
70
4.88M
        uint b;
71
72
4.88M
        if (left & 1) {
73
113k
            b = psrc[0];
74
113k
            bufp[0] = map[b >> 4];
75
113k
            NEXT_MAP;
76
113k
            bufp[1] = map[b & 0xf];
77
113k
            NEXT_MAP;
78
113k
            psrc++, bufp += 2;
79
113k
        }
80
4.88M
        left >>= 1;
81
29.0M
        while (left--) {
82
24.1M
            b = psrc[0];
83
24.1M
            bufp[0] = map[b >> 4];
84
24.1M
            NEXT_MAP;
85
24.1M
            bufp[1] = map[b & 0xf];
86
24.1M
            NEXT_MAP;
87
24.1M
            b = psrc[1];
88
24.1M
            bufp[2] = map[b >> 4];
89
24.1M
            NEXT_MAP;
90
24.1M
            bufp[3] = map[b & 0xf];
91
24.1M
            NEXT_MAP;
92
24.1M
            psrc += 2, bufp += 4;
93
24.1M
        }
94
4.88M
    } 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
4.88M
#ifdef PACIFY_VALGRIND
128
    /* Put any undefinedness back, and carry it over to the output. */
129
4.88M
    VALGRIND_SET_VBITS(psrc-1, &vbits, 1);
130
4.88M
    {
131
4.88M
        byte ones = 0xff;
132
4.88M
        if (vbits & 0x40)
133
4.88M
            VALGRIND_SET_VBITS(bend - spread*7, &ones, 1);
134
4.88M
        if (vbits & 0x20)
135
4.88M
            VALGRIND_SET_VBITS(bend - spread*6, &ones, 1);
136
4.88M
        if (vbits & 0x10)
137
4.88M
            VALGRIND_SET_VBITS(bend - spread*5, &ones, 1);
138
4.88M
        if (vbits & 0x08)
139
4.88M
            VALGRIND_SET_VBITS(bend - spread*4, &ones, 1);
140
4.88M
        if (vbits & 0x04)
141
4.88M
            VALGRIND_SET_VBITS(bend - spread*3, &ones, 1);
142
4.88M
        if (vbits & 0x02)
143
4.88M
            VALGRIND_SET_VBITS(bend - spread*2, &ones, 1);
144
4.88M
        if (vbits & 0x01)
145
4.88M
            VALGRIND_SET_VBITS(bend - spread*1, &ones, 1);
146
4.88M
    }
147
4.88M
#endif
148
4.88M
    *pdata_x = data_x & 7;
149
4.88M
    return bptr;
150
4.88M
}
sample_unpack_1_interleaved
Line
Count
Source
47
261
{
48
261
    const sample_lookup_t * ptab = &smap->table;
49
261
    const byte *psrc = data + (data_x >> 3);
50
261
    int left = dsize - (data_x >> 3);
51
261
    DEFINE_SMAP_INDEX
52
53
261
#ifdef PACIFY_VALGRIND
54
261
    byte *bend = bptr + left*spread;
55
261
    byte vbits = 0;
56
57
    /* Allow for undefined bits at the end */
58
261
    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
261
    if ((vbits & 0x80) == 0) {
62
261
        byte zero = 0;
63
261
        VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1);
64
261
    }
65
261
#endif
66
67
261
    if (spread == 1) {
68
261
        bits32 *bufp = (bits32 *) bptr;
69
261
        const bits32 *map = &ptab->lookup4x1to32[0];
70
261
        uint b;
71
72
261
        if (left & 1) {
73
261
            b = psrc[0];
74
261
            bufp[0] = map[b >> 4];
75
261
            NEXT_MAP;
76
261
            bufp[1] = map[b & 0xf];
77
261
            NEXT_MAP;
78
261
            psrc++, bufp += 2;
79
261
        }
80
261
        left >>= 1;
81
982
        while (left--) {
82
721
            b = psrc[0];
83
721
            bufp[0] = map[b >> 4];
84
721
            NEXT_MAP;
85
721
            bufp[1] = map[b & 0xf];
86
721
            NEXT_MAP;
87
721
            b = psrc[1];
88
721
            bufp[2] = map[b >> 4];
89
721
            NEXT_MAP;
90
721
            bufp[3] = map[b & 0xf];
91
721
            NEXT_MAP;
92
721
            psrc += 2, bufp += 4;
93
721
        }
94
261
    } 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
261
#ifdef PACIFY_VALGRIND
128
    /* Put any undefinedness back, and carry it over to the output. */
129
261
    VALGRIND_SET_VBITS(psrc-1, &vbits, 1);
130
261
    {
131
261
        byte ones = 0xff;
132
261
        if (vbits & 0x40)
133
261
            VALGRIND_SET_VBITS(bend - spread*7, &ones, 1);
134
261
        if (vbits & 0x20)
135
261
            VALGRIND_SET_VBITS(bend - spread*6, &ones, 1);
136
261
        if (vbits & 0x10)
137
261
            VALGRIND_SET_VBITS(bend - spread*5, &ones, 1);
138
261
        if (vbits & 0x08)
139
261
            VALGRIND_SET_VBITS(bend - spread*4, &ones, 1);
140
261
        if (vbits & 0x04)
141
261
            VALGRIND_SET_VBITS(bend - spread*3, &ones, 1);
142
261
        if (vbits & 0x02)
143
261
            VALGRIND_SET_VBITS(bend - spread*2, &ones, 1);
144
261
        if (vbits & 0x01)
145
261
            VALGRIND_SET_VBITS(bend - spread*1, &ones, 1);
146
261
    }
147
261
#endif
148
261
    *pdata_x = data_x & 7;
149
261
    return bptr;
150
261
}
151
152
#undef NEXT_MAP
153
154
#if MULTIPLE_MAPS
155
48
#   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
8.13k
{
165
8.13k
    const sample_lookup_t * ptab = &smap->table;
166
8.13k
    const byte *psrc = data + (data_x >> 2);
167
8.13k
    int left = dsize - (data_x >> 2);
168
8.13k
    DEFINE_SMAP_INDEX
169
170
8.13k
#ifdef PACIFY_VALGRIND
171
8.13k
    byte *bend = bptr + left*spread;
172
8.13k
    byte vbits = 0;
173
174
    /* Allow for undefined bits at the end */
175
8.13k
    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
8.13k
    if ((vbits & 0xC0) == 0) {
179
8.13k
        byte zero = 0;
180
8.13k
        VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1);
181
8.13k
    }
182
8.13k
#endif
183
184
8.13k
    if (spread == 1) {
185
8.13k
        bits16 *bufp = (bits16 *) bptr;
186
8.13k
        const bits16 *map = &ptab->lookup2x2to16[0];
187
188
684k
        while (left--) {
189
676k
            uint b = *psrc++;
190
191
676k
            *bufp++ = map[b >> 4];
192
676k
            NEXT_MAP;
193
676k
            *bufp++ = map[b & 0xf];
194
676k
            NEXT_MAP;
195
676k
        }
196
8.13k
    } 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
8.13k
    *pdata_x = data_x & 3;
218
8.13k
#ifdef PACIFY_VALGRIND
219
    /* Put any undefinedness back, and carry it over to the output. */
220
8.13k
    VALGRIND_SET_VBITS(psrc-1, &vbits, 1);
221
8.13k
    {
222
8.13k
        byte ones = 0xff;
223
8.13k
        if (vbits & 0x30)
224
8.13k
            VALGRIND_SET_VBITS(bend - spread*3, &ones, 1);
225
8.13k
        if (vbits & 0x0C)
226
8.13k
            VALGRIND_SET_VBITS(bend - spread*2, &ones, 1);
227
8.13k
        if (vbits & 0x03)
228
8.13k
            VALGRIND_SET_VBITS(bend - spread*1, &ones, 1);
229
8.13k
    }
230
8.13k
#endif
231
8.13k
    return bptr;
232
8.13k
}
sample_unpack_2
Line
Count
Source
164
8.13k
{
165
8.13k
    const sample_lookup_t * ptab = &smap->table;
166
8.13k
    const byte *psrc = data + (data_x >> 2);
167
8.13k
    int left = dsize - (data_x >> 2);
168
8.13k
    DEFINE_SMAP_INDEX
169
170
8.13k
#ifdef PACIFY_VALGRIND
171
8.13k
    byte *bend = bptr + left*spread;
172
8.13k
    byte vbits = 0;
173
174
    /* Allow for undefined bits at the end */
175
8.13k
    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
8.13k
    if ((vbits & 0xC0) == 0) {
179
8.13k
        byte zero = 0;
180
8.13k
        VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1);
181
8.13k
    }
182
8.13k
#endif
183
184
8.13k
    if (spread == 1) {
185
8.13k
        bits16 *bufp = (bits16 *) bptr;
186
8.13k
        const bits16 *map = &ptab->lookup2x2to16[0];
187
188
684k
        while (left--) {
189
676k
            uint b = *psrc++;
190
191
676k
            *bufp++ = map[b >> 4];
192
676k
            NEXT_MAP;
193
676k
            *bufp++ = map[b & 0xf];
194
676k
            NEXT_MAP;
195
676k
        }
196
8.13k
    } 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
8.13k
    *pdata_x = data_x & 3;
218
8.13k
#ifdef PACIFY_VALGRIND
219
    /* Put any undefinedness back, and carry it over to the output. */
220
8.13k
    VALGRIND_SET_VBITS(psrc-1, &vbits, 1);
221
8.13k
    {
222
8.13k
        byte ones = 0xff;
223
8.13k
        if (vbits & 0x30)
224
8.13k
            VALGRIND_SET_VBITS(bend - spread*3, &ones, 1);
225
8.13k
        if (vbits & 0x0C)
226
8.13k
            VALGRIND_SET_VBITS(bend - spread*2, &ones, 1);
227
8.13k
        if (vbits & 0x03)
228
8.13k
            VALGRIND_SET_VBITS(bend - spread*1, &ones, 1);
229
8.13k
    }
230
8.13k
#endif
231
8.13k
    return bptr;
232
8.13k
}
sample_unpack_2_interleaved
Line
Count
Source
164
1
{
165
1
    const sample_lookup_t * ptab = &smap->table;
166
1
    const byte *psrc = data + (data_x >> 2);
167
1
    int left = dsize - (data_x >> 2);
168
1
    DEFINE_SMAP_INDEX
169
170
1
#ifdef PACIFY_VALGRIND
171
1
    byte *bend = bptr + left*spread;
172
1
    byte vbits = 0;
173
174
    /* Allow for undefined bits at the end */
175
1
    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
1
    if ((vbits & 0xC0) == 0) {
179
1
        byte zero = 0;
180
1
        VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1);
181
1
    }
182
1
#endif
183
184
1
    if (spread == 1) {
185
1
        bits16 *bufp = (bits16 *) bptr;
186
1
        const bits16 *map = &ptab->lookup2x2to16[0];
187
188
25
        while (left--) {
189
24
            uint b = *psrc++;
190
191
24
            *bufp++ = map[b >> 4];
192
24
            NEXT_MAP;
193
24
            *bufp++ = map[b & 0xf];
194
24
            NEXT_MAP;
195
24
        }
196
1
    } 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
1
    *pdata_x = data_x & 3;
218
1
#ifdef PACIFY_VALGRIND
219
    /* Put any undefinedness back, and carry it over to the output. */
220
1
    VALGRIND_SET_VBITS(psrc-1, &vbits, 1);
221
1
    {
222
1
        byte ones = 0xff;
223
1
        if (vbits & 0x30)
224
1
            VALGRIND_SET_VBITS(bend - spread*3, &ones, 1);
225
1
        if (vbits & 0x0C)
226
1
            VALGRIND_SET_VBITS(bend - spread*2, &ones, 1);
227
1
        if (vbits & 0x03)
228
1
            VALGRIND_SET_VBITS(bend - spread*1, &ones, 1);
229
1
    }
230
1
#endif
231
1
    return bptr;
232
1
}
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
23.7k
{
241
23.7k
    const sample_lookup_t * ptab = &smap->table;
242
23.7k
    byte *bufp = bptr;
243
23.7k
    const byte *psrc = data + (data_x >> 1);
244
23.7k
    int left = dsize - (data_x >> 1);
245
23.7k
    const byte *map = &ptab->lookup8[0];
246
23.7k
    DEFINE_SMAP_INDEX
247
248
23.7k
#ifdef PACIFY_VALGRIND
249
23.7k
    byte vbits = 0;
250
251
    /* Allow for undefined bits at the end */
252
23.7k
    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
23.7k
    if ((vbits & 0xf0) == 0) {
256
23.7k
        byte zero = 0;
257
23.7k
        VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1);
258
23.7k
    }
259
23.7k
#endif
260
261
3.94M
    while (left--) {
262
3.92M
        uint b = *psrc++;
263
264
3.92M
        *bufp = map[b >> 4];
265
3.92M
        NEXT_MAP8;
266
3.92M
        bufp += spread;
267
3.92M
        *bufp = map[b & 0xf];
268
3.92M
        NEXT_MAP8;
269
3.92M
        bufp += spread;
270
3.92M
    }
271
23.7k
#ifdef PACIFY_VALGRIND
272
    /* Put any undefinedness back, and carry it over to the output. */
273
23.7k
    VALGRIND_SET_VBITS(psrc-1, &vbits, 1);
274
23.7k
    if ((vbits & 0x0f) != 0) {
275
0
        byte ones = 0xFF;
276
0
        VALGRIND_SET_VBITS(bufp-spread, &ones, 1);
277
0
    }
278
23.7k
#endif
279
23.7k
    *pdata_x = data_x & 1;
280
23.7k
    return bptr;
281
23.7k
}
sample_unpack_4
Line
Count
Source
240
23.7k
{
241
23.7k
    const sample_lookup_t * ptab = &smap->table;
242
23.7k
    byte *bufp = bptr;
243
23.7k
    const byte *psrc = data + (data_x >> 1);
244
23.7k
    int left = dsize - (data_x >> 1);
245
23.7k
    const byte *map = &ptab->lookup8[0];
246
23.7k
    DEFINE_SMAP_INDEX
247
248
23.7k
#ifdef PACIFY_VALGRIND
249
23.7k
    byte vbits = 0;
250
251
    /* Allow for undefined bits at the end */
252
23.7k
    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
23.7k
    if ((vbits & 0xf0) == 0) {
256
23.7k
        byte zero = 0;
257
23.7k
        VALGRIND_SET_VBITS(&psrc[left-1], &zero, 1);
258
23.7k
    }
259
23.7k
#endif
260
261
3.94M
    while (left--) {
262
3.92M
        uint b = *psrc++;
263
264
3.92M
        *bufp = map[b >> 4];
265
3.92M
        NEXT_MAP8;
266
3.92M
        bufp += spread;
267
3.92M
        *bufp = map[b & 0xf];
268
3.92M
        NEXT_MAP8;
269
3.92M
        bufp += spread;
270
3.92M
    }
271
23.7k
#ifdef PACIFY_VALGRIND
272
    /* Put any undefinedness back, and carry it over to the output. */
273
23.7k
    VALGRIND_SET_VBITS(psrc-1, &vbits, 1);
274
23.7k
    if ((vbits & 0x0f) != 0) {
275
0
        byte ones = 0xFF;
276
0
        VALGRIND_SET_VBITS(bufp-spread, &ones, 1);
277
0
    }
278
23.7k
#endif
279
23.7k
    *pdata_x = data_x & 1;
280
23.7k
    return bptr;
281
23.7k
}
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
29.4M
{
288
29.4M
    const sample_lookup_t * ptab = &smap->table;
289
29.4M
    byte *bufp = bptr;
290
29.4M
    const byte *psrc = data + data_x;
291
29.4M
    DEFINE_SMAP_INDEX
292
293
29.4M
    *pdata_x = 0;
294
29.4M
    if (spread == 1) {
295
26.4M
        if (MULTIPLE_MAPS ||
296
26.4M
            ptab->lookup8[0] != 0 ||
297
26.4M
            ptab->lookup8[255] != 255
298
26.4M
            ) {
299
32.4k
            uint left = dsize - data_x;
300
32.4k
            const byte *map = &ptab->lookup8[0];
301
302
20.3M
            while (left--) {
303
20.2M
                *bufp++ = map[*psrc++];
304
20.2M
                NEXT_MAP8;
305
20.2M
            }
306
26.4M
        } else {   /* No copying needed, and we'll use the data right away. */
307
26.4M
            return psrc;
308
26.4M
        }
309
26.4M
    } else {
310
3.00M
        int left = dsize - data_x;
311
3.00M
        const byte *map = &ptab->lookup8[0];
312
313
2.94G
        for (; left--; psrc++, bufp += spread) {
314
2.94G
            *bufp = map[*psrc];
315
2.94G
            NEXT_MAP8;
316
2.94G
        }
317
3.00M
    }
318
3.03M
    return bptr;
319
29.4M
}
sample_unpack_8
Line
Count
Source
287
29.4M
{
288
29.4M
    const sample_lookup_t * ptab = &smap->table;
289
29.4M
    byte *bufp = bptr;
290
29.4M
    const byte *psrc = data + data_x;
291
29.4M
    DEFINE_SMAP_INDEX
292
293
29.4M
    *pdata_x = 0;
294
29.4M
    if (spread == 1) {
295
26.4M
        if (MULTIPLE_MAPS ||
296
26.4M
            ptab->lookup8[0] != 0 ||
297
26.4M
            ptab->lookup8[255] != 255
298
26.4M
            ) {
299
31.4k
            uint left = dsize - data_x;
300
31.4k
            const byte *map = &ptab->lookup8[0];
301
302
19.9M
            while (left--) {
303
19.8M
                *bufp++ = map[*psrc++];
304
19.8M
                NEXT_MAP8;
305
19.8M
            }
306
26.4M
        } else {   /* No copying needed, and we'll use the data right away. */
307
26.4M
            return psrc;
308
26.4M
        }
309
26.4M
    } else {
310
3.00M
        int left = dsize - data_x;
311
3.00M
        const byte *map = &ptab->lookup8[0];
312
313
2.94G
        for (; left--; psrc++, bufp += spread) {
314
2.94G
            *bufp = map[*psrc];
315
2.94G
            NEXT_MAP8;
316
2.94G
        }
317
3.00M
    }
318
3.03M
    return bptr;
319
29.4M
}
sample_unpack_8_interleaved
Line
Count
Source
287
1.01k
{
288
1.01k
    const sample_lookup_t * ptab = &smap->table;
289
1.01k
    byte *bufp = bptr;
290
1.01k
    const byte *psrc = data + data_x;
291
1.01k
    DEFINE_SMAP_INDEX
292
293
1.01k
    *pdata_x = 0;
294
1.01k
    if (spread == 1) {
295
1.01k
        if (MULTIPLE_MAPS ||
296
0
            ptab->lookup8[0] != 0 ||
297
0
            ptab->lookup8[255] != 255
298
1.01k
            ) {
299
1.01k
            uint left = dsize - data_x;
300
1.01k
            const byte *map = &ptab->lookup8[0];
301
302
391k
            while (left--) {
303
390k
                *bufp++ = map[*psrc++];
304
390k
                NEXT_MAP8;
305
390k
            }
306
1.01k
        } else {   /* No copying needed, and we'll use the data right away. */
307
0
            return psrc;
308
0
        }
309
1.01k
    } 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
1.01k
    return bptr;
319
1.01k
}
320
321
#undef NEXT_MAP
322
#undef NEXT_MAP8
323
#undef DEFINE_SMAP_INDEX
324
325
#else
326
int dummy;
327
#endif