#ifndef _CFF_H_
#define _CFF_H_
#include "mfileio.h"
#include "cff_types.h"
#define FONTTYPE_CIDFONT (1 << 0)
#define FONTTYPE_FONT (1 << 1)
#define FONTTYPE_MMASTER (1 << 2)
#define ENCODING_STANDARD (1 << 3)
#define ENCODING_EXPERT (1 << 4)
#define CHARSETS_ISOADOBE (1 << 5)
#define CHARSETS_EXPERT (1 << 6)
#define CHARSETS_EXPSUB (1 << 7)
#define HAVE_STANDARD_ENCODING (ENCODING_STANDARD|ENCODING_EXPERT)
#define HAVE_STANDARD_CHARSETS \
(CHARSETS_ISOADOBE|CHARSETS_EXPERT|CHARSETS_EXPSUB)
#define CFF_STRING_NOTDEF 65535
typedef struct
{
char *fontname;
cff_header header;
cff_index *name;
cff_dict *topdict;
cff_index *string;
cff_index *gsubr;
cff_encoding *encoding;
cff_charsets *charsets;
cff_fdselect *fdselect;
cff_index *cstrings;
cff_dict **fdarray;
cff_dict **private;
cff_index **subrs;
l_offset offset;
l_offset gsubr_offset;
card16 num_glyphs;
card8 num_fds;
cff_index *_string;
FILE *stream;
int filter;
int index;
int flag;
} cff_font;
extern cff_font *cff_open (FILE *file, long offset, int idx);
#define cff_seek_set(c, p) seek_absolute (((c)->stream), ((c)->offset) + (p));
#define cff_read_data(d, l, c) fread(d, 1, l, (c)->stream)
#define cff_tell(c) ftell((c)->stream)
#define cff_seek(c, p) seek_absolute((c)->stream, p)
extern void cff_close (cff_font *cff);
extern long cff_put_header (cff_font *cff, card8 *dest, long destlen);
extern cff_index *cff_get_index (cff_font *cff);
extern cff_index *cff_get_index_header (cff_font *cff);
extern void cff_release_index (cff_index *idx);
extern cff_index *cff_new_index (card16 count);
extern long cff_index_size (cff_index *idx);
extern long cff_pack_index (cff_index *idx, card8 *dest, long destlen);
extern char *cff_get_name (cff_font *cff);
extern long cff_set_name (cff_font *cff, char *name);
extern long cff_read_subrs (cff_font *cff);
extern long cff_read_encoding (cff_font *cff);
extern long cff_pack_encoding (cff_font *cff, card8 *dest, long destlen);
extern card16 cff_encoding_lookup (cff_font *cff, card8 code);
extern void cff_release_encoding (cff_encoding *encoding);
extern long cff_read_charsets (cff_font *cff);
extern long cff_pack_charsets (cff_font *cff, card8 *dest, long destlen);
extern card16 cff_glyph_lookup (cff_font *cff, const char *glyph);
extern char* cff_get_glyphname (cff_font *cff, card16 gid);
extern card16 cff_charsets_lookup (cff_font *cff, card16 cid);
extern card16 cff_charsets_lookup_gid (cff_charsets *charset, card16 cid);
extern void cff_release_charsets (cff_charsets *charset);
extern card16 cff_charsets_lookup_inverse (cff_font *cff, card16 gid);
extern card16 cff_charsets_lookup_cid(cff_charsets *charset, card16 gid);
extern long cff_read_fdselect (cff_font *cff);
extern long cff_pack_fdselect (cff_font *cff, card8 *dest, long destlen);
extern card8 cff_fdselect_lookup (cff_font *cff, card16 gid);
extern void cff_release_fdselect (cff_fdselect *fdselect);
extern long cff_read_fdarray (cff_font *cff);
extern long cff_read_private (cff_font *cff);
extern int cff_match_string (cff_font *cff, const char *str, s_SID sid);
extern char *cff_get_string (cff_font *cff, s_SID id);
extern long cff_get_sid (cff_font *cff, const char *str);
extern long cff_get_seac_sid (cff_font *cff, const char *str);
extern s_SID cff_add_string (cff_font *cff, const char *str, int unique);
extern void cff_update_string (cff_font *cff);
#define cff_is_stdstr(s) (cff_get_sid(NULL, (s)) >= 0)
#endif