Coverage Report

Created: 2026-08-14 09:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/frmts/gtiff/libtiff/tif_predict.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.
27
 *
28
 * Predictor Tag Support (used by multiple codecs).
29
 */
30
#include "tif_predict.h"
31
#include "tiffiop.h"
32
33
#if defined(__x86_64__) || (defined(_M_X64) && !defined(_M_ARM64EC))
34
#include <emmintrin.h>
35
#endif
36
37
1.67M
#define PredictorState(tif) ((TIFFPredictorState *)(tif)->tif_data)
38
39
static int horAcc8(TIFF *tif, uint8_t *cp0, tmsize_t cc);
40
static int horAcc16(TIFF *tif, uint8_t *cp0, tmsize_t cc);
41
static int horAcc32(TIFF *tif, uint8_t *cp0, tmsize_t cc);
42
static int horAcc64(TIFF *tif, uint8_t *cp0, tmsize_t cc);
43
static int swabHorAcc16(TIFF *tif, uint8_t *cp0, tmsize_t cc);
44
static int swabHorAcc32(TIFF *tif, uint8_t *cp0, tmsize_t cc);
45
static int swabHorAcc64(TIFF *tif, uint8_t *cp0, tmsize_t cc);
46
static int horDiff8(TIFF *tif, uint8_t *cp0, tmsize_t cc);
47
static int horDiff16(TIFF *tif, uint8_t *cp0, tmsize_t cc);
48
static int horDiff32(TIFF *tif, uint8_t *cp0, tmsize_t cc);
49
static int horDiff64(TIFF *tif, uint8_t *cp0, tmsize_t cc);
50
static int swabHorDiff16(TIFF *tif, uint8_t *cp0, tmsize_t cc);
51
static int swabHorDiff32(TIFF *tif, uint8_t *cp0, tmsize_t cc);
52
static int swabHorDiff64(TIFF *tif, uint8_t *cp0, tmsize_t cc);
53
static int fpAcc(TIFF *tif, uint8_t *cp0, tmsize_t cc);
54
static int fpDiff(TIFF *tif, uint8_t *cp0, tmsize_t cc);
55
static int PredictorDecodeRow(TIFF *tif, uint8_t *op0, tmsize_t occ0,
56
                              uint16_t s);
57
static int PredictorDecodeTile(TIFF *tif, uint8_t *op0, tmsize_t occ0,
58
                               uint16_t s);
59
static int PredictorEncodeRow(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
60
static int PredictorEncodeTile(TIFF *tif, uint8_t *bp0, tmsize_t cc0,
61
                               uint16_t s);
62
63
static int PredictorSetup(TIFF *tif)
64
3.70k
{
65
3.70k
    static const char module[] = "PredictorSetup";
66
67
3.70k
    TIFFPredictorState *sp = PredictorState(tif);
68
3.70k
    TIFFDirectory *td = &tif->tif_dir;
69
70
3.70k
    switch (sp->predictor) /* no differencing */
71
3.70k
    {
72
2.31k
        case PREDICTOR_NONE:
73
2.31k
            return 1;
74
969
        case PREDICTOR_HORIZONTAL:
75
969
            if (td->td_bitspersample != 8 && td->td_bitspersample != 16 &&
76
427
                td->td_bitspersample != 32 && td->td_bitspersample != 64)
77
143
            {
78
143
                TIFFErrorExtR(tif, module,
79
143
                              "Horizontal differencing \"Predictor\" not "
80
143
                              "supported with %" PRIu16 "-bit samples",
81
143
                              td->td_bitspersample);
82
143
                return 0;
83
143
            }
84
826
            break;
85
826
        case PREDICTOR_FLOATINGPOINT:
86
217
            if (td->td_sampleformat != SAMPLEFORMAT_IEEEFP)
87
85
            {
88
85
                TIFFErrorExtR(
89
85
                    tif, module,
90
85
                    "Floating point \"Predictor\" not supported with %" PRIu16
91
85
                    " data format",
92
85
                    td->td_sampleformat);
93
85
                return 0;
94
85
            }
95
132
            if (td->td_bitspersample != 16 && td->td_bitspersample != 24 &&
96
47
                td->td_bitspersample != 32 && td->td_bitspersample != 64)
97
0
            { /* Should 64 be allowed? */
98
0
                TIFFErrorExtR(
99
0
                    tif, module,
100
0
                    "Floating point \"Predictor\" not supported with %" PRIu16
101
0
                    "-bit samples",
102
0
                    td->td_bitspersample);
103
0
                return 0;
104
0
            }
105
132
            break;
106
204
        default:
107
204
            TIFFErrorExtR(tif, module, "\"Predictor\" value %d not supported",
108
204
                          sp->predictor);
109
204
            return 0;
110
3.70k
    }
111
958
    sp->stride =
112
958
        (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel
113
958
                                                    : 1);
114
    /*
115
     * Calculate the scanline/tile-width size in bytes.
116
     */
117
958
    if (isTiled(tif))
118
314
        sp->rowsize = TIFFTileRowSize(tif);
119
644
    else
120
644
        sp->rowsize = TIFFScanlineSize(tif);
121
958
    if (sp->rowsize == 0)
122
0
        return 0;
123
124
958
    return 1;
125
958
}
126
127
static int PredictorSetupDecode(TIFF *tif)
128
3.96k
{
129
3.96k
    TIFFPredictorState *sp = PredictorState(tif);
130
3.96k
    TIFFDirectory *td = &tif->tif_dir;
131
132
    /* Note: when PredictorSetup() fails, the effets of setupdecode() */
133
    /* will not be "canceled" so setupdecode() might be robust to */
134
    /* be called several times. */
135
3.96k
    if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif))
136
894
        return 0;
137
138
3.06k
    if (sp->predictor == 2)
