/*
     File:       GXMath.h
 
     Contains:   QuickDraw GX math routine interfaces.
 
     Version:    Technology: Quickdraw GX 1.1
                 Release:    QuickTime 7.3
 
     Copyright:  (c) 2007 (c) 1994-2006 by Apple Computer, Inc., all rights reserved.
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __GXMATH__
#define __GXMATH__

#ifndef __CONDITIONALMACROS__
#include <ConditionalMacros.h>
#endif

#ifndef __MACTYPES__
#include <MacTypes.h>
#endif

#ifndef __FIXMATH__
#include <FixMath.h>
#endif

#ifndef __IMAGECODEC__
#include <ImageCodec.h>
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

#if defined(__MWERKS__) && TARGET_CPU_68K
    #pragma push
    #pragma pointers_in_D0
#endif
 
/* Now defined in ImageCodec.i*/
#if 0
struct gxPoint {
  Fixed               x;
  Fixed               y;
};
typedef struct gxPoint                  gxPoint;
#endif  /* 0 */


typedef unsigned short                  gxColorValue;
struct gxPolar {
  Fixed               radius;
  Fixed               angle;
};
typedef struct gxPolar                  gxPolar;
struct gxMapping {
  Fixed               map[3][3];
};
typedef struct gxMapping                gxMapping;
#define gxColorValue1           ((gxColorValue) 0x0000FFFF)
#define  gxPositiveInfinity     ((long) 0x7FFFFFFFL)
#define gxNegativeInfinity      ((long) 0x80000000L)

