{
     File:       ATS/SFNTTypes.h
 
     Contains:   Font file structures.
 
     Copyright:  © 1994-2008 by Apple Inc., all rights reserved.
 
     Warning:    *** APPLE INTERNAL USE ONLY ***
                 This file may contain unreleased API's
 
     BuildInfo:  Built by:            root
                 On:                  Fri Jul 24 22:21:51 2009
                 With Interfacer:     3.0d46   (Mac OS X for PowerPC)
                 From:                SFNTTypes.i
                     Revision:        1.4
                     Dated:           2006/09/13 22:38:46
                     Last change by:  ntaylor
                     Last comment:    Fix last checkin comment.
 
     Bugs:       Report bugs to Radar component "System Interfaces", "Latest"
                 List the version information (from above) in the Problem Description.
 
}

{ Pascal Translation Updated: Gorazd Krosl <gorazd_1957@yahoo.ca>, October 2009 }

{
    Modified for use with Free Pascal
    Version 308
    Please report any bugs to <gpc@microbizz.nl>
}

{$ifc not defined MACOSALLINCLUDE or not MACOSALLINCLUDE}
{$mode macpas}
{$packenum 1}
{$macro on}
{$inline on}
{$calling mwpascal}

unit SFNTTypes;
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}

{$ALIGN POWER}

type
	sfntDirectoryEntryPtr = ^sfntDirectoryEntry;
	sfntDirectoryEntry = record
		tableTag:				FourCharCode;
		checkSum:				UInt32;
		offset:					UInt32;
		length:					UInt32;
	end;

	{	 The search fields limits numOffsets to 4096. 	}
	sfntDirectoryPtr = ^sfntDirectory;
	sfntDirectory = record
		format:					FourCharCode;
		numOffsets:				UInt16;									{  number of tables  }
		searchRange:			UInt16;									{  (max2 <= numOffsets)*16  }
		entrySelector:			UInt16;									{  log2(max2 <= numOffsets)  }
		rangeShift:				UInt16;									{  numOffsets*16-searchRange }
		table:					array [0..0] of sfntDirectoryEntry;		{  table[numOffsets]  }
	end;


const
	sizeof_sfntDirectory		= 12;

	{	 Cmap - character id to glyph id mapping 	}
	cmapFontTableTag			= FourCharCode('cmap');

	kFontUnicodePlatform		= 0;
	kFontMacintoshPlatform		= 1;
	kFontReservedPlatform		= 2;
	kFontMicrosoftPlatform		= 3;
	kFontCustomPlatform			= 4;

	kFontUnicodeDefaultSemantics = 0;
	kFontUnicodeV1_1Semantics = 1;
	kFontISO10646_1993Semantics = 2;
	kFontUnicodeV2_0BMPOnlySemantics = 3;
	kFontUnicodeV2_0FullCoverageSemantics = 4;
	kFontUnicodeV4_0VariationSequenceSemantics = 5;

const
	kFontRomanScript = 0;
	kFontJapaneseScript = 1;
	kFontTraditionalChineseScript = 2;
	kFontChineseScript = kFontTraditionalChineseScript;
	kFontKoreanScript = 3;
	kFontArabicScript = 4;
	kFontHebrewScript = 5;
	kFontGreekScript = 6;
	kFontCyrillicScript = 7;
	kFontRussian = kFontCyrillicScript;
	kFontRSymbolScript = 8;
	kFontDevanagariScript = 9;
	kFontGurmukhiScript = 10;
	kFontGujaratiScript = 11;
	kFontOriyaScript = 12;
	kFontBengaliScript = 13;
	kFontTamilScript = 14;
	kFontTeluguScript = 15;
	kFontKannadaScript = 16;
	kFontMalayalamScript = 17;
	kFontSinhaleseScript = 18;
	kFontBurmeseScript = 19;
	kFontKhmerScript = 20;
	kFontThaiScript = 21;
	kFontLaotianScript = 22;
	kFontGeorgianScript = 23;
	kFontArmenianScript = 24;
	kFontSimpleChineseScript = 25;
	kFontTibetanScript = 26;
	kFontMongolianScript = 27;
	kFontGeezScript = 28;
	kFontEthiopicScript = kFontGeezScript;
	kFontAmharicScript = kFontGeezScript;
	kFontSlavicScript = 29;
	kFontEastEuropeanRomanScript = kFontSlavicScript;
	kFontVietnameseScript = 30;
	kFontExtendedArabicScript = 31;
	kFontSindhiScript = kFontExtendedArabicScript;
	kFontUninterpretedScript = 32;

