/*
 	File:		ATSUnicode.h
 
 	Contains:	Public interfaces for Apple Type Services for Unicode Imaging
 
 	Version:	Technology:	Mac OS 9
 				Release:	QuickTime 4.1
 
 	Copyright:	(c) 1997-1999 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 __ATSUNICODE__
#define __ATSUNICODE__

#ifndef __ATSLAYOUTTYPES__
	#include <ATSLayoutTypes.h>
#endif

#ifndef __SFNTLAYOUTTYPES__
	#include <SFNTLayoutTypes.h>
#endif

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

#ifndef __MACMEMORY__
	#include <MacMemory.h>
#endif

#ifndef __FONTS__
	#include <Fonts.h>
#endif

#ifndef __QUICKDRAW__
	#include <Quickdraw.h>
#endif

#ifndef __TEXTCOMMON__
	#include <TextCommon.h>
#endif

#ifndef __MACERRORS__
	#include <MacErrors.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

/************/
/*	Types	*/
/************/
/*
   UniCharArrayHandle and UniCharArrayOffset are defined in the
   TextCommon interface file.
*/

/*
  	ATSUTextMeasurement is specific to ATSUI in that measurement
  	quantities are in fractional Fixed format instead of shorts
  	used in QuickDraw Text.  This provides exact outline metrics and
  	line specifications such as line width, ascent, descent, and so on.  
*/

typedef Fixed 							ATSUTextMeasurement;
/*
  	ATSUFontID indicates a particular font family and face.  
  	ATSUFontID's are not guaranteed to remain constant across 
  	reboots.  Clients should use the font's unique name to 
  	get a font token to store in documents which is 
  	guaranteed to remain constant across reboots. 
*/
typedef FMFont 							ATSUFontID;
/*
  	ATSUFontFeatureType and ATSUFontFeatureSelector are used 
  	to identify font features.  
*/
typedef UInt16 							ATSUFontFeatureType;
typedef UInt16 							ATSUFontFeatureSelector;
/*
  	ATSUFontVariationAxis and ATSUFontVariationValue are used 
  	in connection with font variations.  
*/
typedef FourCharCode 					ATSUFontVariationAxis;
typedef Fixed 							ATSUFontVariationValue;
/*
  	ATSUTextLayout is used to store the attribute information 
  	associated with a contiguous block of UniChar's (UInt16's) 
  	in memory.  It's typed to be an opaque structure.  
*/

typedef struct OpaqueATSUTextLayout* 	ATSUTextLayout;
/*
  	ATSUStyle is used to store a set of individual attributes, 
  	font features, and font variations.  It's typed to be 
  	an opaque structure.  
*/
typedef struct OpaqueATSUStyle* 		ATSUStyle;
/*
  	ATSUAttributeTag is used to indicate the particular type 
  	of attribute under consideration:  font, size, color, 
  	and so on.  
  	Each style run may have at most one attribute with a 
  	given ATSUAttributeTag (i.e., a style run can't have 
  	more than one font or size) but may have none.  
*/
typedef UInt32 							ATSUAttributeTag;
/*
  	ATSUAttributeValuePtr is used to provide generic access 
  	to storage of attribute values, which vary in size.
*/
typedef void *							ATSUAttributeValuePtr;
/*
  	ATSUAttributeInfo is used to provide a tag/size pairing.  
  	This makes it possible to provide the client information   
  	about all the attributes for a given range of text.  This   
  	structure is only used to return to the client information   
  	about a complete set of attributes.  An array of   
  	ATSUAttributeInfos is passed as a parameter so that the   
  	client can find out what attributes are set and what their   
  	individual sizes are; with that information, they can then   
  	query about the values of the attributes they're interested   
  	in.  Because arrays of ATSUAttributeInfos are used as parameters   
  	to functions, they have to be of a fixed size, hence the   
  	value is not included in the structure.  
*/

struct ATSUAttributeInfo {
	ATSUAttributeTag 				fTag;
	ByteCount 						fValueSize;
};
typedef struct ATSUAttributeInfo		ATSUAttributeInfo;
/*
  	ATSUCaret contains the complete information needed to render a
  	caret.  fX and fY is the position of one of the caret's ends
  	relative to the origin position of the line the caret belongs.
  	fDeltaX and fDeltaY is the position of the caret's other end.
  	Hence, to draw a caret, simply call MoveTo(fX, fY) followed by
  	LineTo(fDeltaX, fDeltaY) or equivalent.  The ATSUCaret will
  	contain the positions needed to draw carets on angled lines
  	and reflect angled carets and leading/trailing split caret
  	appearances.
*/

struct ATSUCaret {
	Fixed 							fX;
	Fixed 							fY;
	Fixed 							fDeltaX;
	Fixed 							fDeltaY;
};
typedef struct ATSUCaret				ATSUCaret;
/*
  	ATSUCursorMovementType currently can take three values 
  	(kATSUByCharacter, kATSUByCluster, and kATSUByWord) 
  	and is used to indicate how much to move the cursor.  
*/

