Mercurial > hgrepos > Python2 > PyMuPDF
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 } |
