Microsoft-3D-Movie-Maker/BREN/INC/SCALAR.H

257 lines
6.3 KiB
C

/*
* Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved.
*
* $Id: scalar.h 1.20 1995/05/25 13:37:37 sam Exp $
* $Locker: $
*
* Scalar type
*
* External defines:
*
* BASED_FIXED
* True if system is based on signed 16.16 fixed point
*
* BASED_FLOAT
* True if system is based on 32 bit floating point
*
* One of these must be defined and the appropriate libraries must be used
*/
#ifndef _SCALAR_H_
#define _SCALAR_H_
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(BASED_FIXED)
#define BASED_FIXED 0
#endif
#if !defined(BASED_FLOAT)
#define BASED_FLOAT 0
#endif
#if !BASED_FIXED && !BASED_FLOAT
#undef BASED_FLOAT
#define BASED_FLOAT 0
#undef BASED_FIXED
#define BASED_FIXED 1
#endif
/**
** Basic types - either fixed or float
**/
#if BASED_FIXED
/*
* Reference an external symbol to make sure
* the right library is linked
*/
extern int _BR_Fixed_Point_Scalar;
/*
* Fixed base types
*/
typedef br_fixed_ls br_scalar;
typedef br_fixed_lsf br_fraction;
typedef br_fixed_luf br_ufraction;
#define BR_SCALAR_EPSILON 0x0001
#define BR_SCALAR_MAX 0x7fffffff
#define BR_SCALAR_MIN 0x80000000
/*
* Macros for static initialisation
*/
#define BR_SCALAR(x) ((br_scalar)(BR_ONE_LS * (x)))
#define BR_FRACTION(x) ((br_fraction)((BR_ONE_LSF * (x))>=BR_ONE_LSF?BR_ONE_LSF-1:BR_ONE_LSF * (x)))
#define BR_UFRACTION(x) ((br_ufraction)((BR_ONE_LUF * (x))>=BR_ONE_LUF?BR_ONE_LUF-1:BR_ONE_LUF * (x)))
/*
* Macros for type conversion
*/
#define BrFloatToScalar(f) ((br_scalar)((f)*(float)BR_ONE_LS))
#define BrScalarToFloat(s) ((s)/(float)BR_ONE_LS)
#define BrIntToScalar(i) ((br_scalar)((i)*(int)BR_ONE_LS))
#define BrScalarToInt(s) ((s)/(int)BR_ONE_LS)
#define BrFixedToScalar(f) (f)
#define BrScalarToFixed(s) (s)
#define BrFractionToScalar(f) ((br_scalar)((f)*2))
#define BrScalarToFraction(s) ((br_fraction)((s)/2))
#define BrUFractionToScalar(f) ((br_scalar)(f))
#define BrScalarToUFraction(s) ((br_ufraction)(s))
/*
* Various arithmetic operations
*/
#define BR_ADD(a,b) ((a)+(b))
#define BR_SUB(a,b) ((a)-(b))
#define BR_MUL(a,b) BrFixedMul(a,b)
#define BR_SQR(a) BrFixedSqr(a)
#define BR_ABS(a) BrFixedAbs(a)
#define BR_DIV(a,b) BrFixedDiv(a,b)
#define BR_DIVR(a,b) BrFixedDivR(a,b)
#define BR_MULDIV(a,b,c) BrFixedMulDiv(a,b,c)
#define BR_RCP(a) BrFixedRcp(a)
#define BR_CONST_MUL(a,b) ((a)*(b))
#define BR_CONST_DIV(a,b) ((a)/(b))
#define BR_MAC2(a,b,c,d) BrFixedMac2(a,b,c,d)
#define BR_MAC3(a,b,c,d,e,f) BrFixedMac3(a,b,c,d,e,f)
#define BR_MAC4(a,b,c,d,e,f,g,h) BrFixedMac4(a,b,c,d,e,f,g,h)
#define BR_MAC2DIV(a,b,c,d,e) BrFixedMac2Div(a,b,c,d,e)
#define BR_MAC3DIV(a,b,c,d,e,f,g) BrFixedMac3Div(a,b,c,d,e,f,g)
#define BR_MAC4DIV(a,b,c,d,e,f,g,h,i) BrFixedMac4Div(a,b,c,d,e,f,g,h,i)
#define BR_SQR2(a,b) BrFixedSqr2(a,b)
#define BR_SQR3(a,b,c) BrFixedSqr3(a,b,c)
#define BR_SQR4(a,b,c,d) BrFixedSqr4(a,b,c,d)
#define BR_FMAC2(a,b,c,d) BrFixedFMac2(a,b,c,d)
#define BR_FMAC3(a,b,c,d,e,f) BrFixedFMac3(a,b,c,d,e,f)
#define BR_FMAC4(a,b,c,d,e,f,g,h) BrFixedFMac4(a,b,c,d,e,f,g,h)
#define BR_LENGTH2(a,b) BrFixedLength2(a,b)
#define BR_LENGTH3(a,b,c) BrFixedLength3(a,b,c)
#define BR_LENGTH4(a,b,c,d) BrFixedLength4(a,b,c,d)
#define BR_RLENGTH2(a,b) BrFixedRLength2(a,b)
#define BR_RLENGTH3(a,b,c) BrFixedRLength3(a,b,c)
#define BR_RLENGTH4(a,b,c,d) BrFixedRLength4(a,b,c,d)
#define BR_POW(a,b) BrFixedPow((a),(b))
#define BR_SQRT(a) BrFixedSqrt(a)
#endif
#if BASED_FLOAT
/*
* Reference an external symbol to make sure
* the right library is linked
*/
extern int _BR_Floating_Point_Scalar;
/*
* Floating point base types
*/
typedef float br_scalar;
typedef float br_fraction;
typedef float br_ufraction;
#define BR_SCALAR_EPSILON 1.192092896e-7f
#define BR_SCALAR_MAX 3.402823466e+38f
#define BR_SCALAR_MIN (-3.402823466e+38f)
/*
* Macros for static initialisation
*/
#define BR_SCALAR(x) ((br_scalar)(x))
#define BR_FRACTION(x) ((br_fraction)(x))
#define BR_UFRACTION(x) ((br_ufraction)(x))
/*
* Macros for type conversion
*/
#define BrFloatToScalar(f) (f)
#define BrScalarToFloat(c) (c)
#define BrIntToScalar(i) ((br_scalar)(i))
#define BrScalarToInt(s) ((int)(s))
#define BrFixedToScalar(f) ((br_scalar)((f)/(float)BR_ONE_LS))
#define BrScalarToFixed(s) (br_fixed_ls)((s)*(br_scalar)BR_ONE_LS)
#define BrFractionToScalar(f) (f)
#define BrScalarToFraction(s) (s)
#define BrUFractionToScalar(f) (f)
#define BrScalarToUFraction(s) (s)
#ifndef _NO_PROTOTYPES
#if defined(_MSC_VER) && !defined(__H2INC__)
#include <math.h>
#elif defined (__IBMC__)
#include <math.h>
#else
double fabs(double);
double fabs(double);
double sqrt(double);
double cos(double);
double sin(double);
double acos(double);
double asin(double);
double atan2(double,double);
#endif
#endif
/*
* Various arithmetic operations
*/
#define BR_ADD(a,b) ((a)+(b))
#define BR_SUB(a,b) ((a)-(b))
#define BR_MUL(a,b) ((a)*(b))
#define BR_SQR(a) ((a)*(a))
#define BR_ABS(a) fabs(a)
#define BR_DIV(a,b) ((a)/(b))
#define BR_DIVR(a,b) ((a)/(b))
#define BR_MULDIV(a,b,c) ((a)*(b)/(c))
#define BR_RCP(a) (1.0/(a))
#define BR_CONST_MUL(a,b) ((a)*(b))
#define BR_CONST_DIV(a,b) ((a)/(b))
#define BR_MAC2(a,b,c,d) ((a)*(b)+(c)*(d))
#define BR_MAC3(a,b,c,d,e,f) ((a)*(b)+(c)*(d)+(e)*(f))
#define BR_MAC4(a,b,c,d,e,f,g,h) ((a)*(b)+(c)*(d)+(e)*(f)+(g)*(h))
#define BR_MAC2DIV(a,b,c,d,e) (((a)*(b)+(c)*(d))/e)
#define BR_MAC3DIV(a,b,c,d,e,f,g) (((a)*(b)+(c)*(d)+(e)*(f))/g)
#define BR_MAC4DIV(a,b,c,d,e,f,g,h,i) (((a)*(b)+(c)*(d)+(e)*(f)+(g)*(h))/i)
#define BR_SQR2(a,b) ((a)*(a)+(b)*(b))
#define BR_SQR3(a,b,c) ((a)*(a)+(b)*(b)+(c)*(c))
#define BR_SQR4(a,b,c,d) ((a)*(a)+(b)*(b)+(c)*(c)+(d)*(d))
#define BR_FMAC2(a,b,c,d) ((a)*(b)+(c)*(d))
#define BR_FMAC3(a,b,c,d,e,f) ((a)*(b)+(c)*(d)+(e)*(f))
#define BR_FMAC4(a,b,c,d,e,f,g,h) ((a)*(b)+(c)*(d)+(e)*(f)+(g)*(h))
#define BR_LENGTH2(a,b) sqrt((a)*(a)+(b)*(b))
#define BR_LENGTH3(a,b,c) sqrt((a)*(a)+(b)*(b)+(c)*(c))
#define BR_LENGTH4(a,b,c,d) sqrt((a)*(a)+(b)*(b)+(c)*(c)+(d)*(d))
#define BR_RLENGTH2(a,b) (1.0/sqrt((a)*(a)+(b)*(b)))
#define BR_RLENGTH3(a,b,c) (1.0/sqrt((a)*(a)+(b)*(b)+(c)*(c)))
#define BR_RLENGTH4(a,b,c,d) (1.0/sqrt((a)*(a)+(b)*(b)+(c)*(c)+(d)*(d)))
#define BR_POW(a,b) pow((a),(b))
#define BR_SQRT(a) sqrt(a)
#endif
/*
* Make sure PI is defined
*/
#ifndef PI
#define PI 3.14159265358979323846
#endif
#ifdef __cplusplus
};
#endif
#endif