typedef UInt16 							ATSUCursorMovementType;
/*
  	ATSUVerticalCharacterType currently can take two values 
  	(kATSUStronglyVertical, and kATSUStronglyHorizontal) and 
  	is used to indicate whether text is to be laid out as 
  	vertical glyphs or horizontal glyphs.  
*/
typedef UInt16 							ATSUVerticalCharacterType;
/*
  	ATSUStyleComparison is an enumeration with four values 
  	(kATUStyleUnequal, ATSUStyleContains, kATSUStyleEquals, 
  	and kATSUStyleContainedBy), and is used by ATSUCompareStyles() 
  	to indicate if the first style parameter contains as a 
  	proper subset, is equal to, or is contained by the second 
  	style parameter.
*/
typedef UInt16 							ATSUStyleComparison;
/*
  	ATSUFontFallbackMethod type defines the type of heap or memory callback
  	method ATSUI is to follow iin all its permanent memory allocations for
  	it clients.
*/
typedef UInt16 							ATSUFontFallbackMethod;
/*
  	ATSUMemoryCallbacks is a union struct that allows the ATSUI 
  	client to specify a specific heap for ATSUI use or allocation
  	callbacks of which ATSUI is to use each time ATSUI performs a
  	memory operation (alloc, grow, free).
*/
typedef CALLBACK_API_C( void *, ATSUCustomAllocFunc )(void *refCon, ByteCount howMuch);
typedef CALLBACK_API_C( void , ATSUCustomFreeFunc )(void *refCon, void *doomedBlock);
typedef CALLBACK_API_C( void *, ATSUCustomGrowFunc )(void *refCon, void *oldBlock, ByteCount oldSize, ByteCount newSize);

union ATSUMemoryCallbacks {
	struct {
		ATSUCustomAllocFunc 			Alloc;
		ATSUCustomFreeFunc 				Free;
		ATSUCustomGrowFunc 				Grow;
		void *							memoryRefCon;
	} 								callbacks;

	THz 							heapToUse;
};
typedef union ATSUMemoryCallbacks		ATSUMemoryCallbacks;
/*
  	ATSUHeapSpec provides allows the ATSUI client a means of
  	specifying the heap ATSUI should allocate it's dynamic memory
  	from or that ATSUI should use the memory callback provided by
  	the client.
*/

typedef UInt16 							ATSUHeapSpec;
/*
  	ATSUMemorySetting is used to store the results from a ATSUSetMemoryAlloc
  	or a ATSUGetCurrentMemorySetting call.  It can also be used to change the
  	current ATSUMemorySetting by passing it into the ATSUSetCurrentMemorySetting
  	call.
*/
typedef struct OpaqueATSUMemorySetting*  ATSUMemorySetting;
/*******************************************************************************/
/*	ATSUI Attribute tags:  Apple reserves values 0 to 65,535 (0 to 0x0000FFFF) */
/*	ATSUI clients may create their own tags with any other value               */
/*******************************************************************************/
/*	Line Control Attribute Tags */
enum {
	kATSULineWidthTag			= 1L,							/*	Type:			ATSUTextMeasurement*/
																/*	Default value:	0*/
	kATSULineRotationTag		= 2L,							/*	Type:			Fixed (fixed value in degrees in right-handed coordinate system)*/
																/*	Default value:	0*/
	kATSULineDirectionTag		= 3L,							/*	Type:			Boolean; values 0 or 1 (see below for value identities)*/
																/*	Default value:	GetSysDirection() ? kATSURightToLeftBaseDirection : kATSULeftToRightBaseDirection*/
	kATSULineJustificationFactorTag = 4L,						/*	Type:			Fract between 0 and 1*/
																/*	Default value:	kATSUNoJustification*/
	kATSULineFlushFactorTag		= 5L,							/*	Type:			Fract between 0 and 1 */
																/*	Default value:	kATSUStartAlignment*/
	kATSULineBaselineValuesTag	= 6L,							/*	Type:			BslnBaselineRecord*/
																/*	Default value:	All zeros.  Calculated from other style attributes (e.g., font and point size)*/
	kATSULineLayoutOptionsTag	= 7L,							/*	Type:			UInt32*/
																/*	Default value:	kATSLineNoLayoutOptions - other options listed in ATSLayoutTypes.h*/
	kATSULineAscentTag			= 8L,							/*	Type:			ATSUTextMeasurement*/
																/*	Default value:	kATSUseLineHeight*/
	kATSULineDescentTag			= 9L,							/*	Type:			ATSUTextMeasurement*/
																/*	Default value:	kATSUseLineHeight*/
	kATSULineLanguageTag		= 10L,							/*	Type:			RegionCode - region values listed in script.h interface file*/
																/*	Default value:	kTextRegionDontCare*/
	kATSULineTextLocatorTag		= 11L,							/*	Type:			TextBreakLocatorRef*/
																/*	Default value:	NULL - set Region derived locator or the default Text Utilities locator*/
	kATSUMaxLineTag				= 12L							/*	This is just for convenience - the upper limit of the ATSUTextLayout attribute tags */
};

