Coverage Report

Created: 2025-11-24 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/jbig2dec/jbig2_generic.c
Line
Count
Source
1
/* Copyright (C) 2001-2023 Artifex Software, Inc.
2
   All Rights Reserved.
3
4
   This software is provided AS-IS with no warranty, either express or
5
   implied.
6
7
   This software is distributed under license and may not be copied,
8
   modified or distributed except as expressly authorized under the terms
9
   of the license contained in the file LICENSE in this distribution.
10
11
   Refer to licensing information at http://www.artifex.com or contact
12
   Artifex Software, Inc.,  39 Mesa Street, Suite 108A, San Francisco,
13
   CA 94129, USA, for further information.
14
*/
15
16
/*
17
    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
2.59G
{
349
2.59G
    const int byte = (x >> 3) + y * image->stride;
350
2.59G
    const int bit = 7 - (x & 7);
351
352
2.59G
    return ((image->data[byte] >> bit) & 1);
353
2.59G
}
354
355
/* return the appropriate context size for the given template */
356
int
357
jbig2_generic_stats_size(Jbig2Ctx *ctx, int template)
358
13.0k
{
359
13.0k
    int stats_size = template == 0 ? 1 << 16 : template == 1 ? 1 << 13 : 1 << 10;
360
361
13.0k
    return stats_size;
362
13.0k
}
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.08k
{
370
4.08k
    const uint32_t GBW = image->width;
371
4.08k
    const uint32_t GBH = image->height;
372
4.08k
    const uint32_t rowstride = image->stride;
373
4.08k
    uint32_t x, y;
374
4.08k
    byte *line2 = NULL;
375
4.08k
    byte *line1 = NULL;
376
4.08k
    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.08k
    if (GBW <= 0)
383
0
        return 0;
384
385
46.0k
    for (y = 0; y < GBH; y++) {
386
41.9k
        uint32_t CONTEXT;
387
41.9k
        uint32_t line_m1;
388
41.9k
        uint32_t line_m2;
389
41.9k
        uint32_t padded_width = (GBW + 7) & -8;
390
391
41.9k
        line_m1 = line1 ? line1[0] : 0;
392
41.9k
        line_m2 = line2 ? line2[0] << 6 : 0;
393
41.9k
        CONTEXT = (line_m1 & 0x7f0) | (line_m2 & 0xf800);
394
395
        /* 6.2.5.7 3d */
396
86.9M
        for (x = 0; x < padded_width; x += 8) {
397
86.9M
            byte result = 0;
398
86.9M
            int x_minor;
399
86.9M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
400
401
86.9M
            if (line1)
402
52.3M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
403
404
86.9M
            if (line2)
405
39.7M
                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 6 : 0);
406
407
            /* This is the speed-critical inner loop. */
408
782M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
409
695M
                int bit;
410
411
695M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
412
695M
                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
695M
                result |= bit << (7 - x_minor);
415
695M
                CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bit | ((line_m1 >> (7 - x_minor)) & 0x10) | ((line_m2 >> (7 - x_minor)) & 0x800);
416
695M
            }
417
86.9M
            gbreg_line[x >> 3] = result;
418
86.9M
        }
419
#ifdef OUTPUT_PBM
420
        fwrite(gbreg_line, 1, rowstride, stdout);
421
#endif
422
41.9k
        line2 = line1;
423
41.9k
        line1 = gbreg_line;
424
41.9k
        gbreg_line += rowstride;
425
41.9k
    }
426
427
4.08k
    return 0;
428
4.08k
}
429
430
#define pixel_outside_field(x, y) \
431
220k
    ((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
8.44k
{
438
8.44k
    const uint32_t GBW = image->width;
439
8.44k
    const uint32_t GBH = image->height;
440
8.44k
    uint32_t CONTEXT;
441
8.44k
    uint32_t x, y;
442
8.44k
    int bit;
443
444
8.44k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]) ||
445
8.42k
        pixel_outside_field(params->gbat[2], params->gbat[3]) ||
446
8.41k
        pixel_outside_field(params->gbat[4], params->gbat[5]) ||
447
8.40k
        pixel_outside_field(params->gbat[6], params->gbat[7]))
448
49
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
449
49
                           "adaptive template pixel is out of field");
450
451
102M
    for (y = 0; y < GBH; y++) {
452
102M
        uint32_t out_byte = 0;
453
102M
        int out_bits_to_go_in_byte = 8;
454
102M
        uint8_t *d = &image->data[image->stride * y];
455
102M
        uint32_t pd = 0;
456
102M
        uint32_t ppd = 0;
457
102M
        uint8_t *pline = NULL;
458
102M
        uint8_t *ppline = NULL;
459
102M
        if (y >= 1)
460
102M
        {
461
102M
            pline  = &image->data[image->stride * (y-1)];
462
102M
            pd = (*pline++ << 8);
463
102M
            if (GBW > 8)
464
372k
                pd |= *pline++;
465
102M
        }
466
102M
        if (y >= 2) {
467
102M
            ppline = &image->data[image->stride * (y-2)];
468
102M
            ppd = (*ppline++ << 8);
469
102M
            if (GBW > 8)
470
365k
                ppd |= *ppline++;
471
102M
        }
472
878M
        for (x = 0; x < GBW; x++) {
473
776M
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
474
84.7M
                bit = 0;
475
691M
            } else {
476
691M
                CONTEXT  = out_byte & 0x000F; /* First 4 pixels */
477
691M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
478
691M
                CONTEXT |= (pd>>8) & 0x03E0; /* Next 5 pixels */
479
691M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], y + params->gbat[3]) << 10;
480
691M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], y + params->gbat[5]) << 11;
481
691M
                CONTEXT |= (ppd>>2) & 0x7000; /* Next 3 pixels */
482
691M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], y + params->gbat[7]) << 15;
483
691M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
484
691M
                if (bit < 0)
485
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 unoptimized");
486
691M
            }
487
776M
            pd = pd<<1;
488
776M
            ppd = ppd<<1;
489
776M
            out_byte = (out_byte<<1) | bit;
490
776M
            out_bits_to_go_in_byte--;
491
776M
            *d = out_byte<<out_bits_to_go_in_byte;
492
776M
            if (out_bits_to_go_in_byte == 0) {
493
79.7M
                out_bits_to_go_in_byte = 8;
494
79.7M
                d++;
495
79.7M
                if (x+9 < GBW && pline != NULL) {
496
40.7M
                    pd |= *pline++;
497
40.7M
                    if (ppline != NULL)
498
28.9M
                        ppd |= *ppline++;
499
40.7M
                }
500
79.7M
            }
501
776M
        }
502
102M
        if (out_bits_to_go_in_byte != 8)
503
101M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
504
102M
    }
