Coverage Report

Created: 2025-09-29 06:40

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
1.79G
{
349
1.79G
    const int byte = (x >> 3) + y * image->stride;
350
1.79G
    const int bit = 7 - (x & 7);
351
352
1.79G
    return ((image->data[byte] >> bit) & 1);
353
1.79G
}
354
355
/* return the appropriate context size for the given template */
356
int
357
jbig2_generic_stats_size(Jbig2Ctx *ctx, int template)
358
11.4k
{
359
11.4k
    int stats_size = template == 0 ? 1 << 16 : template == 1 ? 1 << 13 : 1 << 10;
360
361
11.4k
    return stats_size;
362
11.4k
}
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
32.3k
{
370
32.3k
    const uint32_t GBW = image->width;
371
32.3k
    const uint32_t GBH = image->height;
372
32.3k
    const uint32_t rowstride = image->stride;
373
32.3k
    uint32_t x, y;
374
32.3k
    byte *line2 = NULL;
375
32.3k
    byte *line1 = NULL;
376
32.3k
    byte *gbreg_line = (byte *) image->data;
377
378
#ifdef OUTPUT_PBM
379
    printf("P4\n%d %d\n", GBW, GBH);
380
#endif
381
382
32.3k
    if (GBW <= 0)
383
0
        return 0;
384
385
148k
    for (y = 0; y < GBH; y++) {
386
116k
        uint32_t CONTEXT;
387
116k
        uint32_t line_m1;
388
116k
        uint32_t line_m2;
389
116k
        uint32_t padded_width = (GBW + 7) & -8;
390
391
116k
        line_m1 = line1 ? line1[0] : 0;
392
116k
        line_m2 = line2 ? line2[0] << 6 : 0;
393
116k
        CONTEXT = (line_m1 & 0x7f0) | (line_m2 & 0xf800);
394
395
        /* 6.2.5.7 3d */
396
155M
        for (x = 0; x < padded_width; x += 8) {
397
155M
            byte result = 0;
398
155M
            int x_minor;
399
155M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
400
401
155M
            if (line1)
402
70.0M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
403
404
155M
            if (line2)
405
55.5M
                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 6 : 0);
406
407
            /* This is the speed-critical inner loop. */
408
1.39G
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
409
1.24G
                int bit;
410
411
1.24G
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
412
1.24G
                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
1.24G
                result |= bit << (7 - x_minor);
415
1.24G
                CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bit | ((line_m1 >> (7 - x_minor)) & 0x10) | ((line_m2 >> (7 - x_minor)) & 0x800);
416
1.24G
            }
417
155M
            gbreg_line[x >> 3] = result;
418
155M
        }
419
#ifdef OUTPUT_PBM
420
        fwrite(gbreg_line, 1, rowstride, stdout);
421
#endif
422
116k
        line2 = line1;
423
116k
        line1 = gbreg_line;
424
116k
        gbreg_line += rowstride;
425
116k
    }
426
427
32.3k
    return 0;
428
32.3k
}
429
430
#define pixel_outside_field(x, y) \
431
161k
    ((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
9.83k
{
438
9.83k
    const uint32_t GBW = image->width;
439
9.83k
    const uint32_t GBH = image->height;
440
9.83k
    uint32_t CONTEXT;
441
9.83k
    uint32_t x, y;
442
9.83k
    int bit;
443
444
9.83k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]) ||
445
9.82k
        pixel_outside_field(params->gbat[2], params->gbat[3]) ||
446
9.81k
        pixel_outside_field(params->gbat[4], params->gbat[5]) ||
447
9.80k
        pixel_outside_field(params->gbat[6], params->gbat[7]))
448
35
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
449
35
                           "adaptive template pixel is out of field");
450
451
155M
    for (y = 0; y < GBH; y++) {
452
155M
        uint32_t out_byte = 0;
453
155M
        int out_bits_to_go_in_byte = 8;
454
155M
        uint8_t *d = &image->data[image->stride * y];
455
155M
        uint32_t pd = 0;
456
155M
        uint32_t ppd = 0;
457
155M
        uint8_t *pline = NULL;
458
155M
        uint8_t *ppline = NULL;
459
155M
        if (y >= 1)
460
155M
        {
461
155M
            pline  = &image->data[image->stride * (y-1)];
462
155M
            pd = (*pline++ << 8);
463
155M
            if (GBW > 8)
464
278k
                pd |= *pline++;
465
155M
        }
466
155M
        if (y >= 2) {
467
155M
            ppline = &image->data[image->stride * (y-2)];
468
155M
            ppd = (*ppline++ << 8);
469
155M
            if (GBW > 8)
470
269k
                ppd |= *ppline++;
471
155M
        }
472
1.05G
        for (x = 0; x < GBW; x++) {
473
900M
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
474
146M
                bit = 0;
475
754M
            } else {
476
754M
                CONTEXT  = out_byte & 0x000F; /* First 4 pixels */
477
754M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
478
754M
                CONTEXT |= (pd>>8) & 0x03E0; /* Next 5 pixels */
479
754M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], y + params->gbat[3]) << 10;
480
754M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], y + params->gbat[5]) << 11;
481
754M
                CONTEXT |= (ppd>>2) & 0x7000; /* Next 3 pixels */
482
754M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], y + params->gbat[7]) << 15;
483
754M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
484
754M
                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
754M
            }
487
900M
            pd = pd<<1;
488
900M
            ppd = ppd<<1;
489
900M
            out_byte = (out_byte<<1) | bit;
490
900M
            out_bits_to_go_in_byte--;
491
900M
            *d = out_byte<<out_bits_to_go_in_byte;
492
900M
            if (out_bits_to_go_in_byte == 0) {
493
82.8M
                out_bits_to_go_in_byte = 8;
494
82.8M
                d++;
495
82.8M
                if (x+9 < GBW && pline != NULL) {
496
50.4M
                    pd |= *pline++;
497
50.4M
                    if (ppline != NULL)
498
40.2M
                        ppd |= *ppline++;
499
50.4M
                }
500
82.8M
            }
501
900M
        }