/*	Run Style Attribute Tags */
enum {
																/* QuickDraw compatibility tags */
	kATSUQDBoldfaceTag			= 256L,							/*	Type:			Boolean	*/
																/*	Default value:	false*/
	kATSUQDItalicTag			= 257L,							/*	Type:			Boolean		*/
																/*	Default value:	false*/
	kATSUQDUnderlineTag			= 258L,							/*	Type:			Boolean	*/
																/*	Default value:	false*/
	kATSUQDCondensedTag			= 259L,							/*	Type:			Boolean	*/
																/*	Default value:	false*/
	kATSUQDExtendedTag			= 260L,							/*	Type:			Boolean	*/
																/*	Default value:	false*/
																/* Common run tags */
	kATSUFontTag				= 261L,							/*	Type:			ATSUFontID	*/
																/*	Default value:	GetScriptVariable( smSystemScript, smScriptAppFond )*/
	kATSUSizeTag				= 262L,							/*	Type:			Fixed	*/
																/*	Default value:	GetScriptVariable( smSystemScript, smScriptAppFondSize )	*/
	kATSUColorTag				= 263L,							/*	Type:			RGBColor	*/
																/*	Default value:	(0, 0, 0)*/
																/*	Less common run tags */
	kATSULanguageTag			= 264L,							/*	Type:			RegionCode - region values listed in script.h interface file*/
																/*	Default value:	GetScriptManagerVariable( smRegionCode )*/
	kATSUVerticalCharacterTag	= 265L,							/*	Type:			ATSUVerticalCharacterType	*/
																/*	Default value:	kATSUStronglyHorizontal*/
	kATSUImposeWidthTag			= 266L,							/*	Type:			ATSUTextMeasurement*/
																/*	Default value:	all glyphs use their own font defined advance widths*/
	kATSUBeforeWithStreamShiftTag = 267L,						/*	Type:			Fixed*/
																/*	Default value:	0*/
	kATSUAfterWithStreamShiftTag = 268L,						/*	Type:			Fixed*/
																/*	Default value:	0*/
	kATSUCrossStreamShiftTag	= 269L,							/*	Type:			Fixed*/
																/*	Default value:	0*/
	kATSUTrackingTag			= 270L,							/*	Type:			Fixed*/
																/*	Default value:	kATSNoTracking*/
	kATSUHangingInhibitFactorTag = 271L,						/*	Type:			Fract between 0 and 1*/
																/*	Default value:	0*/
	kATSUKerningInhibitFactorTag = 272L,						/*	Type:			Fract between 0 and 1*/
																/*	Default value:	0*/
	kATSUDecompositionFactorTag	= 273L,							/*	Type:			Fixed (-1.0 -> 1.0)*/
																/*	Default value:	0*/
	kATSUBaselineClassTag		= 274L,							/*	Type:			BslnBaselineClass  (see SFNTLayoutTypes.h)*/
																/*	Default value:	kBSLNRomanBaseline - set to kBSLNNoBaselineOverride to use intrinsic baselines*/
	kATSUPriorityJustOverrideTag = 275L,						/*	Type:			ATSJustPriorityWidthDeltaOverrides (see ATSLayoutTypes.h)*/
																/*	Default value:	all zeros*/
	kATSUNoLigatureSplitTag		= 276L,							/*	Type:			Boolean*/
																/*	Default value:	false - ligatures and compound characters have divisable components.*/
	kATSUNoCaretAngleTag		= 277L,							/*	Type:			Boolean*/
																/*	Default value:	false - use the character's angularity to determine its boundaries*/
	kATSUSuppressCrossKerningTag = 278L,						/*	Type:			Boolean*/
																/*	Default value:	false - do not suppress automatic cross kerning (defined by font)*/
	kATSUNoOpticalAlignmentTag	= 279L,							/*	Type:			Boolean*/
																/*	Default value:	false - do not suppress character's automatic optical positional alignment*/
	kATSUForceHangingTag		= 280L,							/*	Type:			Boolean*/
																/*	Default value:	false - do not force the character's to hang beyond the line boundaries*/
	kATSUNoSpecialJustificationTag = 281L,						/*	Type:			Boolean*/
																/*	Default value:	false - perform post-compensation justification if needed*/
	kATSUStyleTextLocatorTag	= 282L,							/*	Type:			TextBreakLocatorRef*/
																/*	Default value:	NULL - region derived locator or the default Text Utilities locator*/
	kATSUMaxStyleTag			= 283L,							/*	This is just for convenience - the upper limit of the ATSUStyle attribute tags */
	kATSUMaxATSUITagValue		= 65535L						/*	This is the maximum Apple ATSUI reserved tag value.  Client defined tags must be larger.*/
};

/********************************/
/*	Enumerations and constants	*/
/********************************/
/* Cursor movement */
enum {
	kATSUByCharacter			= 0,
	kATSUByCluster				= 1,
	kATSUByWord					= 2
};

/* Vertical text types */
enum {
	kATSUStronglyHorizontal		= 0,
	kATSUStronglyVertical		= 1
};

/* Line direction types (used for kATSULineDirectionTag values) */
enum {
	kATSULeftToRightBaseDirection = 0,							/*	Impose left-to-right or top-to-bottom dominant direction */
	kATSURightToLeftBaseDirection = 1							/*	Impose right-to-left or bottom-to-top dominant direction */
};

/* Style comparison types */
enum {
	kATSUStyleUnequal			= 0,
	kATSUStyleContains			= 1,
	kATSUStyleEquals			= 2,
	kATSUStyleContainedBy		= 3
};

/* Font Fallback methods */
enum {
	kATSUDefaultFontFallbacks	= 0,
	kATSULastResortOnlyFallback	= 1,
	kATSUSequentialFallbacksPreferred = 2,
	kATSUSequentialFallbacksExclusive = 3
};

/* ATSUI heap or memory allocation specifiers (of type ATSUHeapSpec) */
enum {
	kATSUUseCurrentHeap			= 0,
	kATSUUseAppHeap				= 1,
	kATSUUseSpecificHeap		= 2,
	kATSUUseCallbacks			= 3
};

