Coverage Report

Created: 2025-08-09 06:06

/src/jbig2dec/jbig2_generic.c
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
    jbig2dec
18
*/
19
20
/**
21
 * Generic region handlers.
22
 **/
23
24
#ifdef HAVE_CONFIG_H
25
#include "config.h"
26
#endif
27
#include "os_types.h"
28
29
#include <stddef.h>
30
#include <string.h>             /* memcpy(), memset() */
31
32
#ifdef OUTPUT_PBM
33
#include <stdio.h>
34
#endif
35
36
#include "jbig2.h"
37
#include "jbig2_priv.h"
38
#include "jbig2_arith.h"
39
#include "jbig2_generic.h"
40
#include "jbig2_image.h"
41
#include "jbig2_mmr.h"
42
#include "jbig2_page.h"
43
#include "jbig2_segment.h"
44
45
/*
46
This is an explanation of the unoptimized and optimized generic
47
region decoder implementations below, wherein we try to explain
48
all the magic numbers.
49
50
The generic region decoders decode the output pixels one row at a
51
time, top to bottom. Within each row the pixels are decoded left
52
to right. The input for the arithmetic integer decoder used to
53
decode each pixel is a context consisting of up to 16 previously
54
decoded pixels. These pixels are chosen according to a predefined
55
template placed relative to the location of the pixel to be
56
decoded (6.2.5.3 figures 3, 4, 5 and 6). There are four different
57
template that may be used (6.2.5.3). The template to use is
58
determined by GBTEMPLATE. GBTEMPLATE is set in the symbol
59
dictionary (6.5.8.1), generic region (7.4.6.4), or when decoding
60
a halftone region's gray-scale image (annex C.5).
61
62
Most of the pixels in each template have fixed locations relative
63
to the pixel to be decoded. However, all templates have at least
64
one adaptive pixel. The adaptive pixels have nominal locations,
65
but these locations may be changed by GBAT. GBAT is set in the
66
symbol dictionary (7.4.2.1.2), generic region (7.4.6.1), or hard
67
coded as for halftone patterns (6.7.5).
68
69
Adaptive pixels are restricted to fall within a field of
70
previously decoded pixels relative to the pixel to be decoded
71
(figure 7). The relative Y-coordinate for these adaptive pixels
72
may vary between -128 and 0. The relative X-coordinate may vary
73
between -128 and +127 (however, if the Y-coordinate is 0 the
74
range of the X-coordinate is further restricted to -128 to -1
75
since the pixels at locations 0 to +127 have not yet been
76
decoded). If a template refers to a pixel location that reside
77
outside of the image boundaries its value is assumed to be 0.
78
79
UNOPTIMIZED DECODER
80
81
The unoptimized decoders first check the contents of GBAT. If
82
GBAT specifies that any of the adaptive pixels reside outside the
83
allowed field the decoding is aborted. Next, each row is
84
processed top to bottom, left to right, one pixel at a time. For
85
each pixel a context is created containing the bit values of the
86
pixels that fall inside the template.
87
88
The order these bits are stored in the context is implementation
89
dependent (6.2.5.3). We store the bit values in the CONTEXT
90
variable from LSB to MSB, starting with the value of the pixel to
91
the left of the current pixel, continuing right to left, bottom
92
to top following the template. Using the CONTEXT created from
93
these pixel values, the arithmetic integer decoder retrieves the
94
pixel value, which is then written into the output image.
95
96
Example when GBTEMPLATE is 2:
97
98
The figure below represents a pixel grid of the output image.
99
Each pixel is a single bit in the image. The pixel "OO" in the
100
figure below is about to be decoded. The pixels "??" have not
101
been decoded yet. The CONTEXT variable is constructed by
102
combining the bit values from the pixels referred to by the
103
template, shifted to their corresponding bit position.
104
105
     .    .    .    .    .    .    .    .
106
     .    .    .    .    .    .    .    .
107
  ...+----+----+----+----+----+----+----+...
108
     |    |    | X9 | X8 | X7 |    |    |
109
  ...+----+----+----+----+----+----+----+...
110
     |    | X6 | X5 | X4 | X3 | A1 |    |
111
  ...+----+----+----+----+----+----+----+...
112
     |    | X2 | X1 | OO | ?? | ?? | ?? |
113
  ...+----+----+----+----+----+----+----+...
114
     .    .    .    .    .    .    .    .
115
     .    .    .    .    .    .    .    .
116
117
In the table below pixel OO is assumed to be at coordinate (x, y).
118
119
Bit 9: Pixel at location (x-1, y-2) (This is fixed pixel X9)
120
Bit 8: Pixel at location (x  , y-2) (This is fixed pixel X8)
121
Bit 7: Pixel at location (x+1, y-2) (This is fixed pixel X7)
122
Bit 6: Pixel at location (x-2, y-1) (This is fixed pixel X6)
123
Bit 5: Pixel at location (x-1, y-1) (This is fixed pixel X5)
124
Bit 4: Pixel at location (x  , y-1) (This is fixed pixel X4)
125
Bit 3: Pixel at location (x+1, y-1) (This is fixed pixel X3)
126
Bit 2: Pixel at location (x+2, y-1) (This is adaptive pixel A1)
127
Bit 1: Pixel at location (x-2, y  ) (This is fixed pixel X2)
128
Bit 0: Pixel at location (x-1, y  ) (This is fixed pixel X1)
129
130
The location of adaptive pixel A1 may not always be at the
131
nominal location (x+2, y-1). It could be at any pixel location to
132
the left or above OO as specified by GBAT, e.g. at the location
133
(x-128, y+127).
134
135
OPTIMIZED DECODER
136
137
The optimized decoders work differently. They strive to avoid
138
recreating the arithmetic integer decoder context from scratch
139
for every pixel decoded. Instead they reuse part of the CONTEXT
140
used to compute the previous pixel (the pixel to left of the one
141
now being decoded). They also keep two sliding windows of pixel
142
bit values from the two rows of pixels immediately above the
143
pixel to be decoded. These are stored in the 32-bit variables
144
line_m1 (row above the pixel to be decoded) and line_m2 (row
145
above that of line_m1). These optimized decoders ONLY work for
146
the nominal adaptive pixel locations since these locations are
147
hard-coded into the implementation.
148
149
The bit ordering in the CONTEXT variable is identical to the
150
unoptimized case described above.
151
152
The optimized decoders decode the output pixels one row at a
153
time, top to bottom. Within each row the pixels are decoded in
154
batches of up to eight pixels at a time (except possibly the
155
right most batch which may be less than eight pixels). The
156
batches in a row are decoded in sequence from left to right.
157
Within each such batch the pixels are decoded in sequence from
158
left to right.
159
160
Before decoding the pixels in a row the two sliding windows of
161
pixel values are reset. The first eight pixels of the row above
162
the pixel to be decoded is stored in line_m1, while line_m2
163
stores the first eight pixels of the row above that of line_m1.
164
165
The figure below illustrates the situation where the template has
166
been placed so that the decoded pixel OO is the very first pixel
167
of a row. It also gives labels to various pixels that we will
168
refer to below.
169
170
             .    .    .    .    .    .    .    .    .    .    .
171
             |    .    .    .    .    .    .    .    .    .    .
172
   +    +    +----+----+----+----+----+----+----+----+----+----+...
173
          X9 | X8 | X7 | m1 | m2 | m3 | m4 | m5 | m6 | m7 |    |
174
   +    +    +----+----+----+----+----+----+----+----+----+----+...
175
     X6   X5 | X4 | X3 | A1 | n1 | n2 | n3 | n4 | n5 | n6 | n7 |
176
   +    +    +----+----+----+----+----+----+----+----+----+----+...
177
     X2   X1 | OO |    |    |    |    |    |    |    |    |    |
178
   +    +    +----+----+----+----+----+----+----+----+----+----+...
179
             |    .    .    .    .    .    .    .    .    .    .
180
             .    .    .    .    .    .    .    .    .    .    .
181
182
The pixels X1, X2, X5, X6 and X9 all reside outside the left edge
183
of the image. These pixels (like all others outside the image)
184
can according to 6.2.5.2 be assumed to be 0. line_m1 stores n5
185
through n1 as well as A1, and X3 through X6. line_m2 stores m6
186
through m1 as well as X7 through X9. The bits in line_m2 are also
187
shifted left four bits as seen below.
188
189
15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 | bit position
190
------------------------------------------------+------------------
191
 0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 n3 n4 n5 | line_m1
192
 0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6  0  0  0  0 | line_m2
193
194
The way line_m1 and line_m2 are stored means we can simply shift
195
them by the same amount to move the sliding window.
196
197
The bit order in line_m1 and line_m2 matches the ordering in the
198
CONTEXT variable. Each bit for the 'A' and 'X' pixels in line_m1
199
and line_m2 correspond to the equivalent bits in CONTEXT, only
200
shifted right by 3 bits. Thus X3 is bit 3 in CONTEXT and bit 6 in
201
line_m1, etc.
202
203
The initial arithmetic integer decoder context is created and
204
stored in the CONTEXT variable by masking, shifting, and bitwise
205
ORing the contents of line_m1 and line_m2. The "CONTEXT contents"
206
row is only shown for clarity, it is not present in the code.
207
208
15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 | bit position
209
------------------------------------------------+---------------------------
210
 0  0  0  0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 | line_m1 >> 3
211
 0  0  0  0  0  0  0  0  0  1  1  1  1  1  0  0 | mask for line_m1 (0x7c)
212
 0  0  0  0  0  0  0  0  0 X6 X5 X4 X3 A1  0  0 | line_m1 AND mask
213
------------------------------------------------+---------------------------
214
 0  0  0  0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6  0 | line_m2 >> 3
215
 0  0  0  0  0  0  1  1  1  0  0  0  0  0  0  0 | mask for line_m2 (0x380)
216
 0  0  0  0  0  0 X9 X8 X7  0  0  0  0  0  0  0 | line_m2 AND mask
217
------------------------------------------------+---------------------------
218
 0  0  0  0  0  0 X9 X8 X7 X6 X5 X4 X3 A1  0  0 | CONTEXT = line_m1 OR line_m2
219
------------------------------------------------+---------------------------
220
 0  0  0  0  0  0 X9 X8 X7 X6 X5 X4 X3 A1 X2 X1 | CONTEXT contents
221
222
Each batch is normally 8 bits, but at the right edge of the image
223
we may have fewer pixels to decode. The minor_width is how many
224
pixels the current batch should decode, with a counter variable
225
x_minor to keep track of the current pixel being decoded.
226
227
In order to process a new batch of pixels, unless we're at the
228
rightmost batch of pixels, we need to refill the sliding window
229
variables with eight new bits. Looking at the diagram above we
230
can see that in order to decode eight pixels starting with O0
231
we'll need to have bits up to pixel 'n7' for line_m1 and 'm7' for
232
line_m2 available (A1 and X7 moved right 7 times). To do this
233
simply and quickly, we shift line_m1 left by 8 bits, and OR in
234
the next byte from corresponding row. Likewise for line_m2, but
235
the next byte from the image is also shifted left by 4 bits to
236
compensate for line_m2 having the four least significant bits
237
unused.
238
239
These new eight bits contain the bit values of the eight pixels
240
to the right of those already present in line_m1 and line_m2. We
241
call these new bits m7 through mE, and n6 through nD, as
242
illustrated below.
243
244
23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 | bit position
245
------------------------------------------------------------------------+-------------
246
 0  0  0  0  0  0  0  0  0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 n3 n4 n5 | original line_m1
247
 0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 n3 n4 n5  0  0  0  0  0  0  0  0 | line_m1 shifted left by 8
248
 0  0  0  0  0  0 X6 X5 X4 X3 A1 n1 n2 n3 n4 n5 n6 n7 n8 n9 nA nB nC nD | line_m1 with new bits ORed in
249
------------------------------------------------------------------------+-------------
250
 0  0  0  0  0  0  0  0  0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6  0  0  0  0 | original line_m2
251
 0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6  0  0  0  0  0  0  0  0  0  0  0  0 | line_m2 shifted left by 8
252
 0  0  0 X9 X8 X7 m1 m2 m3 m4 m5 m6 m7 m8 m9 mA mB mC mD mE  0  0  0  0 | line_m2 with new bits ORed in
253
254
             .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .
255
             |    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .
256
   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...
257
          X9 | X8 | X7 | m1 | m2 | m3 | m4 | m5 | m6 | m7 | m8 | m9 | mA | mB | mC | mD | mE |    |    |    |
258
   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...
259
     X6   X5 | X4 | X3 | A1 | n1 | n2 | n3 | n4 | n5 | n6 | n7 | n8 | n9 | nA | nB | nC | nD |    |    |    |
260
   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...
261
     X2   X1 | OO |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
262
   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...
263
             |    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .
264
             .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .
265
266
CONTEXT, line_m1 and line_m2 now contain all necessary bits to
267
decode a full batch of eight pixels.
268
269
The first pixel in the batch is decoded using this CONTEXT. After
270
that, for each following pixel we need to update the CONTEXT
271
using both the last decoded pixel value and new bits from line_m1
272
and line_m2.
273
274
             .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .
275
             |    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .
276
   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...
277
         (X9)|_X8_|_X7_|>m1<| m2 | m3 | m4 | m5 | m6 | m7 | m8 | m9 | mA | mB | mC | mD | mE |    |    |    |
278
   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...
279
    (X6) _X5_|_X4_|_X3_|_A1_|>n1<| n2 | n3 | n4 | n5 | n6 | n7 | n8 | n9 | nA | nB | nC | nD |    |    |    |
280
   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...
281
    (X2) _X1_|>OO<| oo |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
282
   +    +    +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+...
283
             |    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .
284
             .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .    .
285
286
This figure illustrates what happens when the same template is
287
overlaid on itself shifted one pixel to the right in order to
288
decode the next pixel. Pixels marked with _  _ are pixels that
289
are present in both templates' CONTEXTs and can be reused. Pixels
290
marked with (  ) are pixels from the first template that are no
291
longer necessary and can be removed from CONTEXT. Pixels marked
292
with >  < are new pixels that were not part of the original
293
CONTEXT, and so need to be moved into the CONTEXT at the
294
appropriate locations. In general the leftmost pixels of each
295
template row can be forgotten, while new pixels are needed at the
296
right most location of each row.
297
298
The CONTEXT corresponding to the current pixel OO and how it is
299
masked is shown below. Note how the left most pixel of each row
300
of the template is NOT propagated to the CONTEXT, these pixels
301
are X2, X6 and X9. This is done by having the mask being 0 at the
302
corresponding locations.
303
304
 9  8  7  6  5  4  3  2  1  0 | bit position
305
------------------------------+-------------
306
X9 X8 X7 X6 X5 X4 X3 A1 X2 X1 | pixel values from CONTEXT
307
 0  1  1  0  1  1  1  1  0  1 | reused pixel bit value mask (0x1bd)
308
 0 X8 X7  0 X5 X4 X3 A1  0 X1 | reused pixel values from CONTEXT
309
310
Next the CONTEXT is shifted left by one bit to make it reference
311
the next pixel to be decoded. The pixel bit value we just decoded
312
is then written into the bit corresponding to X1. The sliding
313
windows in line_m1 and line_m2 are both shifted (10 - x_minor)
314
bits to the right to make the needed pixels' bit values appear at
315
the correct positions to be ORed into CONTEXT. Note that this
316
shift amount depends on which bit in the batch is currently being
317
computed, as is given by the x_minor counter. In the example
318
below we assume that x_minor is 0.
319
320
 9  8  7  6  5  4  3  2  1  0 | bit position
321
------------------------------+--------------
322
 0 X8 X7  0 X5 X4 X3 A1  0  0 | reused pixels from CONTEXT
323
X8 X7  0 X5 X4 X3 A1  0  0  0 | reused pixels shifted left 1 bit
324
------------------------------+--------------
325
X8 X7  0 X5 X4 X3 A1  0 X1 OO | new CONTEXT with current pixel at LSB
326
------------------------------+--------------
327
 0  0 X6 X5 X4 X3 A1 n1 n2 n3 | line_m1 shifted (10 - x_minor) bits to the right
328
 0  0  0  0  0  0  0  1  0  0 | mask for new adaptive pixel one row above (0x4)
329
X8 X7  0 X5 X4 X3 A1 n1 X1 OO | new CONTEXT with new adaptive pixel
330
------------------------------+--------------
331
X8 X7 m1 m2 m3 m4 m5 m6 m7 m8 | line_m2 with new bits ORed in
332
 0  0  1  0  0  0  0  0  0  0 | mask for new pixel two rows above (0x80)
333
X8 X7 m1 X5 X4 X3 A1 n1 X1 OO | new CONTEXT with new pixel
334
335
This makes the computation of the new CONTEXT be:
336
337
NEWCONTEXT = (CONTEXT & 0x1bd) << 1
338
NEWCONTEXT |= newbit;
339
NEWCONTEXT |= (line_m1 >> (10-x_minor)) & 0x4;
340
NEWCONTEXT |= (line_m2 >> (10-x_minor)) & 0x80;
341
342
The optimized decoding functions for GBTEMPLATE 0, 1 and 3 all
343
work similarly. */
344
345
/* Get a bit. No bounds checking. */
346
static inline int
347
jbig2_image_get_pixel_fast(Jbig2Image *image, int x, int y)
348
1.28G
{
349
1.28G
    const int byte = (x >> 3) + y * image->stride;
350
1.28G
    const int bit = 7 - (x & 7);
351
352
1.28G
    return ((image->data[byte] >> bit) & 1);
353
1.28G
}
354
355
/* return the appropriate context size for the given template */
356
int
357
jbig2_generic_stats_size(Jbig2Ctx *ctx, int template)
358
11.1k
{
359
11.1k
    int stats_size = template == 0 ? 1 << 16 : template == 1 ? 1 << 13 : 1 << 10;
360
361
11.1k
    return stats_size;
362
11.1k
}
363
364
static int
365
jbig2_decode_generic_template0(Jbig2Ctx *ctx,
366
                               Jbig2Segment *segment,
367
                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as,
368
                               Jbig2Image *image, Jbig2ArithCx *GB_stats)