502
155M
        if (out_bits_to_go_in_byte != 8)
503
155M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
504
155M
    }
505
9.79k
    return 0;
506
9.79k
}
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.10k
{
513
3.10k
    const uint32_t GBW = image->width;
514
3.10k
    const uint32_t GBH = image->height;
515
3.10k
    uint32_t CONTEXT;
516
3.10k
    uint32_t x, y;
517
3.10k
    int bit;
518
519
3.10k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
520
8
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
521
8
                           "adaptive template pixel is out of field");
522
523
109M
    for (y = 0; y < GBH; y++) {
524
109M
        uint32_t out_byte = 0;
525
109M
        int out_bits_to_go_in_byte = 8;
526
109M
        uint8_t *d = &image->data[image->stride * y];
527
109M
        uint32_t pd = 0;
528
109M
        uint32_t ppd = 0;
529
109M
        uint8_t *pline = NULL;
530
109M
        uint8_t *ppline = NULL;
531
109M
        if (y >= 1) {
532
109M
            pline  = &image->data[image->stride * (y-1)];
533
109M
            pd = (*pline++ << 8);
534
109M
            if (GBW > 8)
535
362k
                pd |= *pline++;
536
109M
        }
537
109M
        if (y >= 2) {
538
109M
            ppline = &image->data[image->stride * (y-2)];
539
109M
            ppd = (*ppline++ << 8);
540
109M
            if (GBW > 8)
541
359k
                ppd |= *ppline++;
542
109M
        }
543
940M
        for (x = 0; x < GBW; x++) {
544
830M
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
545
61.5M
                bit = 0;
546
768M
            } else {
547
768M
                CONTEXT  = out_byte & 0x0007; /* First 3 pixels */
548
768M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 3;
549
768M
                CONTEXT |= (pd>>9) & 0x01F0; /* Next 5 pixels */
550
768M
                CONTEXT |= (ppd>>4) & 0x1E00; /* Next 4 pixels */
551
768M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
552
768M
                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
768M
            }
555
830M
            pd = pd<<1;
556
830M
            ppd = ppd<<1;
557
830M
            out_byte = (out_byte<<1) | bit;
558
830M
            out_bits_to_go_in_byte--;
559
830M
            *d = out_byte<<out_bits_to_go_in_byte;
560
830M
            if (out_bits_to_go_in_byte == 0) {
561
87.7M
                out_bits_to_go_in_byte = 8;
562
87.7M
                d++;
563
87.7M
                if (x+9 < GBW && pline != NULL) {
564
40.6M
                    pd |= *pline++;
565
40.6M
                    if (ppline != NULL)
566
33.2M
                        ppd |= *ppline++;
567
40.6M
                }
568
87.7M
            }
569
830M
        }
570
109M
        if (out_bits_to_go_in_byte != 8)
571
96.3M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
572
109M
    }
573
3.10k
    return 0;
574
3.10k
}
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.78k
{
581
1.78k
    const uint32_t GBW = image->width;
582
1.78k
    const uint32_t GBH = image->height;
583
1.78k
    const uint32_t rowstride = image->stride;
584
1.78k
    uint32_t x, y;
585
1.78k
    byte *line2 = NULL;
586
1.78k
    byte *line1 = NULL;
587
1.78k
    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.78k
    if (GBW <= 0)
594
0
        return 0;
595
596
194k
    for (y = 0; y < GBH; y++) {
597
192k
        uint32_t CONTEXT;
598
192k
        uint32_t line_m1;
599
192k
        uint32_t line_m2;
600
192k
        uint32_t padded_width = (GBW + 7) & -8;
601
602
192k
        line_m1 = line1 ? line1[0] : 0;
603
192k
        line_m2 = line2 ? line2[0] << 5 : 0;
604
192k
        CONTEXT = ((line_m1 >> 1) & 0x1f8) | ((line_m2 >> 1) & 0x1e00);
605
606
        /* 6.2.5.7 3d */
607
70.1M
        for (x = 0; x < padded_width; x += 8) {
608
69.9M
            byte result = 0;
609
69.9M
            int x_minor;
610
69.9M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
611
612
69.9M
            if (line1)
613
28.5M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
614
615
69.9M
            if (line2)
616
19.7M
                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 5 : 0);
617
618
            /* This is the speed-critical inner loop. */
619
627M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
620
558M
                int bit;
621
622
558M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
623
558M
                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
558M
                result |= bit << (7 - x_minor);
626
558M
                CONTEXT = ((CONTEXT & 0xefb) << 1) | bit | ((line_m1 >> (8 - x_minor)) & 0x8) | ((line_m2 >> (8 - x_minor)) & 0x200);
627
558M
            }
628
69.9M
            gbreg_line[x >> 3] = result;
629
69.9M
        }
630
#ifdef OUTPUT_PBM
631
        fwrite(gbreg_line, 1, rowstride, stdout);
632
#endif
633
192k
        line2 = line1;
634
192k
        line1 = gbreg_line;
635
192k
        gbreg_line += rowstride;
636
192k
    }
637
638
1.78k
    return 0;
639
1.78k
}
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
40.3k
{
646
40.3k
    const uint32_t GBW = image->width;
647
40.3k
    const uint32_t GBH = image->height;
648
40.3k
    uint32_t CONTEXT;
649
40.3k
    uint32_t x, y;
650
40.3k
    int bit;
651
652
40.3k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
653
3
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
654
3
                           "adaptive template pixel is out of field");