505
8.39k
    return 0;
506
8.39k
}
507
508
static int
509
jbig2_decode_generic_template1_unopt(Jbig2Ctx *ctx,
510
                                     Jbig2Segment *segment,
511
                                     const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
512
3.12k
{
513
3.12k
    const uint32_t GBW = image->width;
514
3.12k
    const uint32_t GBH = image->height;
515
3.12k
    uint32_t CONTEXT;
516
3.12k
    uint32_t x, y;
517
3.12k
    int bit;
518
519
3.12k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
520
9
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
521
9
                           "adaptive template pixel is out of field");
522
523
141M
    for (y = 0; y < GBH; y++) {
524
141M
        uint32_t out_byte = 0;
525
141M
        int out_bits_to_go_in_byte = 8;
526
141M
        uint8_t *d = &image->data[image->stride * y];
527
141M
        uint32_t pd = 0;
528
141M
        uint32_t ppd = 0;
529
141M
        uint8_t *pline = NULL;
530
141M
        uint8_t *ppline = NULL;
531
141M
        if (y >= 1) {
532
141M
            pline  = &image->data[image->stride * (y-1)];
533
141M
            pd = (*pline++ << 8);
534
141M
            if (GBW > 8)
535
1.92M
                pd |= *pline++;
536
141M
        }
537
141M
        if (y >= 2) {
538
141M
            ppline = &image->data[image->stride * (y-2)];
539
141M
            ppd = (*ppline++ << 8);
540
141M
            if (GBW > 8)
541
1.91M
                ppd |= *ppline++;
542
141M
        }
543
1.44G
        for (x = 0; x < GBW; x++) {
544
1.30G
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
545
134M
                bit = 0;
546
1.16G
            } else {
547
1.16G
                CONTEXT  = out_byte & 0x0007; /* First 3 pixels */
548
1.16G
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 3;
549
1.16G
                CONTEXT |= (pd>>9) & 0x01F0; /* Next 5 pixels */
550
1.16G
                CONTEXT |= (ppd>>4) & 0x1E00; /* Next 4 pixels */
551
1.16G
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
552
1.16G
                if (bit < 0)
553
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template1 unoptimized");
554
1.16G
            }
555
1.30G
            pd = pd<<1;
556
1.30G
            ppd = ppd<<1;
557
1.30G
            out_byte = (out_byte<<1) | bit;
558
1.30G
            out_bits_to_go_in_byte--;
559
1.30G
            *d = out_byte<<out_bits_to_go_in_byte;
560
1.30G
            if (out_bits_to_go_in_byte == 0) {
561
136M
                out_bits_to_go_in_byte = 8;
562
136M
                d++;
563
136M
                if (x+9 < GBW && pline != NULL) {
564
57.1M
                    pd |= *pline++;
565
57.1M
                    if (ppline != NULL)
566
48.3M
                        ppd |= *ppline++;
567
57.1M
                }
568
136M
            }
569
1.30G
        }
570
141M
        if (out_bits_to_go_in_byte != 8)
571
128M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
572
141M
    }
573
3.11k
    return 0;
574
3.11k
}
575
576
static int
577
jbig2_decode_generic_template1(Jbig2Ctx *ctx,
578
                               Jbig2Segment *segment,
579
                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
580
1.09k
{
581
1.09k
    const uint32_t GBW = image->width;
582
1.09k
    const uint32_t GBH = image->height;
583
1.09k
    const uint32_t rowstride = image->stride;
584
1.09k
    uint32_t x, y;
585
1.09k
    byte *line2 = NULL;
586
1.09k
    byte *line1 = NULL;
587
1.09k
    byte *gbreg_line = (byte *) image->data;
588
589
#ifdef OUTPUT_PBM
590
    printf("P4\n%d %d\n", GBW, GBH);
591
#endif
592
593
1.09k
    if (GBW <= 0)
594
0
        return 0;
595
596
51.9M
    for (y = 0; y < GBH; y++) {
597
51.9M
        uint32_t CONTEXT;
598
51.9M
        uint32_t line_m1;
599
51.9M
        uint32_t line_m2;
600
51.9M
        uint32_t padded_width = (GBW + 7) & -8;
601
602
51.9M
        line_m1 = line1 ? line1[0] : 0;
603
51.9M
        line_m2 = line2 ? line2[0] << 5 : 0;
604
51.9M
        CONTEXT = ((line_m1 >> 1) & 0x1f8) | ((line_m2 >> 1) & 0x1e00);
605
606
        /* 6.2.5.7 3d */
607
146M
        for (x = 0; x < padded_width; x += 8) {
608
94.3M
            byte result = 0;
609
94.3M
            int x_minor;
610
94.3M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
611
612
94.3M
            if (line1)
613
69.5M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
614
615
94.3M
            if (line2)
616
61.9M
                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 5 : 0);
617
618
            /* This is the speed-critical inner loop. */
619
486M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
620
391M
                int bit;
621
622
391M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
623
391M
                if (bit < 0)
624
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template1 optimized");
625
391M
                result |= bit << (7 - x_minor);
626
391M
                CONTEXT = ((CONTEXT & 0xefb) << 1) | bit | ((line_m1 >> (8 - x_minor)) & 0x8) | ((line_m2 >> (8 - x_minor)) & 0x200);
627
391M
            }
628
94.3M
            gbreg_line[x >> 3] = result;
629
94.3M
        }
630
#ifdef OUTPUT_PBM
631
        fwrite(gbreg_line, 1, rowstride, stdout);
632
#endif
633
51.9M
        line2 = line1;
634
51.9M
        line1 = gbreg_line;
635
51.9M
        gbreg_line += rowstride;
636
51.9M
    }
637
638
1.09k
    return 0;