369
4.73k
{
370
4.73k
    const uint32_t GBW = image->width;
371
4.73k
    const uint32_t GBH = image->height;
372
4.73k
    const uint32_t rowstride = image->stride;
373
4.73k
    uint32_t x, y;
374
4.73k
    byte *line2 = NULL;
375
4.73k
    byte *line1 = NULL;
376
4.73k
    byte *gbreg_line = (byte *) image->data;
377
378
#ifdef OUTPUT_PBM
379
    printf("P4\n%d %d\n", GBW, GBH);
380
#endif
381
382
4.73k
    if (GBW <= 0)
383
0
        return 0;
384
385
59.8k
    for (y = 0; y < GBH; y++) {
386
55.1k
        uint32_t CONTEXT;
387
55.1k
        uint32_t line_m1;
388
55.1k
        uint32_t line_m2;
389
55.1k
        uint32_t padded_width = (GBW + 7) & -8;
390
391
55.1k
        line_m1 = line1 ? line1[0] : 0;
392
55.1k
        line_m2 = line2 ? line2[0] << 6 : 0;
393
55.1k
        CONTEXT = (line_m1 & 0x7f0) | (line_m2 & 0xf800);
394
395
        /* 6.2.5.7 3d */
396
26.3M
        for (x = 0; x < padded_width; x += 8) {
397
26.3M
            byte result = 0;
398
26.3M
            int x_minor;
399
26.3M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
400
401
26.3M
            if (line1)
402
22.6M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
403
404
26.3M
            if (line2)
405
18.9M
                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 6 : 0);
406
407
            /* This is the speed-critical inner loop. */
408
236M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
409
210M
                int bit;
410
411
210M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
412
210M
                if (bit < 0)
413
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 optimized");
414
210M
                result |= bit << (7 - x_minor);
415
210M
                CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bit | ((line_m1 >> (7 - x_minor)) & 0x10) | ((line_m2 >> (7 - x_minor)) & 0x800);
416
210M
            }
417
26.3M
            gbreg_line[x >> 3] = result;
418
26.3M
        }