655
656
117M
    for (y = 0; y < GBH; y++) {
657
117M
        uint32_t out_byte = 0;
658
117M
        int out_bits_to_go_in_byte = 8;
659
117M
        uint8_t *d = &image->data[image->stride * y];
660
117M
        uint8_t *pline  = &image->data[image->stride * (y-1)];
661
117M
        uint8_t *ppline = &image->data[image->stride * (y-2)];
662
117M
        uint32_t pd = 0;
663
117M
        uint32_t ppd = 0;
664
117M
        if (y > 0) {
665
116M
            pd = (*pline++ << 8);
666
116M
            if (GBW > 8)
667
1.58M
                pd |= *pline++;
668
116M
            if (y > 1) {
669
116M
                ppd = (*ppline++ << 8);
670
116M
                if (GBW > 8)
671
1.54M
                    ppd |= *ppline++;
672
116M
            }
673
116M
        }
674
1.31G
        for (x = 0; x < GBW; x++) {
675
1.19G
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
676
108M
                bit = 0;
677
1.08G
            } else {
678
1.08G
                CONTEXT  = out_byte & 0x003; /* First 2 pixels */
679
1.08G
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 2;
680
1.08G
                CONTEXT |= (pd>>11) & 0x078; /* Next 4 pixels */
681
1.08G
                CONTEXT |= (ppd>>7) & 0x380; /* Next 3 pixels */
682
1.08G
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
683
1.08G
                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.08G
            }
686
1.19G
            pd = pd<<1;
687
1.19G
            ppd = ppd<<1;
688
1.19G
            out_byte = (out_byte<<1) | bit;
689
1.19G
            out_bits_to_go_in_byte--;
690
1.19G
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
691
1.19G
            if (out_bits_to_go_in_byte == 0) {
692
134M
                out_bits_to_go_in_byte = 8;
693
134M
                d++;
694
134M
                if (x+9 < GBW && y > 0) {
695
78.5M
                    pd |= *pline++;
696
78.5M
                    if (y > 1)
697
67.2M
                        ppd |= *ppline++;
698
78.5M
                }
699
134M
            }
700
1.19G
        }
701
117M
        if (out_bits_to_go_in_byte != 8)
702
116M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
703
117M
    }
704
705
40.3k
    return 0;
706
40.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
4.31k
{
713
4.31k
    const uint32_t GBW = image->width;
714
4.31k
    const uint32_t GBH = image->height;
715
4.31k
    const uint32_t rowstride = image->stride;
716
4.31k
    uint32_t x, y;
717
4.31k
    byte *line2 = NULL;
718
4.31k
    byte *line1 = NULL;
719
4.31k
    byte *gbreg_line = (byte *) image->data;
720
721
#ifdef OUTPUT_PBM
722
    printf("P4\n%d %d\n", GBW, GBH);
723
#endif
724
725
4.31k
    if (GBW <= 0)
726
0
        return 0;
727
728
127M
    for (y = 0; y < GBH; y++) {
729
127M
        uint32_t CONTEXT;
730
127M
        uint32_t line_m1;
731
127M
        uint32_t line_m2;
732
127M
        uint32_t padded_width = (GBW + 7) & -8;
733
734
127M
        line_m1 = line1 ? line1[0] : 0;
735
127M
        line_m2 = line2 ? line2[0] << 4 : 0;
736
127M
        CONTEXT = ((line_m1 >> 3) & 0x7c) | ((line_m2 >> 3) & 0x380);
737
738
        /* 6.2.5.7 3d */
739
303M
        for (x = 0; x < padded_width; x += 8) {
740
175M
            byte result = 0;
741
175M
            int x_minor;
742
175M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
743
744
175M
            if (line1)
745
158M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
746
747
175M
            if (line2)
748
141M
                line_m2 = (line_m2 << 8) | (x + 8 < GBW ? line2[(x >> 3) + 1] << 4 : 0);
749
750
            /* This is the speed-critical inner loop. */
751
850M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
752
674M
                int bit;
753
754
674M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
755
674M
                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
674M
                result |= bit << (7 - x_minor);
758
674M
                CONTEXT = ((CONTEXT & 0x1bd) << 1) | bit | ((line_m1 >> (10 - x_minor)) & 0x4) | ((line_m2 >> (10 - x_minor)) & 0x80);
759
674M
            }
760
175M
            gbreg_line[x >> 3] = result;
761
175M
        }
762
#ifdef OUTPUT_PBM
763
        fwrite(gbreg_line, 1, rowstride, stdout);
764
#endif
765
127M
        line2 = line1;
766
127M
        line1 = gbreg_line;
767
127M
        gbreg_line += rowstride;
768
127M
    }
769
770
4.31k
    return 0;