639
1.09k
}
640
641
static int
642
jbig2_decode_generic_template2_unopt(Jbig2Ctx *ctx,
643
                               Jbig2Segment *segment,
644
                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
645
72.3k
{
646
72.3k
    const uint32_t GBW = image->width;
647
72.3k
    const uint32_t GBH = image->height;
648
72.3k
    uint32_t CONTEXT;
649
72.3k
    uint32_t x, y;
650
72.3k
    int bit;
651
652
72.3k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
653
5
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
654
5
                           "adaptive template pixel is out of field");
655
656
213M
    for (y = 0; y < GBH; y++) {
657
213M
        uint32_t out_byte = 0;
658
213M
        int out_bits_to_go_in_byte = 8;
659
213M
        uint8_t *d = &image->data[image->stride * y];
660
213M
        uint8_t *pline  = &image->data[image->stride * (y-1)];
661
213M
        uint8_t *ppline = &image->data[image->stride * (y-2)];
662
213M
        uint32_t pd = 0;
663
213M
        uint32_t ppd = 0;
664
213M
        if (y > 0) {
665
213M
            pd = (*pline++ << 8);
666
213M
            if (GBW > 8)
667
1.16M
                pd |= *pline++;
668
213M
            if (y > 1) {
669
213M
                ppd = (*ppline++ << 8);
670
213M
                if (GBW > 8)
671
1.08M
                    ppd |= *ppline++;
672
213M
            }
673
213M
        }
674
1.50G
        for (x = 0; x < GBW; x++) {
675
1.29G
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
676
77.0M
                bit = 0;
677
1.21G
            } else {
678
1.21G
                CONTEXT  = out_byte & 0x003; /* First 2 pixels */
679
1.21G
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 2;
680
1.21G
                CONTEXT |= (pd>>11) & 0x078; /* Next 4 pixels */
681
1.21G
                CONTEXT |= (ppd>>7) & 0x380; /* Next 3 pixels */
682
1.21G
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
683
1.21G
                if (bit < 0)
684
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template2 unoptimized");
685
1.21G
            }
686
1.29G
            pd = pd<<1;
687
1.29G
            ppd = ppd<<1;
688
1.29G
            out_byte = (out_byte<<1) | bit;
689
1.29G
            out_bits_to_go_in_byte--;
690
1.29G
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
691
1.29G
            if (out_bits_to_go_in_byte == 0) {
692
133M
                out_bits_to_go_in_byte = 8;
693
133M
                d++;
694
133M
                if (x+9 < GBW && y > 0) {
695
55.7M
                    pd |= *pline++;
696
55.7M
                    if (y > 1)
697
49.4M
                        ppd |= *ppline++;
698
55.7M
                }
699
133M
            }
700
1.29G
        }
701
213M
        if (out_bits_to_go_in_byte != 8)
702
213M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
703
213M
    }
704
705
72.3k
    return 0;
706
72.3k
}
707
708
static int
709
jbig2_decode_generic_template2(Jbig2Ctx *ctx,
710
                                Jbig2Segment *segment,
711
                                const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
712
50.2k
{
713
50.2k
    const uint32_t GBW = image->width;
714
50.2k
    const uint32_t GBH = image->height;
715
50.2k
    const uint32_t rowstride = image->stride;
716
50.2k
    uint32_t x, y;
717
50.2k
    byte *line2 = NULL;
718
50.2k
    byte *line1 = NULL;
719
50.2k
    byte *gbreg_line = (byte *) image->data;
720
721
#ifdef OUTPUT_PBM
722
    printf("P4\n%d %d\n", GBW, GBH);
723
#endif
724
725
50.2k
    if (GBW <= 0)
726
0
        return 0;
727
728
35.6M
    for (y = 0; y < GBH; y++) {
729
35.5M
        uint32_t CONTEXT;
730
35.5M
        uint32_t line_m1;
731
35.5M
        uint32_t line_m2;
732
35.5M
        uint32_t padded_width = (GBW + 7) & -8;
733
734
35.5M
        line_m1 = line1 ? line1[0] : 0;
735
35.5M
        line_m2 = line2 ? line2[0] << 4 : 0;
736
35.5M
        CONTEXT = ((line_m1 >> 3) & 0x7c) | ((line_m2 >> 3) & 0x380);
737
738
        /* 6.2.5.7 3d */
739
126M
        for (x = 0; x < padded_width; x += 8) {
740
91.3M
            byte result = 0;
741
91.3M
            int x_minor;
742
91.3M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
743
744
91.3M
            if (line1)
745
65.2M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
746
747
91.3M
            if (line2)
748
51.0M
                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 4 : 0);
749
750
            /* This is the speed-critical inner loop. */
751
576M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
752
485M
                int bit;
753
754
485M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
755
485M
                if (bit < 0)
756
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template2 optimized");
757
485M
                result |= bit << (7 - x_minor);
758
485M
                CONTEXT = ((CONTEXT & 0x1bd) << 1) | bit | ((line_m1 >> (10 - x_minor)) & 0x4) | ((line_m2 >> (10 - x_minor)) & 0x80);
759
485M
            }
760
91.3M
            gbreg_line[x >> 3] = result;
761
91.3M
        }
762
#ifdef OUTPUT_PBM
763
        fwrite(gbreg_line, 1, rowstride, stdout);
764
#endif
765
35.5M
        line2 = line1;
766
35.5M
        line1 = gbreg_line;
767
35.5M
        gbreg_line += rowstride;
768
35.5M
    }
769
770
50.2k
    return 0;
771
50.2k
}
772
773
static int
774
jbig2_decode_generic_template3(Jbig2Ctx *ctx,
775
                               Jbig2Segment *segment,
776
                               const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
777
3.76k
{
778
3.76k
    const uint32_t GBW = image->width;
779
3.76k
    const uint32_t GBH = image->height;
780
3.76k
    const uint32_t rowstride = image->stride;
781
3.76k
    byte *line1 = NULL;
782
3.76k
    byte *gbreg_line = (byte *) image->data;
783
3.76k
    uint32_t x, y;
784
785
#ifdef OUTPUT_PBM
786
    printf("P4\n%d %d\n", GBW, GBH);
787
#endif
788
789
3.76k
    if (GBW <= 0)
790
0
        return 0;
791
792
210k
    for (y = 0; y < GBH; y++) {
793
206k
        uint32_t CONTEXT;
794
206k
        uint32_t line_m1;
795
206k
        uint32_t padded_width = (GBW + 7) & -8;
796
797
206k
        line_m1 = line1 ? line1[0] : 0;
798
206k
        CONTEXT = (line_m1 >> 1) & 0x3f0;
799
800
        /* 6.2.5.7 3d */
801
105M
        for (x = 0; x < padded_width; x += 8) {
802
105M
            byte result = 0;
803
105M
            int x_minor;
804
105M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
805
806
105M
            if (line1)
807
72.4M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
808
809
            /* This is the speed-critical inner loop. */
810
947M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
811
842M
                int bit;
812
813
842M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
814
842M
                if (bit < 0)
815
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template3 optimized");
816
842M
                result |= bit << (7 - x_minor);
817
842M
                CONTEXT = ((CONTEXT & 0x1f7) << 1) | bit | ((line_m1 >> (8 - x_minor)) & 0x10);
818
842M
            }
819
105M
            gbreg_line[x >> 3] = result;
820
105M
        }
821
#ifdef OUTPUT_PBM
822
        fwrite(gbreg_line, 1, rowstride, stdout);
823
#endif
824
206k
        line1 = gbreg_line;
825
206k
        gbreg_line += rowstride;
826
206k
    }
827
828
3.76k
    return 0;
829
3.76k
}
830
831
static int
832
jbig2_decode_generic_template3_unopt(Jbig2Ctx *ctx,
833
                                     Jbig2Segment *segment,
834
                                     const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
835
26.2k
{
836
26.2k
    const uint32_t GBW = image->width;
837
26.2k
    const uint32_t GBH = image->height;
838
26.2k
    uint32_t CONTEXT;
839
26.2k
    uint32_t x, y;
840
26.2k
    int bit;
841
842
26.2k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
843
5
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
844
5
                           "adaptive template pixel is out of field");
845
846
137M
    for (y = 0; y < GBH; y++) {
847
137M
        uint32_t out_byte = 0;
848
137M
        int out_bits_to_go_in_byte = 8;
849
137M
        uint8_t *d = &image->data[image->stride * y];
850
137M
        uint8_t *pline  = &image->data[image->stride * (y-1)];
851
137M
        uint32_t pd = 0;
852
137M
        if (y > 0) {
853
137M
            pd = (*pline++ << 8);
854
137M
            if (GBW > 8)
855
6.07M
                pd |= *pline++;
856
137M
        }
857
1.55G
        for (x = 0; x < GBW; x++) {
858
1.41G
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
859
38.4M
                bit = 0;
860
1.37G
            } else {
861
1.37G
                CONTEXT  = out_byte & 0x00F; /* First 4 pixels */
862
1.37G
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
863
1.37G
                CONTEXT |= (pd>>9) & 0x3E0; /* Next 5 pixels */
864
1.37G
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
865
1.37G
                if (bit < 0)
866
0
                    return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template3 unoptimized");
867
1.37G
            }
868
1.41G
            pd = pd<<1;
869
1.41G
            out_byte = (out_byte<<1) | bit;
870
1.41G
            out_bits_to_go_in_byte--;
871
1.41G
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
872
1.41G
            if (out_bits_to_go_in_byte == 0) {
873
155M
                out_bits_to_go_in_byte = 8;
874
155M
                d++;
875
155M
                if (x+9 < GBW && y > 0)
876
81.5M
                    pd |= *pline++;
877
155M
            }
878
1.41G
        }
879
137M
        if (out_bits_to_go_in_byte != 8)
880
136M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
881
137M
    }