139
826
    {
140
826
        switch (td->td_bitspersample)
141
826
        {
142
386
            case 8:
143
386
                sp->decodepfunc = horAcc8;
144
386
                break;
145
156
            case 16:
146
156
                sp->decodepfunc = horAcc16;
147
156
                break;
148
167
            case 32:
149
167
                sp->decodepfunc = horAcc32;
150
167
                break;
151
117
            case 64:
152
117
                sp->decodepfunc = horAcc64;
153
117
                break;
154
0
            default:
155
0
                break;
156
826
        }
157
        /*
158
         * Override default decoding method with one that does the
159
         * predictor stuff.
160
         */
161
826
        if (tif->tif_decoderow != PredictorDecodeRow)
162
826
        {
163
826
            sp->decoderow = tif->tif_decoderow;
164
826
            tif->tif_decoderow = PredictorDecodeRow;
165
826
            sp->decodestrip = tif->tif_decodestrip;
166
826
            tif->tif_decodestrip = PredictorDecodeTile;
167
826
            sp->decodetile = tif->tif_decodetile;
168
826
            tif->tif_decodetile = PredictorDecodeTile;
169
826
        }
170
171
        /*
172
         * If the data is horizontally differenced 16-bit data that
173
         * requires byte-swapping, then it must be byte swapped before
174
         * the accumulation step.  We do this with a special-purpose
175
         * routine and override the normal post decoding logic that
176
         * the library setup when the directory was read.
177
         */
178
826
        if (tif->tif_flags & TIFF_SWAB)
179
26
        {
180
26
            if (sp->decodepfunc == horAcc16)
181
9
            {
182
9
                sp->decodepfunc = swabHorAcc16;
183
9
                tif->tif_postdecode = _TIFFNoPostDecode;
184
9
            }
185
17
            else if (sp->decodepfunc == horAcc32)
186
4
            {
187
4
                sp->decodepfunc = swabHorAcc32;
188
4
                tif->tif_postdecode = _TIFFNoPostDecode;
189
4
            }
190
13
            else if (sp->decodepfunc == horAcc64)
191
6
            {
192
6
                sp->decodepfunc = swabHorAcc64;
193
6
                tif->tif_postdecode = _TIFFNoPostDecode;
194
6
            }
195
26
        }
196
826
    }
197
198
2.24k
    else if (sp->predictor == 3)
199
132
    {
200
132
        sp->decodepfunc = fpAcc;
201
        /*
202
         * Override default decoding method with one that does the
203
         * predictor stuff.
204
         */
205
132
        if (tif->tif_decoderow != PredictorDecodeRow)
206
132
        {
207
132
            sp->decoderow = tif->tif_decoderow;
208
132
            tif->tif_decoderow = PredictorDecodeRow;
209
132
            sp->decodestrip = tif->tif_decodestrip;
210
132
            tif->tif_decodestrip = PredictorDecodeTile;
211
132
            sp->decodetile = tif->tif_decodetile;
212
132
            tif->tif_decodetile = PredictorDecodeTile;
213
132
        }
214
        /*
215
         * The data should not be swapped outside of the floating
216
         * point predictor, the accumulation routine should return
217
         * bytes in the native order.
218
         */
219
132
        if (tif->tif_flags & TIFF_SWAB)
220
5
        {
221
5
            tif->tif_postdecode = _TIFFNoPostDecode;
222
5
        }
223
132
    }
224
225
3.06k
    return 1;
226
3.06k
}
227
228
static int PredictorSetupEncode(TIFF *tif)
229
203
{
230
203
    TIFFPredictorState *sp = PredictorState(tif);
231
203
    TIFFDirectory *td = &tif->tif_dir;
232
233
203
    if (!(*sp->setupencode)(tif) || !PredictorSetup(tif))
234
0
        return 0;
235
236
203
    if (sp->predictor == 2)
237
0
    {
238
0
        switch (td->td_bitspersample)
239
0
        {
240
0
            case 8:
241
0
                sp->encodepfunc = horDiff8;
242
0
                break;
243
0
            case 16:
244
0
                sp->encodepfunc = horDiff16;
245
0
                break;
246
0
            case 32:
247
0
                sp->encodepfunc = horDiff32;
248
0
                break;
249
0
            case 64:
250
0
                sp->encodepfunc = horDiff64;
251
0
                break;
252
0
            default:
253
0
                break;
254
0
        }
255
        /*
256
         * Override default encoding method with one that does the
257
         * predictor stuff.
258
         */
259
0
        if (tif->tif_encoderow != PredictorEncodeRow)
260
0
        {
261
0
            sp->encoderow = tif->tif_encoderow;
262
0
            tif->tif_encoderow = PredictorEncodeRow;
263
0
            sp->encodestrip = tif->tif_encodestrip;
264
0
            tif->tif_encodestrip = PredictorEncodeTile;
265
0
            sp->encodetile = tif->tif_encodetile;
266
0
            tif->tif_encodetile = PredictorEncodeTile;
267
0
        }
268
269
        /*
270
         * If the data is horizontally differenced 16-bit data that
271
         * requires byte-swapping, then it must be byte swapped after
272
         * the differentiation step.  We do this with a special-purpose
273
         * routine and override the normal post decoding logic that
274
         * the library setup when the directory was read.
275
         */
276
0
        if (tif->tif_flags & TIFF_SWAB)
277
0
        {
278
0
            if (sp->encodepfunc == horDiff16)
279
0
            {
280
0
                sp->encodepfunc = swabHorDiff16;
281
0
                tif->tif_postdecode = _TIFFNoPostDecode;
282
0
            }
283
0
            else if (sp->encodepfunc == horDiff32)
284
0
            {
285
0
                sp->encodepfunc = swabHorDiff32;
286
0
                tif->tif_postdecode = _TIFFNoPostDecode;
287
0
            }
288
0
            else if (sp->encodepfunc == horDiff64)
289
0
            {
290
0
                sp->encodepfunc = swabHorDiff64;
291
0
                tif->tif_postdecode = _TIFFNoPostDecode;
292
0
            }
293
0
        }
294
0
    }
295
296
203
    else if (sp->predictor == 3)
297
0
    {
298
0
        sp->encodepfunc = fpDiff;
299
        /*
300
         * Override default encoding method with one that does the
301
         * predictor stuff.
302
         */
303
0
        if (tif->tif_encoderow != PredictorEncodeRow)
304
0
        {
305
0
            sp->encoderow = tif->tif_encoderow;
306
0
            tif->tif_encoderow = PredictorEncodeRow;
307
0
            sp->encodestrip = tif->tif_encodestrip;
308
0
            tif->tif_encodestrip = PredictorEncodeTile;
309
0
            sp->encodetile = tif->tif_encodetile;
310
0
            tif->tif_encodetile = PredictorEncodeTile;
311
0
        }
312
        /*
313
         * The data should not be swapped outside of the floating
314
         * point predictor, the differentiation routine should return
315
         * bytes in the native order.
316
         */
317
0
        if (tif->tif_flags & TIFF_SWAB)
318
0
        {
319
0
            tif->tif_postdecode = _TIFFNoPostDecode;
320
0
        }
321
0
    }
322
323
203
    return 1;
324
203
}
325
326
#define REPEAT4(n, op)                                                         \
327
2.00M
    switch (n)                                                                 \
