Coverage Report

Created: 2026-07-20 07:19

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libtiff/libtiff/tif_swab.c
Line
Count
Source
1
/*
2
 * Copyright (c) 1988-1997 Sam Leffler
3
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4
 *
5
 * Permission to use, copy, modify, distribute, and sell this software and
6
 * its documentation for any purpose is hereby granted without fee, provided
7
 * that (i) the above copyright notices and this permission notice appear in
8
 * all copies of the software and related documentation, and (ii) the names of
9
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
10
 * publicity relating to the software without the specific, prior written
11
 * permission of Sam Leffler and Silicon Graphics.
12
 *
13
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16
 *
17
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22
 * OF THIS SOFTWARE.
23
 */
24
25
/*
26
 * TIFF Library Bit & Byte Swapping Support.
27
 *
28
 * XXX We assume short = 16-bits and long = 32-bits XXX
29
 */
30
#include "tiffiop.h"
31
32
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabShort)
33
void TIFFSwabShort(uint16_t *wp)
34
4.22M
{
35
4.22M
    unsigned char *cp = (unsigned char *)wp;
36
4.22M
    unsigned char t;
37
4.22M
    assert(sizeof(uint16_t) == 2);
38
4.22M
    t = cp[1];
39
4.22M
    cp[1] = cp[0];
40
4.22M
    cp[0] = t;
41
4.22M
}
42
#endif
43
44
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong)
45
void TIFFSwabLong(uint32_t *lp)
46
2.47M
{
47
2.47M
    unsigned char *cp = (unsigned char *)lp;
48
2.47M
    unsigned char t;
49
2.47M
    assert(sizeof(uint32_t) == 4);
50
2.47M
    t = cp[3];
51
2.47M
    cp[3] = cp[0];
52
2.47M
    cp[0] = t;
53
2.47M
    t = cp[2];
54
2.47M
    cp[2] = cp[1];
55
2.47M
    cp[1] = t;
56
2.47M
}
57
#endif
58
59
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong8)
60
void TIFFSwabLong8(uint64_t *lp)
61
21.6k
{
62
21.6k
    unsigned char *cp = (unsigned char *)lp;
63
21.6k
    unsigned char t;
64
21.6k
    assert(sizeof(uint64_t) == 8);
65
21.6k
    t = cp[7];
66
21.6k
    cp[7] = cp[0];
67
21.6k
    cp[0] = t;
68
21.6k
    t = cp[6];
69
21.6k
    cp[6] = cp[1];
70
21.6k
    cp[1] = t;
71
21.6k
    t = cp[5];
72
21.6k
    cp[5] = cp[2];
73
21.6k
    cp[2] = t;
74
21.6k
    t = cp[4];
75
21.6k
    cp[4] = cp[3];
76
21.6k
    cp[3] = t;
77
21.6k
}
78
#endif
79
80
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfShort)
81
void TIFFSwabArrayOfShort(uint16_t *wp, tmsize_t n)
82
34.9k
{
83
34.9k
    unsigned char *cp;
84
34.9k
    unsigned char t;
85
34.9k
    assert(sizeof(uint16_t) == 2);
86
    /* XXX unroll loop some */
87
13.5M
    while (n-- > 0)
88
13.5M
    {
89
13.5M
        cp = (unsigned char *)wp;
90
13.5M
        t = cp[1];
91
13.5M
        cp[1] = cp[0];
92
13.5M
        cp[0] = t;
93
13.5M
        wp++;
94
13.5M
    }
95
34.9k
}
96
#endif
97
98
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfTriples)
99
void TIFFSwabArrayOfTriples(uint8_t *tp, tmsize_t n)
100
1.77k
{
101
1.77k
    unsigned char *cp;
102
1.77k
    unsigned char t;
103
104
    /* XXX unroll loop some */
105
74.9k
    while (n-- > 0)
106
73.1k
    {
107
73.1k
        cp = (unsigned char *)tp;
108
73.1k
        t = cp[2];
109
73.1k
        cp[2] = cp[0];
110
73.1k
        cp[0] = t;
111
73.1k
        tp += 3;
112
73.1k
    }
113
1.77k
}
114
#endif
115
116
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong)
117
void TIFFSwabArrayOfLong(uint32_t *lp, tmsize_t n)
118
38.6k
{
119
38.6k
    unsigned char *cp;
120
38.6k
    unsigned char t;
121
38.6k
    assert(sizeof(uint32_t) == 4);
122
    /* XXX unroll loop some */
123
343k
    while (n-- > 0)
124
304k
    {
125
304k
        cp = (unsigned char *)lp;
126
304k
        t = cp[3];
127
304k
        cp[3] = cp[0];
128
304k
        cp[0] = t;
129
304k
        t = cp[2];
130
304k
        cp[2] = cp[1];
131
304k
        cp[1] = t;
132
304k
        lp++;
133
304k
    }
134
38.6k
}
135
#endif
136
137
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong8)
138
void TIFFSwabArrayOfLong8(uint64_t *lp, tmsize_t n)
139
9.57k
{
140
9.57k
    unsigned char *cp;
141
9.57k
    unsigned char t;
142
9.57k
    assert(sizeof(uint64_t) == 8);
143
    /* XXX unroll loop some */
144
102k
    while (n-- > 0)
145
92.8k
    {
146
92.8k
        cp = (unsigned char *)lp;
147
92.8k
        t = cp[7];
148
92.8k
        cp[7] = cp[0];
149
92.8k
        cp[0] = t;
150
92.8k
        t = cp[6];
151
92.8k
        cp[6] = cp[1];
152
92.8k
        cp[1] = t;
153
92.8k
        t = cp[5];
154
92.8k
        cp[5] = cp[2];
155
92.8k
        cp[2] = t;
156
92.8k
        t = cp[4];
157
92.8k
        cp[4] = cp[3];
158
92.8k
        cp[3] = t;
159
92.8k
        lp++;
160
92.8k
    }
161
9.57k
}
162
#endif
163
164
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabFloat)
165
void TIFFSwabFloat(float *fp)
166
0
{
167
0
    unsigned char *cp = (unsigned char *)fp;
168
0
    unsigned char t;
169
0
    assert(sizeof(float) == 4);
170
0
    t = cp[3];
171
0
    cp[3] = cp[0];
172
0
    cp[0] = t;
173
0
    t = cp[2];
174
0
    cp[2] = cp[1];
175
0
    cp[1] = t;
176
0
}
177
#endif
178
179
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfFloat)
180
void TIFFSwabArrayOfFloat(float *fp, tmsize_t n)
181
0
{
182
0
    unsigned char *cp;
183
0
    unsigned char t;
184
0
    assert(sizeof(float) == 4);
185
    /* XXX unroll loop some */
186
0
    while (n-- > 0)
187
0
    {
188
0
        cp = (unsigned char *)fp;
189
0
        t = cp[3];
190
0
        cp[3] = cp[0];
191
0
        cp[0] = t;
192
0
        t = cp[2];
193
0
        cp[2] = cp[1];
194
0
        cp[1] = t;
195
0
        fp++;
196
0
    }
197
0
}
198
#endif
199
200
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabDouble)
201
void TIFFSwabDouble(double *dp)
202
0
{
203
0
    unsigned char *cp = (unsigned char *)dp;
204
0
    unsigned char t;
205
0
    assert(sizeof(double) == 8);
206
0
    t = cp[7];
207
0
    cp[7] = cp[0];
208
0
    cp[0] = t;
209
0
    t = cp[6];
210
0
    cp[6] = cp[1];
211
0
    cp[1] = t;
212
0
    t = cp[5];
213
0
    cp[5] = cp[2];
214
0
    cp[2] = t;
215
0
    t = cp[4];
216
0
    cp[4] = cp[3];
217
0
    cp[3] = t;
218
0
}
219
#endif
220
221
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfDouble)
222
void TIFFSwabArrayOfDouble(double *dp, tmsize_t n)
223
1.13k
{
224
1.13k
    unsigned char *cp;
225
1.13k
    unsigned char t;
226
1.13k
    assert(sizeof(double) == 8);
227
    /* XXX unroll loop some */
228
20.4k
    while (n-- > 0)
229
19.3k
    {
230
19.3k
        cp = (unsigned char *)dp;
231
19.3k
        t = cp[7];
232
19.3k
        cp[7] = cp[0];
233
19.3k
        cp[0] = t;
234
19.3k
        t = cp[6];
235
19.3k
        cp[6] = cp[1];
236
19.3k
        cp[1] = t;
237
19.3k
        t = cp[5];
238
19.3k
        cp[5] = cp[2];
239
19.3k
        cp[2] = t;
240
19.3k
        t = cp[4];
241
19.3k
        cp[4] = cp[3];
242
19.3k
        cp[3] = t;
243
19.3k
        dp++;
244
19.3k
    }
245
1.13k
}
246
#endif
247
248
/*
249
 * Bit reversal tables.  TIFFBitRevTable[<byte>] gives
250
 * the bit reversed value of <byte>.  Used in various
251
 * places in the library when the FillOrder requires
252
 * bit reversal of byte values (e.g. CCITT Fax 3
253
 * encoding/decoding).  TIFFNoBitRevTable is provided
254
 * for algorithms that want an equivalent table that
255
 * do not reverse bit values.
256
 */