882
26.1k
    return 0;
883
26.1k
}
884
885
static void
886
copy_prev_row(Jbig2Image *image, int row)
887
501M
{
888
501M
    if (!row) {
889
        /* no previous row */
890
5.56k
        memset(image->data, 0, image->stride);
891
501M
    } else {
892
        /* duplicate data from the previous row */
893
501M
        uint8_t *src = image->data + (row - 1) * image->stride;
894
895
501M
        memcpy(src + image->stride, src, image->stride);
896
501M
    }
897
501M
}
898
899
static int
900
jbig2_decode_generic_template0_TPGDON(Jbig2Ctx *ctx,
901
                                      Jbig2Segment *segment,
902
                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
903
7.91k
{
904
7.91k
    const uint32_t GBW = image->width;
905
7.91k
    const uint32_t GBH = image->height;
906
7.91k
    uint32_t CONTEXT;
907
7.91k
    uint32_t x, y;
908
7.91k
    int LTP = 0;
909
7.91k
    int gmin, gmax;
910
7.91k
    uint32_t left, right, top;
911
912
7.91k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]) ||
913
7.90k
        pixel_outside_field(params->gbat[2], params->gbat[3]) ||
914
7.89k
        pixel_outside_field(params->gbat[4], params->gbat[5]) ||
915
7.88k
        pixel_outside_field(params->gbat[6], params->gbat[7]))
916
35
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
917
35
                           "adaptive template pixel is out of field");
918
919
    /* JBig2 has 'standard' values for gbat (see 6.2.5.4 of the spec).
920
     * Have an optimised version for those locations. This greatly
921
     * simplifies some of the fetches. It's almost like they thought
922
     * it through. */
923
7.87k
    if (params->gbat[0] ==  3 && params->gbat[1] == -1 &&
924
4.16k
        params->gbat[2] == -3 && params->gbat[3] == -1 &&
925
2.77k
        params->gbat[4] ==  2 && params->gbat[5] == -2 &&
926
2.57k
        params->gbat[6] == -2 && params->gbat[7] == -2)
927
499
    {
928
212M
        for (y = 0; y < GBH; y++) {
929
212M
            int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x9B25]);
930
212M
            if (bit < 0)
931
0
                return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 TPGDON1");
932
212M
            LTP ^= bit;
933
212M
            if (!LTP) {
934
149M
                uint32_t out_byte = 0;
935
149M
                int out_bits_to_go_in_byte = 8;
936
149M
                uint8_t *d = &image->data[image->stride * y];
937
149M
                uint8_t *pline  = y > 0 ? &image->data[image->stride * (y-1)] : NULL;
938
149M
                uint8_t *ppline = y > 1 ? &image->data[image->stride * (y-2)] : NULL;
939
149M
                uint32_t pd = 0;
940
149M
                uint32_t ppd = 0;
941
149M
                if (y > 0 && pline) {
942
149M
                    pd = (*pline++ << 8);
943
149M
                    if (GBW > 8)
944
5.98M
                        pd |= *pline++;
945
149M
                    if (y > 1 && ppline) {
946
149M
                        ppd = (*ppline++ << 8);
947
149M
                        if (GBW > 8)
948
5.98M
                            ppd |= *ppline++;
949
149M
                    }
950
149M
                }
951
1.08G
                for (x = 0; x < GBW; x++) {
952
934M
                    if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
953
0
                        bit = 0;
954
934M
                    } else {
955
934M
                        CONTEXT  = out_byte & 0x00F; /* First 4 pixels */
956
934M
                        CONTEXT |= (pd>>8) & 0x7F0; /* Next 7 pixels */
957
934M
                        CONTEXT |= (ppd>>2) & 0xF800; /* Final 5 pixels */
958
934M
                        bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
959
934M
                        if (bit < 0)
960
0
                            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 TPGDON2");
961
934M
                    }
962
934M
                    pd = pd<<1;
963
934M
                    ppd = ppd<<1;
964
934M
                    out_byte = (out_byte<<1) | bit;
965
934M
                    out_bits_to_go_in_byte--;
966
934M
                    if (out_bits_to_go_in_byte == 0) {
967
92.6M
                        out_bits_to_go_in_byte = 8;
968
92.6M
                        *d++ = (uint8_t)out_byte;
969
92.6M
                        if (x+9 < GBW && y > 0 && pline) {
970
35.0M
                            pd |= *pline++;
971
35.0M
                            if (y > 1 && ppline)
972
32.5M
                                ppd |= *ppline++;
973
35.0M
                        }
974
92.6M
                    }
975
934M
                }