419
#ifdef OUTPUT_PBM
420
        fwrite(gbreg_line, 1, rowstride, stdout);
421
#endif
422
55.1k
        line2 = line1;
423
55.1k
        line1 = gbreg_line;
424
55.1k
        gbreg_line += rowstride;
425
55.1k
    }
426
427
4.73k
    return 0;
428
4.73k
}
429
430
#define pixel_outside_field(x, y) \
431
59.0k
    ((y) < -128 || (y) > 0 || (x) < -128 || ((y) < 0 && (x) > 127) || ((y) == 0 && (x) >= 0))
432
433
static int
434
jbig2_decode_generic_template0_unopt(Jbig2Ctx *ctx,
435
                                     Jbig2Segment *segment,
436
                                     const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
437
1.46k
{
438
1.46k
    const uint32_t GBW = image->width;
439
1.46k
    const uint32_t GBH = image->height;
440
1.46k
    uint32_t CONTEXT;
441
1.46k
    uint32_t x, y;
442
1.46k
    int bit;
443
444
1.46k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]) ||
445
1.46k
        pixel_outside_field(params->gbat[2], params->gbat[3]) ||
446
1.46k
        pixel_outside_field(params->gbat[4], params->gbat[5]) ||
447
1.46k
        pixel_outside_field(params->gbat[6], params->gbat[7]))
448
13
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
449
13
                           "adaptive template pixel is out of field");
450
451
27.2M
    for (y = 0; y < GBH; y++) {
452
27.2M
        uint32_t out_byte = 0;
453
27.2M
        int out_bits_to_go_in_byte = 8;
454
27.2M
        uint8_t *d = &image->data[image->stride * y];
455
27.2M
        uint8_t *pline  = &image->data[image->stride * (y-1)];
456
27.2M
        uint8_t *ppline = &image->data[image->stride * (y-2)];
457
27.2M
        uint32_t pd = 0;
458
27.2M
        uint32_t ppd = 0;
459
27.2M
        if (y > 0) {
460
27.2M
            pd = (*pline++ << 8);
461
27.2M
            if (GBW > 8)
462
789k
                pd |= *pline++;
463
27.2M
            if (y > 1) {
464
27.2M
                ppd = (*ppline++ << 8);
465
27.2M
                if (GBW > 8)
466
788k
                    ppd |= *ppline++;
467
27.2M
            }
468
27.2M
        }
469
179M
        for (x = 0; x < GBW; x++) {
470
152M
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
471
78.3M
                bit = 0;
472
78.3M
            } else {
473
74.0M
                CONTEXT  = out_byte & 0x000F; /* First 4 pixels */
474
74.0M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
475
74.0M
                CONTEXT |= (pd>>8) & 0x03E0; /* Next 5 pixels */
476
74.0M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], y + params->gbat[3]) << 10;
477
74.0M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], y + params->gbat[5]) << 11;
478
74.0M
                CONTEXT |= (ppd>>2) & 0x7000; /* Next 3 pixels */
479
74.0M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], y + params->gbat[7]) << 15;
480
74.0M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
481
74.0M
                if (bit < 0)
482
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 unoptimized");
483
74.0M
            }
484
152M
            pd = pd<<1;
485
152M
            ppd = ppd<<1;
486
152M
            out_byte = (out_byte<<1) | bit;
487
152M
            out_bits_to_go_in_byte--;
488
152M
            *d = out_byte<<out_bits_to_go_in_byte;
489
152M
            if (out_bits_to_go_in_byte == 0) {
490
15.3M
                out_bits_to_go_in_byte = 8;
491
15.3M
                d++;
492
15.3M
                if (x+9 < GBW && y > 0) {
493
13.3M
                    pd |= *pline++;
494
13.3M
                    if (y > 1)
495
12.9M
                        ppd |= *ppline++;
496
13.3M
                }
497
15.3M
            }
498
152M
        }
499
27.2M
        if (out_bits_to_go_in_byte != 8)
500
27.2M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
501
27.2M
    }
502
1.45k
    return 0;
503
1.45k
}
504
505
static int
506
jbig2_decode_generic_template1_unopt(Jbig2Ctx *ctx,
507
                                     Jbig2Segment *segment,
508
                                     const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
509
199
{
510
199
    const uint32_t GBW = image->width;
511
199
    const uint32_t GBH = image->height;
512
199
    uint32_t CONTEXT;
513
199
    uint32_t x, y;
514
199
    int bit;
515
516
199
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
517
3
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
518
3
                           "adaptive template pixel is out of field");
519
520
491k
    for (y = 0; y < GBH; y++) {
521
490k
        uint32_t out_byte = 0;
522
490k
        int out_bits_to_go_in_byte = 8;
523
490k
        uint8_t *d = &image->data[image->stride * y];
524
490k
        uint8_t *pline  = &image->data[image->stride * (y-1)];
525
490k
        uint8_t *ppline = &image->data[image->stride * (y-2)];
526
490k
        uint32_t pd = 0;
527
490k
        uint32_t ppd = 0;
528
490k
        if (y > 0) {
529
490k
            pd = (*pline++ << 8);
530
490k
            if (GBW > 8)
531
41.8k
                pd |= *pline++;
532
490k
            if (y > 1) {
533
490k
                ppd = (*ppline++ << 8);
534
490k
                if (GBW > 8)
535
41.6k
                    ppd |= *ppline++;
536
490k
            }
537
490k
        }
538
10.4M
        for (x = 0; x < GBW; x++) {
539
10.0M
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
540
9.83M
                bit = 0;
541
9.83M
            } else {
542
170k
                CONTEXT  = out_byte & 0x0007; /* First 3 pixels */
543
170k
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 3;
544
170k
                CONTEXT |= (pd>>9) & 0x01F0; /* Next 5 pixels */
545
170k
                CONTEXT |= (ppd>>4) & 0x1E00; /* Next 4 pixels */
546
170k
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
547
170k
                if (bit < 0)
548
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template1 unoptimized");
549
170k
            }
550
10.0M
            pd = pd<<1;
551
10.0M
            ppd = ppd<<1;
552
10.0M
            out_byte = (out_byte<<1) | bit;
553
10.0M
            out_bits_to_go_in_byte--;
554
10.0M
            *d = out_byte<<out_bits_to_go_in_byte;
555
10.0M
            if (out_bits_to_go_in_byte == 0) {
556
1.13M
                out_bits_to_go_in_byte = 8;
557
1.13M
                d++;
558
1.13M
                if (x+9 < GBW && y > 0) {
559
964k
                    pd |= *pline++;
560
964k
                    if (y > 1)
561
866k
                        ppd |= *ppline++;
562
964k
                }
563
1.13M
            }
564
10.0M
        }
565
490k
        if (out_bits_to_go_in_byte != 8)
566
458k
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
567
490k
    }
