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 OPJ_INTMATH_H
00038 #define OPJ_INTMATH_H
00039
00048
00051
00056 static INLINE OPJ_INT32 opj_int_min(OPJ_INT32 a, OPJ_INT32 b)
00057 {
00058 return a < b ? a : b;
00059 }
00060
00065 static INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b)
00066 {
00067 return a < b ? a : b;
00068 }
00069
00074 static INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b)
00075 {
00076 return (a > b) ? a : b;
00077 }
00078
00083 static INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32 a, OPJ_UINT32 b)
00084 {
00085 return (a > b) ? a : b;
00086 }
00087
00092 static INLINE OPJ_UINT32 opj_uint_adds(OPJ_UINT32 a, OPJ_UINT32 b)
00093 {
00094 OPJ_UINT64 sum = (OPJ_UINT64)a + (OPJ_UINT64)b;
00095 return (OPJ_UINT32)(-(OPJ_INT32)(sum >> 32)) | (OPJ_UINT32)sum;
00096 }
00097
00102 static INLINE OPJ_UINT32 opj_uint_subs(OPJ_UINT32 a, OPJ_UINT32 b)
00103 {
00104 return (a >= b) ? a - b : 0;
00105 }
00106
00116 static INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min,
00117 OPJ_INT32 max)
00118 {
00119 if (a < min) {
00120 return min;
00121 }
00122 if (a > max) {
00123 return max;
00124 }
00125 return a;
00126 }
00127
00137 static INLINE OPJ_INT64 opj_int64_clamp(OPJ_INT64 a, OPJ_INT64 min,
00138 OPJ_INT64 max)
00139 {
00140 if (a < min) {
00141 return min;
00142 }
00143 if (a > max) {
00144 return max;
00145 }
00146 return a;
00147 }
00148
00152 static INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a)
00153 {
00154 return a < 0 ? -a : a;
00155 }
00160 static INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b)
00161 {
00162 assert(b);
00163 return (OPJ_INT32)(((OPJ_INT64)a + b - 1) / b);
00164 }
00165
00170 static INLINE OPJ_UINT32 opj_uint_ceildiv(OPJ_UINT32 a, OPJ_UINT32 b)
00171 {
00172 assert(b);
00173 return (a + b - 1) / b;
00174 }
00175
00180 static INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b)
00181 {
00182 return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
00183 }
00184
00189 static INLINE OPJ_INT32 opj_int64_ceildivpow2(OPJ_INT64 a, OPJ_INT32 b)
00190 {
00191 return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
00192 }
00193
00198 static INLINE OPJ_UINT32 opj_uint_ceildivpow2(OPJ_UINT32 a, OPJ_UINT32 b)
00199 {
00200 return (OPJ_UINT32)((a + ((OPJ_UINT64)1U << b) - 1U) >> b);
00201 }
00202
00207 static INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b)
00208 {
00209 return a >> b;
00210 }
00215 static INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a)
00216 {
00217 OPJ_INT32 l;
00218 for (l = 0; a > 1; l++) {
00219 a >>= 1;
00220 }
00221 return l;
00222 }
00227 static INLINE OPJ_UINT32 opj_uint_floorlog2(OPJ_UINT32 a)
00228 {
00229 OPJ_UINT32 l;
00230 for (l = 0; a > 1; ++l) {
00231 a >>= 1;
00232 }
00233 return l;
00234 }
00235
00242 static INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b)
00243 {
00244 #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
00245 OPJ_INT64 temp = __emul(a, b);
00246 #else
00247 OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
00248 #endif
00249 temp += 4096;
00250 assert((temp >> 13) <= (OPJ_INT64)0x7FFFFFFF);
00251 assert((temp >> 13) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
00252 return (OPJ_INT32)(temp >> 13);
00253 }
00254
00255 static INLINE OPJ_INT32 opj_int_fix_mul_t1(OPJ_INT32 a, OPJ_INT32 b)
00256 {
00257 #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
00258 OPJ_INT64 temp = __emul(a, b);
00259 #else
00260 OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
00261 #endif
00262 temp += 4096;
00263 assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) <= (OPJ_INT64)0x7FFFFFFF);
00264 assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) >= (-(OPJ_INT64)0x7FFFFFFF -
00265 (OPJ_INT64)1));
00266 return (OPJ_INT32)(temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) ;
00267 }
00268
00269
00273
00274 #endif