mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
89 lines
3.5 KiB
C
89 lines
3.5 KiB
C
|
/********************************************************************
|
||
|
* *
|
||
|
* THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. *
|
||
|
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||
|
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||
|
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||
|
* *
|
||
|
* THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2007 *
|
||
|
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||
|
* *
|
||
|
********************************************************************
|
||
|
|
||
|
function:
|
||
|
last mod: $Id: ocintrin.h 13884 2007-09-22 08:38:10Z giles $
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
/*Some common macros for potential platform-specific optimization.*/
|
||
|
#include <math.h>
|
||
|
#if !defined(_ocintrin_H)
|
||
|
# define _ocintrin_H (1)
|
||
|
|
||
|
/*Some specific platforms may have optimized intrinsic or inline assembly
|
||
|
versions of these functions which can substantially improve performance.
|
||
|
We define macros for them to allow easy incorporation of these non-ANSI
|
||
|
features.*/
|
||
|
|
||
|
/*Branchless, but not correct for differences larger than INT_MAX.
|
||
|
static int oc_mini(int _a,int _b){
|
||
|
int ambsign;
|
||
|
ambsign=_a-_b>>sizeof(int)*8-1;
|
||
|
return (_a&~ambsign)+(_b&ambsign);
|
||
|
}*/
|
||
|
|
||
|
|
||
|
#define OC_MAXI(_a,_b) ((_a)<(_b)?(_b):(_a))
|
||
|
#define OC_MINI(_a,_b) ((_a)>(_b)?(_b):(_a))
|
||
|
/*Clamps an integer into the given range.
|
||
|
If _a>_c, then the lower bound _a is respected over the upper bound _c (this
|
||
|
behavior is required to meet our documented API behavior).
|
||
|
_a: The lower bound.
|
||
|
_b: The value to clamp.
|
||
|
_c: The upper boud.*/
|
||
|
#define OC_CLAMPI(_a,_b,_c) (OC_MAXI(_a,OC_MINI(_b,_c)))
|
||
|
#define OC_CLAMP255(_x) ((unsigned char)((((_x)<0)-1)&((_x)|-((_x)>255))))
|
||
|
/*Divides an integer by a power of two, truncating towards 0.
|
||
|
_dividend: The integer to divide.
|
||
|
_shift: The non-negative power of two to divide by.
|
||
|
_rmask: (1<<_shift)-1*/
|
||
|
#define OC_DIV_POW2(_dividend,_shift,_rmask)\
|
||
|
((_dividend)+(((_dividend)>>sizeof(_dividend)*8-1)&(_rmask))>>(_shift))
|
||
|
/*Divides _x by 65536, truncating towards 0.*/
|
||
|
#define OC_DIV2_16(_x) OC_DIV_POW2(_x,16,0xFFFF)
|
||
|
/*Divides _x by 2, truncating towards 0.*/
|
||
|
#define OC_DIV2(_x) OC_DIV_POW2(_x,1,0x1)
|
||
|
/*Divides _x by 8, truncating towards 0.*/
|
||
|
#define OC_DIV8(_x) OC_DIV_POW2(_x,3,0x7)
|
||
|
/*Divides _x by 16, truncating towards 0.*/
|
||
|
#define OC_DIV16(_x) OC_DIV_POW2(_x,4,0xF)
|
||
|
/*Right shifts _dividend by _shift, adding _rval, and subtracting one for
|
||
|
negative dividends first..
|
||
|
When _rval is (1<<_shift-1), this is equivalent to division with rounding
|
||
|
ties towards positive infinity.*/
|
||
|
#define OC_DIV_ROUND_POW2(_dividend,_shift,_rval)\
|
||
|
((_dividend)+((_dividend)>>sizeof(_dividend)*8-1)+(_rval)>>(_shift))
|
||
|
/*Swaps two integers _a and _b if _a>_b.*/
|
||
|
#define OC_SORT2I(_a,_b)\
|
||
|
if((_a)>(_b)){\
|
||
|
int t__;\
|
||
|
t__=(_a);\
|
||
|
(_a)=(_b);\
|
||
|
(_b)=t__;\
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*All of these macros should expect floats as arguments.*/
|
||
|
#define OC_MAXF(_a,_b) ((_a)<(_b)?(_b):(_a))
|
||
|
#define OC_MINF(_a,_b) ((_a)>(_b)?(_b):(_a))
|
||
|
#define OC_CLAMPF(_a,_b,_c) (OC_MINF(_a,OC_MAXF(_b,_c)))
|
||
|
#define OC_FABSF(_f) ((float)fabs(_f))
|
||
|
#define OC_SQRTF(_f) ((float)sqrt(_f))
|
||
|
#define OC_POWF(_b,_e) ((float)pow(_b,_e))
|
||
|
#define OC_LOGF(_f) ((float)log(_f))
|
||
|
#define OC_IFLOORF(_f) ((int)floor(_f))
|
||
|
#define OC_ICEILF(_f) ((int)ceil(_f))
|
||
|
|
||
|
#endif
|