/*
     File:       WorldScript.h
 
     Contains:   WorldScript I Interfaces.
 
     Version:    Technology: System 7.5
                 Release:    Universal Interfaces 3.4
 
     Copyright:  © 1994-2001 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 __WORLDSCRIPT__
#define __WORLDSCRIPT__

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

#ifndef __TRAPS__
#include <Traps.h>
#endif

#ifndef __QUICKDRAWTEXT__
#include <QuickdrawText.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

typedef UInt16                          WSIOffset;
typedef UInt8                           WSIByteCount;
typedef UInt8                           WSIByteIndex;
/* offset from start of sub-table to row in state table */
typedef UInt16                          WSIStateOffset;
typedef UInt32                          WSITableOffset;
typedef UInt16                          WSISubtableOffset;
typedef UInt16                          WSIGlyphcode;
typedef UInt32                          WSITableIdentifiers;
enum {
  kScriptSettingsTag            = FOUR_CHAR_CODE('info'),
  kMetamorphosisTag             = FOUR_CHAR_CODE('mort'),
  kGlyphExpansionTag            = FOUR_CHAR_CODE('g2g#'),
  kPropertiesTag                = FOUR_CHAR_CODE('prop'),
  kJustificationTag             = FOUR_CHAR_CODE('kash'),
  kCharToGlyphTag               = FOUR_CHAR_CODE('cmap'),
  kGlyphToCharTag               = FOUR_CHAR_CODE('pamc'),
  kFindScriptRunTag             = FOUR_CHAR_CODE('fstb')
};



/****           L O O K U P    T A B L E    T Y P E S       ****/
enum {
  WSILookupSimpleArray          = 0,    /* a simple array indexed by glyph code */
  WSILookupSegmentSingle        = 2,    /* segment mapping to single value */
  WSILookupSegmentArray         = 4,    /* segment mapping to lookup array */
  WSILookupSingleTable          = 6,    /* sorted list of glyph, value pairs */
  WSILookupTrimmedArray         = 8     /* a simple trimmed array indexed by glyph code */
};

typedef unsigned short                  WSILookupTableFormat;
typedef unsigned short                  WSILookupValue;
/* An offset from the beginning of the lookup table */
typedef unsigned short                  WSILookupOffset;
/*  FORMAT SPECIFIC DEFINITIONS */
/*
        lookupSimpleArray:
        
        This is a simple array which maps all glyphs in the font
        to lookup values.
    */
struct WSILookupArrayHeader {
  WSILookupValue      lookupValues[1];        /* The array of values indexed by glyph code */
};
typedef struct WSILookupArrayHeader     WSILookupArrayHeader;
/*
        lookupTrimmedArray:
        
        This is a single trimmed array which maps a single range
        of glyhs in the font to lookup values.
    */
struct WSILookupTrimmedArrayHeader {
  WSIGlyphcode        firstGlyph;
  WSIGlyphcode        limitGlyph;
  WSILookupValue      valueArray[1];
};
typedef struct WSILookupTrimmedArrayHeader WSILookupTrimmedArrayHeader;
/* The format specific part of the subtable header */
union WSILookupFormatSpecificHeader {
  WSILookupArrayHeader  simpleArray;          /* rename lookupArray as simpleArray <9> */
  WSILookupTrimmedArrayHeader  trimmedArray;
};
typedef union WSILookupFormatSpecificHeader WSILookupFormatSpecificHeader;
/* The overall subtable header */
struct WSILookupTableHeader {
  WSILookupTableFormat  format;               /* table format */
  WSILookupFormatSpecificHeader  fsHeader;    /* format specific header */
};
typedef struct WSILookupTableHeader     WSILookupTableHeader;

/****       G L Y P H    E X P A N S I O N    ****/
enum {
                                        /* fixed 1.0 */
  kCurrentGlyphExpansionVersion = 0x00010000
};


typedef unsigned short                  GlyphExpansionFormats;
enum {
  GlyphExpansionLookupFormat    = 1,
  GlyphExpansionContextualFormat = 2
};

struct ExpandedGlyphCluster {
  WSIByteCount        numGlyphs;
  WSIByteIndex        bestGlyph;
  WSIGlyphcode        glyphs[1];
};
typedef struct ExpandedGlyphCluster     ExpandedGlyphCluster;
struct ExpandedGlyphOffset {
  WSIGlyphcode        glyph;
  WSIOffset           offset;                 /* offset to ExpandedGlyphCluster */
};
typedef struct ExpandedGlyphOffset      ExpandedGlyphOffset;
struct GlyphExpansionStateTable {
  WSISubtableOffset   stateTableOffset;
  WSISubtableOffset   classTableOffset;
  WSISubtableOffset   actionTableOffset;      /* state, class and actions tables follow here... */
};
typedef struct GlyphExpansionStateTable GlyphExpansionStateTable;
struct GlyphExpansionTable {
  Fixed               version;
  short               format;
  short               expansionNumer;
  short               expansionDenom;         /* num/denom ratio for expansion <2> */