771
4.31k
}
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
50.0k
{
778
50.0k
    const uint32_t GBW = image->width;
779
50.0k
    const uint32_t GBH = image->height;
780
50.0k
    const uint32_t rowstride = image->stride;
781
50.0k
    byte *line1 = NULL;
782
50.0k
    byte *gbreg_line = (byte *) image->data;
783
50.0k
    uint32_t x, y;
784
785
#ifdef OUTPUT_PBM
786
    printf("P4\n%d %d\n", GBW, GBH);
787
#endif
788
789
50.0k
    if (GBW <= 0)
790
0
        return 0;
791
792
504k
    for (y = 0; y < GBH; y++) {
793
453k
        uint32_t CONTEXT;
794
453k
        uint32_t line_m1;
795
453k
        uint32_t padded_width = (GBW + 7) & -8;
796
797
453k
        line_m1 = line1 ? line1[0] : 0;
798
453k
        CONTEXT = (line_m1 >> 1) & 0x3f0;
799
800
        /* 6.2.5.7 3d */
801
101M
        for (x = 0; x < padded_width; x += 8) {
802
100M
            byte result = 0;
803
100M
            int x_minor;
804
100M
            int minor_width = GBW - x > 8 ? 8 : GBW - x;
805
806
100M
            if (line1)
807
56.2M
                line_m1 = (line_m1 << 8) | (x + 8 < GBW ? line1[(x >> 3) + 1] : 0);
808
809
            /* This is the speed-critical inner loop. */
810
902M
            for (x_minor = 0; x_minor < minor_width; x_minor++) {
811
802M
                int bit;
812
813
802M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
814
802M
                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
802M
                result |= bit << (7 - x_minor);
817
802M
                CONTEXT = ((CONTEXT & 0x1f7) << 1) | bit | ((line_m1 >> (8 - x_minor)) & 0x10);
818
802M
            }
819
100M
            gbreg_line[x >> 3] = result;
820
100M
        }
821
#ifdef OUTPUT_PBM
822
        fwrite(gbreg_line, 1, rowstride, stdout);
823
#endif
824
453k
        line1 = gbreg_line;
825
453k
        gbreg_line += rowstride;
826
453k
    }
827
828
50.0k
    return 0;
829
50.0k
}
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
6.34k
{
836
6.34k
    const uint32_t GBW = image->width;
837
6.34k
    const uint32_t GBH = image->height;
838
6.34k
    uint32_t CONTEXT;
839
6.34k
    uint32_t x, y;
840
6.34k
    int bit;
841
842
6.34k
    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
54.9M
    for (y = 0; y < GBH; y++) {
847
54.9M
        uint32_t out_byte = 0;
848
54.9M
        int out_bits_to_go_in_byte = 8;
849
54.9M
        uint8_t *d = &image->data[image->stride * y];
850
54.9M
        uint8_t *pline  = &image->data[image->stride * (y-1)];
851
54.9M
        uint32_t pd = 0;
852
54.9M
        if (y > 0) {
853
54.9M
            pd = (*pline++ << 8);
854
54.9M
            if (GBW > 8)
855
1.10M
                pd |= *pline++;
856
54.9M
        }
857
1.00G
        for (x = 0; x < GBW; x++) {
858
948M
            if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
859
120M
                bit = 0;
860
828M
            } else {
861
828M
                CONTEXT  = out_byte & 0x00F; /* First 4 pixels */
862
828M
                CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
863
828M
                CONTEXT |= (pd>>9) & 0x3E0; /* Next 5 pixels */
864
828M
                bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
865
828M
                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
828M
            }
868
948M
            pd = pd<<1;
869
948M
            out_byte = (out_byte<<1) | bit;
870
948M
            out_bits_to_go_in_byte--;
871
948M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
872
948M
            if (out_bits_to_go_in_byte == 0) {
873
106M
                out_bits_to_go_in_byte = 8;
874
106M
                d++;
875
106M
                if (x+9 < GBW && y > 0)
876
67.5M
                    pd |= *pline++;
877
106M
            }
878
948M
        }
879
54.9M
        if (out_bits_to_go_in_byte != 8)
880
54.8M
            *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
881
54.9M
    }
882
6.33k
    return 0;
883
6.33k
}
884
885
static void
886
copy_prev_row(Jbig2Image *image, int row)
887
211M
{
888
211M
    if (!row) {
889
        /* no previous row */
890
5.67k
        memset(image->data, 0, image->stride);
891
211M
    } else {
892
        /* duplicate data from the previous row */
893
211M
        uint8_t *src = image->data + (row - 1) * image->stride;
894
895
211M
        memcpy(src + image->stride, src, image->stride);
896
211M
    }
897
211M
}
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
5.43k
{
904
5.43k
    const uint32_t GBW = image->width;
905
5.43k
    const uint32_t GBH = image->height;
906
5.43k
    uint32_t CONTEXT;
907
5.43k
    uint32_t x, y;
908
5.43k
    int LTP = 0;
909
5.43k
    int gmin, gmax;
910
5.43k
    uint32_t left, right, top;
911
912
5.43k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]) ||
913
5.42k
        pixel_outside_field(params->gbat[2], params->gbat[3]) ||
914
5.42k
        pixel_outside_field(params->gbat[4], params->gbat[5]) ||
915
5.40k
        pixel_outside_field(params->gbat[6], params->gbat[7]))
916
38
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
917
38
                           "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
5.39k
    if (params->gbat[0] ==  3 && params->gbat[1] == -1 &&
924
3.25k
        params->gbat[2] == -3 && params->gbat[3] == -1 &&
925
2.20k
        params->gbat[4] ==  2 && params->gbat[5] == -2 &&
926
2.06k
        params->gbat[6] == -2 && params->gbat[7] == -2)
927
500
    {
928
88.5M
        for (y = 0; y < GBH; y++) {
929
88.5M
            int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x9B25]);
930
88.5M
            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
88.5M
            LTP ^= bit;
933
88.5M
            if (!LTP) {
934
45.4M
                uint32_t out_byte = 0;
935
45.4M
                int out_bits_to_go_in_byte = 8;
936
45.4M
                uint8_t *d = &image->data[image->stride * y];
937
45.4M
                uint8_t *pline  = y > 0 ? &image->data[image->stride * (y-1)] : NULL;
938
45.4M
                uint8_t *ppline = y > 1 ? &image->data[image->stride * (y-2)] : NULL;
939
45.4M
                uint32_t pd = 0;
940
45.4M
                uint32_t ppd = 0;
941
45.4M
                if (y > 0 && pline) {
942
45.4M
                    pd = (*pline++ << 8);
943
45.4M
                    if (GBW > 8)
944
2.68M
                        pd |= *pline++;
945
45.4M
                    if (y > 1 && ppline) {
946
45.4M
                        ppd = (*ppline++ << 8);
947
45.4M
                        if (GBW > 8)
948
2.68M
                            ppd |= *ppline++;
949
45.4M
                    }
950
45.4M
                }
951
816M
                for (x = 0; x < GBW; x++) {
952
770M
                    if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
953
0
                        bit = 0;
954
770M
                    } else {
955
770M
                        CONTEXT  = out_byte & 0x00F; /* First 4 pixels */
956
770M
                        CONTEXT |= (pd>>8) & 0x7F0; /* Next 7 pixels */
957
770M
                        CONTEXT |= (ppd>>2) & 0xF800; /* Final 5 pixels */
958
770M
                        bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
959
770M
                        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
770M
                    }
962
770M
                    pd = pd<<1;
963
770M
                    ppd = ppd<<1;
964
770M
                    out_byte = (out_byte<<1) | bit;
965
770M
                    out_bits_to_go_in_byte--;
966
770M
                    if (out_bits_to_go_in_byte == 0) {
967
85.2M
                        out_bits_to_go_in_byte = 8;
968
85.2M
                        *d++ = (uint8_t)out_byte;
969
85.2M
                        if (x+9 < GBW && y > 0 && pline) {
970
27.1M
                            pd |= *pline++;
971
27.1M
                            if (y > 1 && ppline)
972
24.7M
                                ppd |= *ppline++;
973
27.1M
                        }
974
85.2M
                    }
975
770M
                }