328
2.00M
    {                                                                          \
329
1.35M
        default:                                                               \
330
1.35M
        {                                                                      \
331
1.35M
            tmsize_t i;                                                        \
332
4.27M
            for (i = n - 4; i > 0; i--)                                        \
333
2.91M
            {                                                                  \
334
2.91M
                op;                                                            \
335
2.91M
            }                                                                  \
336
1.35M
        } /*-fallthrough*/                                                     \
337
1.45M
        case 4:                                                                \
338
1.45M
            op; /*-fallthrough*/                                               \
339
1.47M
        case 3:                                                                \
340
1.47M
            op; /*-fallthrough*/                                               \
341
1.99M
        case 2:                                                                \
342
1.99M
            op; /*-fallthrough*/                                               \
343
2.00M
        case 1:                                                                \
344
2.00M
            op; /*-fallthrough*/                                               \
345
2.00M
        case 0:;                                                               \
346
2.00M
    }
347
348
/* Remarks related to C standard compliance in all below functions : */
349
/* - to avoid any undefined behavior, we only operate on unsigned types */
350
/*   since the behavior of "overflows" is defined (wrap over) */
351
/* - when storing into the byte stream, we explicitly mask with 0xff so */
352
/*   as to make icc -check=conversions happy (not necessary by the standard) */
353
354
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
355
static int horAcc8(TIFF *tif, uint8_t *cp0, tmsize_t cc)
356
33.6k
{
357
33.6k
    tmsize_t stride = PredictorState(tif)->stride;
358
359
33.6k
    uint8_t *cp = cp0;
360
33.6k
    if ((cc % stride) != 0)
361
9
    {
362
9
        TIFFErrorExtR(tif, "horAcc8", "%s", "(cc%stride)!=0");
363
9
        return 0;
364
9
    }
365
366
33.6k
    if (cc > stride)
367
33.0k
    {
368
        /*
369
         * Pipeline the most common cases.
370
         */
371
33.0k
        if (stride == 1)
372
8.39k
        {
373
8.39k
            uint32_t acc = cp[0];
374
8.39k
            tmsize_t i = stride;
375
551k
            for (; i < cc - 3; i += 4)
376
542k
            {
377
542k
                cp[i + 0] = (uint8_t)((acc += cp[i + 0]) & 0xff);
378
542k
                cp[i + 1] = (uint8_t)((acc += cp[i + 1]) & 0xff);
379
542k
                cp[i + 2] = (uint8_t)((acc += cp[i + 2]) & 0xff);
380
542k
                cp[i + 3] = (uint8_t)((acc += cp[i + 3]) & 0xff);
381
542k
            }
382
17.6k
            for (; i < cc; i++)
383
9.30k
            {
384
9.30k
                cp[i + 0] = (uint8_t)((acc += cp[i + 0]) & 0xff);
385
9.30k
            }
386
8.39k
        }
387
24.6k
        else if (stride == 3)
388
1.98k
        {
389
1.98k
            uint32_t cr = cp[0];
390
1.98k
            uint32_t cg = cp[1];
391
1.98k
            uint32_t cb = cp[2];
392
1.98k
            tmsize_t i = stride;
393
305k
            for (; i < cc; i += stride)
394
303k
            {
395
303k
                cp[i + 0] = (uint8_t)((cr += cp[i + 0]) & 0xff);
396
303k
                cp[i + 1] = (uint8_t)((cg += cp[i + 1]) & 0xff);
397
303k
                cp[i + 2] = (uint8_t)((cb += cp[i + 2]) & 0xff);
398
303k
            }
399
1.98k
        }
400
22.6k
        else if (stride == 4)
401
8.88k
        {
402
8.88k
            uint32_t cr = cp[0];
403
8.88k
            uint32_t cg = cp[1];
404
8.88k
            uint32_t cb = cp[2];
405
8.88k
            uint32_t ca = cp[3];
406
8.88k
            tmsize_t i = stride;
407
650k
            for (; i < cc; i += stride)
408
641k
            {
409
641k
                cp[i + 0] = (uint8_t)((cr += cp[i + 0]) & 0xff);
410
641k
                cp[i + 1] = (uint8_t)((cg += cp[i + 1]) & 0xff);
411
641k
                cp[i + 2] = (uint8_t)((cb += cp[i + 2]) & 0xff);
412
641k
                cp[i + 3] = (uint8_t)((ca += cp[i + 3]) & 0xff);
413
641k
            }
414
8.88k
        }
415
13.7k
        else
416
13.7k
        {
417
13.7k
            cc -= stride;
418
13.7k
            do
419
1.64M
            {
420
1.64M
                REPEAT4(stride,
421
1.64M
                        cp[stride] = (uint8_t)((cp[stride] + *cp) & 0xff);
422
1.64M
                        cp++)
423
1.64M
                cc -= stride;
424
1.64M
            } while (cc > 0);
425
13.7k
        }
426
33.0k
    }
427
33.6k
    return 1;
428
33.6k
}
429
430
static int swabHorAcc16(TIFF *tif, uint8_t *cp0, tmsize_t cc)
431
139
{
432
139
    uint16_t *wp = (uint16_t *)cp0;
433
139
    tmsize_t wc = cc / 2;
434
435
139
    TIFFSwabArrayOfShort(wp, wc);
436
139
    return horAcc16(tif, cp0, cc);
437
139
}
438
439
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
440
static int horAcc16(TIFF *tif, uint8_t *cp0, tmsize_t cc)
441
1.99k
{
442
1.99k
    tmsize_t stride = PredictorState(tif)->stride;
443
1.99k
    uint16_t *wp = (uint16_t *)cp0;
444
1.99k
    tmsize_t wc = cc / 2;
445
446
1.99k
    if ((cc % (2 * stride)) != 0)
447
0
    {
448
0
        TIFFErrorExtR(tif, "horAcc16", "%s", "cc%(2*stride))!=0");
449
0
        return 0;
450
0
    }
451
452
1.99k
    if (wc > stride)
453
1.76k
    {
454
1.76k
        wc -= stride;
455
1.76k
        do
456
182k
        {
457
182k
            REPEAT4(stride, wp[stride] = (uint16_t)(((unsigned int)wp[stride] +
458
182k
                                                     (unsigned int)wp[0]) &
459
182k
                                                    0xffff);
460
182k
                    wp++)
461
182k
            wc -= stride;
462
182k
        } while (wc > 0);
463
1.76k
    }
464
1.99k
    return 1;
465
1.99k
}
466
467
static int swabHorAcc32(TIFF *tif, uint8_t *cp0, tmsize_t cc)
468
3
{
469
3
    uint32_t *wp = (uint32_t *)cp0;
470
3
    tmsize_t wc = cc / 4;
471
472
3
    TIFFSwabArrayOfLong(wp, wc);
473
3
    return horAcc32(tif, cp0, cc);
474
3
}
475
476
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
477
static int horAcc32(TIFF *tif, uint8_t *cp0, tmsize_t cc)
478
2.06k
{
479
2.06k
    tmsize_t stride = PredictorState(tif)->stride;
480
2.06k
    uint32_t *wp = (uint32_t *)cp0;
481
2.06k
    tmsize_t wc = cc / 4;
482
483
2.06k
    if ((cc % (4 * stride)) != 0)
484
0
    {
485
0
        TIFFErrorExtR(tif, "horAcc32", "%s", "cc%(4*stride))!=0");
486
0
        return 0;
487
0
    }
488
489
2.06k
    if (wc > stride)
490
1.69k
    {
491
1.69k
        wc -= stride;
492
1.69k
        do
493
87.3k
        {
494
87.3k
            REPEAT4(stride, wp[stride] += wp[0]; wp++)
495
87.3k
            wc -= stride;
496
87.3k
        } while (wc > 0);
497
1.69k
    }
498
2.06k
    return 1;
499
2.06k
}
500
501
static int swabHorAcc64(TIFF *tif, uint8_t *cp0, tmsize_t cc)
502
32
{
503
32
    uint64_t *wp = (uint64_t *)cp0;
504
32
    tmsize_t wc = cc / 8;
505
506
32
    TIFFSwabArrayOfLong8(wp, wc);
507
32
    return horAcc64(tif, cp0, cc);
508
32
}
509
510
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
511
static int horAcc64(TIFF *tif, uint8_t *cp0, tmsize_t cc)
512
1.33k
{
513
1.33k
    tmsize_t stride = PredictorState(tif)->stride;
514
1.33k
    uint64_t *wp = (uint64_t *)cp0;
515
1.33k
    tmsize_t wc = cc / 8;
516
517
1.33k
    if ((cc % (8 * stride)) != 0)
518
0
    {
519
0
        TIFFErrorExtR(tif, "horAcc64", "%s", "cc%(8*stride))!=0");
520
0
        return 0;
521
0
    }
522
523
1.33k
    if (wc > stride)
524
758
    {
525
758
        wc -= stride;
526
758
        do
527
82.9k
        {
528
82.9k
            REPEAT4(stride, wp[stride] += wp[0]; wp++)
529
82.9k
            wc -= stride;
530
82.9k
        } while (wc > 0);
531
758
    }
532
1.33k
    return 1;
533
1.33k
}
534
535
/*
536
 * Floating point predictor accumulation routine.
537
 */