976
149M
                if (out_bits_to_go_in_byte != 8)
977
143M
                    *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
978
149M
            } else {
979
62.3M
                copy_prev_row(image, y);
980
62.3M
            }
981
212M
        }
982
499
        return 0;
983
499
    }
984
985
    /* We divide the width into 3 regions 0..left...right...GBW,
986
     * between left and right, we know that our accesses will never
987
     * step outside the image, enabling us to use faster accessors. */
988
7.37k
    left = 4;
989
7.37k
    right = 2;
990
7.37k
    gmin = gmax = params->gbat[0];
991
7.37k
    if (params->gbat[2] < gmin)
992
2.72k
        gmin = params->gbat[2];
993
7.37k
    if (gmax < params->gbat[2])
994
2.94k
        gmax = params->gbat[2];
995
7.37k
    if (params->gbat[4] < gmin)
996
1.42k
        gmin = params->gbat[4];
997
7.37k
    if (gmax < params->gbat[4])
998
1.08k
        gmax = params->gbat[4];
999
7.37k
    if (params->gbat[6] < gmin)
1000
1.42k
        gmin = params->gbat[6];
1001
7.37k
    if (gmax < params->gbat[6])
1002
3.20k
        gmax = params->gbat[6];
1003
7.37k
    if ((int)left < -gmin)
1004
4.39k
        left = -gmin;
1005
7.37k
    if ((int)right < gmax)
1006
4.01k
        right = gmax;
1007
7.37k
    if (right > GBW)
1008
2.39k
        right = GBW;
1009
7.37k
    right = GBW - right;
1010
    /* So 0 <= x < left or right <= x < GBW needs bounds checking. */
1011
1012
    /* Now we do the same for the height, but here there is no bottom
1013
     * region, as we only ever look up for y. */
1014
7.37k
    top = 2;
1015
7.37k
    gmin = params->gbat[1];
1016
7.37k
    if (params->gbat[3] < gmin)
1017
998
        gmin = params->gbat[3];
1018
7.37k
    if (params->gbat[5] < gmin)
1019
4.18k
        gmin = params->gbat[5];
1020
7.37k
    if (params->gbat[7] < gmin)
1021
2.68k
        gmin = params->gbat[7];
1022
7.37k
    if ((int)top < -gmin)
1023
5.37k
        top = -gmin;
1024
    /* So 0 <= y < top needs bounds checking. */
1025
1026
147M
    for (y = 0; y < GBH; y++) {
1027
147M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x9B25]);
1028
147M
        if (bit < 0)
1029
0
            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 TPGDON1");
1030
147M
        LTP ^= bit;
1031
147M
        if (!LTP) {
1032
76.0M
            uint32_t out_byte = 0;
1033
76.0M
            int out_bits_to_go_in_byte = 8;
1034
76.0M
            uint8_t *d = &image->data[image->stride * y];
1035
76.0M
            uint8_t *pline  = y > 0 ? &image->data[image->stride * (y-1)] : NULL;
1036
76.0M
            uint8_t *ppline = y > 1 ? &image->data[image->stride * (y-2)] : NULL;
1037
76.0M
            uint32_t pd = 0;
1038
76.0M
            uint32_t ppd = 0;
1039
76.0M
            if (y > 0 && pline) {
1040
76.0M
                pd = (*pline++ << 8);
1041
76.0M
                if (GBW > 8)
1042
3.21M
                    pd |= *pline++;
1043
76.0M
                if (y > 1 && ppline) {
1044
76.0M
                    ppd = (*ppline++ << 8);
1045
76.0M
                    if (GBW > 8)
1046
3.21M
                        ppd |= *ppline++;
1047
76.0M
                }
1048
76.0M
            }
1049
1.30G
            for (x = 0; x < GBW; x++) {
1050
1.22G
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1051
0
                    bit = 0;
1052
1.22G
                } else {
1053
1.22G
                    CONTEXT = out_byte & 0x000F; /* First 4 pixels */
1054
1.22G
                    CONTEXT |= (pd>>8) & 0x03E0; /* Skip one, next 5 pixels */
1055
1.22G
                    CONTEXT |= (ppd>>2) & 0x7000; /* Skip 2, next 3 pixels, skip one */
1056
1.22G
                    if (y >= top && x >= left && x < right)
1057
649M
                    {
1058
649M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[0], y + params->gbat[1]) << 4;
1059
649M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[2], y + params->gbat[3]) << 10;
1060
649M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[4], y + params->gbat[5]) << 11;
1061
649M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[6], y + params->gbat[7]) << 15;
1062
649M
                    }
1063
576M
                    else
1064
576M
                    {
1065
576M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
1066
576M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], y + params->gbat[3]) << 10;
1067
576M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], y + params->gbat[5]) << 11;
1068
576M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], y + params->gbat[7]) << 15;
1069
576M
                    }
1070
1.22G
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1071
1.22G
                    if (bit < 0)
1072
0
                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template0 TPGDON2");
1073
1.22G
                }
1074
1.22G
                pd = pd<<1;
1075
1.22G
                ppd = ppd<<1;
1076
1.22G
                out_byte = (out_byte<<1) | bit;
1077
1.22G
                out_bits_to_go_in_byte--;
1078
1.22G
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1079
1.22G
                if (out_bits_to_go_in_byte == 0) {
1080
137M
                    out_bits_to_go_in_byte = 8;
1081
137M
                    d++;
1082
137M
                    if (x+9 < GBW && y > 0 && pline) {
1083
114M
                        pd |= *pline++;
1084
114M
                        if (y > 1 && ppline)
1085
104M
                            ppd |= *ppline++;
1086
114M
                    }
1087
137M
                }
1088
1.22G
            }
1089
76.0M
            if (out_bits_to_go_in_byte != 8)
1090
75.0M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1091
76.0M
        } else {
1092
71.2M
            copy_prev_row(image, y);
1093
71.2M
        }
1094
147M
    }
1095
1096
7.37k
    return 0;
1097
7.37k
}
1098
1099
static int
1100
jbig2_decode_generic_template1_TPGDON(Jbig2Ctx *ctx,
1101
                                      Jbig2Segment *segment,
1102
                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1103
1.62k
{
1104
1.62k
    const uint32_t GBW = image->width;
1105
1.62k
    const uint32_t GBH = image->height;
1106
1.62k
    uint32_t CONTEXT;
1107
1.62k
    uint32_t x, y;
1108
1.62k
    int LTP = 0;
1109
1110
1.62k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
1111
11
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
1112
11
                           "adaptive template pixel is out of field");
1113
1114
244M
    for (y = 0; y < GBH; y++) {
1115
244M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x0795]);
1116
244M
        if (bit < 0)
