/* table.h -- define data structures for various ttf file internal tables 
 * See Also: True Type Font Specification
 */

#ifndef __TTF_TABLE_H
#define __TTF_TABLE_H

/* $Id: tables.h,v 1.2 1998/07/06 06:07:01 werner Exp $ */

/* Offset Table:
 * Into the beginning of a True Type font file
 */
typedef struct _OffsetTable
{
  Fixed version;
  USHORT numTables;
  USHORT searchRange;
  USHORT entrySelector;
  USHORT rangeShift;
}
OffsetTable, *OffsetTablePtr;

/* Table Directory:
 * The directory to find each table in a True Type font file
 */
typedef struct _TableDir
{
  ULONG tag;
  ULONG checksum;
  ULONG offset;
  ULONG length;
}
TableDir, *TableDirPtr;


/* cmap: Character to Glyph Index Mapping Table
 * There are four kinds of cmap, format 0, 2, 4, and 6.  They are defined
 * as follows
 */
typedef struct
{
  BYTE glyphIndexArray[256];
}
CMAP0;

typedef struct _subHeaders
{
  USHORT firstCode;
  USHORT entryCount;
  SHORT idDelta;
  USHORT idRangeOffset;
}
SubHeader, *SubHeaderPtr;

typedef struct
{
  USHORT subHeaderKeys[256];
  SubHeaderPtr subHeaders;
  USHORT *glyphIndexArray;
}
CMAP2;

typedef struct
{
  USHORT segCountX2;
  USHORT searchRange;
  USHORT entrySelector;
  USHORT rangeShift;
  USHORT *endCount;
  USHORT reservedPad;
  USHORT *startCount;
  USHORT *idDelta;
  USHORT *idRangeOffset;
  USHORT *glyphIndexArray;
}

CMAP4;
typedef struct
{
  USHORT firstCode;
  USHORT entryCount;
  USHORT *glyphIndexArray;
}
CMAP6;

/* SubTable: one for each encoding scheme */
typedef struct
{
  /* encoding table */
  USHORT PlatformID;
  USHORT EncodingID;
  ULONG offset;

  USHORT format;
  USHORT length;
  USHORT version;
  union
  {
    CMAP0 *cmap0;
    CMAP2 *cmap2;
    CMAP4 *cmap4;
    CMAP6 *cmap6;
  }
  map;
}
SubTable, *SubTablePtr;

typedef struct _cmap
{
  USHORT version;
  USHORT numberOfEncodings;
  SubTablePtr subTables;        /* size = numberOfEncodings */
}
CMAP, *CMAPPtr;

/* glyf: Glyph Data table 
 * It is necessary to load "loca" table first to know where to load a specific
 * glyph; the "loca" table itself depends on "head" and "maxp" tables
 */
typedef F2Dot14 SCALE;

typedef struct
{
  F2Dot14 xscale;
  F2Dot14 yscale;
}
VECTOR;

typedef struct
{
  F2Dot14 xscale;
  F2Dot14 scale01;
  F2Dot14 scale10;
  F2Dot14 yscale;
}
TENSOR;

typedef struct
{
  SHORT args[2];                /* need reconsideration */
  union
  {
    SCALE scale;
    VECTOR vector;
    TENSOR tensor;
  }
  transform;
}
CompositeData;

typedef struct _component
{
  USHORT flags;
  USHORT glyphIndex;
  CompositeData data;
  struct _component *next, *previous;   /* linked list used, no way to know 
                                         * how many components in advance */
}
Component;

typedef struct
{
  SHORT numberOfContours;
  FWord xMin;
  FWord yMin;
  FWord xMax;
  FWord yMax;
  /* simple glyph data */
  USHORT *endPtsOfContours;     /* size = numberOfContours */
  USHORT instructionLength;
  BYTE *instructions;           /* size = instructionLength */
  BYTE *flags;                  /* size = the total # of x,y 
                                 * coordinates, i.e. last number
                                 * of endPtsOfContour */
  SHORT *xCoordinates;
  SHORT *yCoordinates;
  Component *comp;              /* a pointer to a linked list of 
                                 * composite components */
}
GLYF, *GLYFPtr;

/* Flags for Coordinates */
#define FLAGS_ON_CURVE       1
#define FLAGS_X_SHORT_VECTOR 2
#define FLAGS_Y_SHORT_VECTOR 4
#define FLAGS_REPEAT         8
#define FLAGS_X_SAME      0x10
#define FLAGS_Y_SAME      0x20

/* Flags for Composite Glyph */
#define ARG_1_AND_2_ARE_WORDS    0x001
#define ARGS_ARE_XY_VALUES       0x002
#define ROUND_XY_TO_GRID         0x004
#define WE_HAVE_A_SCALE          0x008
#define RESERVE                  0x010
#define NO_OVERLAP               0x010
#define MORE_COMPONENT           0x020
#define WE_HAVE_AN_X_AND_Y_SCALE 0x040
#define WE_HAVE_A_TWO_BY_TWO     0x080
#define WE_HAVE_INSTRUCTIONS     0x100
#define USE_MY_METRICS           0x200
#define OVERLAP_COMPOUND         0x400  /* from Apple's TTF specs */

