comparison mupdf-source/thirdparty/jbig2dec/jbig2_arith_int.c @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
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 /* Annex A */
21
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25 #include "os_types.h"
26
27 #include <stddef.h>
28 #include <string.h> /* memset() */
29
30 #include "jbig2.h"
31 #include "jbig2_priv.h"
32 #include "jbig2_arith.h"
33 #include "jbig2_arith_int.h"
34
35 struct _Jbig2ArithIntCtx {
36 Jbig2ArithCx IAx[512];
37 };
38
39 Jbig2ArithIntCtx *
40 jbig2_arith_int_ctx_new(Jbig2Ctx *ctx)
41 {
42 Jbig2ArithIntCtx *result = jbig2_new(ctx, Jbig2ArithIntCtx, 1);
43
44 if (result == NULL) {
45 jbig2_error(ctx, JBIG2_SEVERITY_FATAL, JBIG2_UNKNOWN_SEGMENT_NUMBER, "failed to allocate arithmetic integer coding state");
46 return NULL;
47 } else {
48 memset(result->IAx, 0, sizeof(result->IAx));
49 }
50
51 return result;
52 }
53
54 /* A.2 */
55 /* Return value: -1 on error, 0 on normal value, 1 on OOB return. */
56 int
57 jbig2_arith_int_decode(Jbig2Ctx *ctx, Jbig2ArithIntCtx *actx, Jbig2ArithState *as, int32_t *p_result)
58 {
59 Jbig2ArithCx *IAx = actx->IAx;
60 int PREV = 1;
61 int S;
62 int32_t V;
63 int bit;
64 int n_tail, offset;
65 int i;
66
67 S = jbig2_arith_decode(ctx, as, &IAx[PREV]);
68 if (S < 0)
69 return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, "failed to decode IAx S");
70 PREV = (PREV << 1) | S;
71
72 bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);
73 if (bit < 0)
74 return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, "failed to decode IAx decision bit 0");
75 PREV = (PREV << 1) | bit;
76 if (bit) {
77 bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);
78 if (bit < 0)
79 return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, "failed to decode IAx decision bit 1");
80 PREV = (PREV << 1) | bit;
81
82 if (bit) {
83 bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);
84 if (bit < 0)
85 return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, "failed to decode IAx decision bit 2");
86 PREV = (PREV << 1) | bit;
87
88 if (bit) {
89 bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);
90 if (bit < 0)
91 return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, "failed to decode IAx decision bit 3");
92 PREV = (PREV << 1) | bit;
93
94 if (bit) {
95 bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);
96 if (bit < 0)
97 return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, "failed to decode IAx decision bit 4");
98 PREV = (PREV << 1) | bit;
99
100 if (bit) {
101 n_tail = 32;
102 offset = 4436;
103 } else {
104 n_tail = 12;
105 offset = 340;
106 }
107 } else {
108 n_tail = 8;
109 offset = 84;
110 }
111 } else {
112 n_tail = 6;
113 offset = 20;
114 }
115 } else {
116 n_tail = 4;
117 offset = 4;
118 }
119 } else {
120 n_tail = 2;
121 offset = 0;
122 }
123
124 V = 0;
125 for (i = 0; i < n_tail; i++) {
126 bit = jbig2_arith_decode(ctx, as, &IAx[PREV]);
127 if (bit < 0)
128 return jbig2_error(ctx, JBIG2_SEVERITY_WARNING, JBIG2_UNKNOWN_SEGMENT_NUMBER, "failed to decode IAx V bit %d", i);
129 PREV = ((PREV << 1) & 511) | (PREV & 256) | bit;
130 V = (V << 1) | bit;
131 }
132
133 /* offset is always >=0, so underflow can't happen. */
134 /* avoid overflow by clamping 32 bit value. */
135 if (V > INT32_MAX - offset)
136 V = INT32_MAX;
137 else
138 V += offset;
139 V = S ? -V : V;
140 *p_result = V;
141 return S && V == 0 ? 1 : 0;
142 }
143
144 void
145 jbig2_arith_int_ctx_free(Jbig2Ctx *ctx, Jbig2ArithIntCtx *iax)
146 {
147 jbig2_free(ctx->allocator, iax);
148 }