976
45.4M
                if (out_bits_to_go_in_byte != 8)
977
34.2M
                    *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
978
45.4M
            } else {
979
43.1M
                copy_prev_row(image, y);
980
43.1M
            }
981
88.5M
        }
982
500
        return 0;
983
500
    }
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
4.89k
    left = 4;
989
4.89k
    right = 2;
990
4.89k
    gmin = gmax = params->gbat[0];
991
4.89k
    if (params->gbat[2] < gmin)
992
1.89k
        gmin = params->gbat[2];
993
4.89k
    if (gmax < params->gbat[2])
994
2.27k
        gmax = params->gbat[2];
995
4.89k
    if (params->gbat[4] < gmin)
996
1.05k
        gmin = params->gbat[4];
997
4.89k
    if (gmax < params->gbat[4])
998
287
        gmax = params->gbat[4];
999
4.89k
    if (params->gbat[6] < gmin)
1000
1.07k
        gmin = params->gbat[6];
1001
4.89k
    if (gmax < params->gbat[6])
1002
1.86k
        gmax = params->gbat[6];
1003
4.89k
    if ((int)left < -gmin)
1004
2.69k
        left = -gmin;
1005
4.89k
    if ((int)right < gmax)
1006
2.88k
        right = gmax;
1007
4.89k
    if (right > GBW)
1008
1.68k
        right = GBW;
1009
4.89k
    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
4.89k
    top = 2;
1015
4.89k
    gmin = params->gbat[1];
1016
4.89k
    if (params->gbat[3] < gmin)
1017
1.08k
        gmin = params->gbat[3];
1018
4.89k
    if (params->gbat[5] < gmin)
1019
2.98k
        gmin = params->gbat[5];
1020
4.89k
    if (params->gbat[7] < gmin)
1021
2.07k
        gmin = params->gbat[7];
1022
4.89k
    if ((int)top < -gmin)
1023
3.48k
        top = -gmin;
1024
    /* So 0 <= y < top needs bounds checking. */
1025
1026
107M
    for (y = 0; y < GBH; y++) {
1027
107M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x9B25]);
1028
107M
        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
107M
        LTP ^= bit;
1031
107M
        if (!LTP) {
1032
81.1M
            uint32_t out_byte = 0;
1033
81.1M
            int out_bits_to_go_in_byte = 8;
1034
81.1M
            uint8_t *d = &image->data[image->stride * y];
1035
81.1M
            uint8_t *pline  = y > 0 ? &image->data[image->stride * (y-1)] : NULL;
1036
81.1M
            uint8_t *ppline = y > 1 ? &image->data[image->stride * (y-2)] : NULL;
1037
81.1M
            uint32_t pd = 0;
1038
81.1M
            uint32_t ppd = 0;
1039
81.1M
            if (y > 0 && pline) {
1040
81.1M
                pd = (*pline++ << 8);
1041
81.1M
                if (GBW > 8)
1042
1.32M
                    pd |= *pline++;
1043
81.1M
                if (y > 1 && ppline) {
1044
81.1M
                    ppd = (*ppline++ << 8);
1045
81.1M
                    if (GBW > 8)
1046
1.31M
                        ppd |= *ppline++;
1047
81.1M
                }
1048
81.1M
            }
1049
943M
            for (x = 0; x < GBW; x++) {
1050
862M
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1051
0
                    bit = 0;
1052
862M
                } else {
1053
862M
                    CONTEXT = out_byte & 0x000F; /* First 4 pixels */
1054
862M
                    CONTEXT |= (pd>>8) & 0x03E0; /* Skip one, next 5 pixels */
1055
862M
                    CONTEXT |= (ppd>>2) & 0x7000; /* Skip 2, next 3 pixels, skip one */
1056
862M
                    if (y >= top && x >= left && x < right)
1057
447M
                    {
1058
447M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[0], y + params->gbat[1]) << 4;
1059
447M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[2], y + params->gbat[3]) << 10;
1060
447M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[4], y + params->gbat[5]) << 11;
1061
447M
                        CONTEXT |= jbig2_image_get_pixel_fast(image, x + params->gbat[6], y + params->gbat[7]) << 15;
1062
447M
                    }
1063
414M
                    else
1064
414M
                    {
1065
414M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
1066
414M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[2], y + params->gbat[3]) << 10;
1067
414M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[4], y + params->gbat[5]) << 11;
1068
414M
                        CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[6], y + params->gbat[7]) << 15;
1069
414M
                    }
1070
862M
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1071
862M
                    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
862M
                }
1074
862M
                pd = pd<<1;
1075
862M
                ppd = ppd<<1;
1076
862M
                out_byte = (out_byte<<1) | bit;
1077
862M
                out_bits_to_go_in_byte--;
1078
862M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1079
862M
                if (out_bits_to_go_in_byte == 0) {
1080
83.8M
                    out_bits_to_go_in_byte = 8;
1081
83.8M
                    d++;
1082
83.8M
                    if (x+9 < GBW && y > 0 && pline) {
1083
73.9M
                        pd |= *pline++;
1084
73.9M
                        if (y > 1 && ppline)
1085
66.2M
                            ppd |= *ppline++;
1086
73.9M
                    }
1087
83.8M
                }
1088
862M
            }
1089
81.1M
            if (out_bits_to_go_in_byte != 8)
1090
80.8M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1091
81.1M
        } else {
1092
26.5M
            copy_prev_row(image, y);
1093
26.5M
        }
1094
107M
    }
1095
1096
4.89k
    return 0;
1097
4.89k
}
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.43k
{
1104
1.43k
    const uint32_t GBW = image->width;
1105
1.43k
    const uint32_t GBH = image->height;
1106
1.43k
    uint32_t CONTEXT;
1107
1.43k
    uint32_t x, y;
1108
1.43k
    int LTP = 0;
1109
1110
1.43k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
1111
10
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
1112
10
                           "adaptive template pixel is out of field");