/* LineFlushFactor convenience defined values */
#define kATSUStartAlignment			((Fract) 0x00000000L)
#define kATSUEndAlignment			((Fract) 0x40000000L)
#define kATSUCenterAlignment		((Fract) 0x20000000L)
/* LineJustificationFactor convenience defined values */
#define kATSUNoJustification		((Fract) 0x00000000L)
#define kATSUFullJustification		((Fract) 0x40000000L)
/* Other constants	*/
enum {
	kATSUInvalidFontID			= 0
};


enum {
	kATSUUseLineControlWidth	= 0x7FFFFFFF
};


enum {
	kATSUNoSelector				= 0x0000FFFF
};


enum {
	kATSUUseGrafPortPenLoc		= (long)0xFFFFFFFF,
	kATSUClearAll				= (long)0xFFFFFFFF
};


enum {
	kATSUFromTextBeginning		= (long)0xFFFFFFFF,
	kATSUToTextEnd				= (long)0xFFFFFFFF
};


/****************/
/*	Functions	*/
/****************/

/*	Clipboard support, flattened style version 0 (is is advised to not use these routines and perform your own flattening)	*/
EXTERN_API_C( OSStatus )
ATSUCopyToHandle				(ATSUStyle 				iStyle,
								 Handle 				oStyleHandle);

EXTERN_API_C( OSStatus )
ATSUPasteFromHandle				(ATSUStyle 				iStyle,
								 Handle 				iStyleHandle);

/*	Memory allocation specification functions	*/
EXTERN_API_C( OSStatus )
ATSUCreateMemorySetting			(ATSUHeapSpec 			iHeapSpec,
								 ATSUMemoryCallbacks *	iMemoryCallbacks,
								 ATSUMemorySetting *	oMemorySetting);

EXTERN_API_C( OSStatus )
ATSUSetCurrentMemorySetting		(ATSUMemorySetting 		iMemorySetting);

EXTERN_API_C( ATSUMemorySetting )
ATSUGetCurrentMemorySetting		(void);

EXTERN_API_C( OSStatus )
ATSUDisposeMemorySetting		(ATSUMemorySetting 		iMemorySetting);

/*	Basic style functions	*/
EXTERN_API_C( OSStatus )
ATSUCreateStyle					(ATSUStyle *			oStyle);

EXTERN_API_C( OSStatus )
ATSUCreateAndCopyStyle			(ATSUStyle 				iStyle,
								 ATSUStyle *			oStyle);

EXTERN_API_C( OSStatus )
ATSUDisposeStyle				(ATSUStyle 				iStyle);

EXTERN_API_C( OSStatus )
ATSUSetStyleRefCon				(ATSUStyle 				iStyle,
								 UInt32 				iRefCon);

EXTERN_API_C( OSStatus )
ATSUGetStyleRefCon				(ATSUStyle 				iStyle,
								 UInt32 *				oRefCon);

/*	Style comparison 		*/
EXTERN_API_C( OSStatus )
ATSUCompareStyles				(ATSUStyle 				iFirstStyle,
								 ATSUStyle 				iSecondStyle,
								 ATSUStyleComparison *	oComparison);

/*	Attribute manipulations	*/
EXTERN_API_C( OSStatus )
ATSUCopyAttributes				(ATSUStyle 				iSourceStyle,
								 ATSUStyle 				iDestinationStyle);

EXTERN_API_C( OSStatus )
ATSUOverwriteAttributes			(ATSUStyle 				iSourceStyle,
								 ATSUStyle 				iDestinationStyle);

EXTERN_API_C( OSStatus )
ATSUUnderwriteAttributes		(ATSUStyle 				iSourceStyle,
								 ATSUStyle 				iDestinationStyle);

/*	Empty styles	*/
EXTERN_API_C( OSStatus )
ATSUClearStyle					(ATSUStyle 				iStyle);

EXTERN_API_C( OSStatus )
ATSUStyleIsEmpty				(ATSUStyle 				iStyle,
								 Boolean *				oIsClear);

/*	Get and set attributes */
EXTERN_API_C( OSStatus )
ATSUCalculateBaselineDeltas		(ATSUStyle 				iStyle,
								 BslnBaselineClass 		iBaselineClass,
								 BslnBaselineRecord 	oBaselineDeltas);

EXTERN_API_C( OSStatus )
ATSUSetAttributes				(ATSUStyle 				iStyle,
								 ItemCount 				iAttributeCount,
								 ATSUAttributeTag 		iTag[],
								 ByteCount 				iValueSize[],
								 ATSUAttributeValuePtr 	iValue[]);

EXTERN_API_C( OSStatus )
ATSUGetAttribute				(ATSUStyle 				iStyle,
								 ATSUAttributeTag 		iTag,
								 ByteCount 				iExpectedValueSize,
								 ATSUAttributeValuePtr 	oValue,
								 ByteCount *			oActualValueSize);

EXTERN_API_C( OSStatus )
ATSUGetAllAttributes			(ATSUStyle 				iStyle,
								 ATSUAttributeInfo 		oAttributeInfoArray[],
								 ItemCount 				iTagValuePairArraySize,
								 ItemCount *			oTagValuePairCount);

EXTERN_API_C( OSStatus )
ATSUClearAttributes				(ATSUStyle 				iStyle,
								 ItemCount 				iTagCount,
								 ATSUAttributeTag 		iTag[]);

