Coverage Report

Created: 2026-09-14 07:34

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