1113
1114
170M
    for (y = 0; y < GBH; y++) {
1115
170M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x0795]);
1116
170M
        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
170M
        LTP ^= bit;
1119
170M
        if (!LTP) {
1120
95.8M
            uint32_t out_byte = 0;
1121
95.8M
            int out_bits_to_go_in_byte = 8;
1122
95.8M
            uint8_t *d = &image->data[image->stride * y];
1123
95.8M
            uint8_t *pline  = y > 0 ? &image->data[image->stride * (y-1)] : NULL;
1124
95.8M
            uint8_t *ppline = y > 1 ? &image->data[image->stride * (y-2)] : NULL;
1125
95.8M
            uint32_t pd = 0;
1126
95.8M
            uint32_t ppd = 0;
1127
95.8M
            if (y > 0 && pline) {
1128
95.8M
                pd = (*pline++ << 8);
1129
95.8M
                if (GBW > 8)
1130
5.69M
                    pd |= *pline++;
1131
95.8M
                if (y > 1 && ppline) {
1132
95.8M
                    ppd = (*ppline++ << 8);
1133
95.8M
                    if (GBW > 8)
1134
5.69M
                        ppd |= *ppline++;
1135
95.8M
                }
1136
95.8M
            }
1137
1.31G
            for (x = 0; x < GBW; x++) {
1138
1.21G
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1139
0
                    bit = 0;
1140
1.21G
                } else {
1141
1.21G
                    CONTEXT  = out_byte & 0x0007; /* First 3 pixels */
1142
1.21G
                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 3;
1143
1.21G
                    CONTEXT |= (pd>>9) & 0x01F0; /* next 5 pixels */
1144
1.21G
                    CONTEXT |= (ppd>>4) & 0x1E00; /* next 4 pixels */
1145
1.21G
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1146
1.21G
                    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
1.21G
                }
1149
1.21G
                pd = pd<<1;
1150
1.21G
                ppd = ppd<<1;
1151
1.21G
                out_byte = (out_byte<<1) | bit;
1152
1.21G
                out_bits_to_go_in_byte--;
1153
1.21G
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1154
1.21G
                if (out_bits_to_go_in_byte == 0) {
1155
116M
                    out_bits_to_go_in_byte = 8;
1156
116M
                    d++;
1157
116M
                    if (x+9 < GBW && y > 0 && pline) {
1158
81.3M
                        pd |= *pline++;
1159
81.3M
                        if (y > 1 && ppline)
1160
53.2M
                            ppd |= *ppline++;
1161
81.3M
                    }
1162
116M
                }
1163
1.21G
            }
1164
95.8M
            if (out_bits_to_go_in_byte != 8)
1165
90.6M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1166
95.8M
        } else {
1167
74.7M
            copy_prev_row(image, y);
1168
74.7M
        }
1169
170M
    }
1170
1171
1.42k
    return 0;
1172
1.42k
}
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
2.18k
{
1179
2.18k
    const uint32_t GBW = image->width;
1180
2.18k
    const uint32_t GBH = image->height;
1181
2.18k
    uint32_t CONTEXT;
1182
2.18k
    uint32_t x, y;
1183
2.18k
    int LTP = 0;
1184
1185
2.18k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
1186
3
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
1187
3
                           "adaptive template pixel is out of field");
1188
1189
75.8M
    for (y = 0; y < GBH; y++) {
1190
75.8M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0xE5]);
1191
75.8M
        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
75.8M
        LTP ^= bit;
1194
75.8M
        if (!LTP) {
1195
46.0M
            uint32_t out_byte = 0;
1196
46.0M
            int out_bits_to_go_in_byte = 8;
1197
46.0M
            uint8_t *d = &image->data[image->stride * y];
1198
46.0M
            uint8_t *pline  =  y > 0 ? &image->data[image->stride * (y-1)] : NULL;
1199
46.0M
            uint8_t *ppline = y > 1 ? &image->data[image->stride * (y-2)] : NULL;
1200
46.0M
            uint32_t pd = 0;
1201
46.0M
            uint32_t ppd = 0;
1202
46.0M
            if (y > 0 && pline) {
1203
46.0M
                pd = (*pline++ << 8);
1204
46.0M
                if (GBW > 8)
1205
990k
                    pd |= *pline++;
1206
46.0M
                if (y > 1 && ppline) {
1207
46.0M
                    ppd = (*ppline++ << 8);
1208
46.0M
                    if (GBW > 8)
1209
988k
                        ppd |= *ppline++;
1210
46.0M
                }
1211
46.0M
            }
1212
462M
            for (x = 0; x < GBW; x++) {
1213
416M
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1214
0
                    bit = 0;
1215
416M
                } else {
1216
416M
                    CONTEXT  = out_byte & 0x003; /* First 2 pixels */
1217
416M
                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 2;
1218
416M
                    CONTEXT |= (pd>>11) & 0x078; /* next 4 pixels */
1219
416M
                    CONTEXT |= (ppd>>7) & 0x380; /* next 3 pixels */
1220
416M
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1221
416M
                    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
416M
                }
1224
416M
                pd = pd<<1;
1225
416M
                ppd = ppd<<1;
1226
416M
                out_byte = (out_byte<<1) | bit;
1227
416M
                out_bits_to_go_in_byte--;
1228
416M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1229
416M
                if (out_bits_to_go_in_byte == 0) {
1230
41.4M
                    out_bits_to_go_in_byte = 8;
1231
41.4M
                    d++;
1232
41.4M
                    if (x+9 < GBW && y > 0 && pline) {
1233
37.1M
                        pd |= *pline++;
1234
37.1M
                        if (y > 1 && ppline)
1235
30.1M
                            ppd |= *ppline++;
1236
37.1M
                    }
1237
41.4M
                }
1238
416M
            }
1239
46.0M
            if (out_bits_to_go_in_byte != 8)
1240
45.7M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1241
46.0M
        } else {
1242
29.7M
            copy_prev_row(image, y);
1243
29.7M
        }
1244
75.8M
    }
1245
1246
2.18k
    return 0;