1117
0
            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template1 TPGDON1");
1118
244M
        LTP ^= bit;
1119
244M
        if (!LTP) {
1120
98.3M
            uint32_t out_byte = 0;
1121
98.3M
            int out_bits_to_go_in_byte = 8;
1122
98.3M
            uint8_t *d = &image->data[image->stride * y];
1123
98.3M
            uint8_t *pline  = y > 0 ? &image->data[image->stride * (y-1)] : NULL;
1124
98.3M
            uint8_t *ppline = y > 1 ? &image->data[image->stride * (y-2)] : NULL;
1125
98.3M
            uint32_t pd = 0;
1126
98.3M
            uint32_t ppd = 0;
1127
98.3M
            if (y > 0 && pline) {
1128
98.3M
                pd = (*pline++ << 8);
1129
98.3M
                if (GBW > 8)
1130
4.22M
                    pd |= *pline++;
1131
98.3M
                if (y > 1 && ppline) {
1132
98.3M
                    ppd = (*ppline++ << 8);
1133
98.3M
                    if (GBW > 8)
1134
4.22M
                        ppd |= *ppline++;
1135
98.3M
                }
1136
98.3M
            }
1137
1.09G
            for (x = 0; x < GBW; x++) {
1138
997M
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1139
0
                    bit = 0;
1140
997M
                } else {
1141
997M
                    CONTEXT  = out_byte & 0x0007; /* First 3 pixels */
1142
997M
                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 3;
1143
997M
                    CONTEXT |= (pd>>9) & 0x01F0; /* next 5 pixels */
1144
997M
                    CONTEXT |= (ppd>>4) & 0x1E00; /* next 4 pixels */
1145
997M
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1146
997M
                    if (bit < 0)
1147
0
                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template1 TPGDON2");
1148
997M
                }
1149
997M
                pd = pd<<1;
1150
997M
                ppd = ppd<<1;
1151
997M
                out_byte = (out_byte<<1) | bit;
1152
997M
                out_bits_to_go_in_byte--;
1153
997M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1154
997M
                if (out_bits_to_go_in_byte == 0) {
1155
95.4M
                    out_bits_to_go_in_byte = 8;
1156
95.4M
                    d++;
1157
95.4M
                    if (x+9 < GBW && y > 0 && pline) {
1158
59.5M
                        pd |= *pline++;
1159
59.5M
                        if (y > 1 && ppline)
1160
53.1M
                            ppd |= *ppline++;
1161
59.5M
                    }
1162
95.4M
                }
1163
997M
            }
1164
98.3M
            if (out_bits_to_go_in_byte != 8)
1165
91.1M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1166
146M
        } else {
1167
146M
            copy_prev_row(image, y);
1168
146M
        }
1169
244M
    }
1170
1171
1.61k
    return 0;
1172
1.61k
}
1173
1174
static int
1175
jbig2_decode_generic_template2_TPGDON(Jbig2Ctx *ctx,
1176
                                      Jbig2Segment *segment,
1177
                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1178
1.37k
{
1179
1.37k
    const uint32_t GBW = image->width;
1180
1.37k
    const uint32_t GBH = image->height;
1181
1.37k
    uint32_t CONTEXT;
1182
1.37k
    uint32_t x, y;
1183
1.37k
    int LTP = 0;
1184
1185
1.37k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
1186
2
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
1187
2
                           "adaptive template pixel is out of field");
1188
1189
230M
    for (y = 0; y < GBH; y++) {
1190
230M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0xE5]);
1191
230M
        if (bit < 0)
1192
0
            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template2 TPGDON1");
1193
230M
        LTP ^= bit;
1194
230M
        if (!LTP) {
1195
115M
            uint32_t out_byte = 0;
1196
115M
            int out_bits_to_go_in_byte = 8;
1197
115M
            uint8_t *d = &image->data[image->stride * y];
1198
115M
            uint8_t *pline  =  y > 0 ? &image->data[image->stride * (y-1)] : NULL;
1199
115M
            uint8_t *ppline = y > 1 ? &image->data[image->stride * (y-2)] : NULL;
1200
115M
            uint32_t pd = 0;
1201
115M
            uint32_t ppd = 0;
1202
115M
            if (y > 0 && pline) {
1203
115M
                pd = (*pline++ << 8);
1204
115M
                if (GBW > 8)
1205
1.10M
                    pd |= *pline++;
1206
115M
                if (y > 1 && ppline) {
1207
115M
                    ppd = (*ppline++ << 8);
1208
115M
                    if (GBW > 8)
1209
1.10M
                        ppd |= *ppline++;
1210
115M
                }
1211
115M
            }
1212
1.16G
            for (x = 0; x < GBW; x++) {
1213
1.04G
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1214
0
                    bit = 0;
1215
1.04G
                } else {
1216
1.04G
                    CONTEXT  = out_byte & 0x003; /* First 2 pixels */
1217
1.04G
                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 2;
1218
1.04G
                    CONTEXT |= (pd>>11) & 0x078; /* next 4 pixels */
1219
1.04G
                    CONTEXT |= (ppd>>7) & 0x380; /* next 3 pixels */
1220
1.04G
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1221
1.04G
                    if (bit < 0)
1222
0
                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template2 TPGDON2");
1223
1.04G
                }
1224
1.04G
                pd = pd<<1;
1225
1.04G
                ppd = ppd<<1;
1226
1.04G
                out_byte = (out_byte<<1) | bit;
1227
1.04G
                out_bits_to_go_in_byte--;
1228
1.04G
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1229
1.04G
                if (out_bits_to_go_in_byte == 0) {
1230
81.7M
                    out_bits_to_go_in_byte = 8;
1231
81.7M
                    d++;
1232
81.7M
                    if (x+9 < GBW && y > 0 && pline) {
1233
68.3M
                        pd |= *pline++;
1234
68.3M
                        if (y > 1 && ppline)
1235
42.7M
                            ppd |= *ppline++;
1236
68.3M
                    }
1237
81.7M
                }
1238
1.04G
            }
1239
115M
            if (out_bits_to_go_in_byte != 8)
1240
114M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1241
115M
        } else {
1242
114M
            copy_prev_row(image, y);
1243
114M
        }
1244
230M
    }
1245
1246
1.36k
    return 0;
1247
1.36k
}
1248
1249
static int
1250
jbig2_decode_generic_template3_TPGDON(Jbig2Ctx *ctx,
1251
                                      Jbig2Segment *segment,
1252
                                      const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1253
1.14k
{
1254
1.14k
    const uint32_t GBW = image->width;
1255
1.14k
    const uint32_t GBH = image->height;
1256
1.14k
    uint32_t CONTEXT;
1257
1.14k
    uint32_t x, y;
1258
1.14k
    int LTP = 0;
1259
1260
1.14k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
1261
2
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
1262
2
                           "adaptive template pixel is out of field");
1263
1264
188M
    for (y = 0; y < GBH; y++) {
1265
188M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x0195]);
1266
188M
        if (bit < 0)