const
	kFontMicrosoftSymbolScript = 0;
	kFontMicrosoftStandardScript = 1;
	kFontMicrosoftUCS4Script = 10;


const
	kFontCustom8BitScript = 0;
	kFontCustom816BitScript = 1;
	kFontCustom16BitScript = 2;

{ Language codes are zero based everywhere but within a 'cmap' table }
const
	kFontEnglishLanguage = 0;
	kFontFrenchLanguage = 1;
	kFontGermanLanguage = 2;
	kFontItalianLanguage = 3;
	kFontDutchLanguage = 4;
	kFontSwedishLanguage = 5;
	kFontSpanishLanguage = 6;
	kFontDanishLanguage = 7;
	kFontPortugueseLanguage = 8;
	kFontNorwegianLanguage = 9;
	kFontHebrewLanguage = 10;
	kFontJapaneseLanguage = 11;
	kFontArabicLanguage = 12;
	kFontFinnishLanguage = 13;
	kFontGreekLanguage = 14;
	kFontIcelandicLanguage = 15;
	kFontMalteseLanguage = 16;
	kFontTurkishLanguage = 17;
	kFontCroatianLanguage = 18;
	kFontTradChineseLanguage = 19;
	kFontUrduLanguage = 20;
	kFontHindiLanguage = 21;
	kFontThaiLanguage = 22;
	kFontKoreanLanguage = 23;
	kFontLithuanianLanguage = 24;
	kFontPolishLanguage = 25;
	kFontHungarianLanguage = 26;
	kFontEstonianLanguage = 27;
	kFontLettishLanguage = 28;
	kFontLatvianLanguage = kFontLettishLanguage;
	kFontSaamiskLanguage = 29;
	kFontLappishLanguage = kFontSaamiskLanguage;
	kFontFaeroeseLanguage = 30;
	kFontFarsiLanguage = 31;
	kFontPersianLanguage = kFontFarsiLanguage;
	kFontRussianLanguage = 32;
	kFontSimpChineseLanguage = 33;
	kFontFlemishLanguage = 34;
	kFontIrishLanguage = 35;
	kFontAlbanianLanguage = 36;
	kFontRomanianLanguage = 37;
	kFontCzechLanguage = 38;
	kFontSlovakLanguage = 39;
	kFontSlovenianLanguage = 40;
	kFontYiddishLanguage = 41;
	kFontSerbianLanguage = 42;
	kFontMacedonianLanguage = 43;
	kFontBulgarianLanguage = 44;
	kFontUkrainianLanguage = 45;
	kFontByelorussianLanguage = 46;
	kFontUzbekLanguage = 47;
	kFontKazakhLanguage = 48;
	kFontAzerbaijaniLanguage = 49;
	kFontAzerbaijanArLanguage = 50;
	kFontArmenianLanguage = 51;
	kFontGeorgianLanguage = 52;
	kFontMoldavianLanguage = 53;
	kFontKirghizLanguage = 54;
	kFontTajikiLanguage = 55;
	kFontTurkmenLanguage = 56;
	kFontMongolianLanguage = 57;
	kFontMongolianCyrLanguage = 58;
	kFontPashtoLanguage = 59;
	kFontKurdishLanguage = 60;
	kFontKashmiriLanguage = 61;
	kFontSindhiLanguage = 62;
	kFontTibetanLanguage = 63;
	kFontNepaliLanguage = 64;
	kFontSanskritLanguage = 65;
	kFontMarathiLanguage = 66;
	kFontBengaliLanguage = 67;
	kFontAssameseLanguage = 68;
	kFontGujaratiLanguage = 69;
	kFontPunjabiLanguage = 70;
	kFontOriyaLanguage = 71;
	kFontMalayalamLanguage = 72;
	kFontKannadaLanguage = 73;
	kFontTamilLanguage = 74;
	kFontTeluguLanguage = 75;
	kFontSinhaleseLanguage = 76;
	kFontBurmeseLanguage = 77;
	kFontKhmerLanguage = 78;
	kFontLaoLanguage = 79;
	kFontVietnameseLanguage = 80;
	kFontIndonesianLanguage = 81;
	kFontTagalogLanguage = 82;
	kFontMalayRomanLanguage = 83;
	kFontMalayArabicLanguage = 84;
	kFontAmharicLanguage = 85;
	kFontTigrinyaLanguage = 86;
	kFontGallaLanguage = 87;
	kFontOromoLanguage = kFontGallaLanguage;
	kFontSomaliLanguage = 88;
	kFontSwahiliLanguage = 89;
	kFontRuandaLanguage = 90;
	kFontRundiLanguage = 91;
	kFontChewaLanguage = 92;
	kFontMalagasyLanguage = 93;
	kFontEsperantoLanguage = 94;
	kFontWelshLanguage = 128;
	kFontBasqueLanguage = 129;
	kFontCatalanLanguage = 130;
	kFontLatinLanguage = 131;
	kFontQuechuaLanguage = 132;
	kFontGuaraniLanguage = 133;
	kFontAymaraLanguage = 134;
	kFontTatarLanguage = 135;
	kFontUighurLanguage = 136;
	kFontDzongkhaLanguage = 137;
	kFontJavaneseRomLanguage = 138;
	kFontSundaneseRomLanguage = 139;