568
196
    return 0;
569
196
}
570
571
static int
572
jbig2_decode_generic_template1(Jbig2Ctx *ctx,
573
                               Jbig2Segment *segment,
574
                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
575
69
{
576
69
    const uint32_t GBW = image->width;
577
69
    const uint32_t GBH = image->height;
578
69
    const uint32_t rowstride = image->stride;
579
69
    uint32_t x, y;
580
69
    byte *line2 = NULL;
581
69
    byte *line1 = NULL;
582
69
    byte *gbreg_line = (byte *) image->data;
583
584
#ifdef OUTPUT_PBM
585
    printf("P4\n%d %d\n", GBW, GBH);
586
#endif
587
588
69
    if (GBW <= 0)
589
0
        return 0;
590
591
10.9k
    for (y = 0; y < GBH; y++) {
592
10.8k
        uint32_t CONTEXT;
593
10.8k
        uint32_t line_m1;
594
10.8k
        uint32_t line_m2;
595
10.8k
        uint32_t padded_width = (GBW + 7) & -8;
596
597
10.8k
        line_m1 = line1 ? line1[0] : 0;
598
10.8k
        line_m2 = line2 ? line2[0] << 5 : 0;
599
10.8k
        CONTEXT = ((line_m1 >> 1) & 0x1f8) | ((line_m2 >> 1) & 0x1e00);
600
601
        /* 6.2.5.7 3d */
602
87.2k
        for (x = 0; x < padded_width; x += 8) {
603
76.3k
            byte result = 0;
604
76.3k
            int x_minor;
605
76.3k
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
606
607
76.3k
            if (line1)
608
75.8k
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
609
610
76.3k
            if (line2)
611
75.3k
                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 5 : 0);
612
613
            /* This is the speed-critical inner loop. */
614
614k
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
615
537k
                int bit;
616
617
537k
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
618
537k
                if (bit < 0)
619
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template1 optimized");
620
537k
                result |= bit << (7 - x_minor);
621
537k
                CONTEXT = ((CONTEXT & 0xefb) << 1) | bit | ((line_m1 >> (8 - x_minor)) & 0x8) | ((line_m2 >> (8 - x_minor)) & 0x200);
622
537k
            }
623
76.3k
            gbreg_line[x >> 3] = result;
624
76.3k
        }
625
#ifdef OUTPUT_PBM
626
        fwrite(gbreg_line, 1, rowstride, stdout);
627
#endif
628
10.8k
        line2 = line1;
629
10.8k
        line1 = gbreg_line;
630
10.8k
        gbreg_line += rowstride;
631
10.8k
    }
632
633
69
    return 0;
634
69
}
635
636
static int
637
jbig2_decode_generic_template2_unopt(Jbig2Ctx *ctx,
638
                               Jbig2Segment *segment,
639
                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
640
1.45k
{
641
1.45k
    const uint32_t GBW = image->width;
642
1.45k
    const uint32_t GBH = image->height;
643
1.45k
    uint32_t CONTEXT;
644
1.45k
    uint32_t x, y;
645
1.45k
    int bit;
646
647
1.45k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
648
0
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
649
0
                           "adaptive template pixel is out of field");
650
651
97.4k
    for (y = 0; y < GBH; y++) {
652
95.9k
        uint32_t out_byte = 0;
653
95.9k
        int out_bits_to_go_in_byte = 8;
654
95.9k
        uint8_t *d = &image->data[image->stride * y];
655
95.9k
        uint8_t *pline  = &image->data[image->stride * (y-1)];
656
95.9k
        uint8_t *ppline = &image->data[image->stride * (y-2)];
657
95.9k
        uint32_t pd = 0;
658
95.9k
        uint32_t ppd = 0;
659
95.9k
        if (y > 0) {
660
94.5k
            pd = (*pline++ << 8);
661
94.5k
            if (GBW > 8)
662
27.4k
                pd |= *pline++;
663
94.5k
            if (y > 1) {
664
93.0k
                ppd = (*ppline++ << 8);
665
93.0k
                if (GBW > 8)
666
26.2k
                    ppd |= *ppline++;
667
93.0k
            }
668
94.5k
        }
669
108M
        for (x = 0; x < GBW; x++) {
670
108M
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
671
18.4M
                bit = 0;
672
90.4M
            } else {
673
90.4M
                CONTEXT  = out_byte & 0x003; /* First 2 pixels */
674
90.4M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 2;
675
90.4M
                CONTEXT |= (pd>>11) & 0x078; /* Next 4 pixels */
676
90.4M
                CONTEXT |= (ppd>>7) & 0x380; /* Next 3 pixels */
677
90.4M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
678
90.4M
                if (bit < 0)
679
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template2 unoptimized");
680
90.4M
            }
681
108M
            pd = pd<<1;
682
108M
            ppd = ppd<<1;
683
108M
            out_byte = (out_byte<<1) | bit;
684
108M
            out_bits_to_go_in_byte--;
685
108M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
686
108M
            if (out_bits_to_go_in_byte == 0) {
687
13.5M
                out_bits_to_go_in_byte = 8;
688
13.5M
                d++;
689
13.5M
                if (x+9 < GBW && y > 0) {
690
12.4M
                    pd |= *pline++;
691
12.4M
                    if (y > 1)
692
11.2M
                        ppd |= *ppline++;
693
12.4M
                }
694
13.5M
            }
695
108M
        }
696
95.9k
        if (out_bits_to_go_in_byte != 8)
697
73.7k
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
698
95.9k
    }
699
700
1.45k
    return 0;
701
1.45k
}
702
703
static int
704
jbig2_decode_generic_template2(Jbig2Ctx *ctx,
705
                                Jbig2Segment *segment,
706
                                const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
707
9.79k
{
708
9.79k
    const uint32_t GBW = image->width;
709
9.79k
    const uint32_t GBH = image->height;
710
9.79k
    const uint32_t rowstride = image->stride;
711
9.79k
    uint32_t x, y;
712
9.79k
    byte *line2 = NULL;
713
9.79k
    byte *line1 = NULL;
714
9.79k
    byte *gbreg_line = (byte *) image->data;
715
716
#ifdef OUTPUT_PBM
717
    printf("P4\n%d %d\n", GBW, GBH);
718
#endif
719
720
9.79k
    if (GBW <= 0)
721
0
        return 0;
722
723
16.7M
    for (y = 0; y < GBH; y++) {
724
16.7M
        uint32_t CONTEXT;
725
16.7M
        uint32_t line_m1;
726
16.7M
        uint32_t line_m2;
727
16.7M
        uint32_t padded_width = (GBW + 7) & -8;
728
729
16.7M
        line_m1 = line1 ? line1[0] : 0;
730
16.7M
        line_m2 = line2 ? line2[0] << 4 : 0;
731
16.7M
        CONTEXT = ((line_m1 >> 3) & 0x7c) | ((line_m2 >> 3) & 0x380);
732
733
        /* 6.2.5.7 3d */
734
75.2M
        for (x = 0; x < padded_width; x += 8) {
735
58.4M
            byte result = 0;
736
58.4M
            int x_minor;
737
58.4M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
738
739
58.4M
            if (line1)
740
41.4M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
741
742
58.4M
            if (line2)
743
24.3M
                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 4 : 0);
744
745
            /* This is the speed-critical inner loop. */
746
459M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
747
400M
                int bit;
748
749
400M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
750
400M
                if (bit < 0)
751
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template2 optimized");
752
400M
                result |= bit << (7 - x_minor);
753
400M
                CONTEXT = ((CONTEXT & 0x1bd) << 1) | bit | ((line_m1 >> (10 - x_minor)) & 0x4) | ((line_m2 >> (10 - x_minor)) & 0x80);
754
400M
            }
755
58.4M
            gbreg_line[x >> 3] = result;
756
58.4M
        }
757
#ifdef OUTPUT_PBM
758
        fwrite(gbreg_line, 1, rowstride, stdout);
759
#endif
760
16.7M
        line2 = line1;
761
16.7M
        line1 = gbreg_line;
762
16.7M
        gbreg_line += rowstride;
763
16.7M
    }
764
765
9.79k
    return 0;