257
static const unsigned char TIFFBitRevTable[256] = {
258
    0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0,
259
    0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
260
    0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4,
261
    0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
262
    0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc,
263
    0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
264
    0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca,
265
    0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
266
    0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6,
267
    0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
268
    0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1,
269
    0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
270
    0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9,
271
    0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
272
    0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd,
273
    0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
274
    0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3,
275
    0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
276
    0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7,
277
    0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
278
    0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf,
279
    0x3f, 0xbf, 0x7f, 0xff};
280
static const unsigned char TIFFNoBitRevTable[256] = {
281
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
282
    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
283
    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
284
    0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
285
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
286
    0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
287
    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
288
    0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
289
    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
290
    0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
291
    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
292
    0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
293
    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
294
    0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
295
    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
296
    0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
297
    0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
298
    0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
299
    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
300
    0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
301
    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
302
    0xfc, 0xfd, 0xfe, 0xff,
303
};
304
305
const unsigned char *TIFFGetBitRevTable(int reversed)
306
143k
{
307
143k
    return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
308
143k
}
309
310
void TIFFReverseBits(uint8_t *cp, tmsize_t n)
311
2.73k
{
312
25.2k
    for (; n > 8; n -= 8)
313
22.4k
    {
314
22.4k
        cp[0] = TIFFBitRevTable[cp[0]];
315
22.4k
        cp[1] = TIFFBitRevTable[cp[1]];
316
22.4k
        cp[2] = TIFFBitRevTable[cp[2]];
317
22.4k
        cp[3] = TIFFBitRevTable[cp[3]];
318
22.4k
        cp[4] = TIFFBitRevTable[cp[4]];
319
22.4k
        cp[5] = TIFFBitRevTable[cp[5]];
320
22.4k
        cp[6] = TIFFBitRevTable[cp[6]];
321
22.4k
        cp[7] = TIFFBitRevTable[cp[7]];
322
22.4k
        cp += 8;
323
22.4k
    }
324
16.9k
    while (n-- > 0)
325
14.1k
    {
326
14.1k
        *cp = TIFFBitRevTable[*cp];
327
14.1k
        cp++;
328
14.1k
    }
329
2.73k
}