1247
2.18k
}
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.38k
{
1254
1.38k
    const uint32_t GBW = image->width;
1255
1.38k
    const uint32_t GBH = image->height;
1256
1.38k
    uint32_t CONTEXT;
1257
1.38k
    uint32_t x, y;
1258
1.38k
    int LTP = 0;
1259
1260
1.38k
    if (pixel_outside_field(params->gbat[0], params->gbat[1]))
1261
3
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
1262
3
                           "adaptive template pixel is out of field");
1263
1264
164M
    for (y = 0; y < GBH; y++) {
1265
164M
        int bit = jbig2_arith_decode(ctx, as, &GB_stats[0x0195]);
1266
164M
        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
164M
        LTP ^= bit;
1269
164M
        if (!LTP) {
1270
127M
            uint32_t out_byte = 0;
1271
127M
            int out_bits_to_go_in_byte = 8;
1272
127M
            uint8_t *d = &image->data[image->stride * y];
1273
127M
            uint8_t *pline  = y > 0 ? &image->data[image->stride * (y-1)] : NULL;
1274
127M
            uint32_t pd = 0;
1275
127M
            if (y > 0 && pline) {
1276
127M
                pd = (*pline++ << 8);
1277
127M
                if (GBW > 8)
1278
401k
                    pd |= *pline++;
1279
127M
            }
1280
937M
            for (x = 0; x < GBW; x++) {
1281
809M
                if (params->USESKIP && jbig2_image_get_pixel(params->SKIP, x, y)) {
1282
0
                    bit = 0;
1283
809M
                } else {
1284
809M
                    CONTEXT  = out_byte & 0x0F; /* First 4 pixels */
1285
809M
                    CONTEXT |= jbig2_image_get_pixel(image, x + params->gbat[0], y + params->gbat[1]) << 4;
1286
809M
                    CONTEXT |= (pd>>9) & 0x3E0; /* next 5 pixels */
1287
809M
                    bit = jbig2_arith_decode(ctx, as, &GB_stats[CONTEXT]);
1288
809M
                    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
809M
                }
1291
809M
                pd = pd<<1;
1292
809M
                out_byte = (out_byte<<1) | bit;
1293
809M
                out_bits_to_go_in_byte--;
1294
809M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1295
809M
                if (out_bits_to_go_in_byte == 0) {
1296
68.8M
                    out_bits_to_go_in_byte = 8;
1297
68.8M
                    d++;
1298
68.8M
                    if (x+9 < GBW && y > 0 && pline)
1299
54.0M
                        pd |= *pline++;
1300
68.8M
                }
1301
809M
            }
1302
127M
            if (out_bits_to_go_in_byte != 8)
1303
127M
                *d = (uint8_t)out_byte<<out_bits_to_go_in_byte;
1304
127M
        } else {
1305
36.7M
            copy_prev_row(image, y);
1306
36.7M
        }
1307
164M
    }
1308
1309
1.38k
    return 0;
1310
1.38k
}
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
10.4k
{
1317
10.4k
    switch (params->GBTEMPLATE) {
1318
5.43k
    case 0:
1319
5.43k
        return jbig2_decode_generic_template0_TPGDON(ctx, segment, params, as, image, GB_stats);
1320
1.43k
    case 1:
1321
1.43k
        return jbig2_decode_generic_template1_TPGDON(ctx, segment, params, as, image, GB_stats);
1322
2.18k
    case 2:
1323
2.18k
        return jbig2_decode_generic_template2_TPGDON(ctx, segment, params, as, image, GB_stats);
1324
1.38k
    case 3:
1325
1.38k
        return jbig2_decode_generic_template3_TPGDON(ctx, segment, params, as, image, GB_stats);
1326
10.4k
    }
1327
1328
0
    return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "unsupported GBTEMPLATE (%d)", params->GBTEMPLATE);
1329
10.4k
}
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
158k
{
1352
158k
    const int8_t *gbat = params->gbat;
1353
1354
158k
    if (!params->MMR && params->TPGDON)
1355
10.4k
        return jbig2_decode_generic_region_TPGDON(ctx, segment, params, as, image, GB_stats);
1356
1357
148k
    if (!params->MMR && params->GBTEMPLATE == 0) {
1358
42.1k
        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
32.3k
            return jbig2_decode_generic_template0(ctx, segment, params, as, image, GB_stats);
1360
9.83k
        else
1361
9.83k
            return jbig2_decode_generic_template0_unopt(ctx, segment, params, as, image, GB_stats);
1362
106k
    } else if (!params->MMR && params->GBTEMPLATE == 1) {
1363
4.88k
        if (!params->USESKIP && gbat[0] == +3 && gbat[1] == -1)
1364
1.78k
            return jbig2_decode_generic_template1(ctx, segment, params, as, image, GB_stats);
1365
3.10k
        else
1366
3.10k
            return jbig2_decode_generic_template1_unopt(ctx, segment, params, as, image, GB_stats);
1367
4.88k
    }
1368
101k
    else if (!params->MMR && params->GBTEMPLATE == 2) {
1369
44.7k
        if (!params->USESKIP && gbat[0] == 2 && gbat[1] == -1)
1370
4.31k
            return jbig2_decode_generic_template2(ctx, segment, params, as, image, GB_stats);
1371
40.3k
        else
1372
40.3k
            return jbig2_decode_generic_template2_unopt(ctx, segment, params, as, image, GB_stats);
1373
56.4k
    } else if (!params->MMR && params->GBTEMPLATE == 3) {
1374
56.4k
        if (!params->USESKIP && gbat[0] == 2 && gbat[1] == -1)
1375
50.0k
            return jbig2_decode_generic_template3(ctx, segment, params, as, image, GB_stats);
1376
6.34k
        else
1377
6.34k
            return jbig2_decode_generic_template3_unopt(ctx, segment, params, as, image, GB_stats);
1378
56.4k
    }
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
148k
}
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
14.7k
{
1396
14.7k
    Jbig2RegionSegmentInfo rsi;
1397
14.7k
    byte seg_flags;
1398
14.7k
    int8_t gbat[8];
1399
14.7k
    int offset;
1400
14.7k
    uint32_t gbat_bytes = 0;
1401
14.7k
    Jbig2GenericRegionParams params;
1402
14.7k
    int code = 0;
1403
14.7k
    Jbig2Image *image = NULL;
1404
14.7k
    Jbig2WordStream *ws = NULL;
1405
14.7k
    Jbig2ArithState *as = NULL;
1406
14.7k
    Jbig2ArithCx *GB_stats = NULL;
1407
14.7k
    uint32_t height;
1408
14.7k
    Jbig2Page *page = &ctx->pages[ctx->current_page];
1409
1410
    /* 7.4.6 */
1411
14.7k
    if (segment->data_length < 18)
1412
30
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment too short");
1413
1414
14.6k
    jbig2_get_region_segment_info(&rsi, segment_data);
1415
14.6k
    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
14.6k
    height = rsi.height;
1419
14.6k
    if (segment->rows != UINT32_MAX) {
1420
10.0k
        if (segment->rows > rsi.height)
1421
59
            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment contains more rows than stated in header");
1422
9.94k
        height = segment->rows;
1423
9.94k
    }
1424
1425
    /* 7.4.6.2 */
1426
14.6k
    seg_flags = segment_data[17];
1427
14.6k
    jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, "segment flags = %02x", seg_flags);