  union {
    GlyphExpansionStateTable  stateTable;
    WSILookupTableHeader  lookup;             /* expanded glyph clusters follow here... */
  }                       table;
};
typedef struct GlyphExpansionTable      GlyphExpansionTable;

/* Glyph-to-Character constants and types  */
enum {
  kCurrentGlyphToCharVersion    = 0x00010100
};


typedef unsigned short                  GlyphToCharLookupFormats;
enum {
  kGlyphToCharLookup8Format     = 1,
  kGlyphToCharLookup16Format    = 2,
  kGlyphToCharLookup32Format    = 3
};

typedef UInt8                           GlyphToCharFontIndex;
typedef UInt8                           QDGlyphcode;
struct GlyphToCharActionTable {
  WSISubtableOffset   fontNameOffset;         /* offset relative to this table */
  WSILookupTableHeader  actions;              /* only support lookupSimpleArray format for now */
};
typedef struct GlyphToCharActionTable   GlyphToCharActionTable;
struct GlyphToCharActionHeader {
  short               numTables;              /* 0..n */
  WSISubtableOffset   offsets[1];             /* offsets from start of action table header */
};
typedef struct GlyphToCharActionHeader  GlyphToCharActionHeader;
struct GlyphToCharHeader {
  Fixed               version;

  WSISubtableOffset   actionOffset;           /* offset to GlyphToCharActionHeader */

  short               format;                 /* size of font mask */
  WSILookupTableHeader  mappingTable;
};
typedef struct GlyphToCharHeader        GlyphToCharHeader;

/* JUSTIFICATION TYPES
    WorldScript supports justification of text using insertion. The justification
    table specifies a insertion string to insert between 2 specified glyphs.
    Each combination of inter-glyph boundary can be assigned a justification priority,
    the higher the priority the more justification strings inserted at that position.
    
    The priorities for each inter-glyph boundary are specified by the justification table's
    state table.
    
    Special handling is done for scripts which use spaces to justify, because the width of 
    a space varies depending on the setting of SpaceExtra. This is why the number of spaces
    per inserting string is specified in the justification table.

*/
enum {
                                        /* 1.0 not supported */
  kCurrentJustificationVersion  = 0x0200
};

enum {
  kJustificationStateTableFormat = 1
};

enum {
                                        /* WSI's internal limitation <12> */
  kMaxJustificationStringLength = 13
};


typedef UInt8                           WSIJustificationPriority;
enum {
  WSIJustificationSetMarkMask   = 0x80
};

struct WSIJustificationStateEntry {
  WSIJustificationPriority  markPriority;     /* non-zero priorities means insertion */
  WSIJustificationPriority  priority;
  WSIStateOffset      newState;
};
typedef struct WSIJustificationStateEntry WSIJustificationStateEntry;

typedef unsigned short                  WSIJustificationClasses;
enum {
  wsiJustEndOfLineClass         = 0,
  wsiJustEndOfRunClass          = 1,
  wsiJustDeletedGlyphClass      = 2,
  wsiJustUserDefinedClass       = 3
};

typedef unsigned short                  WSIJustificationStates;
enum {
  wsiStartOfLineState           = 0,    /* pre-defined states */
  wsiStartOfRunState            = 1,
  wsiUserDefinedState           = 2
};

/* pre-multiplied: class# * sizeof(WSIJustificationStateEntry) */
typedef UInt8                           WSIJustificationClassOffset;
struct WSIJustificationStateTable {
  short               maxPriorities;
  unsigned short      rowWidth;               /* width of a state table row in bytes */
  short               classTableOffset;
  short               stateTableOffset;
};
typedef struct WSIJustificationStateTable WSIJustificationStateTable;
/*
            Last two fields of above structure - someday?
            WSIJustificationClassOffset classes[up to 64 classes supported];
            WSIJustificationStateEntry  states[up to your heart's desire];
        */
struct WSIJustificationHeader {
  short               version;
  short               format;

  Point               scaling;                /* numer/denom scaling of priority weights <7> */

  unsigned short      spacesPerInsertion;     /* # of $20 chars in justification insertion string <12> */
  unsigned short      justStringOffset;       /* offset to justification string */


  WSIJustificationStateTable  stateTable;     /* long-aligned boundary aligned w/ spacesPerInsertion field - justification string follows */
};
typedef struct WSIJustificationHeader   WSIJustificationHeader;

/* Line Layout's Property table version <11> */
enum {
                                        /* v1.0 */
  currentPropsTableVersion      = 0x00010000
};

enum {
                                        /* version is octal 0100 or hex 0x40 (#64) */
  kCharToGlyphCurrentVersion    = 0x40
};

/* pass as priorityWeight to JustifyWSILayout to use script's current just setting */
enum {
  kScriptsDefaultJustWeight     = -1
};


/* feature selectors used in FindScriptRun and itl5 configuration tables <9> */

typedef UInt16                          WSIFeatureType;
typedef UInt16                          WSIFeatureSelector;
struct WSIFeature {
  WSIFeatureType      featureType;
  WSIFeatureSelector  featureSelector;
};
typedef struct WSIFeature               WSIFeature;

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