766
9.79k
}
767
768
static int
769
jbig2_decode_generic_template3(Jbig2Ctx *ctx,
770
                               Jbig2Segment *segment,
771
                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
772
388
{
773
388
    const uint32_t GBW = image->width;
774
388
    const uint32_t GBH = image->height;
775
388
    const uint32_t rowstride = image->stride;
776
388
    byte *line1 = NULL;
777
388
    byte *gbreg_line = (byte *) image->data;
778
388
    uint32_t x, y;
779
780
#ifdef OUTPUT_PBM
781
    printf("P4\n%d %d\n", GBW, GBH);
782
#endif
783
784
388
    if (GBW <= 0)
785
0
        return 0;
786
787
2.71k
    for (y = 0; y < GBH; y++) {
788
2.32k
        uint32_t CONTEXT;
789
2.32k
        uint32_t line_m1;
790
2.32k
        uint32_t padded_width = (GBW + 7) & -8;
791
792
2.32k
        line_m1 = line1 ? line1[0] : 0;
793
2.32k
        CONTEXT = (line_m1 >> 1) & 0x3f0;
794
795
        /* 6.2.5.7 3d */
796
493k
        for (x = 0; x < padded_width; x += 8) {
797
491k
            byte result = 0;
798
491k
            int x_minor;
799
491k
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
800
801
491k
            if (line1)
802
409k
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
803
804
            /* This is the speed-critical inner loop. */
805
4.41M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
806
3.92M
                int bit;
807
808
3.92M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
809
3.92M
                if (bit < 0)
810
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template3 optimized");
811
3.92M
                result |= bit << (7 - x_minor);
812
3.92M
                CONTEXT = ((CONTEXT & 0x1f7) << 1) | bit | ((line_m1 >> (8 - x_minor)) & 0x10);
813
3.92M
            }
814
491k
            gbreg_line[x >> 3] = result;
815
491k
        }
816
#ifdef OUTPUT_PBM
817
        fwrite(gbreg_line, 1, rowstride, stdout);
818
#endif
819
2.32k
        line1 = gbreg_line;
820
2.32k
        gbreg_line += rowstride;
821
2.32k
    }
822
823
388
    return 0;
824
388
}
825
826
static int
827
jbig2_decode_generic_template3_unopt(Jbig2Ctx *ctx,
828
                                     Jbig2Segment *segment,
829
                                     const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
830
61
{
831
61
    const uint32_t GBW = image->width;
832
61
    const uint32_t GBH = image->height;
833
61
    uint32_t CONTEXT;
834
61
    uint32_t x, y;
835
61
    int bit;
836
837
61
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
838
0
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
839
0
                           "adaptive template pixel is out of field");
840
841
16.7M
    for (y = 0; y < GBH; y++) {
842
16.7M
        uint32_t out_byte = 0;
843
16.7M
        int out_bits_to_go_in_byte = 8;
844
16.7M
        uint8_t *d = &image->data[image->stride * y];
845
16.7M
        uint8_t *pline  = &image->data[image->stride * (y-1)];
846
16.7M
        uint32_t pd = 0;
847
16.7M
        if (y > 0) {
848
16.7M
            pd = (*pline++ << 8);
849
16.7M
            if (GBW > 8)
850
1.46k
                pd |= *pline++;
851
16.7M
        }
852
284M
        for (x = 0; x < GBW; x++) {
853
267M
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
854
3.91k
                bit = 0;
855
267M
            } else {
856
267M
                CONTEXT  = out_byte & 0x00F; /* First 4 pixels */
857
267M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
858
267M
                CONTEXT |= (pd>>9) & 0x3E0; /* Next 5 pixels */
859
267M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
860
267M
                if (bit < 0)
861
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template3 unoptimized");
862
267M
            }
863
267M
            pd = pd<<1;
864
267M
            out_byte = (out_byte<<1) | bit;
865
267M
            out_bits_to_go_in_byte--;
866
267M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
867
267M
            if (out_bits_to_go_in_byte == 0) {
868
31.3M
                out_bits_to_go_in_byte = 8;
869
31.3M
                d++;
870
31.3M
                if (x+9 < GBW && y > 0)
871
31.1M
                    pd |= *pline++;
872
31.3M
            }
873
267M
        }
874
16.7M
        if (out_bits_to_go_in_byte != 8)
875
16.7M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
876
16.7M
    }
877
61
    return 0;
878
61
}
879
880
static void
881
copy_prev_row(Jbig2Image *image, int row)
882
6.52M
{
883
6.52M
    if (!row) {
884
        /* no previous row */
885
5.43k
        memset(image->data, 0, image->stride);
886
6.51M
    } else {
887
        /* duplicate data from the previous row */
888
6.51M
        uint8_t *src = image->data + (row - 1) * image->stride;
889
890
6.51M
        memcpy(src + image->stride, src, image->stride);
891
6.51M
    }
892
6.52M
}
893
894
static int
895
jbig2_decode_generic_template0_TPGDON(Jbig2Ctx *ctx,
896
                                      Jbig2Segment *segment,
897
                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
898
6.12k
{
899
6.12k
    const uint32_t GBW = image->width;
900
6.12k
    const uint32_t GBH = image->height;
901
6.12k
    uint32_t CONTEXT;
902
6.12k
    uint32_t x, y;
903
6.12k
    int LTP = 0;
904
6.12k
    int gmin, gmax;
905
6.12k
    uint32_t left, right, top;
906
907
6.12k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]) ||
908
6.12k
        pixel_outside_field(params->gbat[2], params->gbat[3]) ||
909
6.12k
        pixel_outside_field(params->gbat[4], params->gbat[5]) ||
910
6.12k
        pixel_outside_field(params->gbat[6], params->gbat[7]))
911
11
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
912
11
                           "adaptive template pixel is out of field");
913
914
    /* JBig2 has 'standard' values for gbat (see 6.2.5.4 of the spec).
915
     * Have an optimised version for those locations. This greatly
916
     * simplifies some of the fetches. It's almost like they thought
917
     * it through. */
918
6.11k
    if (params->gbat[0] ==  3 && params->gbat[1] == -1 &&
919
6.11k
        params->gbat[2] == -3 && params->gbat[3] == -1 &&
920
6.11k
        params->gbat[4] ==  2 && params->gbat[5] == -2 &&
921
6.11k
        params->gbat[6] == -2 && params->gbat[7] == -2)
922
283
    {
923
11.0k
        for (y = 0; y < GBH; y++) {
924
10.7k
            int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x9B25]);
925
10.7k
            if (bit < 0)
926
0
                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 TPGDON1");
927
10.7k
            LTP ^= bit;
928
10.7k
            if (!LTP) {
929
6.81k
                uint32_t out_byte = 0;
930
6.81k
                int out_bits_to_go_in_byte = 8;
931
6.81k
                uint8_t *d = &image->data[image->stride * y];
932
6.81k
                uint8_t *pline  = &image->data[image->stride * (y-1)];
933
6.81k
                uint8_t *ppline = &image->data[image->stride * (y-2)];
934
6.81k
                uint32_t pd = 0;
935
6.81k
                uint32_t ppd = 0;
936
6.81k
                if (y > 0) {
937
6.55k
                    pd = (*pline++ << 8);
938
6.55k
                    if (GBW > 8)
939
6.55k
                        pd |= *pline++;
940
6.55k
                    if (y > 1) {
941
6.28k
                        ppd = (*ppline++ << 8);
942
6.28k
                        if (GBW > 8)
943
6.28k
                            ppd |= *ppline++;
944
6.28k
                    }
945
6.55k
                }
946
8.21M
                for (x = 0; x < GBW; x++) {
947
8.21M
                    if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
948
0
                        bit = 0;
949
8.21M
                    } else {
950
8.21M
                        CONTEXT  = out_byte & 0x00F; /* First 4 pixels */
951
8.21M
                        CONTEXT |= (pd>>8) & 0x7F0; /* Next 7 pixels */
952
8.21M
                        CONTEXT |= (ppd>>2) & 0xF800; /* Final 5 pixels */
953
8.21M
                        bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
954
8.21M
                        if (bit < 0)
955
0
                            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 TPGDON2");
956
8.21M
                    }
957
8.21M
                    pd = pd<<1;
958
8.21M
                    ppd = ppd<<1;
959
8.21M
                    out_byte = (out_byte<<1) | bit;
960
8.21M
                    out_bits_to_go_in_byte--;
961
8.21M
                    if (out_bits_to_go_in_byte == 0) {
962
1.02M
                        out_bits_to_go_in_byte = 8;
963
1.02M
                        *d++ = (uint8_t)out_byte;
964
1.02M
                        if (x+9 < GBW && y > 0) {
965
994k
                            pd |= *pline++;
966
994k
                            if (y > 1)
967
963k
                                ppd |= *ppline++;
968
994k
                        }
969
1.02M
                    }
970
8.21M
                }
971
6.81k
                if (out_bits_to_go_in_byte != 8)
972
6.57k
                    *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
973
6.81k
            } else {
974
3.95k
                copy_prev_row(image, y);
975
3.95k
            }
976
10.7k
        }