1428
14.6k
    if ((seg_flags & 1) && (seg_flags & 6))
1429
421
        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "MMR is 1, but GBTEMPLATE is not 0");
1430
1431
    /* 7.4.6.3 */
1432
14.6k
    if (!(seg_flags & 1)) {
1433
13.6k
        gbat_bytes = (seg_flags & 6) ? 2 : 8;
1434
13.6k
        if (18 + gbat_bytes > segment->data_length)
1435
7
            return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment too short");
1436
13.5k
        memcpy(gbat, segment_data + 18, gbat_bytes);
1437
13.5k
        jbig2_error(ctx, JBIG2_SEVERITY_INFO, segment->number, "gbat: %d, %d", gbat[0], gbat[1]);
1438
13.5k
    }
1439
1440
14.6k
    offset = 18 + gbat_bytes;
1441
1442
    /* Check for T.88 amendment 2 */
1443
14.6k
    if ((seg_flags >> 5) & 1)
1444
43
        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number, "segment uses 12 adaptive template pixels (NYI)");
1445
1446
    /* Table 34 */
1447
14.5k
    params.MMR = seg_flags & 1;
1448
14.5k
    params.GBTEMPLATE = (seg_flags & 6) >> 1;
1449
14.5k
    params.TPGDON = (seg_flags & 8) >> 3;
1450
14.5k
    params.USESKIP = 0;
1451
14.5k
    memcpy(params.gbat, gbat, gbat_bytes);
1452
1453
14.5k
    if (page->height == 0xffffffff && page->striped && page->stripe_size > 0) {
1454
5.34k
        if (rsi.y >= page->end_row + page->stripe_size) {
1455
1.56k
            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.56k
            return 0;
1457
1.56k
        }
1458
3.77k
        if (height > page->end_row + page->stripe_size) {
1459
2.46k
            height = page->end_row + page->stripe_size;
1460
2.46k
        }
1461
9.22k
    } else {
1462
9.22k
        if (rsi.y >= page->height) {
1463
1.22k
            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
1.22k
            return 0;
1465
1.22k
        }
1466
8.00k
        if (height > page->height - rsi .y) {
1467
6.78k
            height = page->height - rsi.y;
1468
6.78k
        }
1469
8.00k
    }
1470
11.7k
    if (height == 0) {
1471
416
        jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "nothing remains of region, ignoring");
1472
416
        return 0;
1473
416
    }
1474
1475
11.3k
    image = jbig2_image_new(ctx, rsi.width, height);
1476
11.3k
    if (image == NULL)
1477
70
        return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to allocate generic image");
1478
11.2k
    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number, "allocated %d x %d image buffer for region decode results", rsi.width, height);
1479
1480
11.2k
    if (params.MMR) {
1481
519
        code = jbig2_decode_generic_mmr(ctx, segment, &params, segment_data + offset, segment->data_length - offset, image);
1482
519
        if (code < 0) {
1483
15
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode MMR-coded generic region");
1484
15
            goto cleanup;
1485
15
        }
1486
10.7k
    } else {
1487
10.7k
        int stats_size = jbig2_generic_stats_size(ctx, params.GBTEMPLATE);
1488
1489
10.7k
        GB_stats = jbig2_new(ctx, Jbig2ArithCx, stats_size);
1490
10.7k
        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
10.7k
        memset(GB_stats, 0, stats_size);
1495
1496
10.7k
        ws = jbig2_word_stream_buf_new(ctx, segment_data + offset, segment->data_length - offset);
1497
10.7k
        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
10.7k
        as = jbig2_arith_new(ctx, ws);
1502
10.7k
        if (as == NULL) {
1503
9
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to allocate arithmetic coding state when handling immediate generic region");
1504
9
            goto cleanup;
1505
9
        }
1506
10.7k
        code = jbig2_decode_generic_region(ctx, segment, &params, as, image, GB_stats);
1507
10.7k
        if (code < 0) {
1508
72
            code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "failed to decode immediate generic region");
1509
72
            goto cleanup;
1510
72
        }
1511
10.7k
    }
1512
1513
11.1k
    code = jbig2_page_add_result(ctx, &ctx->pages[ctx->current_page], image, rsi.x, rsi.y, rsi.op);
1514
11.1k
    if (code < 0)
1515
607
        code = jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->number, "unable to add result to page");
1516
1517
11.2k
cleanup:
1518
11.2k
    jbig2_free(ctx->allocator, as);
1519
11.2k
    jbig2_word_stream_buf_free(ctx, ws);
1520
11.2k
    jbig2_free(ctx->allocator, GB_stats);
1521
11.2k
    jbig2_image_release(ctx, image);
1522
1523
11.2k
    return code;
1524
11.1k
}