#ifndef _SFNT_H
#define _SFNT_H

#include "bitset.h"

typedef struct {
  unsigned int tag;
  unsigned int checkSum;
  unsigned int offset;
  unsigned int length;
} OTF_DIRENT;

typedef struct _IO_FILE FILE;

typedef struct {
  FILE *f;
  unsigned int numTTC,useTTC;
  unsigned int version;

  unsigned short numTables;
  OTF_DIRENT *tables;

  int flags;
  unsigned short unitsPerEm;
  unsigned short indexToLocFormat; // 0=short, 1=long
  unsigned short numGlyphs;

  // optionally loaded data
  unsigned int *glyphOffsets;
  unsigned short numberOfHMetrics;
  char *hmtx,*name,*cmap;
  const char *unimap; // ptr to (3,1) or (3,0) cmap start
  
  // single glyf buffer, allocated large enough by otf_load_more() 
  char *gly;
  OTF_DIRENT *glyfTable;

} OTF_FILE;
#define OTF_F_FMT_CFF      0x10000
#define OTF_F_DO_CHECKSUM  0x40000

// to load TTC collections: append e.g. "/3" for the third font in the file.
OTF_FILE *otf_load(const char *file);
void otf_close(OTF_FILE *otf);

#define OTF_TAG(a,b,c,d)  (unsigned int)( ((a)<<24)|((b)<<16)|((c)<<8)|(d) )
#define OTF_UNTAG(a)  (((unsigned int)(a)>>24)&0xff),(((unsigned int)(a)>>16)&0xff),\
                      (((unsigned int)(a)>>8)&0xff),(((unsigned int)(a))&0xff)

char *otf_get_table(OTF_FILE *otf,unsigned int tag,int *ret_len);

int otf_get_width(OTF_FILE *otf,unsigned short gid);
const char *otf_get_name(OTF_FILE *otf,int platformID,int encodingID,int languageID,int nameID,int *ret_len);
int otf_get_glyph(OTF_FILE *otf,unsigned short gid);
unsigned short otf_from_unicode(OTF_FILE *otf,int unicode);

#ifndef OUTPUT_FN_DECLARED
#define OUTPUT_FN_DECLARED
typedef void (*OUTPUT_FN)(const char *buf,int len,void *context);
#endif
int otf_subset(OTF_FILE *otf,BITSET glyphs,OUTPUT_FN output,void *context);
int otf_ttc_extract(OTF_FILE *otf,OUTPUT_FN output,void *context);

#endif
