// (c) 1994-2007 Electronic Arts Inc.
/*
 	File:		SFNTTypes.h
 
 	Contains:	Font file structures.
 
 	Version:	Technology:	Quickdraw GX 1.1
 				Release:	QuickTime 3.0
 
 
 	Bugs?:		Please include the the file and version information (from above) with
 				the problem description.  Developers belonging to one of the Apple
 				developer programs can submit bug reports to:
 
 					devsupport@apple.com
 
*/
#ifndef __SFNTTYPES__
#define __SFNTTYPES__

#ifndef __MACTYPES__
#include <MacTypes.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


struct sfntDirectoryEntry {
	FourCharCode 					tableTag;
	UInt32 							checkSum;
	UInt32 							offset;
	UInt32 							length;
};
typedef struct sfntDirectoryEntry		sfntDirectoryEntry;
/* The search fields limits numOffsets to 4096. */

struct sfntDirectory {
	FourCharCode 					format;
	UInt16 							numOffsets;					/* number of tables */
	UInt16 							searchRange;				/* (max2 <= numOffsets)*16 */
	UInt16 							entrySelector;				/* log2(max2 <= numOffsets) */
	UInt16 							rangeShift;					/* numOffsets*16-searchRange*/
	sfntDirectoryEntry 				table[1];					/* table[numOffsets] */
};
typedef struct sfntDirectory			sfntDirectory;

enum {
	sizeof_sfntDirectory		= 12
};

/* Cmap - character id to glyph id mapping */

enum {
	cmapFontTableTag			= FOUR_CHAR_CODE('cmap')
};


enum {
	kFontUnicodePlatform		= 0,
	kFontMacintoshPlatform		= 1,
	kFontReservedPlatform		= 2,
	kFontMicrosoftPlatform		= 3,
	kFontCustomPlatform			= 4
};


enum {
	kFontUnicodeDefaultSemantics = 0,
	kFontUnicodeV1_1Semantics	= 1,
	kFontISO10646_1993Semantics	= 2
};


enum {
	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
};


enum {
	kFontMicrosoftSymbolScript	= 0,
	kFontMicrosoftStandardScript = 1
};



enum {
	kFontCustom8BitScript		= 0,
	kFontCustom816BitScript		= 1,
	kFontCustom16BitScript		= 2
};

/* Language codes are zero based everywhere but within a 'cmap' table */

