1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker * The copyright in this software is being made available under the 2-clauses
3*3ac0a46fSAndroid Build Coastguard Worker * BSD License, included below. This software may be subject to other third
4*3ac0a46fSAndroid Build Coastguard Worker * party and contributor rights, including patent rights, and no such rights
5*3ac0a46fSAndroid Build Coastguard Worker * are granted under this license.
6*3ac0a46fSAndroid Build Coastguard Worker *
7*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2002-2014, Professor Benoit Macq
9*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2001-2003, David Janssens
10*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2002-2003, Yannick Verschueren
11*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2003-2007, Francois-Olivier Devaux
12*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2003-2014, Antonin Descampe
13*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 2005, Herve Drolon, FreeImage Team
14*3ac0a46fSAndroid Build Coastguard Worker * All rights reserved.
15*3ac0a46fSAndroid Build Coastguard Worker *
16*3ac0a46fSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
17*3ac0a46fSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
18*3ac0a46fSAndroid Build Coastguard Worker * are met:
19*3ac0a46fSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
20*3ac0a46fSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
21*3ac0a46fSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
22*3ac0a46fSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
23*3ac0a46fSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
24*3ac0a46fSAndroid Build Coastguard Worker *
25*3ac0a46fSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
26*3ac0a46fSAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27*3ac0a46fSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28*3ac0a46fSAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
29*3ac0a46fSAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30*3ac0a46fSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31*3ac0a46fSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32*3ac0a46fSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33*3ac0a46fSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34*3ac0a46fSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35*3ac0a46fSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
36*3ac0a46fSAndroid Build Coastguard Worker */
37*3ac0a46fSAndroid Build Coastguard Worker #ifndef OPJ_INTMATH_H
38*3ac0a46fSAndroid Build Coastguard Worker #define OPJ_INTMATH_H
39*3ac0a46fSAndroid Build Coastguard Worker /**
40*3ac0a46fSAndroid Build Coastguard Worker @file opj_intmath.h
41*3ac0a46fSAndroid Build Coastguard Worker @brief Implementation of operations on integers (INT)
42*3ac0a46fSAndroid Build Coastguard Worker
43*3ac0a46fSAndroid Build Coastguard Worker The functions in OPJ_INTMATH.H have for goal to realize operations on integers.
44*3ac0a46fSAndroid Build Coastguard Worker */
45*3ac0a46fSAndroid Build Coastguard Worker
46*3ac0a46fSAndroid Build Coastguard Worker /** @defgroup OPJ_INTMATH OPJ_INTMATH - Implementation of operations on integers */
47*3ac0a46fSAndroid Build Coastguard Worker /*@{*/
48*3ac0a46fSAndroid Build Coastguard Worker
49*3ac0a46fSAndroid Build Coastguard Worker /** @name Exported functions (see also openjpeg.h) */
50*3ac0a46fSAndroid Build Coastguard Worker /*@{*/
51*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
52*3ac0a46fSAndroid Build Coastguard Worker /**
53*3ac0a46fSAndroid Build Coastguard Worker Get the minimum of two integers
54*3ac0a46fSAndroid Build Coastguard Worker @return Returns a if a < b else b
55*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_min(OPJ_INT32 a,OPJ_INT32 b)56*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_min(OPJ_INT32 a, OPJ_INT32 b)
57*3ac0a46fSAndroid Build Coastguard Worker {
58*3ac0a46fSAndroid Build Coastguard Worker return a < b ? a : b;
59*3ac0a46fSAndroid Build Coastguard Worker }
60*3ac0a46fSAndroid Build Coastguard Worker
61*3ac0a46fSAndroid Build Coastguard Worker /**
62*3ac0a46fSAndroid Build Coastguard Worker Get the minimum of two integers
63*3ac0a46fSAndroid Build Coastguard Worker @return Returns a if a < b else b
64*3ac0a46fSAndroid Build Coastguard Worker */
opj_uint_min(OPJ_UINT32 a,OPJ_UINT32 b)65*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b)
66*3ac0a46fSAndroid Build Coastguard Worker {
67*3ac0a46fSAndroid Build Coastguard Worker return a < b ? a : b;
68*3ac0a46fSAndroid Build Coastguard Worker }
69*3ac0a46fSAndroid Build Coastguard Worker
70*3ac0a46fSAndroid Build Coastguard Worker /**
71*3ac0a46fSAndroid Build Coastguard Worker Get the maximum of two integers
72*3ac0a46fSAndroid Build Coastguard Worker @return Returns a if a > b else b
73*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_max(OPJ_INT32 a,OPJ_INT32 b)74*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b)
75*3ac0a46fSAndroid Build Coastguard Worker {
76*3ac0a46fSAndroid Build Coastguard Worker return (a > b) ? a : b;
77*3ac0a46fSAndroid Build Coastguard Worker }
78*3ac0a46fSAndroid Build Coastguard Worker
79*3ac0a46fSAndroid Build Coastguard Worker /**
80*3ac0a46fSAndroid Build Coastguard Worker Get the maximum of two integers
81*3ac0a46fSAndroid Build Coastguard Worker @return Returns a if a > b else b
82*3ac0a46fSAndroid Build Coastguard Worker */
opj_uint_max(OPJ_UINT32 a,OPJ_UINT32 b)83*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32 a, OPJ_UINT32 b)
84*3ac0a46fSAndroid Build Coastguard Worker {
85*3ac0a46fSAndroid Build Coastguard Worker return (a > b) ? a : b;
86*3ac0a46fSAndroid Build Coastguard Worker }
87*3ac0a46fSAndroid Build Coastguard Worker
88*3ac0a46fSAndroid Build Coastguard Worker /**
89*3ac0a46fSAndroid Build Coastguard Worker Get the saturated sum of two unsigned integers
90*3ac0a46fSAndroid Build Coastguard Worker @return Returns saturated sum of a+b
91*3ac0a46fSAndroid Build Coastguard Worker */
opj_uint_adds(OPJ_UINT32 a,OPJ_UINT32 b)92*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_uint_adds(OPJ_UINT32 a, OPJ_UINT32 b)
93*3ac0a46fSAndroid Build Coastguard Worker {
94*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT64 sum = (OPJ_UINT64)a + (OPJ_UINT64)b;
95*3ac0a46fSAndroid Build Coastguard Worker return (OPJ_UINT32)(-(OPJ_INT32)(sum >> 32)) | (OPJ_UINT32)sum;
96*3ac0a46fSAndroid Build Coastguard Worker }
97*3ac0a46fSAndroid Build Coastguard Worker
98*3ac0a46fSAndroid Build Coastguard Worker /**
99*3ac0a46fSAndroid Build Coastguard Worker Get the saturated difference of two unsigned integers
100*3ac0a46fSAndroid Build Coastguard Worker @return Returns saturated sum of a-b
101*3ac0a46fSAndroid Build Coastguard Worker */
opj_uint_subs(OPJ_UINT32 a,OPJ_UINT32 b)102*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_uint_subs(OPJ_UINT32 a, OPJ_UINT32 b)
103*3ac0a46fSAndroid Build Coastguard Worker {
104*3ac0a46fSAndroid Build Coastguard Worker return (a >= b) ? a - b : 0;
105*3ac0a46fSAndroid Build Coastguard Worker }
106*3ac0a46fSAndroid Build Coastguard Worker
107*3ac0a46fSAndroid Build Coastguard Worker /**
108*3ac0a46fSAndroid Build Coastguard Worker Clamp an integer inside an interval
109*3ac0a46fSAndroid Build Coastguard Worker @return
110*3ac0a46fSAndroid Build Coastguard Worker <ul>
111*3ac0a46fSAndroid Build Coastguard Worker <li>Returns a if (min < a < max)
112*3ac0a46fSAndroid Build Coastguard Worker <li>Returns max if (a > max)
113*3ac0a46fSAndroid Build Coastguard Worker <li>Returns min if (a < min)
114*3ac0a46fSAndroid Build Coastguard Worker </ul>
115*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_clamp(OPJ_INT32 a,OPJ_INT32 min,OPJ_INT32 max)116*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min,
117*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 max)
118*3ac0a46fSAndroid Build Coastguard Worker {
119*3ac0a46fSAndroid Build Coastguard Worker if (a < min) {
120*3ac0a46fSAndroid Build Coastguard Worker return min;
121*3ac0a46fSAndroid Build Coastguard Worker }
122*3ac0a46fSAndroid Build Coastguard Worker if (a > max) {
123*3ac0a46fSAndroid Build Coastguard Worker return max;
124*3ac0a46fSAndroid Build Coastguard Worker }
125*3ac0a46fSAndroid Build Coastguard Worker return a;
126*3ac0a46fSAndroid Build Coastguard Worker }
127*3ac0a46fSAndroid Build Coastguard Worker
128*3ac0a46fSAndroid Build Coastguard Worker /**
129*3ac0a46fSAndroid Build Coastguard Worker Clamp an integer inside an interval
130*3ac0a46fSAndroid Build Coastguard Worker @return
131*3ac0a46fSAndroid Build Coastguard Worker <ul>
132*3ac0a46fSAndroid Build Coastguard Worker <li>Returns a if (min < a < max)
133*3ac0a46fSAndroid Build Coastguard Worker <li>Returns max if (a > max)
134*3ac0a46fSAndroid Build Coastguard Worker <li>Returns min if (a < min)
135*3ac0a46fSAndroid Build Coastguard Worker </ul>
136*3ac0a46fSAndroid Build Coastguard Worker */
opj_int64_clamp(OPJ_INT64 a,OPJ_INT64 min,OPJ_INT64 max)137*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT64 opj_int64_clamp(OPJ_INT64 a, OPJ_INT64 min,
138*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT64 max)
139*3ac0a46fSAndroid Build Coastguard Worker {
140*3ac0a46fSAndroid Build Coastguard Worker if (a < min) {
141*3ac0a46fSAndroid Build Coastguard Worker return min;
142*3ac0a46fSAndroid Build Coastguard Worker }
143*3ac0a46fSAndroid Build Coastguard Worker if (a > max) {
144*3ac0a46fSAndroid Build Coastguard Worker return max;
145*3ac0a46fSAndroid Build Coastguard Worker }
146*3ac0a46fSAndroid Build Coastguard Worker return a;
147*3ac0a46fSAndroid Build Coastguard Worker }
148*3ac0a46fSAndroid Build Coastguard Worker
149*3ac0a46fSAndroid Build Coastguard Worker /**
150*3ac0a46fSAndroid Build Coastguard Worker @return Get absolute value of integer
151*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_abs(OPJ_INT32 a)152*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a)
153*3ac0a46fSAndroid Build Coastguard Worker {
154*3ac0a46fSAndroid Build Coastguard Worker return a < 0 ? -a : a;
155*3ac0a46fSAndroid Build Coastguard Worker }
156*3ac0a46fSAndroid Build Coastguard Worker /**
157*3ac0a46fSAndroid Build Coastguard Worker Divide an integer and round upwards
158*3ac0a46fSAndroid Build Coastguard Worker @return Returns a divided by b
159*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_ceildiv(OPJ_INT32 a,OPJ_INT32 b)160*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b)
161*3ac0a46fSAndroid Build Coastguard Worker {
162*3ac0a46fSAndroid Build Coastguard Worker assert(b);
163*3ac0a46fSAndroid Build Coastguard Worker return (OPJ_INT32)(((OPJ_INT64)a + b - 1) / b);
164*3ac0a46fSAndroid Build Coastguard Worker }
165*3ac0a46fSAndroid Build Coastguard Worker
166*3ac0a46fSAndroid Build Coastguard Worker /**
167*3ac0a46fSAndroid Build Coastguard Worker Divide an integer and round upwards
168*3ac0a46fSAndroid Build Coastguard Worker @return Returns a divided by b
169*3ac0a46fSAndroid Build Coastguard Worker */
opj_uint_ceildiv(OPJ_UINT32 a,OPJ_UINT32 b)170*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_uint_ceildiv(OPJ_UINT32 a, OPJ_UINT32 b)
171*3ac0a46fSAndroid Build Coastguard Worker {
172*3ac0a46fSAndroid Build Coastguard Worker assert(b);
173*3ac0a46fSAndroid Build Coastguard Worker return (OPJ_UINT32)(((OPJ_UINT64)a + b - 1) / b);
174*3ac0a46fSAndroid Build Coastguard Worker }
175*3ac0a46fSAndroid Build Coastguard Worker
176*3ac0a46fSAndroid Build Coastguard Worker /**
177*3ac0a46fSAndroid Build Coastguard Worker Divide an integer by a power of 2 and round upwards
178*3ac0a46fSAndroid Build Coastguard Worker @return Returns a divided by 2^b
179*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_ceildivpow2(OPJ_INT32 a,OPJ_INT32 b)180*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b)
181*3ac0a46fSAndroid Build Coastguard Worker {
182*3ac0a46fSAndroid Build Coastguard Worker return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
183*3ac0a46fSAndroid Build Coastguard Worker }
184*3ac0a46fSAndroid Build Coastguard Worker
185*3ac0a46fSAndroid Build Coastguard Worker /**
186*3ac0a46fSAndroid Build Coastguard Worker Divide a 64bits integer by a power of 2 and round upwards
187*3ac0a46fSAndroid Build Coastguard Worker @return Returns a divided by 2^b
188*3ac0a46fSAndroid Build Coastguard Worker */
opj_int64_ceildivpow2(OPJ_INT64 a,OPJ_INT32 b)189*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int64_ceildivpow2(OPJ_INT64 a, OPJ_INT32 b)
190*3ac0a46fSAndroid Build Coastguard Worker {
191*3ac0a46fSAndroid Build Coastguard Worker return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
192*3ac0a46fSAndroid Build Coastguard Worker }
193*3ac0a46fSAndroid Build Coastguard Worker
194*3ac0a46fSAndroid Build Coastguard Worker /**
195*3ac0a46fSAndroid Build Coastguard Worker Divide an integer by a power of 2 and round upwards
196*3ac0a46fSAndroid Build Coastguard Worker @return Returns a divided by 2^b
197*3ac0a46fSAndroid Build Coastguard Worker */
opj_uint_ceildivpow2(OPJ_UINT32 a,OPJ_UINT32 b)198*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_uint_ceildivpow2(OPJ_UINT32 a, OPJ_UINT32 b)
199*3ac0a46fSAndroid Build Coastguard Worker {
200*3ac0a46fSAndroid Build Coastguard Worker return (OPJ_UINT32)((a + ((OPJ_UINT64)1U << b) - 1U) >> b);
201*3ac0a46fSAndroid Build Coastguard Worker }
202*3ac0a46fSAndroid Build Coastguard Worker
203*3ac0a46fSAndroid Build Coastguard Worker /**
204*3ac0a46fSAndroid Build Coastguard Worker Divide an integer by a power of 2 and round downwards
205*3ac0a46fSAndroid Build Coastguard Worker @return Returns a divided by 2^b
206*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_floordivpow2(OPJ_INT32 a,OPJ_INT32 b)207*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b)
208*3ac0a46fSAndroid Build Coastguard Worker {
209*3ac0a46fSAndroid Build Coastguard Worker return a >> b;
210*3ac0a46fSAndroid Build Coastguard Worker }
211*3ac0a46fSAndroid Build Coastguard Worker
212*3ac0a46fSAndroid Build Coastguard Worker /**
213*3ac0a46fSAndroid Build Coastguard Worker Divide an integer by a power of 2 and round downwards
214*3ac0a46fSAndroid Build Coastguard Worker @return Returns a divided by 2^b
215*3ac0a46fSAndroid Build Coastguard Worker */
opj_uint_floordivpow2(OPJ_UINT32 a,OPJ_UINT32 b)216*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_uint_floordivpow2(OPJ_UINT32 a, OPJ_UINT32 b)
217*3ac0a46fSAndroid Build Coastguard Worker {
218*3ac0a46fSAndroid Build Coastguard Worker return a >> b;
219*3ac0a46fSAndroid Build Coastguard Worker }
220*3ac0a46fSAndroid Build Coastguard Worker
221*3ac0a46fSAndroid Build Coastguard Worker /**
222*3ac0a46fSAndroid Build Coastguard Worker Get logarithm of an integer and round downwards
223*3ac0a46fSAndroid Build Coastguard Worker @return Returns log2(a)
224*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_floorlog2(OPJ_INT32 a)225*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a)
226*3ac0a46fSAndroid Build Coastguard Worker {
227*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32 l;
228*3ac0a46fSAndroid Build Coastguard Worker for (l = 0; a > 1; l++) {
229*3ac0a46fSAndroid Build Coastguard Worker a >>= 1;
230*3ac0a46fSAndroid Build Coastguard Worker }
231*3ac0a46fSAndroid Build Coastguard Worker return l;
232*3ac0a46fSAndroid Build Coastguard Worker }
233*3ac0a46fSAndroid Build Coastguard Worker /**
234*3ac0a46fSAndroid Build Coastguard Worker Get logarithm of an integer and round downwards
235*3ac0a46fSAndroid Build Coastguard Worker @return Returns log2(a)
236*3ac0a46fSAndroid Build Coastguard Worker */
opj_uint_floorlog2(OPJ_UINT32 a)237*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_UINT32 opj_uint_floorlog2(OPJ_UINT32 a)
238*3ac0a46fSAndroid Build Coastguard Worker {
239*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 l;
240*3ac0a46fSAndroid Build Coastguard Worker for (l = 0; a > 1; ++l) {
241*3ac0a46fSAndroid Build Coastguard Worker a >>= 1;
242*3ac0a46fSAndroid Build Coastguard Worker }
243*3ac0a46fSAndroid Build Coastguard Worker return l;
244*3ac0a46fSAndroid Build Coastguard Worker }
245*3ac0a46fSAndroid Build Coastguard Worker
246*3ac0a46fSAndroid Build Coastguard Worker /**
247*3ac0a46fSAndroid Build Coastguard Worker Multiply two fixed-precision rational numbers.
248*3ac0a46fSAndroid Build Coastguard Worker @param a
249*3ac0a46fSAndroid Build Coastguard Worker @param b
250*3ac0a46fSAndroid Build Coastguard Worker @return Returns a * b
251*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_fix_mul(OPJ_INT32 a,OPJ_INT32 b)252*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b)
253*3ac0a46fSAndroid Build Coastguard Worker {
254*3ac0a46fSAndroid Build Coastguard Worker #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
255*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT64 temp = __emul(a, b);
256*3ac0a46fSAndroid Build Coastguard Worker #else
257*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
258*3ac0a46fSAndroid Build Coastguard Worker #endif
259*3ac0a46fSAndroid Build Coastguard Worker temp += 4096;
260*3ac0a46fSAndroid Build Coastguard Worker assert((temp >> 13) <= (OPJ_INT64)0x7FFFFFFF);
261*3ac0a46fSAndroid Build Coastguard Worker assert((temp >> 13) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
262*3ac0a46fSAndroid Build Coastguard Worker return (OPJ_INT32)(temp >> 13);
263*3ac0a46fSAndroid Build Coastguard Worker }
264*3ac0a46fSAndroid Build Coastguard Worker
opj_int_fix_mul_t1(OPJ_INT32 a,OPJ_INT32 b)265*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_fix_mul_t1(OPJ_INT32 a, OPJ_INT32 b)
266*3ac0a46fSAndroid Build Coastguard Worker {
267*3ac0a46fSAndroid Build Coastguard Worker #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
268*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT64 temp = __emul(a, b);
269*3ac0a46fSAndroid Build Coastguard Worker #else
270*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
271*3ac0a46fSAndroid Build Coastguard Worker #endif
272*3ac0a46fSAndroid Build Coastguard Worker temp += 4096;
273*3ac0a46fSAndroid Build Coastguard Worker assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) <= (OPJ_INT64)0x7FFFFFFF);
274*3ac0a46fSAndroid Build Coastguard Worker assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) >= (-(OPJ_INT64)0x7FFFFFFF -
275*3ac0a46fSAndroid Build Coastguard Worker (OPJ_INT64)1));
276*3ac0a46fSAndroid Build Coastguard Worker return (OPJ_INT32)(temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) ;
277*3ac0a46fSAndroid Build Coastguard Worker }
278*3ac0a46fSAndroid Build Coastguard Worker
279*3ac0a46fSAndroid Build Coastguard Worker /**
280*3ac0a46fSAndroid Build Coastguard Worker Addition two signed integers with a wrap-around behaviour.
281*3ac0a46fSAndroid Build Coastguard Worker Assumes complement-to-two signed integers.
282*3ac0a46fSAndroid Build Coastguard Worker @param a
283*3ac0a46fSAndroid Build Coastguard Worker @param b
284*3ac0a46fSAndroid Build Coastguard Worker @return Returns a + b
285*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_add_no_overflow(OPJ_INT32 a,OPJ_INT32 b)286*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_add_no_overflow(OPJ_INT32 a, OPJ_INT32 b)
287*3ac0a46fSAndroid Build Coastguard Worker {
288*3ac0a46fSAndroid Build Coastguard Worker void* pa = &a;
289*3ac0a46fSAndroid Build Coastguard Worker void* pb = &b;
290*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* upa = (OPJ_UINT32*)pa;
291*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* upb = (OPJ_UINT32*)pb;
292*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ures = *upa + *upb;
293*3ac0a46fSAndroid Build Coastguard Worker void* pures = &ures;
294*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32* ipres = (OPJ_INT32*)pures;
295*3ac0a46fSAndroid Build Coastguard Worker return *ipres;
296*3ac0a46fSAndroid Build Coastguard Worker }
297*3ac0a46fSAndroid Build Coastguard Worker
298*3ac0a46fSAndroid Build Coastguard Worker /**
299*3ac0a46fSAndroid Build Coastguard Worker Subtract two signed integers with a wrap-around behaviour.
300*3ac0a46fSAndroid Build Coastguard Worker Assumes complement-to-two signed integers.
301*3ac0a46fSAndroid Build Coastguard Worker @param a
302*3ac0a46fSAndroid Build Coastguard Worker @param b
303*3ac0a46fSAndroid Build Coastguard Worker @return Returns a - b
304*3ac0a46fSAndroid Build Coastguard Worker */
opj_int_sub_no_overflow(OPJ_INT32 a,OPJ_INT32 b)305*3ac0a46fSAndroid Build Coastguard Worker static INLINE OPJ_INT32 opj_int_sub_no_overflow(OPJ_INT32 a, OPJ_INT32 b)
306*3ac0a46fSAndroid Build Coastguard Worker {
307*3ac0a46fSAndroid Build Coastguard Worker void* pa = &a;
308*3ac0a46fSAndroid Build Coastguard Worker void* pb = &b;
309*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* upa = (OPJ_UINT32*)pa;
310*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32* upb = (OPJ_UINT32*)pb;
311*3ac0a46fSAndroid Build Coastguard Worker OPJ_UINT32 ures = *upa - *upb;
312*3ac0a46fSAndroid Build Coastguard Worker void* pures = &ures;
313*3ac0a46fSAndroid Build Coastguard Worker OPJ_INT32* ipres = (OPJ_INT32*)pures;
314*3ac0a46fSAndroid Build Coastguard Worker return *ipres;
315*3ac0a46fSAndroid Build Coastguard Worker }
316*3ac0a46fSAndroid Build Coastguard Worker
317*3ac0a46fSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------- */
318*3ac0a46fSAndroid Build Coastguard Worker /*@}*/
319*3ac0a46fSAndroid Build Coastguard Worker
320*3ac0a46fSAndroid Build Coastguard Worker /*@}*/
321*3ac0a46fSAndroid Build Coastguard Worker
322*3ac0a46fSAndroid Build Coastguard Worker #endif /* OPJ_INTMATH_H */
323