typedef struct
{
  Fixed version;
  Fixed fontRevision;
  ULONG checkSumAdj;
  ULONG magicNumber;
  USHORT flags;
  USHORT unitsPerEm;
  BYTE created[8];
  BYTE modified[8];
  FWord xMin;
  FWord yMin;
  FWord xMax;
  FWord yMax;
  USHORT macStyle;
  USHORT lowestRecPPEM;
  SHORT fontDirectionHint;
  SHORT indexToLocFormat;       /* 0 => ushort, 1 => ulong */
  SHORT glyphDataFormat;
}
HEAD, *HEADPtr;

#define FLAGS_Y_0 1
#define FLAGS_X_0 2
#define FLAGS_SIZE_DEP 4
#define FLAGS_INT_PPEM 8
#define FLAGS_ALT_WIDTH 0x10
#define MAC_STYLE_BOLD 1
#define MAC_STYLE_ITALIC 2
#define FONT_DIR_MIX 0
#define FONT_DIR_L2R 1
#define FONT_DIR_L2R_NEUTRALS 2
#define FONT_DIR_R2L -1
#define FONT_DIR_R2L_NEUTRALS -2
#define LOCA_OFFSET_SHORT 0
#define LOCA_OFFSET_LONG 1

typedef struct
{
  Fixed version;
  FWord Ascender;
  FWord Descender;
  FWord LineGap;
  uFWord advanceWidthMax;
  FWord minLeftSideBearing;
  FWord minRightSideBearing;
  FWord xMaxExtent;
  SHORT caretSlopeRise;
  SHORT caretSlopeRun;
  SHORT reserved[5];
  SHORT metricDataFormat;
  USHORT numberOfHMetrics;
}
HHEA, *HHEAPtr;

/* for a new created HMTX, one have to fill numberofHMetrics manually for
 * hhea */
typedef struct _longHorMetric
{
  uFWord advanceWidth;
  FWord lsb;
}
longHorMetric;

typedef struct
{                               /* depends on hhea */
  USHORT numberOfHMetrics;      /* defined in hhea */
  USHORT numberOfLSB;           /* numGlyph - numberOfHMetrics */
  longHorMetric *hMetrics;
  FWord *leftSideBearing;
}
HMTX, *HMTXPtr;

/* for a newly created LOCA, one have to fill indexToLocFormat from head and
 * numGlyphs from maxp manually */
typedef struct
{                               /* depends on head and maxp */
  SHORT indexToLocFormat;       /* defined in head */
  USHORT numGlyphs;             /* defined in maxp */
  ULONG *offset;
}
LOCA, *LOCAPtr;

typedef struct
{
  Fixed version;
  USHORT numGlyphs;
  USHORT maxPoints;
  USHORT maxContours;
  USHORT maxCompositePoints;
  USHORT maxCompositeContours;
  USHORT maxZones;
  USHORT maxTwilightPoints;
  USHORT maxStorage;
  USHORT maxFunctionDefs;
  USHORT maxInstructionDefs;
  USHORT maxStackElements;
  USHORT maxSizeOfInstructions;
  USHORT maxComponentElements;
  USHORT maxComponentDepth;
}
MAXP, *MAXPPtr;

typedef struct
{
  USHORT PlatformID;
  USHORT EncodingID;
  USHORT LanguageID;
  USHORT NameID;
  USHORT length;
  USHORT offset;
  char *data;
}
NameRecord, *NameRecordPtr;

typedef struct
{
  USHORT format;
  USHORT numberOfRecords;
  USHORT offset;
  NameRecordPtr NameRecords;
}
NAME, *NAMEPtr;

typedef struct
{
  USHORT numGlyphs;     /* Should be the same as numGlyphs defined in maxp */
  USHORT *glyphNameIndex;
  CHAR **GlyphName;
}
Format20;

typedef struct
{
  char *offset;
}
Format25;

typedef struct
{
  Fixed format;
  Fixed italicAngle;
  FWord underlinePosition;
  FWord underlineThickness;
  ULONG isFixedPitch;
  ULONG minMemType42;
  ULONG maxMemType42;
  ULONG minMemType1;
  ULONG maxMemType1;
  /* the elements below exist only for 2.0 and 2.5 format */
  union
  {
    Format20 *format20;
    Format25 *format25;
  }
  name;
}
POST, *POSTPtr;

