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