/*	Font features	*/
EXTERN_API_C( OSStatus )
ATSUSetFontFeatures				(ATSUStyle 				iStyle,
								 ItemCount 				iFeatureCount,
								 ATSUFontFeatureType 	iType[],
								 ATSUFontFeatureSelector  iSelector[]);

EXTERN_API_C( OSStatus )
ATSUGetFontFeature				(ATSUStyle 				iStyle,
								 ItemCount 				iFeatureIndex,
								 ATSUFontFeatureType *	oFeatureType,
								 ATSUFontFeatureSelector * oFeatureSelector);

EXTERN_API_C( OSStatus )
ATSUGetAllFontFeatures			(ATSUStyle 				iStyle,
								 ItemCount 				iMaximumFeatureCount,
								 ATSUFontFeatureType 	oFeatureType[],
								 ATSUFontFeatureSelector  oFeatureSelector[],
								 ItemCount *			oActualFeatureCount);

EXTERN_API_C( OSStatus )
ATSUClearFontFeatures			(ATSUStyle 				iStyle,
								 ItemCount 				iFeatureCount,
								 ATSUFontFeatureType 	iType[],
								 ATSUFontFeatureSelector  iSelector[]);

/*	Font variations	*/
EXTERN_API_C( OSStatus )
ATSUSetVariations				(ATSUStyle 				iStyle,
								 ItemCount 				iVariationCount,
								 ATSUFontVariationAxis 	iAxes[],
								 ATSUFontVariationValue  iValue[]);

EXTERN_API_C( OSStatus )
ATSUGetFontVariationValue		(ATSUStyle 				iStyle,
								 ATSUFontVariationAxis 	iFontVariationAxis,
								 ATSUFontVariationValue * oFontVariationValue);

EXTERN_API_C( OSStatus )
ATSUGetAllFontVariations		(ATSUStyle 				iStyle,
								 ItemCount 				iVariationCount,
								 ATSUFontVariationAxis 	oVariationAxes[],
								 ATSUFontVariationValue  oFontVariationValues[],
								 ItemCount *			oActualVariationCount);

EXTERN_API_C( OSStatus )
ATSUClearFontVariations			(ATSUStyle 				iStyle,
								 ItemCount 				iAxisCount,
								 ATSUFontVariationAxis 	iAxis[]);

/*	Basic text-layout functions	*/
EXTERN_API_C( OSStatus )
ATSUCreateTextLayout			(ATSUTextLayout *		oTextLayout);

EXTERN_API_C( OSStatus )
ATSUCreateAndCopyTextLayout		(ATSUTextLayout 		iTextLayout,
								 ATSUTextLayout *		oTextLayout);

EXTERN_API_C( OSStatus )
ATSUCreateTextLayoutWithTextPtr	(ConstUniCharArrayPtr 	iText,
								 UniCharArrayOffset 	iTextOffset,
								 UniCharCount 			iTextLength,
								 UniCharCount 			iTextTotalLength,
								 ItemCount 				iNumberOfRuns,
								 UniCharCount 			iRunLengths[],
								 ATSUStyle 				iStyles[],
								 ATSUTextLayout *		oTextLayout);

EXTERN_API_C( OSStatus )
ATSUCreateTextLayoutWithTextHandle (UniCharArrayHandle 	iText,
								 UniCharArrayOffset 	iTextOffset,
								 UniCharCount 			iTextLength,
								 UniCharCount 			iTextTotalLength,
								 ItemCount 				iNumberOfRuns,
								 UniCharCount 			iRunLengths[],
								 ATSUStyle 				iStyles[],
								 ATSUTextLayout *		oTextLayout);

EXTERN_API_C( OSStatus )
ATSUClearLayoutCache			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineStart);

EXTERN_API_C( OSStatus )
ATSUDisposeTextLayout			(ATSUTextLayout 		iTextLayout);

EXTERN_API_C( OSStatus )
ATSUSetTextLayoutRefCon			(ATSUTextLayout 		iTextLayout,
								 UInt32 				iRefCon);

EXTERN_API_C( OSStatus )
ATSUGetTextLayoutRefCon			(ATSUTextLayout 		iTextLayout,
								 UInt32 *				oRefCon);

/*	Glyph bounds retrieval	*/
EXTERN_API_C( OSStatus )
ATSUGetGlyphBounds				(ATSUTextLayout 		iTextLayout,
								 ATSUTextMeasurement 	iTextBasePointX,
								 ATSUTextMeasurement 	iTextBasePointY,
								 UniCharArrayOffset 	iBoundsCharStart,
								 UniCharCount 			iBoundsCharLength,
								 UInt16 				iTypeOfBounds,
								 ItemCount 				iMaxNumberOfBounds,
								 ATSTrapezoid 			oGlyphBounds[],
								 ItemCount *			oActualNumberOfBounds);

/*	Idle processing	*/
EXTERN_API_C( OSStatus )
ATSUIdle						(ATSUTextLayout 		iTextLayout);

/*	Text location	*/
EXTERN_API_C( OSStatus )
ATSUSetTextPointerLocation		(ATSUTextLayout 		iTextLayout,
								 ConstUniCharArrayPtr 	iText,
								 UniCharArrayOffset 	iTextOffset,
								 UniCharCount 			iTextLength,
								 UniCharCount 			iTextTotalLength);