#if CALL_NOT_IN_CARBON
/*
 *  CopyToMapping()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
CopyToMapping(
  gxMapping *        target,
  const gxMapping *  source)                                  THREEWORDINLINE(0x303C, 0x0031, 0xA832);


/*
 *  InvertMapping()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
InvertMapping(
  gxMapping *        target,
  const gxMapping *  source)                                  THREEWORDINLINE(0x303C, 0x0032, 0xA832);


/*
 *  MapMapping()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
MapMapping(
  gxMapping *        target,
  const gxMapping *  source)                                  THREEWORDINLINE(0x303C, 0x0033, 0xA832);


/*
 *  MoveMapping()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
MoveMapping(
  gxMapping *  target,
  Fixed        hOffset,
  Fixed        vOffset)                                       THREEWORDINLINE(0x303C, 0x0034, 0xA832);


/*
 *  MoveMappingTo()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
MoveMappingTo(
  gxMapping *  target,
  Fixed        hPosition,
  Fixed        vPosition)                                     THREEWORDINLINE(0x303C, 0x0035, 0xA832);


/*
 *  NormalizeMapping()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
NormalizeMapping(gxMapping * target)                          THREEWORDINLINE(0x303C, 0x0036, 0xA832);


/*
 *  RotateMapping()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
RotateMapping(
  gxMapping *  target,
  Fixed        angle,
  Fixed        xCenter,
  Fixed        yCenter)                                       THREEWORDINLINE(0x303C, 0x0037, 0xA832);


/*
 *  ScaleMapping()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
ScaleMapping(
  gxMapping *  target,
  Fixed        hFactor,
  Fixed        vFactor,
  Fixed        xCenter,
  Fixed        yCenter)                                       THREEWORDINLINE(0x303C, 0x0038, 0xA832);


/*
 *  ResetMapping()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
ResetMapping(gxMapping * target)                              THREEWORDINLINE(0x303C, 0x0039, 0xA832);


/*
 *  SkewMapping()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxMapping * )
SkewMapping(
  gxMapping *  target,
  Fixed        skewX,
  Fixed        skewY,
  Fixed        xCenter,
  Fixed        yCenter)                                       THREEWORDINLINE(0x303C, 0x003A, 0xA832);


/*
 *  MapPoints()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( void )
MapPoints(
  const gxMapping *  source,
  long               count,
  gxPoint            theVector[])                             THREEWORDINLINE(0x303C, 0x003B, 0xA832);


/*
 *  FirstBit()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( short )
FirstBit(unsigned long x)                                     THREEWORDINLINE(0x303C, 0x003C, 0xA832);


/*
 *  WideScale()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( short )
WideScale(const wide * source)                                THREEWORDINLINE(0x303C, 0x003D, 0xA832);


/*
 *  LinearRoot()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( short )
LinearRoot(
  Fixed   first,
  Fixed   last,
  Fract   t[])                                                THREEWORDINLINE(0x303C, 0x003E, 0xA832);


/*
 *  QuadraticRoot()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( short )
QuadraticRoot(
  Fixed   first,
  Fixed   control,
  Fixed   last,
  Fract   t[])                                                THREEWORDINLINE(0x303C, 0x003F, 0xA832);


/*
 *  PolarToPoint()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxPoint * )
PolarToPoint(
  const gxPolar *  ra,
  gxPoint *        xy)                                        THREEWORDINLINE(0x303C, 0x0040, 0xA832);


/*
 *  PointToPolar()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( gxPolar * )
PointToPolar(
  const gxPoint *  xy,
  gxPolar *        ra)                                        THREEWORDINLINE(0x303C, 0x0041, 0xA832);


/*
 *  FractCubeRoot()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( Fract )
FractCubeRoot(Fract source)                                   THREEWORDINLINE(0x303C, 0x0042, 0xA832);


/*
 *  FractDivide()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( Fract )
FractDivide(
  Fract   dividend,
  Fract   divisor)                                            THREEWORDINLINE(0x303C, 0x0043, 0xA832);


/*
 *  FractMultiply()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( Fract )
FractMultiply(
  Fract   multiplicand,
  Fract   multiplier)                                         THREEWORDINLINE(0x303C, 0x0044, 0xA832);


/*
 *  FractSineCosine()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( Fract )
FractSineCosine(
  Fixed    degrees,
  Fract *  cosine)                                            THREEWORDINLINE(0x303C, 0x0045, 0xA832);


/*
 *  FractSquareRoot()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( Fract )
FractSquareRoot(Fract source)                                 THREEWORDINLINE(0x303C, 0x0046, 0xA832);


/*
 *  FixedDivide()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( Fixed )
FixedDivide(
  Fixed   dividend,
  Fixed   divisor)                                            THREEWORDINLINE(0x303C, 0x0047, 0xA832);


/*
 *  FixedMultiply()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( Fixed )
FixedMultiply(
  Fixed   multiplicand,
  Fixed   multiplier)                                         THREEWORDINLINE(0x303C, 0x0048, 0xA832);


/* This next call is (source * multiplier / divisor) -- it avoids underflow, overflow by using wides */
/*
 *  MultiplyDivide()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( long )
MultiplyDivide(
  long   source,
  long   multiplier,
  long   divisor)                                             THREEWORDINLINE(0x303C, 0x0049, 0xA832);


/*
 *  Magnitude()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( unsigned long )
Magnitude(
  long   deltaX,
  long   deltaY)                                              THREEWORDINLINE(0x303C, 0x004A, 0xA832);


/*
 *  VectorMultiplyDivide()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( long )
VectorMultiplyDivide(
  long          count,
  const long *  vector1,
  long          step1,
  const long *  vector2,
  long          step2,
  long          divisor)                                      THREEWORDINLINE(0x303C, 0x004B, 0xA832);





/* wide operations are defined within FixMath.h for PowerPC */
#endif  /* CALL_NOT_IN_CARBON */