1267
0
            return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template3 TPGDON1");
1268
188M
        LTP ^= bit;
1269
188M
        if (!LTP) {
1270
80.9M
            uint32_t out_byte = 0;
1271
80.9M
            int out_bits_to_go_in_byte = 8;
1272
80.9M
            uint8_t *d = &image->data[image->stride * y];
1273
80.9M
            uint8_t *pline  = y > 0 ? &image->data[image->stride * (y-1)] : NULL;
1274
80.9M
            uint32_t pd = 0;
1275
80.9M
            if (y > 0 && pline) {
1276
80.9M
                pd = (*pline++ << 8);
1277
80.9M
                if (GBW > 8)
1278
1.58M
                    pd |= *pline++;
1279
80.9M
            }
1280
1.14G
            for (x = 0; x < GBW; x++) {
1281
1.06G
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1282
0
                    bit = 0;
1283
1.06G
                } else {
1284
1.06G
                    CONTEXT  = out_byte & 0x0F; /* First 4 pixels */
1285
1.06G
                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
1286
1.06G
                    CONTEXT |= (pd>>9) & 0x3E0; /* next 5 pixels */
1287
1.06G
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1288
1.06G
                    if (bit < 0)
1289
0
                        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode arithmetic code when handling generic template3 TPGDON2");
1290
1.06G
                }
1291
1.06G
                pd = pd<<1;
1292
1.06G
                out_byte = (out_byte<<1) | bit;
1293
1.06G
                out_bits_to_go_in_byte--;
1294
1.06G
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1295
1.06G
                if (out_bits_to_go_in_byte == 0) {
1296
112M
                    out_bits_to_go_in_byte = 8;
1297
112M
                    d++;
1298
112M
                    if (x+9 < GBW && y > 0 && pline)
1299
74.2M
                        pd |= *pline++;
1300
112M
                }
1301
1.06G
            }
1302
80.9M
            if (out_bits_to_go_in_byte != 8)
1303
68.8M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1304
107M
        } else {
1305
107M
            copy_prev_row(image, y);
1306
107M
        }
1307
188M
    }
1308
1309
1.14k
    return 0;
1310
1.14k
}
1311
1312
static int
1313
jbig2_decode_generic_region_TPGDON(Jbig2Ctx *ctx,
1314
                                   Jbig2Segment *segment,
1315
                                   const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1316
12.0k
{
1317
12.0k
    switch (params->GBTEMPLATE) {
1318
7.91k
    case 0:
1319
7.91k
        return jbig2_decode_generic_template0_TPGDON(ctx, segment, params, as, image, GB_stats);
1320
1.62k
    case 1:
1321
1.62k
        return jbig2_decode_generic_template1_TPGDON(ctx, segment, params, as, image, GB_stats);
1322
1.37k
    case 2:
1323
1.37k
        return jbig2_decode_generic_template2_TPGDON(ctx, segment, params, as, image, GB_stats);
1324
1.14k
    case 3:
1325
1.14k
        return jbig2_decode_generic_template3_TPGDON(ctx, segment, params, as, image, GB_stats);
1326
12.0k
    }
1327
1328
0
    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "unsupported GBTEMPLATE (%d)", params->GBTEMPLATE);
1329
12.0k
}
1330
1331
/**
1332
 * jbig2_decode_generic_region: Decode a generic region.
1333
 * @ctx: The context for allocation and error reporting.
1334
 * @segment: A segment reference for error reporting.
1335
 * @params: Decoding parameter set.
1336
 * @as: Arithmetic decoder state.
1337
 * @image: Where to store the decoded data.
1338
 * @GB_stats: Arithmetic stats.
1339
 *
1340
 * Decodes a generic region, according to section 6.2. The caller should
1341
 * pass an already allocated Jbig2Image object for @image
1342
 *
1343
 * Because this API is based on an arithmetic decoding state, it is
1344
 * not suitable for MMR decoding.
1345
 *
1346
 * Return code: 0 on success.
1347
 **/
1348
int
1349
jbig2_decode_generic_region(Jbig2Ctx *ctx,
1350
                            Jbig2Segment *segment, const Jbig2GenericRegionParams *params, Jbig2ArithState *as, Jbig2Image *image, Jbig2ArithCx *GB_stats)
1351
181k
{
1352
181k
    const int8_t *gbat = params->gbat;
1353
1354
181k
    if (!params->MMR && params->TPGDON)
1355
12.0k
        return jbig2_decode_generic_region_TPGDON(ctx, segment, params, as, image, GB_stats);
1356
1357
169k
    if (!params->MMR && params->GBTEMPLATE == 0) {
1358
12.5k
        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)
1359
4.08k
            return jbig2_decode_generic_template0(ctx, segment, params, as, image, GB_stats);
1360
8.44k
        else
1361
8.44k
            return jbig2_decode_generic_template0_unopt(ctx, segment, params, as, image, GB_stats);
1362
156k
    } else if (!params->MMR && params->GBTEMPLATE == 1) {
1363
4.21k
        if (!params->USESKIP && gbat[0] == +3 && gbat[1] == -1)
1364
1.09k
            return jbig2_decode_generic_template1(ctx, segment, params, as, image, GB_stats);
1365
3.12k
        else
1366
3.12k
            return jbig2_decode_generic_template1_unopt(ctx, segment, params, as, image, GB_stats);
1367
4.21k
    }
1368
152k
    else if (!params->MMR && params->GBTEMPLATE == 2) {
1369
122k
        if (!params->USESKIP && gbat[0] == 2 && gbat[1] == -1)
1370
50.2k
            return jbig2_decode_generic_template2(ctx, segment, params, as, image, GB_stats);
1371
72.3k
        else
1372
72.3k
            return jbig2_decode_generic_template2_unopt(ctx, segment, params, as, image, GB_stats);
1373
122k
    } else if (!params->MMR && params->GBTEMPLATE == 3) {
1374
29.9k
        if (!params->USESKIP && gbat[0] == 2 && gbat[1] == -1)
1375
3.76k
            return jbig2_decode_generic_template3(ctx, segment, params, as, image, GB_stats);
1376
26.2k
        else
1377
26.2k
            return jbig2_decode_generic_template3_unopt(ctx, segment, params, as, image, GB_stats);
1378
29.9k
    }
1379
1380
0
    {
1381
0
        int i;
1382
1383
0
        for (i = 0; i < 8; i++)
1384
0
            jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, "gbat[%d] = %d", i, params->gbat[i]);