977
283
        return 0;
978
283
    }
979
980
    /* We divide the width into 3 regions 0..left...right...GBW,
981
     * between left and right, we know that our accesses will never
982
     * step outside the image, enabling us to use faster accessors. */
983
5.82k
    left = 4;
984
5.82k
    right = 2;
985
5.82k
    gmin = gmax = params->gbat[0];
986
5.82k
    if (params->gbat[2] < gmin)
987
2.45k
        gmin = params->gbat[2];
988
5.82k
    if (gmax < params->gbat[2])
989
2.61k
        gmax = params->gbat[2];
990
5.82k
    if (params->gbat[4] < gmin)
991
1.38k
        gmin = params->gbat[4];
992
5.82k
    if (gmax < params->gbat[4])
993
401
        gmax = params->gbat[4];
994
5.82k
    if (params->gbat[6] < gmin)
995
1.42k
        gmin = params->gbat[6];
996
5.82k
    if (gmax < params->gbat[6])
997
2.35k
        gmax = params->gbat[6];
998
5.82k
    if ((int)left < -gmin)
999
2.98k
        left = -gmin;
1000
5.82k
    if ((int)right < gmax)
1001
3.79k
        right = gmax;
1002
5.82k
    if (right > GBW)
1003
2.26k
        right = GBW;
1004
5.82k
    right = GBW - right;
1005
    /* So 0 <= x < left or right <= x < GBW needs bounds checking. */
1006
1007
    /* Now we do the same for the height, but here there is no bottom
1008
     * region, as we only ever look up for y. */
1009
5.82k
    top = 2;
1010
5.82k
    gmin = params->gbat[1];
1011
5.82k
    if (params->gbat[3] < gmin)
1012
992
        gmin = params->gbat[3];
1013
5.82k
    if (params->gbat[5] < gmin)
1014
3.74k
        gmin = params->gbat[5];
1015
5.82k
    if (params->gbat[7] < gmin)
1016
2.76k
        gmin = params->gbat[7];
1017
5.82k
    if ((int)top < -gmin)
1018
4.20k
        top = -gmin;
1019
    /* So 0 <= y < top needs bounds checking. */
1020
1021
8.74M
    for (y = 0; y < GBH; y++) {
1022
8.73M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x9B25]);
1023
8.73M
        if (bit < 0)
1024
0
            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 TPGDON1");
1025
8.73M
        LTP ^= bit;
1026
8.73M
        if (!LTP) {
1027
4.52M
            uint32_t out_byte = 0;
1028
4.52M
            int out_bits_to_go_in_byte = 8;
1029
4.52M
            uint8_t *d = &image->data[image->stride * y];
1030
4.52M
            uint8_t *pline  = &image->data[image->stride * (y-1)];
1031
4.52M
            uint8_t *ppline = &image->data[image->stride * (y-2)];
1032
4.52M
            uint32_t pd = 0;
1033
4.52M
            uint32_t ppd = 0;
1034
4.52M
            if (y > 0) {
1035
4.52M
                pd = (*pline++ << 8);
1036
4.52M
                if (GBW > 8)
1037
1.31M
                    pd |= *pline++;
1038
4.52M
                if (y > 1) {
1039
4.51M
                    ppd = (*ppline++ << 8);
1040
4.51M
                    if (GBW > 8)
1041
1.30M
                        ppd |= *ppline++;
1042
4.51M
                }
1043
4.52M
            }
1044
499M
            for (x = 0; x < GBW; x++) {
1045
494M
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1046
0
                    bit = 0;
1047
494M
                } else {
1048
494M
                    CONTEXT = out_byte & 0x000F; /* First 4 pixels */
1049
494M
                    CONTEXT |= (pd>>8) & 0x03E0; /* Skip one, next 5 pixels */
1050
494M
                    CONTEXT |= (ppd>>2) & 0x7000; /* Skip 2, next 3 pixels, skip one */
1051
494M
                    if (y >= top && x >= left && x < right)
1052
321M
                    {
1053
321M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[0], y + params->gbat[1]) << 4;
1054
321M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[2], y + params->gbat[3]) << 10;
1055
321M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[4], y + params->gbat[5]) << 11;
1056
321M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[6], y + params->gbat[7]) << 15;
1057
321M
                    }
1058
172M
                    else
1059
172M
                    {
1060
172M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
1061
172M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], y + params->gbat[3]) << 10;
1062
172M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], y + params->gbat[5]) << 11;
1063
172M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], y + params->gbat[7]) << 15;
1064
172M
                    }
1065
494M
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1066
494M
                    if (bit < 0)
1067
0
                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 TPGDON2");
1068
494M
                }
1069
494M
                pd = pd<<1;
1070
494M
                ppd = ppd<<1;
1071
494M
                out_byte = (out_byte<<1) | bit;
1072
494M
                out_bits_to_go_in_byte--;
1073
494M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1074
494M
                if (out_bits_to_go_in_byte == 0) {
1075
59.4M
                    out_bits_to_go_in_byte = 8;
1076
59.4M
                    d++;
1077
59.4M
                    if (x+9 < GBW && y > 0) {
1078
57.7M
                        pd |= *pline++;
1079
57.7M
                        if (y > 1)
1080
57.1M
                            ppd |= *ppline++;
1081
57.7M
                    }
1082
59.4M
                }
1083
494M
            }
1084
4.52M
            if (out_bits_to_go_in_byte != 8)
1085
4.29M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1086
4.52M
        } else {
1087
4.21M
            copy_prev_row(image, y);
1088
4.21M
        }
1089
8.73M
    }
1090
1091
5.82k
    return 0;
1092
5.82k
}
1093
1094
static int
1095
jbig2_decode_generic_template1_TPGDON(Jbig2Ctx *ctx,
1096
                                      Jbig2Segment *segment,
1097
                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1098
1.66k
{
1099
1.66k
    const uint32_t GBW = image->width;
1100
1.66k
    const uint32_t GBH = image->height;
1101
1.66k
    uint32_t CONTEXT;
1102
1.66k
    uint32_t x, y;
1103
1.66k
    int LTP = 0;
1104
1105
1.66k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
1106
9
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
1107
9
                           "adaptive template pixel is out of field");
1108
1109
2.22M
    for (y = 0; y < GBH; y++) {
1110
2.22M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x0795]);
1111
2.22M
        if (bit < 0)
1112
0
            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template1 TPGDON1");
1113
2.22M
        LTP ^= bit;
1114
2.22M
        if (!LTP) {
1115
1.12M
            uint32_t out_byte = 0;
1116
1.12M
            int out_bits_to_go_in_byte = 8;
1117
1.12M
            uint8_t *d = &image->data[image->stride * y];
1118
1.12M
            uint8_t *pline  = &image->data[image->stride * (y-1)];
1119
1.12M
            uint8_t *ppline = &image->data[image->stride * (y-2)];
1120
1.12M
            uint32_t pd = 0;
1121
1.12M
            uint32_t ppd = 0;
1122
1.12M
            if (y > 0) {
1123
1.11M
                pd = (*pline++ << 8);
1124
1.11M
                if (GBW > 8)
1125
648k
                    pd |= *pline++;
1126
1.11M
                if (y > 1) {
1127
1.11M
                    ppd = (*ppline++ << 8);
1128
1.11M
                    if (GBW > 8)
1129
647k
                        ppd |= *ppline++;
1130
1.11M
                }
1131
1.11M
            }
1132
124M
            for (x = 0; x < GBW; x++) {
1133
123M
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1134
0
                    bit = 0;
1135
123M
                } else {
1136
123M
                    CONTEXT  = out_byte & 0x0007; /* First 3 pixels */
1137
123M
                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 3;
1138
123M
                    CONTEXT |= (pd>>9) & 0x01F0; /* next 5 pixels */
1139
123M
                    CONTEXT |= (ppd>>4) & 0x1E00; /* next 4 pixels */
1140
123M
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1141
123M
                    if (bit < 0)
1142
0
                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template1 TPGDON2");
1143
123M
                }
1144
123M
                pd = pd<<1;
1145
123M
                ppd = ppd<<1;
1146
123M
                out_byte = (out_byte<<1) | bit;
1147
123M
                out_bits_to_go_in_byte--;
1148
123M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1149
123M
                if (out_bits_to_go_in_byte == 0) {
1150
14.8M
                    out_bits_to_go_in_byte = 8;
1151
14.8M
                    d++;
1152
14.8M
                    if (x+9 < GBW && y > 0) {
1153
14.1M
                        pd |= *pline++;
1154
14.1M
                        if (y > 1)
1155
14.1M
                            ppd |= *ppline++;
1156
14.1M
                    }
1157
14.8M
                }
1158
123M
            }
1159
1.12M
            if (out_bits_to_go_in_byte != 8)
1160
1.12M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1161
1.12M
        } else {
1162
1.10M
            copy_prev_row(image, y);
1163
1.10M
        }