#if TARGET_OS_MAC && TARGET_CPU_68K
#if CALL_NOT_IN_CARBON
/*
 *  WideAdd()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( wide * )
WideAdd(
  wide *        target,
  const wide *  source)                                       THREEWORDINLINE(0x303C, 0x004C, 0xA832);


/*
 *  WideCompare()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( short )
WideCompare(
  const wide *  target,
  const wide *  source)                                       THREEWORDINLINE(0x303C, 0x004D, 0xA832);


/*
 *  WideNegate()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( wide * )
WideNegate(wide * target)                                     THREEWORDINLINE(0x303C, 0x004E, 0xA832);


/*
 *  WideShift()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( wide * )
WideShift(
  wide *  target,
  long    shift)                                              THREEWORDINLINE(0x303C, 0x004F, 0xA832);


/*
 *  WideSquareRoot()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( unsigned long )
WideSquareRoot(const wide * source)                           THREEWORDINLINE(0x303C, 0x0050, 0xA832);


/*
 *  WideSubtract()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( wide * )
WideSubtract(
  wide *        target,
  const wide *  source)                                       THREEWORDINLINE(0x303C, 0x0051, 0xA832);


/*
 *  WideMultiply()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( wide * )
WideMultiply(
  long    multiplicand,
  long    multiplier,
  wide *  target)                                             THREEWORDINLINE(0x303C, 0x0052, 0xA832);


/* returns the quotient */
/*
 *  WideDivide()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( long )
WideDivide(
  const wide *  dividend,
  long          divisor,
  long *        remainder)                                    THREEWORDINLINE(0x303C, 0x0053, 0xA832);


/* quotient replaces dividend */
/*
 *  WideWideDivide()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( wide * )
WideWideDivide(
  wide *  dividend,
  long    divisor,
  long *  remainder)                                          THREEWORDINLINE(0x303C, 0x0055, 0xA832);


#endif  /* CALL_NOT_IN_CARBON */

#endif  /* TARGET_OS_MAC && TARGET_CPU_68K */



#if CALL_NOT_IN_CARBON
/*
 *  VectorMultiply()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( wide * )
VectorMultiply(
  long          count,
  const long *  vector1,
  long          step1,
  const long *  vector2,
  long          step2,
  wide *        dot)                                          THREEWORDINLINE(0x303C, 0x0054, 0xA832);


/*
 *  RandomBits()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( unsigned long )
RandomBits(
  long   count,
  long   focus)                                               THREEWORDINLINE(0x303C, 0x0056, 0xA832);


/*
 *  SetRandomSeed()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( void )
SetRandomSeed(const wide * seed)                              THREEWORDINLINE(0x303C, 0x0057, 0xA832);


/*
 *  GetRandomSeed()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( wide * )
GetRandomSeed(wide * seed)                                    THREEWORDINLINE(0x303C, 0x0058, 0xA832);


#endif  /* CALL_NOT_IN_CARBON */

#ifndef FixedRound
#define FixedRound(a)       ((short)(((Fixed)(a) + fixed1/2) >> 16))
#endif
#ifndef FixedSquareRoot
#define FixedSquareRoot(a)  (((Fixed)FractSquareRoot(a) + 64) >> 7)
#endif
#ifndef FixedTruncate
#define FixedTruncate(a)        ((short)((Fixed)(a) >> 16))
#endif
#ifndef FixedToFract
#define FixedToFract(a)     ((Fract)(a) << 14)
#endif
#ifndef FractToFixed
#define FractToFixed(a)     ((Fixed)(a) + 8192L >> 14)
#endif
#ifndef FixedToInt
#define FixedToInt(a)      ((short)(((Fixed)(a) + fixed1/2) >> 16))
#endif
#ifndef IntToFixed
#define IntToFixed(a)      ((Fixed)(a) << 16)
#endif
#ifndef FixedToFloat
#define FixedToFloat(a)  ((float)(a) / fixed1)
#endif
#ifndef FloatToFixed
#define FloatToFixed(a)      ((Fixed)((float)(a) * fixed1))
#endif
#ifndef FractToFloat
#define FractToFloat(a)  ((float)(a) / fract1)
#endif
#ifndef FloatToFract
#define FloatToFract(a)  ((Fract)((float)(a) * fract1))
#endif
#ifndef ColorToFract
#define ColorToFract(a)  (((Fract) (a) << 14) + (((Fract)(a) + 2) >> 2))
#endif
#ifndef FractToColor
#define FractToColor(a)  ((gxColorValue) ((a) - ((a) >> 16) + 8191 >> 14))
#endif
#ifndef ff  /* ff is already defined on some platforms */
#define ff(a)              IntToFixed(a)
#define fl(a)              FloatToFixed(a)
#endif

 
#if defined(__MWERKS__) && TARGET_CPU_68K
    #pragma pop
#endif


#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __GXMATH__ */