538
static int fpAcc(TIFF *tif, uint8_t *cp0, tmsize_t cc)
539
651
{
540
651
    tmsize_t stride = PredictorState(tif)->stride;
541
651
    uint32_t bps = tif->tif_dir.td_bitspersample / 8;
542
651
    tmsize_t wc = cc / bps;
543
651
    tmsize_t count = cc;
544
651
    uint8_t *cp = cp0;
545
651
    uint8_t *tmp;
546
547
651
    if (cc % (bps * stride) != 0)
548
0
    {
549
0
        TIFFErrorExtR(tif, "fpAcc", "%s", "cc%(bps*stride))!=0");
550
0
        return 0;
551
0
    }
552
553
651
    tmp = (uint8_t *)_TIFFmallocExt(tif, cc);
554
651
    if (!tmp)
555
0
        return 0;
556
557
651
    if (stride == 1)
558
433
    {
559
        /* Optimization of general case */
560
433
#define OP                                                                     \
561
3.56k
    do                                                                         \
562
3.56k
    {                                                                          \
563
3.56k
        cp[1] = (uint8_t)((cp[1] + cp[0]) & 0xff);                             \
564
3.56k
        ++cp;                                                                  \
565
3.56k
    } while (0)
566
715
        for (; count > 8; count -= 8)
567
282
        {
568
282
            OP;
569
282
            OP;
570
282
            OP;
571
282
            OP;
572
282
            OP;
573
282
            OP;
574
282
            OP;
575
282
            OP;
576
282
        }
577
1.73k
        for (; count > 1; count -= 1)
578
1.30k
        {
579
1.30k
            OP;
580
1.30k
        }
581
433
#undef OP
582
433
    }
583
218
    else
584
218
    {
585
1.03k
        while (count > stride)
586
814
        {
587
814
            REPEAT4(stride, cp[stride] = (uint8_t)((cp[stride] + cp[0]) & 0xff);
588
814
                    cp++)
589
814
            count -= stride;
590
814
        }
591
218
    }
592
593
651
    _TIFFmemcpy(tmp, cp0, cc);
594
651
    cp = (uint8_t *)cp0;
595
651
    count = 0;
596
597
651
#if defined(__x86_64__) || (defined(_M_X64) && !defined(_M_ARM64EC))
598
651
    if (bps == 4)
599
239
    {
600
        /* Optimization of general case */
601
1.04k
        for (; count + 15 < wc; count += 16)
602
808
        {
603
            /* Interlace 4*16 byte values */
604
605
808
            __m128i xmm0 =
606
808
                _mm_loadu_si128((const __m128i *)(tmp + count + 3 * wc));
607
808
            __m128i xmm1 =
608
808
                _mm_loadu_si128((const __m128i *)(tmp + count + 2 * wc));
609
808
            __m128i xmm2 =
610
808
                _mm_loadu_si128((const __m128i *)(tmp + count + 1 * wc));
611
808
            __m128i xmm3 =
612
808
                _mm_loadu_si128((const __m128i *)(tmp + count + 0 * wc));
613
            /* (xmm0_0, xmm1_0, xmm0_1, xmm1_1, xmm0_2, xmm1_2, ...) */
614
808
            __m128i tmp0 = _mm_unpacklo_epi8(xmm0, xmm1);
615
            /* (xmm0_8, xmm1_8, xmm0_9, xmm1_9, xmm0_10, xmm1_10, ...) */
616
808
            __m128i tmp1 = _mm_unpackhi_epi8(xmm0, xmm1);
617
            /* (xmm2_0, xmm3_0, xmm2_1, xmm3_1, xmm2_2, xmm3_2, ...) */
618
808
            __m128i tmp2 = _mm_unpacklo_epi8(xmm2, xmm3);
619
            /* (xmm2_8, xmm3_8, xmm2_9, xmm3_9, xmm2_10, xmm3_10, ...) */
620
808
            __m128i tmp3 = _mm_unpackhi_epi8(xmm2, xmm3);
621
            /* (xmm0_0, xmm1_0, xmm2_0, xmm3_0, xmm0_1, xmm1_1, xmm2_1, xmm3_1,
622
             * ...) */
623
808
            __m128i tmp2_0 = _mm_unpacklo_epi16(tmp0, tmp2);
624
808
            __m128i tmp2_1 = _mm_unpackhi_epi16(tmp0, tmp2);
625
808
            __m128i tmp2_2 = _mm_unpacklo_epi16(tmp1, tmp3);
626
808
            __m128i tmp2_3 = _mm_unpackhi_epi16(tmp1, tmp3);
627
808
            _mm_storeu_si128((__m128i *)(cp + 4 * count + 0 * 16), tmp2_0);
628
808
            _mm_storeu_si128((__m128i *)(cp + 4 * count + 1 * 16), tmp2_1);
629
808
            _mm_storeu_si128((__m128i *)(cp + 4 * count + 2 * 16), tmp2_2);
630
808
            _mm_storeu_si128((__m128i *)(cp + 4 * count + 3 * 16), tmp2_3);
631
808
        }
632
239
    }
633
651
#endif
634
635
2.56k
    for (; count < wc; count++)
636
1.91k
    {
637
1.91k
        uint32_t byte;
638
7.88k
        for (byte = 0; byte < bps; byte++)
639
5.97k
        {
640
#if WORDS_BIGENDIAN
641
            cp[bps * count + byte] = tmp[byte * wc + count];
642
#else
643
5.97k
            cp[bps * count + byte] = tmp[(bps - byte - 1) * wc + count];
644
5.97k
#endif
645
5.97k
        }
646
1.91k
    }
647
651
    _TIFFfreeExt(tif, tmp);
648
651
    return 1;
649
651
}
650
651
/*
652
 * Decode a scanline and apply the predictor routine.
653
 */