1164
2.22M
    }
1165
1166
1.66k
    return 0;
1167
1.66k
}
1168
1169
static int
1170
jbig2_decode_generic_template2_TPGDON(Jbig2Ctx *ctx,
1171
                                      Jbig2Segment *segment,
1172
                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1173
1.49k
{
1174
1.49k
    const uint32_t GBW = image->width;
1175
1.49k
    const uint32_t GBH = image->height;
1176
1.49k
    uint32_t CONTEXT;
1177
1.49k
    uint32_t x, y;
1178
1.49k
    int LTP = 0;
1179
1180
1.49k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
1181
0
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
1182
0
                           "adaptive template pixel is out of field");
1183
1184
2.70M
    for (y = 0; y < GBH; y++) {
1185
2.70M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0xE5]);
1186
2.70M
        if (bit < 0)
1187
0
            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template2 TPGDON1");
1188
2.70M
        LTP ^= bit;
1189
2.70M
        if (!LTP) {
1190
1.54M
            uint32_t out_byte = 0;
1191
1.54M
            int out_bits_to_go_in_byte = 8;
1192
1.54M
            uint8_t *d = &image->data[image->stride * y];
1193
1.54M
            uint8_t *pline  = &image->data[image->stride * (y-1)];
1194
1.54M
            uint8_t *ppline = &image->data[image->stride * (y-2)];
1195
1.54M
            uint32_t pd = 0;
1196
1.54M
            uint32_t ppd = 0;
1197
1.54M
            if (y > 0) {
1198
1.54M
                pd = (*pline++ << 8);
1199
1.54M
                if (GBW > 8)
1200
145k
                    pd |= *pline++;
1201
1.54M
                if (y > 1) {
1202
1.54M
                    ppd = (*ppline++ << 8);
1203
1.54M
                    if (GBW > 8)
1204
143k
                        ppd |= *ppline++;
1205
1.54M
                }
1206
1.54M
            }
1207
51.7M
            for (x = 0; x < GBW; x++) {
1208
50.2M
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1209
0
                    bit = 0;
1210
50.2M
                } else {
1211
50.2M
                    CONTEXT  = out_byte & 0x003; /* First 2 pixels */
1212
50.2M
                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 2;
1213
50.2M
                    CONTEXT |= (pd>>11) & 0x078; /* next 4 pixels */
1214
50.2M
                    CONTEXT |= (ppd>>7) & 0x380; /* next 3 pixels */
1215
50.2M
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1216
50.2M
                    if (bit < 0)
1217
0
                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template2 TPGDON2");
1218
50.2M
                }
1219
50.2M
                pd = pd<<1;
1220
50.2M
                ppd = ppd<<1;
1221
50.2M
                out_byte = (out_byte<<1) | bit;
1222
50.2M
                out_bits_to_go_in_byte--;
1223
50.2M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1224
50.2M
                if (out_bits_to_go_in_byte == 0) {
1225
5.04M
                    out_bits_to_go_in_byte = 8;
1226
5.04M
                    d++;
1227
5.04M
                    if (x+9 < GBW && y > 0) {
1228
4.77M
                        pd |= *pline++;
1229
4.77M
                        if (y > 1)
1230
4.67M
                            ppd |= *ppline++;
1231
4.77M
                    }
1232
5.04M
                }
1233
50.2M
            }
1234
1.54M
            if (out_bits_to_go_in_byte != 8)
1235
1.52M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1236
1.54M
        } else {
1237
1.16M
            copy_prev_row(image, y);
1238
1.16M
        }
1239
2.70M
    }
1240
1241
1.49k
    return 0;
1242
1.49k
}
1243
1244
static int
1245
jbig2_decode_generic_template3_TPGDON(Jbig2Ctx *ctx,
1246
                                      Jbig2Segment *segment,
1247
                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1248
1.07k
{
1249
1.07k
    const uint32_t GBW = image->width;
1250
1.07k
    const uint32_t GBH = image->height;
1251
1.07k
    uint32_t CONTEXT;
1252
1.07k
    uint32_t x, y;
1253
1.07k
    int LTP = 0;
1254
1255
1.07k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
1256
0
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
1257
0
                           "adaptive template pixel is out of field");
1258
1259
1.12M
    for (y = 0; y < GBH; y++) {
1260
1.11M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x0195]);
1261
1.11M
        if (bit < 0)
1262
0
            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template3 TPGDON1");
1263
1.11M
        LTP ^= bit;
1264
1.11M
        if (!LTP) {
1265
1.08M
            uint32_t out_byte = 0;
1266
1.08M
            int out_bits_to_go_in_byte = 8;
1267
1.08M
            uint8_t *d = &image->data[image->stride * y];
1268
1.08M
            uint8_t *pline  = &image->data[image->stride * (y-1)];
1269
1.08M
            uint32_t pd = 0;
1270
1.08M
            if (y > 0) {
1271
1.08M
                pd = (*pline++ << 8);
1272
1.08M
                if (GBW > 8)
1273
1.08M
                    pd |= *pline++;
1274
1.08M
            }
1275
106M
            for (x = 0; x < GBW; x++) {
1276
104M
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1277
0
                    bit = 0;
1278
104M
                } else {
1279
104M
                    CONTEXT  = out_byte & 0x0F; /* First 4 pixels */
1280
104M
                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
1281
104M
                    CONTEXT |= (pd>>9) & 0x3E0; /* next 5 pixels */
1282
104M
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1283
104M
                    if (bit < 0)
1284
0
                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template3 TPGDON2");
1285
104M
                }
1286
104M
                pd = pd<<1;
1287
104M
                out_byte = (out_byte<<1) | bit;
1288
104M
                out_bits_to_go_in_byte--;
1289
104M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1290
104M
                if (out_bits_to_go_in_byte == 0) {
1291
12.4M
                    out_bits_to_go_in_byte = 8;
1292
12.4M
                    d++;
1293
12.4M
                    if (x+9 < GBW && y > 0)
1294
11.2M
                        pd |= *pline++;
1295
12.4M
                }
1296
104M
            }
1297
1.08M
            if (out_bits_to_go_in_byte != 8)
1298
1.06M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1299
1.08M
        } else {
1300
35.9k
            copy_prev_row(image, y);
1301
35.9k
        }
1302
1.11M
    }
1303
1304
1.07k
    return 0;
1305
1.07k
}
1306
1307
static int
1308
jbig2_decode_generic_region_TPGDON(Jbig2Ctx *ctx,
1309
                                   Jbig2Segment *segment,
1310
                                   const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1311
10.3k
{
1312
10.3k
    switch (params->GBTEMPLATE) {
1313
6.12k
    case 0:
1314
6.12k
        return jbig2_decode_generic_template0_TPGDON(ctx, segment, params, as, image, GB_stats);
1315
1.66k
    case 1:
1316
1.66k
        return jbig2_decode_generic_template1_TPGDON(ctx, segment, params, as, image, GB_stats);
1317
1.49k
    case 2:
1318
1.49k
        return jbig2_decode_generic_template2_TPGDON(ctx, segment, params, as, image, GB_stats);
1319
1.07k
    case 3:
1320
1.07k
        return jbig2_decode_generic_template3_TPGDON(ctx, segment, params, as, image, GB_stats);
1321
10.3k
    }
1322
1323
0
    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "unsupported GBTEMPLATE (%d)", params->GBTEMPLATE);
1324
10.3k
}
1325
1326
/**
1327
 * jbig2_decode_generic_region: Decode a generic region.
1328
 * @ctx: The context for allocation and error reporting.
1329
 * @segment: A segment reference for error reporting.
1330
 * @params: Decoding parameter set.
1331
 * @as: Arithmetic decoder state.
1332
 * @image: Where to store the decoded data.
1333
 * @GB_stats: Arithmetic stats.
1334
 *
1335
 * Decodes a generic region, according to section 6.2. The caller should
1336
 * pass an already allocated Jbig2Image object for @image
1337
 *
1338
 * Because this API is based on an arithmetic decoding state, it is
1339
 * not suitable for MMR decoding.
1340
 *
1341
 * Return code: 0 on success.
1342
 **/
