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 __INT_H
     38 #define __INT_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 	return a < b ? a : b;
     58 }
     59 
     60 /**
     61 Get the minimum of two integers
     62 @return Returns a if a < b else b
     63 */
     64 static INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b) {
     65 	return a < b ? a : b;
     66 }
     67 
     68 /**
     69 Get the maximum of two integers
     70 @return Returns a if a > b else b
     71 */
     72 static INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b) {
     73 	return (a > b) ? a : b;
     74 }
     75 
     76 /**
     77 Get the maximum of two integers
     78 @return Returns a if a > b else b
     79 */
     80 static INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32  a, OPJ_UINT32  b) {
     81 	return (a > b) ? a : b;
     82 }
     83 
     84 /**
     85  Get the saturated sum of two unsigned integers
     86  @return Returns saturated sum of a+b
     87  */
     88 static INLINE OPJ_UINT32 opj_uint_adds(OPJ_UINT32 a, OPJ_UINT32 b) {
     89 	OPJ_UINT64 sum = (OPJ_UINT64)a + (OPJ_UINT64)b;
     90 	return (OPJ_UINT32)(-(OPJ_INT32)(sum >> 32)) | (OPJ_UINT32)sum;
     91 }
     92 
     93 /**
     94 Clamp an integer inside an interval
     95 @return
     96 <ul>
     97 <li>Returns a if (min < a < max)
     98 <li>Returns max if (a > max)
     99 <li>Returns min if (a < min)
    100 </ul>
    101 */
    102 static INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min, OPJ_INT32 max) {
    103 	if (a < min)
    104 		return min;
    105 	if (a > max)
    106 		return max;
    107 	return a;
    108 }
    109 /**
    110 @return Get absolute value of integer
    111 */
    112 static INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a) {
    113 	return a < 0 ? -a : a;
    114 }
    115 /**
    116 Divide an integer and round upwards
    117 @return Returns a divided by b
    118 */
    119 static INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b) {
    120 	assert(b);
    121 	return (a + b - 1) / b;
    122 }
    123 
    124 /**
    125 Divide an integer and round upwards
    126 @return Returns a divided by b
    127 */
    128 static INLINE OPJ_UINT32  opj_uint_ceildiv(OPJ_UINT32  a, OPJ_UINT32  b) {
    129 	assert(b);
    130 	return (a + b - 1) / b;
    131 }
    132 
    133 /**
    134 Divide an integer by a power of 2 and round upwards
    135 @return Returns a divided by 2^b
    136 */
    137 static INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b) {
    138 	return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
    139 }
    140 
    141 /**
    142  Divide a 64bits integer by a power of 2 and round upwards
    143  @return Returns a divided by 2^b
    144  */
    145 static INLINE OPJ_INT32 opj_int64_ceildivpow2(OPJ_INT64 a, OPJ_INT32 b) {
    146 	return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
    147 }
    148 
    149 /**
    150  Divide an integer by a power of 2 and round upwards
    151  @return Returns a divided by 2^b
    152  */
    153 static INLINE OPJ_UINT32 opj_uint_ceildivpow2(OPJ_UINT32 a, OPJ_UINT32 b) {
    154 	return (OPJ_UINT32)((a + ((OPJ_UINT64)1U << b) - 1U) >> b);
    155 }
    156 
    157 /**
    158 Divide an integer by a power of 2 and round downwards
    159 @return Returns a divided by 2^b
    160 */
    161 static INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b) {
    162 	return a >> b;
    163 }
    164 /**
    165 Get logarithm of an integer and round downwards
    166 @return Returns log2(a)
    167 */
    168 static INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a) {
    169 	OPJ_INT32 l;
    170 	for (l = 0; a > 1; l++) {
    171 		a >>= 1;
    172 	}
    173 	return l;
    174 }
    175 /**
    176 Get logarithm of an integer and round downwards
    177 @return Returns log2(a)
    178 */
    179 static INLINE OPJ_UINT32  opj_uint_floorlog2(OPJ_UINT32  a) {
    180 	OPJ_UINT32  l;
    181 	for (l = 0; a > 1; ++l)
    182 	{
    183 		a >>= 1;
    184 	}
    185 	return l;
    186 }
    187 
    188 /**
    189 Multiply two fixed-precision rational numbers.
    190 @param a
    191 @param b
    192 @return Returns a * b
    193 */
    194 static INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b) {
    195 #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
    196 	OPJ_INT64 temp = __emul(a, b);
    197 #else
    198 	OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
    199 #endif
    200 	temp += 4096;
    201 	assert((temp >> 13) <= (OPJ_INT64)0x7FFFFFFF);
    202 	assert((temp >> 13) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
    203 	return (OPJ_INT32) (temp >> 13);
    204 }
    205 
    206 static INLINE OPJ_INT32 opj_int_fix_mul_t1(OPJ_INT32 a, OPJ_INT32 b) {
    207 #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
    208 	OPJ_INT64 temp = __emul(a, b);
    209 #else
    210 	OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
    211 #endif
    212 	temp += 4096;
    213 	assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) <= (OPJ_INT64)0x7FFFFFFF);
    214 	assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
    215 	return (OPJ_INT32) (temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) ;
    216 }
    217 
    218 /* ----------------------------------------------------------------------- */
    219 /*@}*/
    220 
    221 /*@}*/
    222 
    223 #endif
    224