654
static int PredictorDecodeRow(TIFF *tif, uint8_t *op0, tmsize_t occ0,
655
                              uint16_t s)
656
22.2k
{
657
22.2k
    TIFFPredictorState *sp = PredictorState(tif);
658
659
22.2k
    assert(sp != NULL);
660
22.2k
    assert(sp->decoderow != NULL);
661
22.2k
    assert(sp->decodepfunc != NULL);
662
663
22.2k
    if ((*sp->decoderow)(tif, op0, occ0, s))
664
21.8k
    {
665
21.8k
        return (*sp->decodepfunc)(tif, op0, occ0);
666
21.8k
    }
667
355
    else
668
355
        return 0;
669
22.2k
}
670
671
/*
672
 * Decode a tile/strip and apply the predictor routine.
673
 * Note that horizontal differencing must be done on a
674
 * row-by-row basis.  The width of a "row" has already
675
 * been calculated at pre-decode time according to the
676
 * strip/tile dimensions.
677
 */
678
static int PredictorDecodeTile(TIFF *tif, uint8_t *op0, tmsize_t occ0,
679
                               uint16_t s)
680
1.79k
{
681
1.79k
    TIFFPredictorState *sp = PredictorState(tif);
682
683
1.79k
    assert(sp != NULL);
684
1.79k
    assert(sp->decodetile != NULL);
685
686
1.79k
    if ((*sp->decodetile)(tif, op0, occ0, s))
687
1.37k
    {
688
1.37k
        tmsize_t rowsize = sp->rowsize;
689
1.37k
        assert(rowsize > 0);
690
1.37k
        if ((occ0 % rowsize) != 0)
691
6
        {
692
6
            TIFFErrorExtR(tif, "PredictorDecodeTile", "%s",
693
6
                          "occ0%rowsize != 0");
694
6
            return 0;
695
6
        }
696
1.37k
        assert(sp->decodepfunc != NULL);
697
19.2k
        while (occ0 > 0)
698
17.8k
        {
699
17.8k
            if (!(*sp->decodepfunc)(tif, op0, rowsize))
700
9
                return 0;
701
17.8k
            occ0 -= rowsize;
702
17.8k
            op0 += rowsize;
703
17.8k
        }
704
1.35k
        return 1;
705
1.36k
    }
706
428
    else
707
428
        return 0;
708
1.79k
}
709
710
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
711
static int horDiff8(TIFF *tif, uint8_t *cp0, tmsize_t cc)
712
0
{
713
0
    TIFFPredictorState *sp = PredictorState(tif);
714
0
    tmsize_t stride = sp->stride;
715
0
    unsigned char *cp = (unsigned char *)cp0;
716
717
0
    if ((cc % stride) != 0)
718
0
    {
719
0
        TIFFErrorExtR(tif, "horDiff8", "%s", "(cc%stride)!=0");
720
0
        return 0;
721
0
    }
722
723
0
    if (cc > stride)
724
0
    {
725
0
        cc -= stride;
726
        /*
727
         * Pipeline the most common cases.
728
         */
729
0
        if (stride == 3)
730
0
        {
731
0
            unsigned int r1, g1, b1;
732
0
            unsigned int r2 = cp[0];
733
0
            unsigned int g2 = cp[1];
734
0
            unsigned int b2 = cp[2];
735
0
            do
736
0
            {
737
0
                r1 = cp[3];
738
0
                cp[3] = (unsigned char)((r1 - r2) & 0xff);
739
0
                r2 = r1;
740
0
                g1 = cp[4];
741
0
                cp[4] = (unsigned char)((g1 - g2) & 0xff);
742
0
                g2 = g1;
743
0
                b1 = cp[5];
744
0
                cp[5] = (unsigned char)((b1 - b2) & 0xff);
745
0
                b2 = b1;
746
0
                cp += 3;
747
0
            } while ((cc -= 3) > 0);
748
0
        }
749
0
        else if (stride == 4)
750
0
        {
751
0
            unsigned int r1, g1, b1, a1;
752
0
            unsigned int r2 = cp[0];
753
0
            unsigned int g2 = cp[1];
754
0
            unsigned int b2 = cp[2];
755
0
            unsigned int a2 = cp[3];
756
0
            do
757
0
            {
758
0
                r1 = cp[4];
759
0
                cp[4] = (unsigned char)((r1 - r2) & 0xff);
760
0
                r2 = r1;
761
0
                g1 = cp[5];
762
0
                cp[5] = (unsigned char)((g1 - g2) & 0xff);
763
0
                g2 = g1;
764
0
                b1 = cp[6];
765
0
                cp[6] = (unsigned char)((b1 - b2) & 0xff);
766
0
                b2 = b1;
767
0
                a1 = cp[7];
768
0
                cp[7] = (unsigned char)((a1 - a2) & 0xff);
769
0
                a2 = a1;
770
0
                cp += 4;
771
0
            } while ((cc -= 4) > 0);
772
0
        }
773
0
        else
774
0
        {
775
0
            cp += cc - 1;
776
0
            do
777
0
            {
778
0
                REPEAT4(stride,
779
0
                        cp[stride] =
780
0
                            (unsigned char)((cp[stride] - cp[0]) & 0xff);
781
0
                        cp--)
782
0
            } while ((cc -= stride) > 0);
783
0
        }
784
0
    }
785
0
    return 1;
786
0
}
787
788
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
789
static int horDiff16(TIFF *tif, uint8_t *cp0, tmsize_t cc)
790
0
{
791
0
    TIFFPredictorState *sp = PredictorState(tif);
792
0
    tmsize_t stride = sp->stride;
793
0
    uint16_t *wp = (uint16_t *)cp0;
794
0
    tmsize_t wc = cc / 2;
795
796
0
    if ((cc % (2 * stride)) != 0)
797
0
    {
798
0
        TIFFErrorExtR(tif, "horDiff8", "%s", "(cc%(2*stride))!=0");
799
0
        return 0;
800
0
    }
801
802
0
    if (wc > stride)
803
0
    {
804
0
        wc -= stride;
805
0
        wp += wc - 1;
806
0
        do
807
0
        {
808
0
            REPEAT4(stride, wp[stride] = (uint16_t)(((unsigned int)wp[stride] -
809
0
                                                     (unsigned int)wp[0]) &
810
0
                                                    0xffff);
811
0
                    wp--)
812
0
            wc -= stride;
813
0
        } while (wc > 0);
814
0
    }
815
0
    return 1;
816
0
}
817
818
static int swabHorDiff16(TIFF *tif, uint8_t *cp0, tmsize_t cc)
819
0
{
820
0
    uint16_t *wp = (uint16_t *)cp0;
821
0
    tmsize_t wc = cc / 2;
822
823
0
    if (!horDiff16(tif, cp0, cc))
824
0
        return 0;
825
826
0
    TIFFSwabArrayOfShort(wp, wc);
827
0
    return 1;
828
0
}
829
830
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
831
static int horDiff32(TIFF *tif, uint8_t *cp0, tmsize_t cc)
832
0
{
833
0
    TIFFPredictorState *sp = PredictorState(tif);
834
0
    tmsize_t stride = sp->stride;
835
0
    uint32_t *wp = (uint32_t *)cp0;
836
0
    tmsize_t wc = cc / 4;
837
838
0
    if ((cc % (4 * stride)) != 0)
839
0
    {
840
0
        TIFFErrorExtR(tif, "horDiff32", "%s", "(cc%(4*stride))!=0");
841
0
        return 0;
842
0
    }
843
844
0
    if (wc > stride)
845
0
    {
846
0
        wc -= stride;
847
0
        wp += wc - 1;
848
0
        do
849
0
        {
850
0
            REPEAT4(stride, wp[stride] -= wp[0]; wp--)
851
0
            wc -= stride;
852
0
        } while (wc > 0);
853
0
    }
854
0
    return 1;
855
0
}
856
857
static int swabHorDiff32(TIFF *tif, uint8_t *cp0, tmsize_t cc)
858
0
{
859
0
    uint32_t *wp = (uint32_t *)cp0;
860
0
    tmsize_t wc = cc / 4;
861
862
0
    if (!horDiff32(tif, cp0, cc))
863
0
        return 0;
864
865
0
    TIFFSwabArrayOfLong(wp, wc);
866
0
    return 1;
867
0
}
868
869
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
870
static int horDiff64(TIFF *tif, uint8_t *cp0, tmsize_t cc)
871
0
{
872
0
    TIFFPredictorState *sp = PredictorState(tif);
873
0
    tmsize_t stride = sp->stride;
874
0
    uint64_t *wp = (uint64_t *)cp0;
875
0
    tmsize_t wc = cc / 8;
876
877
0
    if ((cc % (8 * stride)) != 0)
878
0
    {
879
0
        TIFFErrorExtR(tif, "horDiff64", "%s", "(cc%(8*stride))!=0");
880
0
        return 0;
881
0
    }
882
883
0
    if (wc > stride)
884
0
    {
885
0
        wc -= stride;
886
0
        wp += wc - 1;
887
0
        do
888
0
        {
889
0
            REPEAT4(stride, wp[stride] -= wp[0]; wp--)
890
0
            wc -= stride;
891
0
        } while (wc > 0);
892
0
    }
893
0
    return 1;
894
0
}
895
896
static int swabHorDiff64(TIFF *tif, uint8_t *cp0, tmsize_t cc)
897
0
{
898
0
    uint64_t *wp = (uint64_t *)cp0;
899
0
    tmsize_t wc = cc / 8;
900
901
0
    if (!horDiff64(tif, cp0, cc))
902
0
        return 0;
903
904
0
    TIFFSwabArrayOfLong8(wp, wc);
905
0
    return 1;
906
0
}
907
908
/*
909
 * Floating point predictor differencing routine.
910
 */