1343
int
1344
jbig2_decode_generic_region(Jbig2Ctx *ctx,
1345
                            Jbig2Segment *segment, const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1346
28.5k
{
1347
28.5k
    const int8_t *gbat = params->gbat;
1348
1349
28.5k
    if (!params->MMR && params->TPGDON)
1350
10.3k
        return jbig2_decode_generic_region_TPGDON(ctx, segment, params, as, image, GB_stats);
1351
1352
18.1k
    if (!params->MMR && params->GBTEMPLATE == 0) {
1353
6.20k
        if (!params->USESKIP && gbat[0] == +3 && gbat[1] == -1 && gbat[2] == -3 && gbat[3] == -1 && gbat[4] == +2 && gbat[5] == -2 && gbat[6] == -2 && gbat[7] == -2)
1354
4.73k
            return jbig2_decode_generic_template0(ctx, segment, params, as, image, GB_stats);
1355
1.46k
        else
1356
1.46k
            return jbig2_decode_generic_template0_unopt(ctx, segment, params, as, image, GB_stats);
1357
11.9k
    } else if (!params->MMR && params->GBTEMPLATE == 1) {
1358
268
        if (!params->USESKIP && gbat[0] == +3 && gbat[1] == -1)
1359
69
            return jbig2_decode_generic_template1(ctx, segment, params, as, image, GB_stats);
1360
199
        else
1361
199
            return jbig2_decode_generic_template1_unopt(ctx, segment, params, as, image, GB_stats);
1362
268
    }
1363
11.6k
    else if (!params->MMR && params->GBTEMPLATE == 2) {
1364
11.2k
        if (!params->USESKIP && gbat[0] == 2 && gbat[1] == -1)
1365
9.79k
            return jbig2_decode_generic_template2(ctx, segment, params, as, image, GB_stats);
1366
1.45k
        else
1367
1.45k
            return jbig2_decode_generic_template2_unopt(ctx, segment, params, as, image, GB_stats);
1368
11.2k
    } else if (!params->MMR && params->GBTEMPLATE == 3) {
1369
449
        if (!params->USESKIP && gbat[0] == 2 && gbat[1] == -1)
1370
388
            return jbig2_decode_generic_template3(ctx, segment, params, as, image, GB_stats);
1371
61
        else
1372
61
            return jbig2_decode_generic_template3_unopt(ctx, segment, params, as, image, GB_stats);
1373
449
    }
1374
1375
0
    {
1376
0
        int i;
1377
1378
0
        for (i = 0; i < 8; i++)
1379
0
            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, "gbat[%d] = %d", i, params->gbat[i]);
1380
0
    }
1381
1382
0
    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "unsupported generic region (MMR=%d, GBTEMPLATE=%d)", params->MMR, params->GBTEMPLATE);
1383
18.1k
}
1384
1385
/**
1386
 * Handler for immediate generic region segments
1387
 */
1388
int
1389
jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)
1390
14.2k
{
1391
14.2k
    Jbig2RegionSegmentInfo rsi;
1392
14.2k
    byte seg_flags;
1393
14.2k
    int8_t gbat[8];
1394
14.2k
    int offset;
1395
14.2k
    uint32_t gbat_bytes = 0;
1396
14.2k
    Jbig2GenericRegionParams params;
1397
14.2k
    int code = 0;
1398
14.2k
    Jbig2Image *image = NULL;
1399
14.2k
    Jbig2WordStream *ws = NULL;
1400
14.2k
    Jbig2ArithState *as = NULL;
1401
14.2k
    Jbig2ArithCx *GB_stats = NULL;
1402
14.2k
    uint32_t height;
1403
14.2k
    Jbig2Page *page = &ctx->pages[ctx->current_page];
1404
1405
    /* 7.4.6 */
1406
14.2k
    if (segment->data_length < 18)
1407
38
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment too short");
1408
1409
14.1k
    jbig2_get_region_segment_info(&rsi, segment_data);
1410
14.1k
    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, "generic region: %u x %u @ (%u, %u), flags = %02x", rsi.width, rsi.height, rsi.x, rsi.y, rsi.flags);
1411
1412
    /* 7.4.6.4 */
1413
14.1k
    height = rsi.height;
1414
14.1k
    if (segment->rows != UINT32_MAX) {
1415
9.39k
        if (segment->rows > rsi.height)
1416
10
            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment contains more rows than stated in header");
1417
9.38k
        height = segment->rows;
1418
9.38k
    }
1419
1420
    /* 7.4.6.2 */
1421
14.1k
    seg_flags = segment_data[17];
1422
14.1k
    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, "segment flags = %02x", seg_flags);
1423
14.1k
    if ((seg_flags & 1) && (seg_flags & 6))
1424
251
        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "MMR is 1, but GBTEMPLATE is not 0");
1425
1426
    /* 7.4.6.3 */
1427
14.1k
    if (!(seg_flags & 1)) {
1428
13.4k
        gbat_bytes = (seg_flags & 6) ? 2 : 8;
1429
13.4k
        if (18 + gbat_bytes > segment->data_length)
1430
8
            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment too short");
1431
13.4k
        memcpy(gbat, segment_data + 18, gbat_bytes);
1432
13.4k
        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, "gbat: %d, %d", gbat[0], gbat[1]);
1433
13.4k
    }
1434
1435
14.1k
    offset = 18 + gbat_bytes;
1436
1437
    /* Check for T.88 amendment 2 */
1438
14.1k
    if ((seg_flags >> 5) & 1)
1439
10
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment uses 12 adaptive template pixels (NYI)");
1440
1441
    /* Table 34 */
1442
14.1k
    params.MMR = seg_flags & 1;
1443
14.1k
    params.GBTEMPLATE = (seg_flags & 6) >> 1;
1444
14.1k
    params.TPGDON = (seg_flags & 8) >> 3;
1445
14.1k
    params.USESKIP = 0;
1446
14.1k
    memcpy(params.gbat, gbat, gbat_bytes);
1447
1448
14.1k
    if (page->height == 0xffffffff && page->striped && page->stripe_size > 0) {
1449
6.03k
        if (rsi.y >= page->end_row + page->stripe_size) {
1450
1.74k
            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "ignoring %u x %u region at (%u, %u) outside of stripe at row %u covering %u rows, on page of height %u", rsi.width, rsi.height, rsi.x, rsi.y, page->end_row, page->stripe_size, page->image->height);
1451
1.74k
            return 0;
1452
1.74k
        }
1453
4.29k
        if (height > page->end_row + page->stripe_size) {
1454
2.64k
            height = page->end_row + page->stripe_size;
1455
2.64k
        }
1456
8.13k
    } else {
1457
8.13k
        if (rsi.y >= page->height) {
1458
995
            jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "ignoring %u x %u region at (%u, %u) outside of page of height %u", rsi.width, rsi.height, rsi.x, rsi.y, page->height);
1459
995
            return 0;
1460
995
        }
1461
7.13k
        if (height > page->height - rsi .y) {
1462
6.52k
            height = page->height - rsi.y;
1463
6.52k
        }
1464
7.13k
    }
1465
11.4k
    if (height == 0) {
1466
368
        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "nothing remains of region, ignoring");
1467
368
        return 0;
1468
368
    }
1469
1470
11.0k
    image = jbig2_image_new(ctx, rsi.width, height);
1471
11.0k
    if (image == NULL)
1472
10
        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to allocate generic image");
1473
11.0k
    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, "allocated %d x %d image buffer for region decode results", rsi.width, height);
1474
1475
11.0k
    if (params.MMR) {
1476
342
        code = jbig2_decode_generic_mmr(ctx, segment, &params, segment_data + offset, segment->data_length - offset, image);
1477
342
        if (code < 0) {
1478
5
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode MMR-coded generic region");
1479
5
            goto cleanup;
1480
5
        }
1481
10.7k
    } else {
1482
10.7k
        int stats_size = jbig2_generic_stats_size(ctx, params.GBTEMPLATE);
1483
1484
10.7k
        GB_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);
1485
10.7k
        if (GB_stats == NULL) {
1486
0
            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "failed to allocate arithmetic decoder states when handling immediate generic region");
1487
0
            goto cleanup;
1488
0
        }
1489
10.7k
        memset(GB_stats, 0, stats_size);
1490
1491
10.7k
        ws = jbig2_word_stream_buf_new(ctx, segment_data + offset, segment->data_length - offset);
1492
10.7k
        if (ws == NULL) {
1493
0
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to allocated word stream when handling immediate generic region");
1494
0
            goto cleanup;
1495
0
        }
1496
10.7k
        as = jbig2_arith_new(ctx, ws);
1497
10.7k
        if (as == NULL) {
1498
0
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to allocate arithmetic coding state when handling immediate generic region");
1499
0
            goto cleanup;
1500
0
        }
1501
10.7k
        code = jbig2_decode_generic_region(ctx, segment, &params, as, image, GB_stats);
1502
10.7k
        if (code < 0) {
1503
35
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode immediate generic region");
1504
35
            goto cleanup;
1505
35
        }
1506
10.7k
    }
1507
1508
11.0k
    code = jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], image, rsi.x, rsi.y, rsi.op);
1509
11.0k
    if (code < 0)
1510
83
        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "unable to add result to page");
1511
1512
11.0k
cleanup:
1513
11.0k
    jbig2_free(ctx->allocator, as);
1514
11.0k
    jbig2_word_stream_buf_free(ctx, ws);
1515
11.0k
    jbig2_free(ctx->allocator, GB_stats);
1516
11.0k
    jbig2_image_release(ctx, image);
1517
1518
11.0k
    return code;
1519
11.0k
}