{ The following are special "don't care" values to be used in interfaces }

const
	kFontNoPlatformCode = $FFFFFFFF;
	kFontNoScriptCode = $FFFFFFFF;
	kFontNoLanguageCode = $FFFFFFFF;

type
	sfntCMapSubHeaderPtr = ^sfntCMapSubHeader;
	sfntCMapSubHeader = record
		format:					UInt16;
		length:					UInt16;
		languageID:				UInt16;									{  base-1  }
	end;
const
	sizeof_sfntCMapSubHeader = 6;

type
	sfntCMapExtendedSubHeader = record
		format: UInt16;
		reserved: UInt16;
		length: UInt32;
		language: UInt32;
	end;
const
	sizeof_sfntCMapExtendedSubHeader = 12;

type
	sfntCMapEncodingPtr = ^sfntCMapEncoding;
	sfntCMapEncoding = record
		platformID:				UInt16;									{  base-0  }
		scriptID:				UInt16;									{  base-0  }
		offset:					UInt32;
	end;
const
	sizeof_sfntCMapEncoding = 8;

type
	sfntCMapHeaderPtr = ^sfntCMapHeader;
	sfntCMapHeader = record
		version: UInt16;
		numTables: UInt16;
		encoding: array[0..0] of sfntCMapEncoding;
	end;
const
	sizeof_sfntCMapHeader = 4;

{ Name table }
const
	nameFontTableTag = FourCharCode('name');

const
	kFontCopyrightName = 0;
	kFontFamilyName = 1;
	kFontStyleName = 2;
	kFontUniqueName = 3;
	kFontFullName = 4;
	kFontVersionName = 5;
	kFontPostscriptName = 6;
	kFontTrademarkName = 7;
	kFontManufacturerName = 8;
	kFontDesignerName = 9;
	kFontDescriptionName = 10;
	kFontVendorURLName = 11;
	kFontDesignerURLName = 12;
	kFontLicenseDescriptionName = 13;
	kFontLicenseInfoURLName = 14;
	kFontPreferredFamilyName = 16;
	kFontPreferredSubfamilyName = 17;
	kFontMacCompatibleFullName = 18;
	kFontSampleTextName = 19;
	kFontPostScriptCIDName = 20;
	kFontLastReservedName = 255;

{ The following is a special "don't care" value to be used in interfaces }

const
	kFontNoNameCode = $FFFFFFFF;

type
	sfntNameRecordPtr = ^sfntNameRecord;
	sfntNameRecord = record
		platformID: UInt16;             { base-0 }
		scriptID: UInt16;               { base-0 }
		languageID: UInt16;             { base-0 }
		nameID: UInt16;                 { base-0 }
		length: UInt16;
		offset: UInt16;
	end;
const
	sizeof_sfntNameRecord = 12;

type
	sfntNameHeaderPtr = ^sfntNameHeader;
	sfntNameHeader = record
		format:					UInt16;
		count:					UInt16;
		stringOffset:			UInt16;
		rec:					array [0..0] of sfntNameRecord;
	end;
const
	sizeof_sfntNameHeader = 6;

{ Fvar table - font variations }
const
	variationFontTableTag = FourCharCode('fvar');

{ These define each font variation }
type
	sfntVariationAxisPtr = ^sfntVariationAxis;
	sfntVariationAxis = record
		axisTag:				FourCharCode;
		minValue:				Fixed;
		defaultValue:			Fixed;
		maxValue:				Fixed;
		flags:					SInt16;
		nameID:					SInt16;
	end;
const
	sizeof_sfntVariationAxis = 20;