EXTERN_API_C( OSStatus )
ATSUSetTextHandleLocation		(ATSUTextLayout 		iTextLayout,
								 UniCharArrayHandle 	iText,
								 UniCharArrayOffset 	iTextOffset,
								 UniCharCount 			iTextLength,
								 UniCharCount 			iTextTotalLength);

EXTERN_API_C( OSStatus )
ATSUGetTextLocation				(ATSUTextLayout 		iTextLayout,
								 void **				oText,
								 Boolean *				oTextIsStoredInHandle,
								 UniCharArrayOffset *	oOffset,
								 UniCharCount *			oTextLength,
								 UniCharCount *			oTextTotalLength);

/*	Text manipulation	*/
EXTERN_API_C( OSStatus )
ATSUTextDeleted					(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iDeletedRangeStart,
								 UniCharCount 			iDeletedRangeLength);

EXTERN_API_C( OSStatus )
ATSUTextInserted				(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iInsertionLocation,
								 UniCharCount 			iInsertionLength);

EXTERN_API_C( OSStatus )
ATSUTextMoved					(ATSUTextLayout 		iTextLayout,
								 ConstUniCharArrayPtr 	iNewLocation);

/*	Layout controls	*/
EXTERN_API_C( OSStatus )
ATSUCopyLayoutControls			(ATSUTextLayout 		iSourceTextLayout,
								 ATSUTextLayout 		iDestTextLayout);

EXTERN_API_C( OSStatus )
ATSUSetLayoutControls			(ATSUTextLayout 		iTextLayout,
								 ItemCount 				iAttributeCount,
								 ATSUAttributeTag 		iTag[],
								 ByteCount 				iValueSize[],
								 ATSUAttributeValuePtr 	iValue[]);

EXTERN_API_C( OSStatus )
ATSUGetLayoutControl			(ATSUTextLayout 		iTextLayout,
								 ATSUAttributeTag 		iTag,
								 ByteCount 				iExpectedValueSize,
								 ATSUAttributeValuePtr 	oValue,
								 ByteCount *			oActualValueSize);

EXTERN_API_C( OSStatus )
ATSUGetAllLayoutControls		(ATSUTextLayout 		iTextLayout,
								 ATSUAttributeInfo 		oAttributeInfoArray[],
								 ItemCount 				iTagValuePairArraySize,
								 ItemCount *			oTagValuePairCount);

EXTERN_API_C( OSStatus )
ATSUClearLayoutControls			(ATSUTextLayout 		iTextLayout,
								 ItemCount 				iTagCount,
								 ATSUAttributeTag 		iTag[]);

/*	Single line layout controls	*/
EXTERN_API_C( OSStatus )
ATSUCopyLineControls			(ATSUTextLayout 		iSourceTextLayout,
								 UniCharArrayOffset 	iSourceLineStart,
								 ATSUTextLayout 		iDestTextLayout,
								 UniCharArrayOffset 	iDestLineStart);

EXTERN_API_C( OSStatus )
ATSUSetLineControls				(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineStart,
								 ItemCount 				iAttributeCount,
								 ATSUAttributeTag 		iTag[],
								 ByteCount 				iValueSize[],
								 ATSUAttributeValuePtr 	iValue[]);

EXTERN_API_C( OSStatus )
ATSUGetLineControl				(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineStart,
								 ATSUAttributeTag 		iTag,
								 ByteCount 				iExpectedValueSize,
								 ATSUAttributeValuePtr 	oValue,
								 ByteCount *			oActualValueSize);

EXTERN_API_C( OSStatus )
ATSUGetAllLineControls			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineStart,
								 ATSUAttributeInfo 		oAttributeInfoArray[],
								 ItemCount 				iTagValuePairArraySize,
								 ItemCount *			oTagValuePairCount);

EXTERN_API_C( OSStatus )
ATSUClearLineControls			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineStart,
								 ItemCount 				iTagCount,
								 ATSUAttributeTag 		iTag[]);

/*	Style run processing	*/
EXTERN_API_C( OSStatus )
ATSUSetRunStyle					(ATSUTextLayout 		iTextLayout,
								 ATSUStyle 				iStyle,
								 UniCharArrayOffset 	iRunStart,
								 UniCharCount 			iRunLength);

EXTERN_API_C( OSStatus )
ATSUGetRunStyle					(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iOffset,
								 ATSUStyle *			oStyle,
								 UniCharArrayOffset *	oRunStart,
								 UniCharCount *			oRunLength);

EXTERN_API_C( OSStatus )
ATSUGetContinuousAttributes		(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iOffset,
								 UniCharCount 			iLength,
								 ATSUStyle 				oStyle);

/*	Drawing and measuring	*/
EXTERN_API_C( OSStatus )
ATSUDrawText					(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineOffset,
								 UniCharCount 			iLineLength,
								 ATSUTextMeasurement 	iLocationX,
								 ATSUTextMeasurement 	iLocationY);

EXTERN_API_C( OSStatus )
ATSUMeasureText					(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineStart,
								 UniCharCount 			iLineLength,
								 ATSUTextMeasurement *	oTextBefore,
								 ATSUTextMeasurement *	oTextAfter,
								 ATSUTextMeasurement *	oAscent,
								 ATSUTextMeasurement *	oDescent);

EXTERN_API_C( OSStatus )
ATSUMeasureTextImage			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineOffset,
								 UniCharCount 			iLineLength,
								 ATSUTextMeasurement 	iLocationX,
								 ATSUTextMeasurement 	iLocationY,
								 Rect *					oTextImageRect);