enum {
	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 */

enum {
	kFontNoPlatform				= -1,
	kFontNoScript				= -1,
	kFontNoLanguage				= -1
};


struct sfntCMapSubHeader {
	UInt16 							format;
	UInt16 							length;
	UInt16 							languageID;					/* base-1 */
};
typedef struct sfntCMapSubHeader		sfntCMapSubHeader;

enum {
	sizeof_sfntCMapSubHeader	= 6
};


struct sfntCMapEncoding {
	UInt16 							platformID;					/* base-0 */
	UInt16 							scriptID;					/* base-0 */
	UInt32 							offset;
};
typedef struct sfntCMapEncoding			sfntCMapEncoding;

enum {
	sizeof_sfntCMapEncoding		= 8
};


struct sfntCMapHeader {
	UInt16 							version;
	UInt16 							numTables;
	sfntCMapEncoding 				encoding[1];
};
typedef struct sfntCMapHeader			sfntCMapHeader;

enum {
	sizeof_sfntCMapHeader		= 4
};

/* Name table */

enum {
	nameFontTableTag			= FOUR_CHAR_CODE('name')
};


enum {
	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,
	kFontLastReservedName		= 255
};

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

enum {
	kFontNoName					= -1
};


struct sfntNameRecord {
	UInt16 							platformID;					/* base-0 */
	UInt16 							scriptID;					/* base-0 */
	UInt16 							languageID;					/* base-0 */
	UInt16 							nameID;						/* base-0 */
	UInt16 							length;
	UInt16 							offset;
};
typedef struct sfntNameRecord			sfntNameRecord;

enum {
	sizeof_sfntNameRecord		= 12
};


struct sfntNameHeader {
	UInt16 							format;
	UInt16 							count;
	UInt16 							stringOffset;
	sfntNameRecord 					rec[1];
};
typedef struct sfntNameHeader			sfntNameHeader;

enum {
	sizeof_sfntNameHeader		= 6
};

/* Fvar table - font variations */

enum {
	variationFontTableTag		= FOUR_CHAR_CODE('fvar')
};

/* These define each font variation */

struct sfntVariationAxis {
	FourCharCode 					axisTag;
	Fixed 							minValue;
	Fixed 							defaultValue;
	Fixed 							maxValue;
	SInt16 							flags;
	SInt16 							nameID;
};
typedef struct sfntVariationAxis		sfntVariationAxis;

enum {
	sizeof_sfntVariationAxis	= 20
};

/* These are named locations in style-space for the user */

struct sfntInstance {
	SInt16 							nameID;
	SInt16 							flags;
	Fixed 							coord[1];					/* [axisCount] */
																/* room to grow since the header carries a tupleSize field */
};
typedef struct sfntInstance				sfntInstance;

enum {
	sizeof_sfntInstance			= 4
};


struct sfntVariationHeader {
	Fixed 							version;					/* 1.0 Fixed */
	UInt16 							offsetToData;				/* to first axis = 16*/
	UInt16 							countSizePairs;				/* axis+inst = 2 */
	UInt16 							axisCount;
	UInt16 							axisSize;
	UInt16 							instanceCount;
	UInt16 							instanceSize;
																/* Éother <count,size> pairs */
	sfntVariationAxis 				axis[1];					/* [axisCount] */
	sfntInstance 					instance[1];				/* [instanceCount]  Éother arrays of data */
};
typedef struct sfntVariationHeader		sfntVariationHeader;

enum {
	sizeof_sfntVariationHeader	= 16
};

/* Fdsc table - font descriptor */

enum {
	descriptorFontTableTag		= FOUR_CHAR_CODE('fdsc')
};


struct sfntFontDescriptor {
	FourCharCode 					name;
	Fixed 							value;
};
typedef struct sfntFontDescriptor		sfntFontDescriptor;

struct sfntDescriptorHeader {
	Fixed 							version;					/* 1.0 in Fixed */
	SInt32 							descriptorCount;
	sfntFontDescriptor 				descriptor[1];
};
typedef struct sfntDescriptorHeader		sfntDescriptorHeader;

enum {
	sizeof_sfntDescriptorHeader	= 8
};

/* Feat Table - layout feature table */

enum {
	featureFontTableTag			= FOUR_CHAR_CODE('feat')
};


struct sfntFeatureName {
	UInt16 							featureType;
	UInt16 							settingCount;
	SInt32 							offsetToSettings;
	UInt16 							featureFlags;
	UInt16 							nameID;
};
typedef struct sfntFeatureName			sfntFeatureName;

struct sfntFontFeatureSetting {
	UInt16 							setting;
	UInt16 							nameID;
};
typedef struct sfntFontFeatureSetting	sfntFontFeatureSetting;

struct sfntFontRunFeature {
	UInt16 							featureType;
	UInt16 							setting;
};
typedef struct sfntFontRunFeature		sfntFontRunFeature;

struct sfntFeatureHeader {
	SInt32 							version;					/* 1.0 */
	UInt16 							featureNameCount;
	UInt16 							featureSetCount;
	SInt32 							reserved;					/* set to 0 */
	sfntFeatureName 				names[1];
	sfntFontFeatureSetting 			settings[1];
	sfntFontRunFeature 				runs[1];
};
typedef struct sfntFeatureHeader		sfntFeatureHeader;
/* OS/2 Table */

enum {
	os2FontTableTag				= FOUR_CHAR_CODE('OS/2')
};

/*  Special invalid glyph ID value, useful as a sentinel value, for example */

enum {
	nonGlyphID					= 65535L
};

/* Data types for encoding components as used in interfaces */

typedef UInt32 							FontPlatformCode;
typedef UInt32 							FontScriptCode;
typedef UInt32 							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.
*/

struct FontVariation {
	FourCharCode 					name;
	Fixed 							value;
};
typedef struct FontVariation			FontVariation;

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

