{ File: CarbonCore/FixMath.h Contains: Fixed Math Interfaces. Version: CarbonCore-859.2~1 Copyright: © 1985-2008 by Apple Computer, Inc., all rights reserved Bugs?: For bug reports, consult the following page on the World Wide Web: http://www.freepascal.org/bugs.html } { Pascal Translation Updated: Jonas Maebe, , October 2009 } { Modified for use with Free Pascal Version 308 Please report any bugs to } {$ifc not defined MACOSALLINCLUDE or not MACOSALLINCLUDE} {$mode macpas} {$packenum 1} {$macro on} {$inline on} {$calling mwpascal} unit FixMath; interface {$setc UNIVERSAL_INTERFACES_VERSION := $0400} {$setc GAP_INTERFACES_VERSION := $0308} {$ifc not defined USE_CFSTR_CONSTANT_MACROS} {$setc USE_CFSTR_CONSTANT_MACROS := TRUE} {$endc} {$ifc defined CPUPOWERPC and defined CPUI386} {$error Conflicting initial definitions for CPUPOWERPC and CPUI386} {$endc} {$ifc defined FPC_BIG_ENDIAN and defined FPC_LITTLE_ENDIAN} {$error Conflicting initial definitions for FPC_BIG_ENDIAN and FPC_LITTLE_ENDIAN} {$endc} {$ifc not defined __ppc__ and defined CPUPOWERPC32} {$setc __ppc__ := 1} {$elsec} {$setc __ppc__ := 0} {$endc} {$ifc not defined __ppc64__ and defined CPUPOWERPC64} {$setc __ppc64__ := 1} {$elsec} {$setc __ppc64__ := 0} {$endc} {$ifc not defined __i386__ and defined CPUI386} {$setc __i386__ := 1} {$elsec} {$setc __i386__ := 0} {$endc} {$ifc not defined __x86_64__ and defined CPUX86_64} {$setc __x86_64__ := 1} {$elsec} {$setc __x86_64__ := 0} {$endc} {$ifc not defined __arm__ and defined CPUARM} {$setc __arm__ := 1} {$elsec} {$setc __arm__ := 0} {$endc} {$ifc defined cpu64} {$setc __LP64__ := 1} {$elsec} {$setc __LP64__ := 0} {$endc} {$ifc defined __ppc__ and __ppc__ and defined __i386__ and __i386__} {$error Conflicting definitions for __ppc__ and __i386__} {$endc} {$ifc defined __ppc__ and __ppc__} {$setc TARGET_CPU_PPC := TRUE} {$setc TARGET_CPU_PPC64 := FALSE} {$setc TARGET_CPU_X86 := FALSE} {$setc TARGET_CPU_X86_64 := FALSE} {$setc TARGET_CPU_ARM := FALSE} {$setc TARGET_OS_MAC := TRUE} {$setc TARGET_OS_IPHONE := FALSE} {$setc TARGET_IPHONE_SIMULATOR := FALSE} {$elifc defined __ppc64__ and __ppc64__} {$setc TARGET_CPU_PPC := FALSE} {$setc TARGET_CPU_PPC64 := TRUE} {$setc TARGET_CPU_X86 := FALSE} {$setc TARGET_CPU_X86_64 := FALSE} {$setc TARGET_CPU_ARM := FALSE} {$setc TARGET_OS_MAC := TRUE} {$setc TARGET_OS_IPHONE := FALSE} {$setc TARGET_IPHONE_SIMULATOR := FALSE} {$elifc defined __i386__ and __i386__} {$setc TARGET_CPU_PPC := FALSE} {$setc TARGET_CPU_PPC64 := FALSE} {$setc TARGET_CPU_X86 := TRUE} {$setc TARGET_CPU_X86_64 := FALSE} {$setc TARGET_CPU_ARM := FALSE} {$ifc defined(iphonesim)} {$setc TARGET_OS_MAC := FALSE} {$setc TARGET_OS_IPHONE := TRUE} {$setc TARGET_IPHONE_SIMULATOR := TRUE} {$elsec} {$setc TARGET_OS_MAC := TRUE} {$setc TARGET_OS_IPHONE := FALSE} {$setc TARGET_IPHONE_SIMULATOR := FALSE} {$endc} {$elifc defined __x86_64__ and __x86_64__} {$setc TARGET_CPU_PPC := FALSE} {$setc TARGET_CPU_PPC64 := FALSE} {$setc TARGET_CPU_X86 := FALSE} {$setc TARGET_CPU_X86_64 := TRUE} {$setc TARGET_CPU_ARM := FALSE} {$setc TARGET_OS_MAC := TRUE} {$setc TARGET_OS_IPHONE := FALSE} {$setc TARGET_IPHONE_SIMULATOR := FALSE} {$elifc defined __arm__ and __arm__} {$setc TARGET_CPU_PPC := FALSE} {$setc TARGET_CPU_PPC64 := FALSE} {$setc TARGET_CPU_X86 := FALSE} {$setc TARGET_CPU_X86_64 := FALSE} {$setc TARGET_CPU_ARM := TRUE} { will require compiler define when/if other Apple devices with ARM cpus ship } {$setc TARGET_OS_MAC := FALSE} {$setc TARGET_OS_IPHONE := TRUE} {$setc TARGET_IPHONE_SIMULATOR := FALSE} {$elsec} {$error __ppc__ nor __ppc64__ nor __i386__ nor __x86_64__ nor __arm__ is defined.} {$endc} {$ifc defined __LP64__ and __LP64__ } {$setc TARGET_CPU_64 := TRUE} {$elsec} {$setc TARGET_CPU_64 := FALSE} {$endc} {$ifc defined FPC_BIG_ENDIAN} {$setc TARGET_RT_BIG_ENDIAN := TRUE} {$setc TARGET_RT_LITTLE_ENDIAN := FALSE} {$elifc defined FPC_LITTLE_ENDIAN} {$setc TARGET_RT_BIG_ENDIAN := FALSE} {$setc TARGET_RT_LITTLE_ENDIAN := TRUE} {$elsec} {$error Neither FPC_BIG_ENDIAN nor FPC_LITTLE_ENDIAN are defined.} {$endc} {$setc ACCESSOR_CALLS_ARE_FUNCTIONS := TRUE} {$setc CALL_NOT_IN_CARBON := FALSE} {$setc OLDROUTINENAMES := FALSE} {$setc OPAQUE_TOOLBOX_STRUCTS := TRUE} {$setc OPAQUE_UPP_TYPES := TRUE} {$setc OTCARBONAPPLICATION := TRUE} {$setc OTKERNEL := FALSE} {$setc PM_USE_SESSION_APIS := TRUE} {$setc TARGET_API_MAC_CARBON := TRUE} {$setc TARGET_API_MAC_OS8 := FALSE} {$setc TARGET_API_MAC_OSX := TRUE} {$setc TARGET_CARBON := TRUE} {$setc TARGET_CPU_68K := FALSE} {$setc TARGET_CPU_MIPS := FALSE} {$setc TARGET_CPU_SPARC := FALSE} {$setc TARGET_OS_UNIX := FALSE} {$setc TARGET_OS_WIN32 := FALSE} {$setc TARGET_RT_MAC_68881 := FALSE} {$setc TARGET_RT_MAC_CFM := FALSE} {$setc TARGET_RT_MAC_MACHO := TRUE} {$setc TYPED_FUNCTION_POINTERS := TRUE} {$setc TYPE_BOOL := FALSE} {$setc TYPE_EXTENDED := FALSE} {$setc TYPE_LONGLONG := TRUE} uses MacTypes; {$endc} {not MACOSALLINCLUDE} {$ifc TARGET_OS_MAC} const fixed1 = $00010000; fract1 = $40000000; positiveInfinity = $7FFFFFFF; negativeInfinity = $80000000; { FixRatio, FixMul, and FixRound were previously in ToolUtils.h } { * FixRatio() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FixRatio( numer: SInt16; denom: SInt16 ): Fixed; external name '_FixRatio'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * FixMul() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FixMul( a: Fixed; b: Fixed ): Fixed; external name '_FixMul'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * FixRound() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FixRound( x: Fixed ): SInt16; external name '_FixRound'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * Fix2Frac() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function Fix2Frac( x: Fixed ): Fract; external name '_Fix2Frac'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * Fix2Long() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function Fix2Long( x: Fixed ): SInt32; external name '_Fix2Long'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * Long2Fix() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function Long2Fix( x: SInt32 ): Fixed; external name '_Long2Fix'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * Frac2Fix() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function Frac2Fix( x: Fract ): Fixed; external name '_Frac2Fix'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * FracMul() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FracMul( x: Fract; y: Fract ): Fract; external name '_FracMul'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * FixDiv() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FixDiv( x: Fixed; y: Fixed ): Fixed; external name '_FixDiv'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * FracDiv() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FracDiv( x: Fract; y: Fract ): Fract; external name '_FracDiv'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * FracSqrt() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FracSqrt( x: Fract ): Fract; external name '_FracSqrt'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * FracSin() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FracSin( x: Fixed ): Fract; external name '_FracSin'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * FracCos() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FracCos( x: Fixed ): Fract; external name '_FracCos'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * FixATan2() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function FixATan2( x: SInt32; y: SInt32 ): Fixed; external name '_FixATan2'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { Frac2X, Fix2X, X2Fix, and X2Frac translate to and from the floating point type "extended" (that's what the X is for). On the original Mac this was 80-bits and the functions could be accessed via A-Traps. When the 68881 co-processor was added, it used 96-bit floating point types, so the A-Traps could not be used. When PowerPC was added, it used 64-bit floating point types, so yet another prototype was added. } { * Frac2X() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function Frac2X( x: Fract ): Float64; external name '_Frac2X'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * Fix2X() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function Fix2X( x: Fixed ): Float64; external name '_Fix2X'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * X2Fix() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function X2Fix( x: Float64 ): Fixed; external name '_X2Fix'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * X2Frac() * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function X2Frac( x: Float64 ): Fract; external name '_X2Frac'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideCompare() * * Parameters: * * target: * a pointer to the first wide to compare * * source: * a pointer to the second wide to compare * * Result: * return 0 if the value in target == the value in source ; a value * < 0 if *target < *source and a value > 0 if *target > *source * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideCompare( const (*var*) target: wide; const (*var*) source: wide ): SInt16; external name '_WideCompare'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideAdd() * * Discussion: * Adds the value in source to target and returns target. Note that * target is updated to the new value. * * Parameters: * * target: * a pointer to the value to have source added to * * source: * a pointer to the value to be added to target * * Result: * returns the value target * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideAdd( var target: wide; const (*var*) source: wide ): widePtr; external name '_WideAdd'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideSubtract() * * Discussion: * Subtracts the value in source from target and returns target. * Note that target is updated to the new value. * * Parameters: * * target: * a pointer to the value to have source subtracted from * * source: * a pointer to the value to be substracted from target * * Result: * returns the value target * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideSubtract( var target: wide; const (*var*) source: wide ): widePtr; external name '_WideSubtract'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideNegate() * * Discussion: * Negates the value ( twos complement ) in target and returns * target. Note that target is updated to the new value. * * Parameters: * * target: * * Result: * returns the value target * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideNegate( var target: wide ): widePtr; external name '_WideNegate'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideShift() * * Discussion: * Shift the value in target by shift bits with upwards rounding of * the remainder. Note that target is updated to the new value. * * Parameters: * * target: * the value to be shifted * * shift: * the count of bits to shift, positive values shift right and * negative values shift left * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideShift( var target: wide; shift: SInt32 ): widePtr; external name '_WideShift'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideSquareRoot() * * Discussion: * Return the closest integer value to the square root for the given * number. * * Parameters: * * source: * the value to calculate the root for * * Result: * the closest integer value to the square root of source * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideSquareRoot( const (*var*) source: wide ): UInt32; external name '_WideSquareRoot'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideMultiply() * * Discussion: * Returns the wide result of multipling two SInt32 values * * Parameters: * * multiplicand: * * multiplier: * * target: * a pointer to where to put the result of multiplying * multiplicand and multiplier, must not be NULL * * Result: * the value target * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideMultiply( multiplicand: SInt32; multiplier: SInt32; var target: wide ): widePtr; external name '_WideMultiply'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideDivide() * * Discussion: * Returns the integer and remainder results after dividing a wide * value by an SInt32. Will overflow to positiveInfinity or * negativeInfinity if the result won't fit into an SInt32. If * remainder is (SInt32) -1 then any overflow rounds to * negativeInfinity. * * Parameters: * * dividend: * the value to be divided * * divisor: * the value to divide by * * remainder: * a pointer to where to put the remainder result, between 0 and * divisor, after dividing divident by divisor. If NULL, no * remainder is returned. If (SInt32*) -1, then any overflow * result will round to negativeInfinity. * * Result: * the integer signed result of dividend / divisor * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideDivide( const (*var*) dividend: wide; divisor: SInt32; var remainder: SInt32 ): SInt32; external name '_WideDivide'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideWideDivide() * * Discussion: * Returns the wide integer and remainder results after dividing a * wide value by an SInt32. Note that dividend is updated with the * result. * * Parameters: * * dividend: * the value to be divided * * divisor: * the value to divide by * * remainder: * a pointer to where to put the remainder result, between 0 and * divisor, after dividing divident by divisor * * Result: * the wide result of dividend / divisor * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideWideDivide( var dividend: wide; divisor: SInt32; var remainder: SInt32 ): widePtr; external name '_WideWideDivide'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * WideBitShift() * * Discussion: * Shift the value in target by shift bits. Note that target is * updated with the shifted result. * * Parameters: * * target: * the value to be shifted * * shift: * the count of bits to shift, positive values shift right and * negative values shift left * * Result: * return the value target * * Availability: * Mac OS X: in version 10.0 and later in CoreServices.framework * CarbonLib: in CarbonLib 1.0 and later * Non-Carbon CFM: in InterfaceLib 7.1 and later } function WideBitShift( var target: wide; shift: SInt32 ): widePtr; external name '_WideBitShift'; (* AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER *) { * UnsignedFixedMulDiv() * * Availability: * Mac OS X: in version 10.4 and later in CoreServices.framework * CarbonLib: not available * Non-Carbon CFM: not available } function UnsignedFixedMulDiv( value: UnsignedFixed; multiplier: UnsignedFixed; divisor: UnsignedFixed ): UnsignedFixed; external name '_UnsignedFixedMulDiv'; (* AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER *) {$endc} {TARGET_OS_MAC} {$ifc not defined MACOSALLINCLUDE or not MACOSALLINCLUDE} end. {$endc} {not MACOSALLINCLUDE}