/*	Highlighting	*/
EXTERN_API_C( OSStatus )
ATSUHighlightText				(ATSUTextLayout 		iTextLayout,
								 ATSUTextMeasurement 	iTextBasePointX,
								 ATSUTextMeasurement 	iTextBasePointY,
								 UniCharArrayOffset 	iHighlightStart,
								 UniCharCount 			iHighlightLength);

EXTERN_API_C( OSStatus )
ATSUUnhighlightText				(ATSUTextLayout 		iTextLayout,
								 ATSUTextMeasurement 	iTextBasePointX,
								 ATSUTextMeasurement 	iTextBasePointY,
								 UniCharArrayOffset 	iHighlightStart,
								 UniCharCount 			iHighlightLength);

EXTERN_API_C( OSStatus )
ATSUGetTextHighlight			(ATSUTextLayout 		iTextLayout,
								 ATSUTextMeasurement 	iTextBasePointX,
								 ATSUTextMeasurement 	iTextBasePointY,
								 UniCharArrayOffset 	iHighlightStart,
								 UniCharCount 			iHighlightLength,
								 RgnHandle 				oHighlightRegion);

/*	Hit-testing	*/
EXTERN_API_C( OSStatus )
ATSUPositionToOffset			(ATSUTextLayout 		iTextLayout,
								 ATSUTextMeasurement 	iLocationX,
								 ATSUTextMeasurement 	iLocationY,
								 UniCharArrayOffset *	ioPrimaryOffset,
								 Boolean *				oIsLeading,
								 UniCharArrayOffset *	oSecondaryOffset);

EXTERN_API_C( OSStatus )
ATSUOffsetToPosition			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iOffset,
								 Boolean 				iIsLeading,
								 ATSUCaret *			oMainCaret,
								 ATSUCaret *			oSecondCaret,
								 Boolean *				oCaretIsSplit);

/*	Cursor movement	*/
EXTERN_API_C( OSStatus )
ATSUNextCursorPosition			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iOldOffset,
								 ATSUCursorMovementType  iMovementType,
								 UniCharArrayOffset *	oNewOffset);

EXTERN_API_C( OSStatus )
ATSUPreviousCursorPosition		(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iOldOffset,
								 ATSUCursorMovementType  iMovementType,
								 UniCharArrayOffset *	oNewOffset);

EXTERN_API_C( OSStatus )
ATSURightwardCursorPosition		(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iOldOffset,
								 ATSUCursorMovementType  iMovementType,
								 UniCharArrayOffset *	oNewOffset);

EXTERN_API_C( OSStatus )
ATSULeftwardCursorPosition		(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iOldOffset,
								 ATSUCursorMovementType  iMovementType,
								 UniCharArrayOffset *	oNewOffset);

/*	Line breaking	*/
EXTERN_API_C( OSStatus )
ATSUBreakLine					(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineStart,
								 ATSUTextMeasurement 	iLineWidth,
								 Boolean 				iUseAsSoftLineBreak,
								 UniCharArrayOffset *	oLineBreak);

EXTERN_API_C( OSStatus )
ATSUSetSoftLineBreak			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iLineBreak);

EXTERN_API_C( OSStatus )
ATSUGetSoftLineBreaks			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iRangeStart,
								 UniCharCount 			iRangeLength,
								 ItemCount 				iMaximumBreaks,
								 UniCharArrayOffset 	oBreaks[],
								 ItemCount *			oBreakCount);

EXTERN_API_C( OSStatus )
ATSUClearSoftLineBreaks			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iRangeStart,
								 UniCharCount 			iRangeLength);

/*	Font matching	*/
EXTERN_API_C( OSStatus )
ATSUSetFontFallbacks			(ItemCount 				iFontFallbacksCount,
								 ATSUFontID 			iFontIDs[],
								 ATSUFontFallbackMethod  iFontFallbackMethod);

EXTERN_API_C( OSStatus )
ATSUGetFontFallbacks			(ItemCount 				iMaxFontFallbacksCount,
								 ATSUFontID 			oFontIDs[],
								 ATSUFontFallbackMethod * oFontFallbackMethod,
								 ItemCount *			oActualFallbacksCount);

EXTERN_API_C( OSStatus )
ATSUMatchFontsToText			(ATSUTextLayout 		iTextLayout,
								 UniCharArrayOffset 	iTextStart,
								 UniCharCount 			iTextLength,
								 ATSUFontID *			oFontID,
								 UniCharArrayOffset *	oChangedOffset,
								 UniCharCount *			oChangedLength);

EXTERN_API_C( OSStatus )
ATSUSetTransientFontMatching	(ATSUTextLayout 		iTextLayout,
								 Boolean 				iTransientFontMatching);

EXTERN_API_C( OSStatus )
ATSUGetTransientFontMatching	(ATSUTextLayout 		iTextLayout,
								 Boolean *				oTransientFontMatching);

/*	Font ID's	*/
EXTERN_API_C( OSStatus )
ATSUFontCount					(ItemCount *			oFontCount);

EXTERN_API_C( OSStatus )
ATSUGetFontIDs					(ATSUFontID 			oFontIDs[],
								 ItemCount 				iArraySize,
								 ItemCount *			oFontCount);

EXTERN_API_C( OSStatus )
ATSUFONDtoFontID				(short 					iFONDNumber,
								 Style 					iFONDStyle,
								 ATSUFontID *			oFontID);

