00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef __INT_H
00038 #define __INT_H
00039
00048
00051
00056 static INLINE OPJ_INT32 opj_int_min(OPJ_INT32 a, OPJ_INT32 b) {
00057 return a < b ? a : b;
00058 }
00059
00064 static INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b) {
00065 return a < b ? a : b;
00066 }
00067
00072 static INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b) {
00073 return (a > b) ? a : b;
00074 }
00075
00080 static INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32 a, OPJ_UINT32 b) {
00081 return (a > b) ? a : b;
00082 }
00083
00088 static INLINE OPJ_UINT32 opj_uint_adds(OPJ_UINT32 a, OPJ_UINT32 b) {
00089 OPJ_UINT64 sum = (OPJ_UINT64)a + (OPJ_UINT64)b;
00090 return (OPJ_UINT32)(-(OPJ_INT32)(sum >> 32)) | (OPJ_UINT32)sum;
00091 }
00092
00102 static INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min, OPJ_INT32 max) {
00103 if (a < min)
00104 return min;
00105 if (a > max)
00106 return max;
00107 return a;
00108 }
00112 static INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a) {
00113 return a < 0 ? -a : a;
00114 }
00119 static INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b) {
00120 assert(b);
00121 return (a + b - 1) / b;
00122 }
00123
00128 static INLINE OPJ_UINT32 opj_uint_ceildiv(OPJ_UINT32 a, OPJ_UINT32 b) {
00129 assert(b);
00130 return (a + b - 1) / b;
00131 }
00132
00137 static INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b) {
00138 return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
00139 }
00140
00145 static INLINE OPJ_INT32 opj_int64_ceildivpow2(OPJ_INT64 a, OPJ_INT32 b) {
00146 return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
00147 }
00148
00153 static INLINE OPJ_UINT32 opj_uint_ceildivpow2(OPJ_UINT32 a, OPJ_UINT32 b) {
00154 return (OPJ_UINT32)((a + ((OPJ_UINT64)1U << b) - 1U) >> b);
00155 }
00156
00161 static INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b) {
00162 return a >> b;
00163 }
00168 static INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a) {
00169 OPJ_INT32 l;
00170 for (l = 0; a > 1; l++) {
00171 a >>= 1;
00172 }
00173 return l;
00174 }
00179 static INLINE OPJ_UINT32 opj_uint_floorlog2(OPJ_UINT32 a) {
00180 OPJ_UINT32 l;
00181 for (l = 0; a > 1; ++l)
00182 {
00183 a >>= 1;
00184 }
00185 return l;
00186 }
00187
00194 static INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b) {
00195 #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
00196 OPJ_INT64 temp = __emul(a, b);
00197 #else
00198 OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
00199 #endif
00200 temp += 4096;
00201 assert((temp >> 13) <= (OPJ_INT64)0x7FFFFFFF);
00202 assert((temp >> 13) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
00203 return (OPJ_INT32) (temp >> 13);
00204 }
00205
00206 static INLINE OPJ_INT32 opj_int_fix_mul_t1(OPJ_INT32 a, OPJ_INT32 b) {
00207 #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
00208 OPJ_INT64 temp = __emul(a, b);
00209 #else
00210 OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
00211 #endif
00212 temp += 4096;
00213 assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) <= (OPJ_INT64)0x7FFFFFFF);
00214 assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
00215 return (OPJ_INT32) (temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) ;
00216 }
00217
00218
00222
00223 #endif