1385
0
    }
1386
1387
0
    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "unsupported generic region (MMR=%d, GBTEMPLATE=%d)", params->MMR, params->GBTEMPLATE);
1388
169k
}
1389
1390
/**
1391
 * Handler for immediate generic region segments
1392
 */
1393
int
1394
jbig2_immediate_generic_region(Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data)
1395
15.8k
{
1396
15.8k
    Jbig2RegionSegmentInfo rsi;
1397
15.8k
    byte seg_flags;
1398
15.8k
    int8_t gbat[8];
1399
15.8k
    int offset;
1400
15.8k
    uint32_t gbat_bytes = 0;
1401
15.8k
    Jbig2GenericRegionParams params;
1402
15.8k
    int code = 0;
1403
15.8k
    Jbig2Image *image = NULL;
1404
15.8k
    Jbig2WordStream *ws = NULL;
1405
15.8k
    Jbig2ArithState *as = NULL;
1406
15.8k
    Jbig2ArithCx *GB_stats = NULL;
1407
15.8k
    uint32_t height;
1408
15.8k
    Jbig2Page *page = &ctx->pages[ctx->current_page];
1409
1410
    /* 7.4.6 */
1411
15.8k
    if (segment->data_length < 18)
1412
34
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment too short");
1413
1414
15.8k
    jbig2_get_region_segment_info(&rsi, segment_data);
1415
15.8k
    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);
1416
1417
    /* 7.4.6.4 */
1418
15.8k
    height = rsi.height;
1419
15.8k
    if (segment->rows != UINT32_MAX) {
1420
9.88k
        if (segment->rows > rsi.height)
1421
53
            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment contains more rows than stated in header");
1422
9.82k
        height = segment->rows;
1423
9.82k
    }
1424
1425
    /* 7.4.6.2 */
1426
15.7k
    seg_flags = segment_data[17];
1427
15.7k
    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, "segment flags = %02x", seg_flags);
1428
15.7k
    if ((seg_flags & 1) && (seg_flags & 6))
1429
410
        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "MMR is 1, but GBTEMPLATE is not 0");
1430
1431
    /* 7.4.6.3 */
1432
15.7k
    if (!(seg_flags & 1)) {
1433
14.6k
        gbat_bytes = (seg_flags & 6) ? 2 : 8;
1434
14.6k
        if (18 + gbat_bytes > segment->data_length)
1435
11
            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment too short");
1436
14.6k
        memcpy(gbat, segment_data + 18, gbat_bytes);
1437
14.6k
        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, "gbat: %d, %d", gbat[0], gbat[1]);
1438
14.6k
    }
1439
1440
15.7k
    offset = 18 + gbat_bytes;
1441
1442
    /* Check for T.88 amendment 2 */
1443
15.7k
    if ((seg_flags >> 5) & 1)
1444
49
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment uses 12 adaptive template pixels (NYI)");
1445
1446
    /* Table 34 */
1447
15.7k
    params.MMR = seg_flags & 1;
1448
15.7k
    params.GBTEMPLATE = (seg_flags & 6) >> 1;
1449
15.7k
    params.TPGDON = (seg_flags & 8) >> 3;
1450
15.7k
    params.USESKIP = 0;
1451
15.7k
    memcpy(params.gbat, gbat, gbat_bytes);
1452
1453
15.7k
    if (page->height == 0xffffffff && page->striped && page->stripe_size > 0) {
1454
7.24k
        if (rsi.y >= page->end_row + page->stripe_size) {
1455
1.60k
            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);
1456
1.60k
            return 0;
1457
1.60k
        }
1458
5.63k
        if (height > page->end_row + page->stripe_size) {
1459
4.18k
            height = page->end_row + page->stripe_size;
1460
4.18k
        }
1461
8.49k
    } else {
1462
8.49k
        if (rsi.y >= page->height) {
1463
674
            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);
1464
674
            return 0;
1465
674
        }
1466
7.81k
        if (height > page->height - rsi .y) {
1467
6.37k
            height = page->height - rsi.y;
1468
6.37k
        }
1469
7.81k
    }
1470
13.4k
    if (height == 0) {
1471
425
        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "nothing remains of region, ignoring");
1472
425
        return 0;
1473
425
    }
1474
1475
13.0k
    image = jbig2_image_new(ctx, rsi.width, height);
1476
13.0k
    if (image == NULL)
1477
97
        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to allocate generic image");
1478
12.9k
    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, "allocated %d x %d image buffer for region decode results", rsi.width, height);
1479
1480
12.9k
    if (params.MMR) {
1481
651
        code = jbig2_decode_generic_mmr(ctx, segment, &params, segment_data + offset, segment->data_length - offset, image);
1482
651
        if (code < 0) {
1483
18
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode MMR-coded generic region");
1484
18
            goto cleanup;
1485
18
        }
1486
12.2k
    } else {
1487
12.2k
        int stats_size = jbig2_generic_stats_size(ctx, params.GBTEMPLATE);
1488
1489
12.2k
        GB_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);
1490
12.2k
        if (GB_stats == NULL) {
1491
1
            code = jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "failed to allocate arithmetic decoder states when handling immediate generic region");
1492
1
            goto cleanup;
1493
1
        }
1494
12.2k
        memset(GB_stats, 0, stats_size);
1495
1496
12.2k
        ws = jbig2_word_stream_buf_new(ctx, segment_data + offset, segment->data_length - offset);
1497
12.2k
        if (ws == NULL) {
1498
1
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to allocated word stream when handling immediate generic region");
1499
1
            goto cleanup;
1500
1
        }
1501
12.2k
        as = jbig2_arith_new(ctx, ws);
1502
12.2k
        if (as == NULL) {
1503
5
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to allocate arithmetic coding state when handling immediate generic region");
1504
5
            goto cleanup;
1505
5
        }
1506
12.2k
        code = jbig2_decode_generic_region(ctx, segment, &params, as, image, GB_stats);
1507
12.2k
        if (code < 0) {
1508
81
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode immediate generic region");
1509
81
            goto cleanup;
1510
81
        }
1511
12.2k
    }
1512
1513
12.8k
    code = jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], image, rsi.x, rsi.y, rsi.op);
1514
12.8k
    if (code < 0)
1515
726
        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "unable to add result to page");
1516
1517
12.9k
cleanup:
1518
12.9k
    jbig2_free(ctx->allocator, as);
1519
12.9k
    jbig2_word_stream_buf_free(ctx, ws);
1520
12.9k
    jbig2_free(ctx->allocator, GB_stats);
1521
12.9k
    jbig2_image_release(ctx, image);
1522
1523
12.9k
    return code;
1524
12.8k
}