{ These are named locations in style-space for the user }
type
	sfntInstancePtr = ^sfntInstance;
	sfntInstance = record
		nameID:					SInt16;
		flags:					SInt16;
		coord:					array [0..0] of Fixed;					{  [axisCount]  }
																		{  room to grow since the header carries a tupleSize field  }
	end;
const
	sizeof_sfntInstance = 4;

type
	sfntVariationHeaderPtr = ^sfntVariationHeader;
	sfntVariationHeader = record
		version:				Fixed;									{  1.0 Fixed  }
		offsetToData:			UInt16;									{  to first axis = 16 }
		countSizePairs:			UInt16;									{  axis+inst = 2  }
		axisCount:				UInt16;
		axisSize:				UInt16;
		instanceCount:			UInt16;
		instanceSize:			UInt16;
																		{  Éother <count,size> pairs  }
		axis:					array [0..0] of sfntVariationAxis;		{  [axisCount]  }
		instance:				array [0..0] of sfntInstance;			{  [instanceCount]  Éother arrays of data  }
	end;
const
	sizeof_sfntVariationHeader = 16;

{ Fdsc table - font descriptor }
const
	descriptorFontTableTag = FourCharCode('fdsc');

type
	sfntFontDescriptorPtr = ^sfntFontDescriptor;
	sfntFontDescriptor = record
		name: FourCharCode;
		value: Fixed;
	end;

	sfntDescriptorHeaderPtr = ^sfntDescriptorHeader;
	sfntDescriptorHeader = record
		version:				Fixed;									{  1.0 in Fixed  }
		descriptorCount:		SInt32;
		descriptor:				array [0..0] of sfntFontDescriptor;
	end;
const
	sizeof_sfntDescriptorHeader = 8;

{ Feat Table - layout feature table }
const
	featureFontTableTag = FourCharCode('feat');

type
	sfntFeatureNamePtr = ^sfntFeatureName;
	sfntFeatureName = record
		featureType:			UInt16;
		settingCount:			UInt16;
		offsetToSettings:		SInt32;
		featureFlags:			UInt16;
		nameID:					UInt16;
	end;

	sfntFontFeatureSettingPtr = ^sfntFontFeatureSetting;
	sfntFontFeatureSetting = record
		setting: UInt16;
		nameID: UInt16;
	end;

	sfntFontRunFeaturePtr = ^sfntFontRunFeature;
	sfntFontRunFeature = record
		featureType: UInt16;
		setting: UInt16;
	end;

	sfntFeatureHeaderPtr = ^sfntFeatureHeader;
	sfntFeatureHeader = record
		version:				SInt32;									{  1.0  }
		featureNameCount:		UInt16;
		featureSetCount:		UInt16;
		reserved:				SInt32;									{  set to 0  }
		names:					array [0..0] of sfntFeatureName;
		settings:				array [0..0] of sfntFontFeatureSetting;
		runs:					array [0..0] of sfntFontRunFeature;
	end;
{ OS/2 Table }
const
	os2FontTableTag = FourCharCode('OS/2');

{  Special invalid glyph ID value, useful as a sentinel value, for example }
const
	nonGlyphID = 65535;


{   Deprecated "don't care" values - use kFontNoPlatformCode, kFontNoScriptCode, 
     kFontNoLanguageCode, kFontNoName instead
}


	kFontNoPlatform = $FFFFFFFF;
	kFontNoScript = $FFFFFFFF;
	kFontNoLanguage = $FFFFFFFF;
	kFontNoName = $FFFFFFFF;

{  Data type used to access names from font name table }


type
	FontNameCode = UInt32;
	FontNameCodePtr = ^FontNameCode;

{ Data types for encoding components as used in interfaces }
	FontPlatformCode = UInt32;
	FontPlatformCodePtr = ^FontPlatformCode;
	
	FontScriptCode = UInt32;
	FontScriptCodePtr = ^FontScriptCode;
	
	FontLanguageCode = UInt32;
	FontLanguageCodePtr = ^FontLanguageCode;
{
**  FontVariation is used to specify a coordinate along a variation axis. The name
**  identifies the axes to be applied, and value is the setting to be used.
}

	FontVariationPtr = ^FontVariation;
	FontVariation = record
		name: FourCharCode;
		value: Fixed;
	end;

{$endc} {TARGET_OS_MAC}
{$ifc not defined MACOSALLINCLUDE or not MACOSALLINCLUDE}

end.
{$endc} {not MACOSALLINCLUDE}
