Home | History | Annotate | Download | only in libopenjpeg20
      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