911
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
912
static int fpDiff(TIFF *tif, uint8_t *cp0, tmsize_t cc)
913
0
{
914
0
    tmsize_t stride = PredictorState(tif)->stride;
915
0
    uint32_t bps = tif->tif_dir.td_bitspersample / 8;
916
0
    tmsize_t wc = cc / bps;
917
0
    tmsize_t count;
918
0
    uint8_t *cp = (uint8_t *)cp0;
919
0
    uint8_t *tmp;
920
921
0
    if ((cc % (bps * stride)) != 0)
922
0
    {
923
0
        TIFFErrorExtR(tif, "fpDiff", "%s", "(cc%(bps*stride))!=0");
924
0
        return 0;
925
0
    }
926
927
0
    tmp = (uint8_t *)_TIFFmallocExt(tif, cc);
928
0
    if (!tmp)
929
0
        return 0;
930
931
0
    _TIFFmemcpy(tmp, cp0, cc);
932
0
    for (count = 0; count < wc; count++)
933
0
    {
934
0
        uint32_t byte;
935
0
        for (byte = 0; byte < bps; byte++)
936
0
        {
937
#if WORDS_BIGENDIAN
938
            cp[byte * wc + count] = tmp[bps * count + byte];
939
#else
940
0
            cp[(bps - byte - 1) * wc + count] = tmp[bps * count + byte];
941
0
#endif
942
0
        }
943
0
    }
944
0
    _TIFFfreeExt(tif, tmp);
945
946
0
    cp = (uint8_t *)cp0;
947
0
    cp += cc - stride - 1;
948
0
    for (count = cc; count > stride; count -= stride)
949
0
        REPEAT4(stride,
950
0
                cp[stride] = (unsigned char)((cp[stride] - cp[0]) & 0xff);
951
0
                cp--)
952
0
    return 1;
953
0
}
954
955
static int PredictorEncodeRow(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
956
0
{
957
0
    static const char module[] = "PredictorEncodeRow";
958
0
    TIFFPredictorState *sp = PredictorState(tif);
959
0
    uint8_t *working_copy;
960
0
    int result_code;
961
962
0
    assert(sp != NULL);
963
0
    assert(sp->encodepfunc != NULL);
964
0
    assert(sp->encoderow != NULL);
965
966
    /*
967
     * Do predictor manipulation in a working buffer to avoid altering
968
     * the callers buffer, like for PredictorEncodeTile().
969
     * https://gitlab.com/libtiff/libtiff/-/issues/5
970
     */
971
0
    working_copy = (uint8_t *)_TIFFmallocExt(tif, cc);
972
0
    if (working_copy == NULL)
973
0
    {
974
0
        TIFFErrorExtR(tif, module,
975
0
                      "Out of memory allocating %" PRId64 " byte temp buffer.",
976
0
                      (int64_t)cc);
977
0
        return 0;
978
0
    }
979
0
    memcpy(working_copy, bp, (size_t)cc);
980
981
0
    if (!(*sp->encodepfunc)(tif, working_copy, cc))
982
0
    {
983
0
        _TIFFfreeExt(tif, working_copy);
984
0
        return 0;
985
0
    }
986
0
    result_code = (*sp->encoderow)(tif, working_copy, cc, s);
987
0
    _TIFFfreeExt(tif, working_copy);
988
0
    return result_code;
989
0
}
990
991
static int PredictorEncodeTile(TIFF *tif, uint8_t *bp0, tmsize_t cc0,
992
                               uint16_t s)
993
0
{
994
0
    static const char module[] = "PredictorEncodeTile";
995
0
    TIFFPredictorState *sp = PredictorState(tif);
996
0
    uint8_t *working_copy;
997
0
    tmsize_t cc = cc0, rowsize;
998
0
    unsigned char *bp;
999
0
    int result_code;
1000
1001
0
    assert(sp != NULL);
1002
0
    assert(sp->encodepfunc != NULL);
1003
0
    assert(sp->encodetile != NULL);
1004
1005
    /*
1006
     * Do predictor manipulation in a working buffer to avoid altering
1007
     * the callers buffer. http://trac.osgeo.org/gdal/ticket/1965
1008
     */
1009
0
    working_copy = (uint8_t *)_TIFFmallocExt(tif, cc0);
1010
0
    if (working_copy == NULL)
1011
0
    {
1012
0
        TIFFErrorExtR(tif, module,
1013
0
                      "Out of memory allocating %" PRId64 " byte temp buffer.",
1014
0
                      (int64_t)cc0);
1015
0
        return 0;
1016
0
    }
1017
0
    memcpy(working_copy, bp0, (size_t)cc0);
1018
0
    bp = working_copy;
1019
1020
0
    rowsize = sp->rowsize;
1021
0
    assert(rowsize > 0);
1022
0
    if ((cc0 % rowsize) != 0)
1023
0
    {
1024
0
        TIFFErrorExtR(tif, "PredictorEncodeTile", "%s", "(cc0%rowsize)!=0");
1025
0
        _TIFFfreeExt(tif, working_copy);
1026
0
        return 0;
1027
0
    }
1028
0
    while (cc > 0)
1029
0
    {
1030
0
        (*sp->encodepfunc)(tif, bp, rowsize);
1031
0
        cc -= rowsize;
1032
0
        bp += rowsize;
1033
0
    }
1034
0
    result_code = (*sp->encodetile)(tif, working_copy, cc0, s);
1035
1036
0
    _TIFFfreeExt(tif, working_copy);
1037
1038
0
    return result_code;
1039
0
}
1040
1041
#define FIELD_PREDICTOR (FIELD_CODEC + 0) /* XXX */
1042
1043
static const TIFFField predictFields[] = {
1044
    {TIFFTAG_PREDICTOR, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
1045
     FIELD_PREDICTOR, FALSE, FALSE, "Predictor", NULL},
1046
};
1047
1048
static int PredictorVSetField(TIFF *tif, uint32_t tag, va_list ap)
1049
325k
{
1050
325k
    TIFFPredictorState *sp = PredictorState(tif);
1051
1052
325k
    assert(sp != NULL);
1053
325k
    assert(sp->vsetparent != NULL);
1054
1055
325k
    switch (tag)
1056
325k
    {
1057
8.73k
        case TIFFTAG_PREDICTOR:
1058
8.73k
            sp->predictor = (uint16_t)va_arg(ap, uint16_vap);
1059
8.73k
            TIFFSetFieldBit(tif, FIELD_PREDICTOR);
1060
8.73k
            break;
1061
316k
        default:
1062
316k
            return (*sp->vsetparent)(tif, tag, ap);
1063
325k
    }
1064
8.73k
    tif->tif_flags |= TIFF_DIRTYDIRECT;
1065
8.73k
    return 1;
1066
325k
}
1067
1068
static int PredictorVGetField(TIFF *tif, uint32_t tag, va_list ap)
1069
1.18M
{
1070
1.18M
    TIFFPredictorState *sp = PredictorState(tif);
1071
1072
1.18M
    assert(sp != NULL);
1073
1.18M
    assert(sp->vgetparent != NULL);
1074
1075
1.18M
    switch (tag)
1076
1.18M
    {
1077
3.88k
        case TIFFTAG_PREDICTOR:
1078
3.88k
            *va_arg(ap, uint16_t *) = (uint16_t)sp->predictor;
1079
3.88k
            break;
1080
1.18M
        default:
1081
1.18M
            return (*sp->vgetparent)(tif, tag, ap);
1082
1.18M
    }
1083
3.88k
    return 1;
1084
1.18M
}
1085
1086
static void PredictorPrintDir(TIFF *tif, FILE *fd, long flags)
1087
0
{
1088
0
    TIFFPredictorState *sp = PredictorState(tif);
1089
1090
0
    (void)flags;
1091
0
    if (TIFFFieldSet(tif, FIELD_PREDICTOR))
1092
0
    {
1093
0
        fprintf(fd, "  Predictor: ");
1094
0
        switch (sp->predictor)
1095
0
        {
1096
0
            case 1:
1097
0
                fprintf(fd, "none ");
1098
0
                break;
1099
0
            case 2:
1100
0
                fprintf(fd, "horizontal differencing ");
1101
0
                break;
1102
0
            case 3:
1103
0
                fprintf(fd, "floating point predictor ");
1104
0
                break;
1105
0
            default:
1106
0
                break;
1107
0
        }
1108
0
        fprintf(fd, "%d (0x%x)\n", sp->predictor, (unsigned)sp->predictor);
1109
0
    }
1110
0
    if (sp->printdir)
1111
0
        (*sp->printdir)(tif, fd, flags);
1112
0
}
1113
1114
int TIFFPredictorInit(TIFF *tif)
1115
44.0k
{
1116
44.0k
    TIFFPredictorState *sp = PredictorState(tif);
1117
1118
44.0k
    assert(sp != 0);
1119
1120
    /*
1121
     * Merge codec-specific tag information.
1122
     */
1123
44.0k
    if (!_TIFFMergeFields(tif, predictFields, TIFFArrayCount(predictFields)))
1124
0
    {
1125
0
        TIFFErrorExtR(tif, "TIFFPredictorInit",
1126
0
                      "Merging Predictor codec-specific tags failed");
1127
0
        return 0;
1128
0
    }
1129
1130
    /*
1131
     * Override parent get/set field methods.
1132
     */
1133
44.0k
    sp->vgetparent = tif->tif_tagmethods.vgetfield;
1134
44.0k
    tif->tif_tagmethods.vgetfield =
1135
44.0k
        PredictorVGetField; /* hook for predictor tag */
1136
44.0k
    sp->vsetparent = tif->tif_tagmethods.vsetfield;
1137
44.0k
    tif->tif_tagmethods.vsetfield =
1138
44.0k
        PredictorVSetField; /* hook for predictor tag */
1139
44.0k
    sp->printdir = tif->tif_tagmethods.printdir;
1140
44.0k
    tif->tif_tagmethods.printdir =
1141
44.0k
        PredictorPrintDir; /* hook for predictor tag */
1142
1143
44.0k
    sp->setupdecode = tif->tif_setupdecode;
1144
44.0k
    tif->tif_setupdecode = PredictorSetupDecode;
1145
44.0k
    sp->setupencode = tif->tif_setupencode;
1146
44.0k
    tif->tif_setupencode = PredictorSetupEncode;
1147
1148
44.0k
    sp->predictor = 1;      /* default value */
1149
44.0k
    sp->encodepfunc = NULL; /* no predictor routine */
1150
44.0k
    sp->decodepfunc = NULL; /* no predictor routine */
1151
44.0k
    return 1;
1152
44.0k
}
1153
1154
int TIFFPredictorCleanup(TIFF *tif)
1155
44.0k
{
1156
44.0k
    TIFFPredictorState *sp = PredictorState(tif);
1157
1158
44.0k
    assert(sp != 0);
1159
1160
44.0k
    tif->tif_tagmethods.vgetfield = sp->vgetparent;
1161
44.0k
    tif->tif_tagmethods.vsetfield = sp->vsetparent;
1162
44.0k
    tif->tif_tagmethods.printdir = sp->printdir;
1163
44.0k
    tif->tif_setupdecode = sp->setupdecode;
1164
44.0k
    tif->tif_setupencode = sp->setupencode;
1165
1166
44.0k
    return 1;
1167
44.0k
}