EXTERN_API_C( OSStatus )
ATSUFontIDtoFOND				(ATSUFontID 			iFontID,
								 short *				oFONDNumber,
								 Style *				oFONDStyle);

/*	Font names	*/
EXTERN_API_C( OSStatus )
ATSUCountFontNames				(ATSUFontID 			iFontID,
								 ItemCount *			oFontNameCount);

EXTERN_API_C( OSStatus )
ATSUGetIndFontName				(ATSUFontID 			iFontID,
								 ItemCount 				iFontNameIndex,
								 ByteCount 				iMaximumNameLength,
								 Ptr 					oName,
								 ByteCount *			oActualNameLength,
								 FontNameCode *			oFontNameCode,
								 FontPlatformCode *		oFontNamePlatform,
								 FontScriptCode *		oFontNameScript,
								 FontLanguageCode *		oFontNameLanguage);

EXTERN_API_C( OSStatus )
ATSUFindFontName				(ATSUFontID 			iFontID,
								 FontNameCode 			iFontNameCode,
								 FontPlatformCode 		iFontNamePlatform,
								 FontScriptCode 		iFontNameScript,
								 FontLanguageCode 		iFontNameLanguage,
								 ByteCount 				iMaximumNameLength,
								 Ptr 					oName,
								 ByteCount *			oActualNameLength,
								 ItemCount *			oFontNameIndex);

EXTERN_API_C( OSStatus )
ATSUFindFontFromName			(Ptr 					iName,
								 ByteCount 				iNameLength,
								 FontNameCode 			iFontNameCode,
								 FontPlatformCode 		iFontNamePlatform,
								 FontScriptCode 		iFontNameScript,
								 FontLanguageCode 		iFontNameLanguage,
								 ATSUFontID *			oFontID);

/*	Font features	*/
EXTERN_API_C( OSStatus )
ATSUCountFontFeatureTypes		(ATSUFontID 			iFontID,
								 ItemCount *			oTypeCount);

EXTERN_API_C( OSStatus )
ATSUCountFontFeatureSelectors	(ATSUFontID 			iFontID,
								 ATSUFontFeatureType 	iType,
								 ItemCount *			oSelectorCount);

EXTERN_API_C( OSStatus )
ATSUGetFontFeatureTypes			(ATSUFontID 			iFontID,
								 ItemCount 				iMaximumTypes,
								 ATSUFontFeatureType 	oTypes[],
								 ItemCount *			oActualTypeCount);

EXTERN_API_C( OSStatus )
ATSUGetFontFeatureSelectors		(ATSUFontID 			iFontID,
								 ATSUFontFeatureType 	iType,
								 ItemCount 				iMaximumSelectors,
								 ATSUFontFeatureSelector  oSelectors[],
								 Boolean 				oSelectorIsOnByDefault[],
								 ItemCount *			oActualSelectorCount,
								 Boolean *				oIsMutuallyExclusive);

EXTERN_API_C( OSStatus )
ATSUGetFontFeatureNameCode		(ATSUFontID 			iFontID,
								 ATSUFontFeatureType 	iType,
								 ATSUFontFeatureSelector  iSelector,
								 FontNameCode *			oNameCode);

/*	Font tracking value & names	*/
EXTERN_API_C( OSStatus )
ATSUCountFontTracking			(ATSUFontID 			iFontID,
								 ATSUVerticalCharacterType  iCharacterOrientation,
								 ItemCount *			oTrackingCount);

EXTERN_API_C( OSStatus )
ATSUGetIndFontTracking			(ATSUFontID 			iFontID,
								 ATSUVerticalCharacterType  iCharacterOrientation,
								 ItemCount 				iTrackIndex,
								 Fixed *				oFontTrackingValue,
								 FontNameCode *			oNameCode);

/*	Font variations	*/
EXTERN_API_C( OSStatus )
ATSUCountFontVariations			(ATSUFontID 			iFontID,
								 ItemCount *			oVariationCount);

EXTERN_API_C( OSStatus )
ATSUGetIndFontVariation			(ATSUFontID 			iFontID,
								 ItemCount 				iVariationIndex,
								 ATSUFontVariationAxis * oATSUFontVariationAxis,
								 ATSUFontVariationValue * oMinimumValue,
								 ATSUFontVariationValue * oMaximumValue,
								 ATSUFontVariationValue * oDefaultValue);

EXTERN_API_C( OSStatus )
ATSUGetFontVariationNameCode	(ATSUFontID 			iFontID,
								 ATSUFontVariationAxis 	iAxis,
								 FontNameCode *			oNameCode);

/*	Font Instances	*/
EXTERN_API_C( OSStatus )
ATSUCountFontInstances			(ATSUFontID 			iFontID,
								 ItemCount *			oInstances);

EXTERN_API_C( OSStatus )
ATSUGetFontInstance				(ATSUFontID 			iFontID,
								 ItemCount 				iFontInstanceIndex,
								 ItemCount 				iMaximumVariations,
								 ATSUFontVariationAxis 	oAxes[],
								 ATSUFontVariationValue  oValues[],
								 ItemCount *			oActualVariationCount);

EXTERN_API_C( OSStatus )
ATSUGetFontInstanceNameCode		(ATSUFontID 			iFontID,
								 ItemCount 				iInstanceIndex,
								 FontNameCode *			oNameCode);



#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 /* __ATSUNICODE__ */

