2
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
3
* Copyright (c) 2002-2007, Professor Benoit Macq
4
* Copyright (c) 2001-2003, David Janssens
5
* Copyright (c) 2002-2003, Yannick Verschueren
6
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
7
* Copyright (c) 2005, Herve Drolon, FreeImage Team
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
19
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
20
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
* POSSIBILITY OF SUCH DAMAGE.
35
@brief Implementation of operations on integers (INT)
37
The functions in OPJ_INTMATH.H have for goal to realize operations on integers.
40
/** @defgroup OPJ_INTMATH OPJ_INTMATH - Implementation of operations on integers */
43
/** @name Exported functions (see also openjpeg.h) */
45
/* ----------------------------------------------------------------------- */
47
Get the minimum of two integers
48
@return Returns a if a < b else b
50
static INLINE OPJ_INT32 opj_int_min(OPJ_INT32 a, OPJ_INT32 b) {
55
Get the minimum of two integers
56
@return Returns a if a < b else b
58
static INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b) {
63
Get the maximum of two integers
64
@return Returns a if a > b else b
66
static INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b) {
67
return (a > b) ? a : b;
71
Get the maximum of two integers
72
@return Returns a if a > b else b
74
static INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32 a, OPJ_UINT32 b) {
75
return (a > b) ? a : b;
79
Clamp an integer inside an interval
82
<li>Returns a if (min < a < max)
83
<li>Returns max if (a > max)
84
<li>Returns min if (a < min)
87
static INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min, OPJ_INT32 max) {
95
@return Get absolute value of integer
97
static INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a) {
98
return a < 0 ? -a : a;
101
Divide an integer and round upwards
102
@return Returns a divided by b
104
static INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b) {
105
return (a + b - 1) / b;
109
Divide an integer and round upwards
110
@return Returns a divided by b
112
static INLINE OPJ_UINT32 opj_uint_ceildiv(OPJ_UINT32 a, OPJ_UINT32 b) {
113
return (a + b - 1) / b;
117
Divide an integer by a power of 2 and round upwards
118
@return Returns a divided by 2^b
120
static INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b) {
121
return (a + (int64_t)(1 << b) - 1) >> b;
124
Divide an integer by a power of 2 and round downwards
125
@return Returns a divided by 2^b
127
static INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b) {
131
Get logarithm of an integer and round downwards
132
@return Returns log2(a)
134
static INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a) {
136
for (l = 0; a > 1; l++) {
142
Get logarithm of an integer and round downwards
143
@return Returns log2(a)
145
static INLINE OPJ_UINT32 opj_uint_floorlog2(OPJ_UINT32 a) {
147
for (l = 0; a > 1; ++l)
155
Multiply two fixed-precision rational numbers.
158
@return Returns a * b
160
static INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b) {
161
OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
163
return (OPJ_INT32) (temp >> 13) ;
166
/* ----------------------------------------------------------------------- */