typedef struct
{
  USHORT version;
  SHORT xAvgCharWidth;
  USHORT usWeightClass;
  USHORT usWidthClass;
  USHORT fsType;
  SHORT ySubscriptXSize;
  SHORT ySubscriptYSize;
  SHORT ySubscriptXOffset;
  SHORT ySubscriptYOffset;
  SHORT ySuperscriptXSize;
  SHORT ySuperscriptYSize;
  SHORT ySuperscriptXOffset;
  SHORT ySuperscriptYOffset;
  SHORT yStrikeoutSize;
  SHORT yStrikeoutPosition;
  SHORT sFamilyClass;
  CHAR panose[10];
  ULONG ulUnicodeRange1;
  ULONG ulUnicodeRange2;
  ULONG ulUnicodeRange3;
  ULONG ulUnicodeRange4;
  CHAR achVendID[5];
  USHORT fsSelection;
  USHORT usFirstCharIndex;
  USHORT usLastCharIndex;
  SHORT sTypoAscender;
  SHORT sTypoDescender;
  SHORT sTypoLineGap;
  USHORT usWinAscent;
  USHORT usWinDescent;
  ULONG ulCodePageRange1;
  ULONG ulCodePageRange2;
}
OS_2, *OS_2Ptr;

typedef struct
{
  USHORT rangeMaxPPEM;
  USHORT rangeGaspBehavior;
}
GASPRANGE;

typedef struct
{
  USHORT version;
  USHORT numRanges;
  GASPRANGE *gaspRange;         /* length = numRanges */
}
GASP, *GASPPtr;

/* flags for gasp */
#define GASP_GRIDFIT 0x0001
#define GASP_DOGRAY  0x0002

typedef struct
{
  BYTE PixelSize;
  BYTE MaxWidth;
  BYTE *Width;                  /* length = numGlyphs */
}
DeviceRecord;

typedef struct
{
  USHORT numGlyphs;             /* defined in maxp, artifitial */
  USHORT version;
  SHORT numDevices;
  LONG size;
  DeviceRecord *Records;
}
HDMX, *HDMXPtr;

typedef struct
{
  USHORT version;
  USHORT length;
  USHORT coverage;
  union
  {
    struct
    {
      USHORT nPairs;
      USHORT searchRange;
      USHORT entrySelector;
      USHORT rangeShift;
      struct kernpair
      {
        USHORT left;
        USHORT right;
        FWord value;
      }
      *pairs;
    }
    kern0;

    struct
    {
      USHORT rowWidth;
      USHORT leftClassTable;
      USHORT rightClassTable;
      USHORT array;
    }
    kern2;
  }
  kern;
}
KernSubtable;

typedef struct
{
  USHORT version;
  USHORT nTables;
  KernSubtable *subtable;
}
KERN, *KERNPtr;

typedef struct
{
  USHORT version;
  USHORT numGlyphs;
  BYTE *yPels;                  /* length = numGlyphs */
}
LTSH, *LTSHPtr;

typedef struct
{
  Fixed version;
  ULONG FontNumber;
  USHORT Pitch;
  USHORT xHeight;
  USHORT Style;
  USHORT TypeFamily;
  USHORT CapHeight;
  USHORT SymbolSet;
  CHAR Typeface[16];
  CHAR CharacterComplement[8];
  CHAR FileName[6];
  CHAR StrokeWeight;
  CHAR WidthType;
  BYTE SerifStyle;
  BYTE reserved;
}
PCLT, *PCLTPtr;

typedef struct
{
  BYTE CharSet;
  BYTE xRatio;
  BYTE yStartRatio;
  BYTE yEndRatio;
}
Ratios;

typedef struct
{
  USHORT yPelHeight;
  SHORT yMax;
  SHORT yMin;
}
vTable;

typedef struct
{
  USHORT recs;
  BYTE startsz;
  BYTE endsz;
  vTable *entry;
}
Vdmx;

typedef struct
{
  USHORT version;
  USHORT numRecs;
  USHORT numRatios;
  Ratios *ratRange;             /* length = numRatios */
  USHORT *offset;               /* length = numRatios */
  Vdmx *groups;
}
VDMX, *VDMXPtr;

typedef struct
{
  Fixed version;
  SHORT ascent;
  SHORT descent;
  SHORT lineGap;
  SHORT advanceHeightMax;
  SHORT minTopSideBearing;
  SHORT minBottomSideBearing;
  SHORT yMaxExtent;
  SHORT caretSlopeRise;
  SHORT caretSlopeRun;
  SHORT caretOffset;
  SHORT reserved[4];
  SHORT metricDataFormat;
  USHORT numOfLongVerMetrics;
}
VHEA, *VHEAPtr;

typedef struct
{
  uFWord advanceHeight;
  FWord topSideBearing;
}
longVerMetric;

typedef struct
{
  /* depends on vhea */
  USHORT numOfLongVerMetrics;   /* defined in vhea */
  USHORT numOfTSB;              /* numGlyph - numberOfHMetrics */
  longVerMetric *vMetrics;
  FWord *topSideBearing;
}
VMTX, *VMTXPtr;

#endif /* __TTF_TABLE_H */


/* end of tables.h */
