summaryrefslogtreecommitdiff
path: root/Build/source/libs/luafontforge/src/luafflib.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/luafontforge/src/luafflib.c')
-rw-r--r--Build/source/libs/luafontforge/src/luafflib.c1789
1 files changed, 0 insertions, 1789 deletions
diff --git a/Build/source/libs/luafontforge/src/luafflib.c b/Build/source/libs/luafontforge/src/luafflib.c
deleted file mode 100644
index 8c67e0b2697..00000000000
--- a/Build/source/libs/luafontforge/src/luafflib.c
+++ /dev/null
@@ -1,1789 +0,0 @@
-/**
-* $Id $
-* @desc Support interface for fontforge 20070607
-* @version 1.0
-* @author Taco Hoekwater
-*/
-
-#include <stdio.h>
-#include <lua.h>
-#include <lauxlib.h>
-
-#include "pfaedit.h"
-
-extern void LoadPrefs(void);
-
-extern char **gww_errors;
-extern int gww_error_count;
-extern void gwwv_errors_free (void);
-
-#define FONT_METATABLE "fontforge.splinefont"
-
-#define LUA_OTF_VERSION "0.2"
-
-char *possub_type_enum[] = {
- "null", "position", "pair", "substitution",
- "alternate", "multiple", "ligature", "lcaret",
- "kerning", "vkerning", "anchors", "contextpos",
- "contextsub", "chainpos", "chainsub","reversesub",
- "max", "kernback", "vkernback"};
-
-#define LAST_POSSUB_TYPE_ENUM 18
-
-#define eight_nulls() NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
-
-char *otf_lookup_type_enum[] = {
- "gsub_start", "gsub_single", "gsub_multiple", "gsub_alternate",
- "gsub_ligature", "gsub_context", "gsub_contextchain", NULL,
- "gsub_reversecontextchain", NULL, NULL, NULL, NULL, NULL, NULL, NULL, /*0x00F */
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(), NULL, NULL, NULL, NULL, NULL, "morx_indic", "morx_context", "morx_insert", /* 0x0FF*/
- "gpos_start", "gpos_single", "gpos_pair", "gpos_cursive",
- "gpos_mark2base", "gpos_mark2ligature", "gpos_mark2mark", "gpos_context",
- "gpos_contextchain", NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0x10F */
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(),eight_nulls(),
- eight_nulls(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, "kern_statemachine", /* 0x1FF*/
-};
-
-
-char *anchor_type_enum[] = { "mark", "basechar", "baselig", "basemark", "centry", "cexit", "max", NULL };
-#define MAX_ANCHOR_TYPE 7
-char *anchorclass_type_enum[] = { "mark", "mkmk", "curs", "mklg", NULL };
-char *glyph_class_enum[] = { "automatic", "none" ,"base", "ligature","mark", "component", NULL };
-
-
-#define check_isfont(L,b) (SplineFont **)luaL_checkudata(L,b,FONT_METATABLE)
-
-void handle_generic_pst (lua_State *L, struct generic_pst *pst); /* forward */
-void handle_generic_fpst (lua_State *L, struct generic_fpst *fpst); /* forward */
-void handle_kernclass (lua_State *L, struct kernclass *kerns);
-void handle_anchorclass (lua_State *L, struct anchorclass *anchor);
-
-
-void
-lua_ff_pushfont(lua_State *L, SplineFont *sf) {
- SplineFont **a;
- if (sf==NULL) {
- lua_pushnil(L);
- } else {
- a = lua_newuserdata(L,sizeof(SplineFont *));
- *a = sf;
- luaL_getmetatable(L,FONT_METATABLE);
- lua_setmetatable(L,-2);
- }
- return;
-}
-
-
-static int
-ff_open (lua_State *L) {
- SplineFont *sf;
- const char *fontname;
- FILE *l;
- char s[511];
- size_t len;
- int args,i ;
- int openflags = 1;
- fontname = luaL_checkstring(L,1);
- /* test fontname for existance */
- if ((l = fopen(fontname,"r"))) {
- fclose(l);
- } else {
- lua_pushfstring(L,"font loading failed for %s (read error)\n", fontname);
- lua_error(L);
- }
- args = lua_gettop(L);
- if (args>=2) {
- if (lua_isstring(L,2)) {
- if (*(fontname+strlen(fontname))!=')') {
- /* possibly fails for embedded parens in the font name */
- snprintf(s,511,"%s(%s)", fontname, lua_tolstring(L,2,&len));
- if (len==0) {
- snprintf(s,511,"%s", fontname);
- }
- }
- }
- } else {
- snprintf(s,511,"%s", fontname);
- }
- if (strlen(s)>0) {
- sf = ReadSplineFont((char *)s,openflags);
- if (sf==NULL) {
- lua_pushfstring(L,"font loading failed for %s\n", fontname);
- lua_error(L);
- } else {
- lua_ff_pushfont(L,sf);
- if (gww_error_count>0) {
- lua_newtable(L);
- for (i=0;i<gww_error_count;i++) {
- lua_pushstring(L,gww_errors[i]);
- lua_rawseti(L,-2,(i+1));
- }
- gwwv_errors_free();
- } else {
- lua_pushnil(L);
- }
- }
- } else {
- lua_pushfstring(L,"font loading failed: empty string given\n", fontname);
- lua_error(L);
- }
- return 2;
-}
-
-
-static int
-ff_close (lua_State *L) {
- SplineFont **sf;
- /*fputs("ff_close called",stderr);*/
- sf = check_isfont(L,1);
- if (*sf!=NULL) {
- SplineFontFree(*sf);
- *sf = NULL;
- }
- return 0;
-}
-
-static int
-ff_apply_featurefile (lua_State *L) {
- SplineFont **sf;
- char *fname;
- sf = check_isfont(L,1);
- fname = (char *)luaL_checkstring(L,2);
- SFApplyFeatureFilename(*sf,fname);
- return 0;
-}
-
-static int
-ff_apply_afmfile (lua_State *L) {
- SplineFont **sf;
- char *fname;
- sf = check_isfont(L,1);
- fname = (char *)luaL_checkstring(L,2);
- CheckAfmOfPostscript(*sf,fname,(*sf)->map);
-
- return 0;
-}
-
-
-
-static void
-dump_intfield (lua_State *L, char *name, long int field) {
- lua_checkstack(L,2);
- lua_pushstring(L,name);
- lua_pushnumber(L,field);
- lua_rawset(L,-3);
-}
-
-#define dump_cond_intfield(a,b,c) if ((c)!=0) { dump_intfield ((a),(b),(c)); }
-
-
-static void
-dump_stringfield (lua_State *L, char *name, char *field) {
- lua_checkstack(L,2);
- lua_pushstring(L,name);
- lua_pushstring(L,field);
- lua_rawset(L,-3);
-}
-
-static void
-dump_char_ref (lua_State *L, struct splinechar *spchar) {
- lua_checkstack(L,2);
- lua_pushstring(L,"char");
- lua_pushstring(L,spchar->name);
- lua_rawset(L,-3);
-}
-
-
-static void
-dump_lstringfield (lua_State *L, char *name, char *field, int len) {
- lua_checkstack(L,2);
- lua_pushstring(L,name);
- lua_pushlstring(L,field,len);
- lua_rawset(L,-3);
-}
-
-static void
-dump_enumfield (lua_State *L, char *name, int fid, char **fields) {
- lua_checkstack(L,2);
- lua_pushstring(L,name);
- lua_pushstring(L,fields[fid]);
- lua_rawset(L,-3);
-}
-
-static void
-dump_floatfield (lua_State *L, char *name, double field) {
- lua_checkstack(L,2);
- lua_pushstring(L,name);
- lua_pushnumber(L,field);
- lua_rawset(L,-3);
-}
-
-static char tag_string [5] = {0};
-
-static char *make_tag_string (unsigned int field) {
- tag_string[0] = (field&0xFF000000) >> 24;
- tag_string[1] = (field&0x00FF0000) >> 16;
- tag_string[2] = (field&0x0000FF00) >> 8;
- tag_string[3] = (field&0x000000FF);
- return (char *)tag_string;
-}
-
-static char featbuf[32] = {0};
-
-static char *make_mactag_string (unsigned int field) {
- sprintf( featbuf, "<%d,%d>", field>>16, field&0xffff );
- return (char *)featbuf;
-}
-
-
-static void
-dump_tag (lua_State *L, char *name, unsigned int field) {
- lua_checkstack(L,2);
- lua_pushstring(L,name);
- lua_pushlstring(L,make_tag_string(field),4);
- lua_rawset(L,-3);
-}
-
-static void
-dump_mactag (lua_State *L, char *name, unsigned int field) {
- lua_checkstack(L,2);
- lua_pushstring(L,name);
- lua_pushstring(L,make_mactag_string(field));
- lua_rawset(L,-3);
-}
-
-#define NESTED_TABLE(a,b,c) { \
- int k = 1; \
- next = b; \
- while (next != NULL) { \
- lua_checkstack(L,2); \
- lua_pushnumber(L,k); k++; \
- lua_createtable(L,0,c); \
- a(L, next); \
- lua_rawset(L,-3); \
- next = next->next; \
- } }
-
-void
-do_handle_scriptlanglist (lua_State *L, struct scriptlanglist *sl) {
- int k;
- dump_tag(L,"script", sl->script);
-
- lua_checkstack(L,3);
- lua_newtable(L);
- for (k=0;k<MAX_LANG;k++) {
- if (sl->langs[k] != 0) {
- lua_pushnumber(L,(k+1));
- lua_pushstring(L,make_tag_string(sl->langs[k]));
- lua_rawset(L,-3);
- }
- }
-
- if (sl->lang_cnt>=MAX_LANG) {
- for (k=MAX_LANG;k<sl->lang_cnt;k++) {
- lua_pushnumber(L,(k+1));
- lua_pushstring(L,make_tag_string(sl->morelangs[k-MAX_LANG]));
- lua_rawset(L,-3);
- }
- }
- lua_setfield(L,-2,"langs");
-}
-
-void
-handle_scriptlanglist (lua_State *L, struct scriptlanglist *sll) {
- struct scriptlanglist *next;
- NESTED_TABLE(do_handle_scriptlanglist,sll,4);
-}
-
-void
-do_handle_featurescriptlanglist (lua_State *L, struct featurescriptlanglist *features) {
- if (features->ismac) {
- dump_mactag (L,"tag",features->featuretag);
- } else {
- dump_tag (L,"tag",features->featuretag);
- }
- lua_newtable(L);
- handle_scriptlanglist(L, features->scripts);
- lua_setfield(L,-2,"scripts");
- dump_cond_intfield (L,"ismac",features->ismac);
-}
-
-void
-handle_featurescriptlanglist (lua_State *L, struct featurescriptlanglist *features) {
- struct featurescriptlanglist *next;
- NESTED_TABLE(do_handle_featurescriptlanglist,features,3);
-}
-
-void
-do_handle_lookup_subtable (lua_State *L, struct lookup_subtable *subtable) {
-
- dump_stringfield(L,"name", subtable->subtable_name);
- dump_stringfield(L,"suffix", subtable->suffix);
-
- /* struct otlookup *lookup; */ /* this is the parent */
-
- /* dump_intfield (L,"unused", subtable->unused); */
- /* The next one is true if there is no fpst, false otherwise */
- /*
- dump_intfield (L,"per_glyph_pst_or_kern",subtable->per_glyph_pst_or_kern);
- */
- dump_cond_intfield (L,"anchor_classes", subtable->anchor_classes);
- dump_cond_intfield (L,"vertical_kerning", subtable->vertical_kerning);
-
- if (subtable->kc != NULL) {
- lua_newtable(L);
- handle_kernclass(L, subtable->kc);
- lua_setfield(L,-2, "kernclass");
- }
-
- /* generic_asm *sm; */ /* TODO, Apple state machine */
-
- /* int subtable_offset; */ /* used by OTF file generation */
- /* int32 *extra_subtables; */ /* used by OTF file generation */
-}
-
-/* subtables have to be dumped as an array because the ordering
- * has to be preserved
- */
-
-void
-handle_lookup_subtable (lua_State *L, struct lookup_subtable *subtable) {
- struct lookup_subtable *next;
- NESTED_TABLE(do_handle_lookup_subtable,subtable,2);
-}
-
-void
-do_handle_lookup (lua_State *L, struct otlookup *lookup ) {
-
- dump_enumfield (L,"type", lookup->lookup_type, otf_lookup_type_enum);
-
- lua_newtable(L);
- if (lookup->lookup_flags & pst_r2l) {
- lua_pushstring(L,"r2l"); lua_pushboolean(L,1); lua_rawset(L,-3);
- }
- if (lookup->lookup_flags & pst_ignorebaseglyphs) {
- lua_pushstring(L,"ignorebaseglyphs"); lua_pushboolean(L,1); lua_rawset(L,-3);
- }
- if (lookup->lookup_flags & pst_ignoreligatures) {
- lua_pushstring(L,"ignoreligatures"); lua_pushboolean(L,1); lua_rawset(L,-3);
- }
- if (lookup->lookup_flags & pst_ignorecombiningmarks) {
- lua_pushstring(L,"ignorecombiningmarks"); lua_pushboolean(L,1); lua_rawset(L,-3);
- }
- lua_setfield(L,-2,"flags");
-
-
- dump_stringfield (L,"name", lookup->lookup_name);
-
- if (lookup->features != NULL) {
- lua_newtable(L);
- handle_featurescriptlanglist(L,lookup->features);
- lua_setfield(L,-2,"features");
- }
-
- if (lookup->subtables != NULL) {
- lua_newtable(L);
- handle_lookup_subtable(L,lookup->subtables);
- lua_setfield(L,-2,"subtables");
- }
-
- /* dump_intfield (L,"unused", lookup->unused); */
- /* dump_intfield (L,"empty", lookup->empty); */
- /* dump_intfield (L,"def_lang_checked", lookup->def_lang_checked); */
- /* dump_intfield (L,"def_lang_found", lookup->def_lang_found); */
- /* dump_intfield (L,"subcnt", lookup->subcnt); */
- /* dump_intfield (L,"index", lookup->lookup_index); */ /* identical to array index */
- /* dump_intfield (L,"lookup_offset", lookup->lookup_offset); */
- /* dump_intfield (L,"lookup_length", lookup->lookup_length); */
- /* dump_stringfield(L,"tempname", lookup->tempname); */
-
-}
-
-void
-handle_lookup (lua_State *L, struct otlookup *lookup ) {
- struct otlookup *next;
- NESTED_TABLE(do_handle_lookup,lookup,18); /* 18 is a guess */
-}
-
-void
-do_handle_kernpair (lua_State *L, struct kernpair *kp) {
-
- if (kp->sc != NULL)
- dump_char_ref(L, kp->sc);
- dump_intfield(L,"off", kp->off);
- if (kp->subtable!=NULL) {
- dump_stringfield(L,"lookup",kp->subtable->subtable_name);
- }
-}
-
-void
-handle_kernpair (lua_State *L, struct kernpair *kp) {
- struct kernpair *next;
- NESTED_TABLE(do_handle_kernpair,kp,4);
-}
-
-void
-handle_splinecharlist (lua_State *L, struct splinecharlist *scl) {
-
- struct splinecharlist *next = scl;
- int k = 1;
- lua_checkstack(L,10);
- while( next != NULL) {
- if (next->sc != NULL) {
- lua_pushnumber(L,k); k++;
- lua_pushstring(L,next->sc->name);
- lua_rawset(L,-3);
- }
- next = next->next;
- }
-}
-
-
-#define interesting_vr(a) (((a)->xoff!=0) || ((a)->yoff!=0) || ((a)->h_adv_off!=0) || ((a)->v_adv_off!=0))
-
-void handle_vr (lua_State *L, struct vr *pos) {
-
- dump_cond_intfield(L,"x", pos->xoff);
- dump_cond_intfield(L,"y", pos->yoff);
- dump_cond_intfield(L,"h", pos->h_adv_off);
- dump_cond_intfield(L,"v", pos->v_adv_off);
-
-}
-
-void
-do_handle_generic_pst (lua_State *L, struct generic_pst *pst) {
- int k;
- if (pst->type>LAST_POSSUB_TYPE_ENUM) {
- dump_tag(L,"type", pst->type);
- } else {
- dump_enumfield(L,"type", pst->type, possub_type_enum);
- }
-
- /*dump_intfield(L,"macfeature", pst->macfeature); */
-
- lua_checkstack(L,4);
- lua_pushstring(L,"specification");
- lua_createtable(L,0,4);
- if (pst->type == pst_position) {
- handle_vr (L, &pst->u.pos);
- } else if (pst->type == pst_pair) {
- dump_stringfield(L,"paired",pst->u.pair.paired);
- if (pst->u.pair.vr != NULL) {
- lua_pushstring(L,"offsets");
- lua_createtable(L,2,0);
- if (interesting_vr(pst->u.pair.vr)) {
- lua_createtable(L,0,4);
- handle_vr (L, pst->u.pair.vr);
- lua_rawseti(L,-2,1);
- }
- if (interesting_vr(pst->u.pair.vr+1)) {
- lua_createtable(L,0,4);
- handle_vr (L, pst->u.pair.vr+1);
- lua_rawseti(L,-2,2);
- }
- lua_rawset(L,-3);
- }
- } else if (pst->type == pst_substitution) {
- dump_stringfield(L,"variant",pst->u.subs.variant);
- } else if (pst->type == pst_alternate) {
- dump_stringfield(L,"components",pst->u.mult.components);
- } else if (pst->type == pst_multiple) {
- dump_stringfield(L,"components",pst->u.alt.components);
- } else if (pst->type == pst_ligature) {
- dump_stringfield(L,"components",pst->u.lig.components);
- if (pst->u.lig.lig != NULL) {
- dump_char_ref(L,pst->u.lig.lig);
- }
- } else if (pst->type == pst_lcaret) {
- for (k=0;k<pst->u.lcaret.cnt;k++) {
- lua_pushnumber(L,(k+1));
- lua_pushnumber(L,pst->u.lcaret.carets[k]);
- lua_rawset(L,-3);
- }
- }
- lua_rawset(L,-3);
-}
-
-
-void
-handle_generic_pst (lua_State *L, struct generic_pst *pst) {
- struct generic_pst *next;
- int k;
- int l = 1;
- next = pst;
- /* most likely everything arrives in proper order. But to prevent
- * surprises, better do this is the proper way
- */
- while (next != NULL) {
- if (next->subtable !=NULL &&
- next->subtable->subtable_name !=NULL) {
- lua_checkstack(L,3); /* just in case */
- lua_getfield(L,-1,next->subtable->subtable_name);
- if (!lua_istable(L,-1)) {
- lua_pop(L,1);
- lua_newtable(L);
- lua_setfield(L,-2,next->subtable->subtable_name);
- lua_getfield(L,-1,next->subtable->subtable_name);
- }
- k = lua_objlen(L,-1) + 1;
- lua_pushnumber(L,k);
- lua_createtable(L,0,4);
- do_handle_generic_pst(L, next);
- lua_rawset(L,-3);
- next = next->next;
- lua_pop(L,1); /* pop the subtable */
- } else {
- /* Found a pst without subtable, or without subtable name */
- lua_pushnumber(L,l); l++;
- lua_createtable(L,0,4);
- do_handle_generic_pst(L, next);
- lua_rawset(L,-3);
- next = next->next;
- }
- }
-}
-
-void
-do_handle_liglist (lua_State *L, struct liglist *ligofme) {
- lua_checkstack(L,2);
- if(ligofme->lig != NULL) {
- lua_createtable(L,0,6);
- handle_generic_pst (L,ligofme->lig);
- lua_setfield(L,-2,"lig");
- }
- dump_char_ref(L,ligofme->first);
- if (ligofme->components != NULL) {
- lua_newtable(L);
- handle_splinecharlist (L,ligofme->components);
- lua_setfield(L,-2,"components");
- }
- dump_intfield(L,"ccnt",ligofme->ccnt);
-}
-
-void
-handle_liglist (lua_State *L, struct liglist *ligofme) {
- struct liglist *next;
- NESTED_TABLE(do_handle_liglist,ligofme,3);
-}
-
-/*
-if glyph.anchor then
- local t = { }
- for k,v in ipairs(glyph.anchor) do
- if not t[v.type] then t[v.type] = { } end
- t[v.type][v.anchor] = v
- v.anchor = nil
- v.type = nil
- end
- glyph.anchor = t
- end
-*/
-
-void
-do_handle_anchorpoint (lua_State *L, struct anchorpoint *anchor) {
-
- if (anchor->anchor==NULL) {
- return;
- }
- if (anchor->type>=0 && anchor->type <= MAX_ANCHOR_TYPE ) {
- lua_pushstring(L,anchor_type_enum[anchor->type]);
- } else {
- lua_pushstring(L,"Anchorpoint has an unknown type!");
- lua_error(L);
- }
-
- lua_rawget(L,-2);
- if (!lua_istable(L,-1)) {
- /* create the table first */
- lua_pop(L,1);
- lua_pushstring(L,anchor_type_enum[anchor->type]);
- lua_pushvalue(L,-1);
- lua_newtable(L);
- lua_rawset(L,-4);
- lua_rawget(L,-2);
- }
- /* now the 'type' table is top of stack */
- if (anchor->type==at_baselig) {
- lua_pushstring(L,anchor->anchor->name);
- lua_rawget(L,-2);
- if (!lua_istable(L,-1)) {
- /* create the table first */
- lua_pop(L,1);
- lua_pushstring(L,anchor->anchor->name);
- lua_pushvalue(L,-1);
- lua_newtable(L);
- lua_rawset(L,-4);
- lua_rawget(L,-2);
- }
- lua_newtable(L);
- dump_intfield(L,"x", anchor->me.x);
- dump_intfield(L,"y", anchor->me.y);
-
- if (anchor->has_ttf_pt)
- dump_intfield(L,"ttf_pt_index", anchor->ttf_pt_index);
- /* dump_intfield(L,"lig_index", anchor->lig_index); */
- lua_rawseti(L,-2,(anchor->lig_index+1));
- lua_pop(L,1);
- } else {
- lua_pushstring(L,anchor->anchor->name);
- lua_newtable(L);
- dump_intfield(L,"x", anchor->me.x);
- dump_intfield(L,"y", anchor->me.y);
-
- if (anchor->has_ttf_pt)
- dump_intfield(L,"ttf_pt_index", anchor->ttf_pt_index);
- lua_rawset(L,-3);
- }
- lua_pop(L,1);
-}
-
-void
-handle_anchorpoint (lua_State *L, struct anchorpoint *anchor) {
- struct anchorpoint *next;
- next = anchor;
- while (next != NULL) {
- do_handle_anchorpoint(L, next);
- next = next->next;
- }
-}
-
-void
-handle_splinechar (lua_State *L,struct splinechar *glyph, int hasvmetrics) {
-
- dump_stringfield(L,"name", glyph->name);
- dump_intfield(L,"unicode", glyph->unicodeenc);
- lua_createtable(L,4,0);
- lua_pushnumber(L,1); lua_pushnumber(L,glyph->xmin); lua_rawset(L,-3);
- lua_pushnumber(L,2); lua_pushnumber(L,glyph->ymin); lua_rawset(L,-3);
- lua_pushnumber(L,3); lua_pushnumber(L,glyph->xmax); lua_rawset(L,-3);
- lua_pushnumber(L,4); lua_pushnumber(L,glyph->ymax); lua_rawset(L,-3);
- lua_setfield(L,-2,"boundingbox");
-
- /*dump_intfield(L,"orig_pos", glyph->orig_pos);*/
- if (hasvmetrics)
- dump_intfield(L,"vwidth", glyph->vwidth);
- dump_intfield(L,"width", glyph->width);
-
- dump_cond_intfield(L,"lsidebearing", glyph->lsidebearing);
-
- /* Layer layers[2]; */ /* TH Not used */
- /* int layer_cnt; */ /* TH Not used */
- /* StemInfo *hstem; */ /* TH Not used */
- /* StemInfo *vstem; */ /* TH Not used */
- /* DStemInfo *dstem; */ /* TH Not used */
-
- /* MinimumDistance *md; */ /* TH Not used */
- /* struct charview *views; */ /* TH Not used */
- /* struct charinfo *charinfo; */ /* TH ? (charinfo.c) */
-
- /* struct splinefont *parent; */ /* TH Not used */
-
- /*
-
- */
- if (glyph->glyph_class>0) {
- dump_enumfield(L,"class", glyph->glyph_class, glyph_class_enum);
- }
- /* TH: internal fontforge stuff
- dump_intfield(L,"ticked", glyph->ticked);
- dump_intfield(L,"widthset", glyph->widthset);
- dump_intfield(L,"ttf_glyph", glyph->ttf_glyph);
- dump_intfield(L,"changed", glyph->changed);
- dump_intfield(L,"changedsincelasthinted", glyph->changedsincelasthinted);
- dump_intfield(L,"manualhints", glyph->manualhints);
- dump_intfield(L,"changed_since_autosave", glyph->changed_since_autosave);
- dump_intfield(L,"vconflicts", glyph->vconflicts);
- dump_intfield(L,"hconflicts", glyph->hconflicts);
- dump_intfield(L,"anyflexes", glyph->anyflexes);
- dump_intfield(L,"searcherdummy", glyph->searcherdummy);
- dump_intfield(L,"changed_since_search", glyph->changed_since_search);
- dump_intfield(L,"wasopen", glyph->wasopen);
- dump_intfield(L,"namechanged", glyph->namechanged);
- dump_intfield(L,"blended", glyph->blended);
- dump_intfield(L,"unused_so_far", glyph->unused_so_far);
- dump_intfield(L,"numberpointsbackards", glyph->numberpointsbackards);
- dump_intfield(L,"instructions_out_of_date", glyph->instructions_out_of_date);
- dump_intfield(L,"complained_about_ptnums", glyph->complained_about_ptnums);
-
- uint8 *ttf_instrs;
- int16 ttf_instrs_len;
- int16 countermask_cnt;
- HintMask *countermasks;
- */
-
- if (glyph->kerns != NULL) {
- lua_newtable(L);
- handle_kernpair(L,glyph->kerns);
- lua_setfield(L,-2,"kerns");
- }
- if (glyph->vkerns != NULL) {
- lua_newtable(L);
- handle_kernpair(L,glyph->vkerns);
- lua_setfield(L,-2,"vkerns");
- }
-
- if (glyph->dependents != NULL) {
- lua_newtable(L);
- handle_splinecharlist(L,glyph->dependents);
- lua_setfield(L,-2,"dependents");
-
- }
- if (glyph->possub != NULL) {
- lua_newtable(L);
- handle_generic_pst(L,glyph->possub);
- lua_setfield(L,-2,"lookups");
- }
-
- if (glyph->ligofme != NULL) {
- lua_newtable(L);
- handle_liglist(L,glyph->ligofme);
- lua_setfield(L,-2,"ligatures");
- }
-
- if (glyph->comment != NULL)
- dump_stringfield(L,"comment", glyph->comment);
-
- /* Color color; */ /* dont care */
-
- if (glyph->anchor != NULL) {
- lua_newtable(L);
- handle_anchorpoint(L,glyph->anchor);
- lua_setfield(L,-2,"anchors");
- }
-
- if (glyph->tex_height != TEX_UNDEF)
- dump_intfield(L,"tex_height", glyph->tex_height);
- if (glyph->tex_depth != TEX_UNDEF)
- dump_intfield(L,"tex_depth", glyph->tex_depth);
- if (glyph->tex_sub_pos != TEX_UNDEF)
- dump_intfield(L,"tex_sub_pos", glyph->tex_sub_pos);
- if (glyph->tex_super_pos != TEX_UNDEF)
- dump_intfield(L,"tex_super_pos", glyph->tex_super_pos);
-
- /* struct altuni { struct altuni *next; int unienc; } *altuni; */
-}
-
-char *panose_values_0[] = { "Any", "No Fit", "Text and Display", "Script", "Decorative", "Pictorial" };
-
-char *panose_values_1[] = { "Any", "No Fit", "Cove", "Obtuse Cove", "Square Cove", "Obtuse Square Cove",
- "Square", "Thin", "Bone", "Exaggerated", "Triangle", "Normal Sans",
- "Obtuse Sans", "Perp Sans", "Flared", "Rounded" } ;
-
-char *panose_values_2[] = { "Any", "No Fit", "Very Light", "Light", "Thin", "Book",
- "Medium", "Demi", "Bold", "Heavy", "Black", "Nord" } ;
-
-char *panose_values_3[] = { "Any", "No Fit", "Old Style", "Modern", "Even Width",
- "Expanded", "Condensed", "Very Expanded", "Very Condensed", "Monospaced" };
-
-char *panose_values_4[] = { "Any", "No Fit", "None", "Very Low", "Low", "Medium Low",
- "Medium", "Medium High", "High", "Very High" };
-
-char *panose_values_5[] = { "Any", "No Fit", "Gradual/Diagonal", "Gradual/Transitional","Gradual/Vertical",
- "Gradual/Horizontal", "Rapid/Vertical", "Rapid/Horizontal", "Instant/Vertical" };
-
-char *panose_values_6[] = {"Any","No Fit","Straight Arms/Horizontal","Straight Arms/Wedge","Straight Arms/Vertical",
- "Straight Arms/Single Serif","Straight Arms/Double Serif","Non-Straight Arms/Horizontal",
- "Non-Straight Arms/Wedge","Non-Straight Arms/Vertical","Non-Straight Arms/Single Serif",
- "Non-Straight Arms/Double Serif" };
-
-char *panose_values_7[] = { "Any", "No Fit","Normal/Contact","Normal/Weighted","Normal/Boxed","Normal/Flattened",
- "Normal/Rounded","Normal/Off Center","Normal/Square","Oblique/Contact","Oblique/Weighted",
- "Oblique/Boxed","Oblique/Flattened","Oblique/Rounded","Oblique/Off Center","Oblique/Square" };
-
-char *panose_values_8[] = { "Any","No Fit","Standard/Trimmed","Standard/Pointed","Standard/Serifed","High/Trimmed",
- "High/Pointed","High/Serifed","Constant/Trimmed","Constant/Pointed","Constant/Serifed",
- "Low/Trimmed","Low/Pointed","Low/Serifed"};
-
-char *panose_values_9[] = { "Any","No Fit", "Constant/Small", "Constant/Standard",
- "Constant/Large", "Ducking/Small", "Ducking/Standard", "Ducking/Large" };
-
-
-void
-handle_pfminfo (lua_State *L, struct pfminfo pfm) {
-
- dump_intfield (L, "pfmset", pfm.pfmset);
- dump_intfield (L, "winascent_add", pfm.winascent_add);
- dump_intfield (L, "windescent_add", pfm.windescent_add);
- dump_intfield (L, "hheadascent_add", pfm.hheadascent_add);
- dump_intfield (L, "hheaddescent_add", pfm.hheaddescent_add);
- dump_intfield (L, "typoascent_add", pfm.typoascent_add);
- dump_intfield (L, "typodescent_add", pfm.typodescent_add);
- dump_intfield (L, "subsuper_set", pfm.subsuper_set);
- dump_intfield (L, "panose_set", pfm.panose_set);
- dump_intfield (L, "hheadset", pfm.hheadset);
- dump_intfield (L, "vheadset", pfm.vheadset);
- dump_intfield (L, "pfmfamily", pfm.pfmfamily);
- dump_intfield (L, "weight", pfm.weight);
- dump_intfield (L, "width", pfm.width);
- dump_intfield (L, "avgwidth", pfm.avgwidth);
- dump_intfield (L, "firstchar", pfm.firstchar);
- dump_intfield (L, "lastchar", pfm.lastchar);
- lua_createtable(L,0,10);
- dump_enumfield(L,"familytype", pfm.panose[0], panose_values_0);
- dump_enumfield(L,"serifstyle", pfm.panose[1], panose_values_1);
- dump_enumfield(L,"weight", pfm.panose[2], panose_values_2);
- dump_enumfield(L,"proportion", pfm.panose[3], panose_values_3);
- dump_enumfield(L,"contrast", pfm.panose[4], panose_values_4);
- dump_enumfield(L,"strokevariation", pfm.panose[5], panose_values_5);
- dump_enumfield(L,"armstyle", pfm.panose[6], panose_values_6);
- dump_enumfield(L,"letterform", pfm.panose[7], panose_values_7);
- dump_enumfield(L,"midline", pfm.panose[8], panose_values_8);
- dump_enumfield(L,"xheight", pfm.panose[9], panose_values_9);
- lua_setfield (L,-2,"panose");
-
- dump_intfield (L, "fstype", pfm.fstype);
- dump_intfield (L, "linegap", pfm.linegap);
- dump_intfield (L, "vlinegap", pfm.vlinegap);
- dump_intfield (L, "hhead_ascent", pfm.hhead_ascent);
- dump_intfield (L, "hhead_descent", pfm.hhead_descent);
- dump_intfield (L, "hhead_descent", pfm.hhead_descent);
- dump_intfield (L, "os2_typoascent", pfm.os2_typoascent );
- dump_intfield (L, "os2_typodescent", pfm.os2_typodescent );
- dump_intfield (L, "os2_typolinegap", pfm.os2_typolinegap );
- dump_intfield (L, "os2_winascent", pfm.os2_winascent );
- dump_intfield (L, "os2_windescent", pfm.os2_windescent );
- dump_intfield (L, "os2_subxsize", pfm.os2_subxsize );
- dump_intfield (L, "os2_subysize", pfm.os2_subysize );
- dump_intfield (L, "os2_subxoff", pfm.os2_subxoff );
- dump_intfield (L, "os2_subyoff", pfm.os2_subyoff );
- dump_intfield (L, "os2_supxsize", pfm.os2_supxsize );
- dump_intfield (L, "os2_supysize", pfm.os2_supysize );
- dump_intfield (L, "os2_supxoff", pfm.os2_supxoff );
- dump_intfield (L, "os2_supyoff", pfm.os2_supyoff );
- dump_intfield (L, "os2_strikeysize", pfm.os2_strikeysize );
- dump_intfield (L, "os2_strikeypos", pfm.os2_strikeypos );
- dump_lstringfield (L, "os2_vendor", pfm.os2_vendor, 4);
- dump_intfield (L, "os2_family_class", pfm.os2_family_class);
- dump_intfield (L, "os2_xheight", pfm.os2_xheight);
- dump_intfield (L, "os2_capheight", pfm.os2_capheight);
- dump_intfield (L, "os2_defaultchar", pfm.os2_defaultchar);
- dump_intfield (L, "os2_breakchar", pfm.os2_breakchar);
-}
-
-
-void
-do_handle_enc (lua_State *L, struct enc *enc) {
- int i;
-
- dump_stringfield(L,"enc_name", enc->enc_name);
- dump_intfield (L,"char_cnt", enc->char_cnt);
-
- lua_checkstack(L,4);
- if (enc->char_cnt && enc->unicode != NULL) {
- lua_createtable(L,enc->char_cnt,1);
- for (i=0;i<enc->char_cnt;i++) {
- lua_pushnumber(L,i);
- lua_pushnumber(L,enc->unicode[i]);
- lua_rawset(L,-3);
- }
- lua_setfield(L,-2,"unicode");
- }
-
- if (enc->char_cnt && enc->psnames != NULL) {
- lua_createtable(L,enc->char_cnt,1);
- for (i=0;i<enc->char_cnt;i++) {
- lua_pushnumber(L,i);
- lua_pushstring(L,enc->psnames[i]);
- lua_rawset(L,-3);
- }
- lua_setfield(L,-2,"psnames");
- }
- dump_intfield (L,"builtin", enc->builtin );
- dump_intfield (L,"hidden", enc->hidden );
- dump_intfield (L,"only_1byte", enc->only_1byte );
- dump_intfield (L,"has_1byte", enc->has_1byte );
- dump_intfield (L,"has_2byte", enc->has_2byte );
- dump_cond_intfield (L,"is_unicodebmp", enc->is_unicodebmp );
- dump_cond_intfield (L,"is_unicodefull", enc->is_unicodefull );
- dump_cond_intfield (L,"is_custom", enc->is_custom );
- dump_cond_intfield (L,"is_original", enc->is_original );
- dump_cond_intfield (L,"is_compact", enc->is_compact );
- dump_cond_intfield (L,"is_japanese", enc->is_japanese );
- dump_cond_intfield (L,"is_korean", enc->is_korean );
- dump_cond_intfield (L,"is_tradchinese", enc->is_tradchinese );
- dump_cond_intfield (L,"is_simplechinese", enc->is_simplechinese);
-
- if (enc->iso_2022_escape_len > 0) {
- dump_lstringfield (L,"iso_2022_escape", enc->iso_2022_escape, enc->iso_2022_escape_len);
- }
- dump_intfield (L,"low_page", enc->low_page);
- dump_intfield(L,"high_page", enc->high_page);
-
- dump_stringfield(L,"iconv_name", enc->iconv_name);
-
- /* TH: iconv internal information, ignorable */
- /* iconv_t *tounicode; */
- /* iconv_t *fromunicode; */
- /* int (*tounicode_func)(int); */
- /* int (*fromunicode_func)(int); */
-
- /*dump_intfield (L,"is_temporary", enc->is_temporary);*/
- dump_intfield (L,"char_max", enc->char_max);
-
-}
-
-void
-handle_enc (lua_State *L, struct enc *enc) {
- struct enc *next;
- NESTED_TABLE(do_handle_enc,enc,24);
-}
-
-void
-handle_encmap (lua_State *L, struct encmap *map) {
- int i;
- dump_intfield(L,"enccount", map->enccount) ;
- dump_intfield(L,"encmax", map->encmax) ;
- dump_intfield(L,"backmax", map->backmax) ;
- /*dump_intfield(L,"ticked", map->ticked) ;*/
- if (map->remap != NULL) {
- lua_newtable(L);
- dump_intfield(L,"firstenc", map->remap->firstenc) ;
- dump_intfield(L,"lastenc", map->remap->lastenc) ;
- dump_intfield(L,"infont", map->remap->infont) ;
- lua_setfield(L,-2,"remap");
- }
- lua_checkstack(L,4);
- if (map->encmax > 0 && map->map != NULL) {
- lua_createtable(L,map->encmax,1);
- for (i=0;i<map->encmax;i++) {
- if (map->map[i]!=-1) {
- lua_pushnumber(L,i);
- lua_pushnumber(L,map->map[i]);
- lua_rawset(L,-3);
- }
- }
- lua_setfield(L,-2,"map");
- }
-
- if (map->backmax > 0 && map->backmap != NULL) {
- lua_newtable(L);
- for (i=0;i<map->backmax;i++) {
- if (map->backmap[i]!=-1) {
- lua_pushnumber(L,i);
- lua_pushnumber(L,map->backmap[i]);
- lua_rawset(L,-3);
- }
- }
- lua_setfield(L,-2,"backmap");
- }
-
- if (map->enc != NULL) {
- lua_newtable(L);
- handle_enc(L,map->enc);
- lua_setfield(L,-2,"enc");
- }
-}
-
-static void
-handle_psdict (lua_State *L, struct psdict *private) {
- int k;
- if (private->keys != NULL && private->values != NULL) {
- for (k=0;k<private->next;k++) {
- lua_pushstring(L,private->keys[k]);
- lua_pushstring(L,private->values[k]);
- lua_rawset(L,-3);
- }
- }
-}
-
-char *ttfnames_enum[ttf_namemax] = { "copyright", "family", "subfamily", "uniqueid",
- "fullname", "version", "postscriptname", "trademark",
- "manufacturer", "designer", "descriptor", "venderurl",
- "designerurl", "license", "licenseurl", "idontknow",
- "preffamilyname", "prefmodifiers", "compatfull", "sampletext",
- "cidfindfontname"};
-
-void
-do_handle_ttflangname (lua_State *L, struct ttflangname *names) {
- int k;
- dump_stringfield(L,"lang", (char *)MSLangString(names->lang)) ;
- lua_checkstack(L,4);
- lua_createtable(L,0,ttf_namemax);
- for (k=0;k<ttf_namemax;k++) {
- lua_pushstring(L,ttfnames_enum[k]);
- lua_pushstring(L,names->names[k]);
- lua_rawset(L,-3);
- }
- lua_setfield(L, -2 , "names");
-}
-
-
-void
-handle_ttflangname (lua_State *L, struct ttflangname *names) {
- struct ttflangname *next;
- NESTED_TABLE(do_handle_ttflangname,names,2);
-}
-
-
-void
-do_handle_anchorclass (lua_State *L, struct anchorclass *anchor) {
-
- dump_stringfield(L,"name", anchor->name);
- if (anchor->subtable!=NULL) {
- dump_stringfield(L,"lookup",anchor->subtable->subtable_name);
- }
- dump_enumfield(L,"type", anchor->type, anchorclass_type_enum);
-}
-
-void
-handle_anchorclass (lua_State *L, struct anchorclass *anchor) {
- struct anchorclass *next;
- NESTED_TABLE(do_handle_anchorclass,anchor,10);
-}
-
-void
-do_handle_ttf_table (lua_State *L, struct ttf_table *ttf_tab) {
-
- dump_tag(L,"tag", ttf_tab->tag);
- dump_intfield(L,"len", ttf_tab->len);
- dump_intfield(L,"maxlen", ttf_tab->maxlen);
- dump_lstringfield(L,"data", (char *)ttf_tab->data, ttf_tab->len);
-}
-
-void
-handle_ttf_table (lua_State *L, struct ttf_table *ttf_tab) {
- struct ttf_table *next;
- NESTED_TABLE(do_handle_ttf_table,ttf_tab,4);
-}
-
-void
-do_handle_kernclass (lua_State *L, struct kernclass *kerns) {
- int k;
-
- /*
- * dump_intfield(L,"first_cnt", kerns->first_cnt);
- * dump_intfield(L,"second_cnt", kerns->second_cnt);
- */
- lua_checkstack(L,4);
- lua_createtable(L,kerns->first_cnt,1);
- for (k=0;k<kerns->first_cnt;k++) {
- lua_pushnumber(L,(k+1));
- lua_pushstring(L,kerns->firsts[k]);
- lua_rawset(L,-3);
- }
- lua_setfield(L,-2,"firsts");
-
- lua_createtable(L,kerns->second_cnt,1);
- for (k=0;k<kerns->second_cnt;k++) {
- lua_pushnumber(L,(k+1));
- lua_pushstring(L,kerns->seconds[k]);
- lua_rawset(L,-3);
- }
- lua_setfield(L,-2,"seconds");
-
- if (kerns->subtable != NULL) {
- dump_stringfield(L,"lookup", kerns->subtable->subtable_name);
- }
- /*dump_intfield(L,"kcid", kerns->kcid); *//* probably not needed */
-
- lua_createtable(L,kerns->second_cnt*kerns->first_cnt,1);
- for (k=0;k<(kerns->second_cnt*kerns->first_cnt);k++) {
- if (kerns->offsets[k]!=0) {
- lua_pushnumber(L,(k+1));
- lua_pushnumber(L,kerns->offsets[k]);
- lua_rawset(L,-3);
- }
- }
- lua_setfield(L,-2,"offsets");
-
-}
-
-void
-handle_kernclass (lua_State *L, struct kernclass *kerns) {
- struct kernclass *next;
- NESTED_TABLE(do_handle_kernclass,kerns,8);
-}
-
-
-#define DUMP_NUMBER_ARRAY(s,cnt,item) { \
- if (cnt>0 && item != NULL) { \
- int kk; \
- lua_newtable(L); \
- for (kk=0;kk<cnt;kk++) { \
- lua_pushnumber(L,(kk+1)); \
- lua_pushnumber(L,item[kk]); \
- lua_rawset(L,-3); } \
- lua_setfield(L,-2,s); } }
-
-
-#define DUMP_STRING_ARRAY(s,cnt,item) { \
- if (cnt>0 && item!=NULL) { \
- int kk; \
- lua_newtable(L); \
- for (kk=0;kk<cnt;kk++) { \
- lua_pushnumber(L,(kk+1)); \
- lua_pushstring(L,item[kk]); \
- lua_rawset(L,-3); } \
- lua_setfield(L,-2,s); } }
-
-#define DUMP_EXACT_STRING_ARRAY(s,cnt,item) { \
- if (cnt>0 && item!=NULL) { \
- int kk; \
- lua_newtable(L); \
- for (kk=0;kk<cnt;kk++) { \
- lua_pushnumber(L,(kk)); \
- lua_pushstring(L,item[kk]); \
- lua_rawset(L,-3); } \
- lua_setfield(L,-2,s); } }
-
-
-
-static char *fpossub_format_enum [] = { "glyphs", "class","coverage","reversecoverage"};
-
-void handle_fpst_rule (lua_State *L, struct fpst_rule *rule, int format) {
- int k;
-
-
- if (format == pst_glyphs) {
-
- lua_newtable(L);
- dump_stringfield(L,"names",rule->u.glyph.names);
- dump_stringfield(L,"back",rule->u.glyph.back);
- dump_stringfield(L,"fore",rule->u.glyph.fore);
- lua_setfield(L,-2,fpossub_format_enum[format]);
-
- } else if (format == pst_class) {
-
- lua_newtable(L);
- DUMP_NUMBER_ARRAY("current", rule->u.class.ncnt,rule->u.class.nclasses);
- DUMP_NUMBER_ARRAY("before", rule->u.class.bcnt,rule->u.class.bclasses);
- DUMP_NUMBER_ARRAY("after", rule->u.class.fcnt,rule->u.class.fclasses);
-#if 0
- DUMP_NUMBER_ARRAY("allclasses", 0,rule->u.class.allclasses);
-#endif
- lua_setfield(L,-2,fpossub_format_enum[format]);
-
- } else if (format == pst_coverage) {
-
- lua_newtable(L);
- DUMP_STRING_ARRAY("current", rule->u.coverage.ncnt,rule->u.coverage.ncovers);
- DUMP_STRING_ARRAY("before", rule->u.coverage.bcnt,rule->u.coverage.bcovers);
- DUMP_STRING_ARRAY("after", rule->u.coverage.fcnt,rule->u.coverage.fcovers);
- lua_setfield(L,-2,fpossub_format_enum[format]);
-
- } else if (format == pst_reversecoverage) {
-
- lua_newtable(L);
- DUMP_STRING_ARRAY("current", rule->u.rcoverage.always1,rule->u.rcoverage.ncovers);
- DUMP_STRING_ARRAY("before", rule->u.rcoverage.bcnt,rule->u.rcoverage.bcovers);
- DUMP_STRING_ARRAY("after", rule->u.rcoverage.fcnt,rule->u.rcoverage.fcovers);
- dump_stringfield(L,"replacements", rule->u.rcoverage.replacements);
- lua_setfield(L,-2,fpossub_format_enum[format]);
- } else {
- fprintf(stderr,"handle_fpst_rule(): Unknown rule format: %d\n",format);
- }
-
- if (rule->lookup_cnt>0) {
- lua_newtable(L);
- for (k=0;k<rule->lookup_cnt;k++) {
- lua_pushnumber(L,(rule->lookups[k].seq+1));
- if (rule->lookups[k].lookup!=NULL) {
- lua_pushstring(L,rule->lookups[k].lookup->lookup_name);
- } else {
- lua_pushnil(L);
- }
- lua_rawset(L,-3);
- }
- lua_setfield(L,-2,"lookups");
- } else {
- /*fprintf(stderr,"handle_fpst_rule(): No lookups?\n");*/
- }
-}
-
-void
-do_handle_generic_fpst(lua_State *L, struct generic_fpst *fpst) {
- int k;
-
- if (fpst->type>LAST_POSSUB_TYPE_ENUM) {
- dump_intfield(L,"type", fpst->type);
- } else {
- dump_enumfield(L,"type", fpst->type, possub_type_enum);
- }
- dump_enumfield(L,"format", fpst->format, fpossub_format_enum);
-
- if (fpst->format==pst_class) {
- DUMP_EXACT_STRING_ARRAY("current_class",fpst->nccnt,fpst->nclass);
- DUMP_EXACT_STRING_ARRAY("before_class",fpst->bccnt,fpst->bclass);
- DUMP_EXACT_STRING_ARRAY("after_class",fpst->fccnt,fpst->fclass);
- } else {
- DUMP_STRING_ARRAY("current_class",fpst->nccnt,fpst->nclass);
- DUMP_STRING_ARRAY("before_class",fpst->bccnt,fpst->bclass);
- DUMP_STRING_ARRAY("after_class",fpst->fccnt,fpst->fclass);
- }
-
- lua_checkstack(L,4);
- if (fpst->rule_cnt>0) {
- lua_createtable(L,fpst->rule_cnt,1);
- for (k=0;k<fpst->rule_cnt;k++) {
- lua_pushnumber(L,(k+1));
- lua_newtable(L);
- handle_fpst_rule(L,&(fpst->rules[k]),fpst->format);
- lua_rawset(L,-3);
- }
- lua_setfield(L,-2,"rules");
- }
- /*dump_intfield (L,"ticked", fpst->ticked);*/
-}
-
-void
-handle_generic_fpst(lua_State *L, struct generic_fpst *fpst) {
- struct generic_fpst *next;
- int k = 1;
- lua_checkstack(L,3);
- if (fpst->subtable != NULL &&
- fpst->subtable->subtable_name != NULL) {
- lua_pushstring(L,fpst->subtable->subtable_name);
- } else {
- lua_pushnumber(L,k); k++;
- }
- lua_createtable(L,0,10);
- do_handle_generic_fpst(L,fpst);
- lua_rawset(L,-3);
- next = fpst->next;
- while (next != NULL) {
- lua_checkstack(L,3);
- if (next->subtable != NULL &&
- next->subtable->subtable_name != NULL) {
- lua_pushstring(L,next->subtable->subtable_name);
- } else {
- lua_pushnumber(L,k); k++;
- }
- lua_createtable(L,0,10);
- do_handle_generic_fpst(L, next);
- lua_rawset(L,-3);
- next = next->next;
- }
-}
-
-void
-do_handle_otfname (lua_State *L, struct otfname *oname) {
- dump_intfield(L,"lang", oname->lang);
- dump_stringfield(L,"name", oname->name);
-}
-
-void
-handle_otfname (lua_State *L, struct otfname *oname) {
- struct otfname *next;
- NESTED_TABLE(do_handle_otfname,oname,2);
-}
-
-void
-do_handle_macname (lua_State *L, struct macname *featname) {
- dump_intfield(L,"enc", featname->enc);
- dump_intfield(L,"lang", featname->lang);
- dump_stringfield(L,"name", featname->name);
-}
-
-void
-handle_macname (lua_State *L, struct macname *featname) {
- struct macname *next;
- NESTED_TABLE(do_handle_macname,featname,3);
-}
-
-void
-do_handle_macsetting (lua_State *L, struct macsetting *settings) {
- dump_intfield(L,"setting", settings->setting);
- dump_intfield(L,"strid", settings->strid);
- dump_intfield(L,"initially_enabled", settings->initially_enabled);
- if (settings->setname != NULL) {
- lua_newtable(L);
- handle_macname(L,settings->setname);
- lua_setfield(L,-2,"setname");
- }
-}
-
-void
-handle_macsetting (lua_State *L, struct macsetting *settings) {
- struct macsetting *next;
- NESTED_TABLE(do_handle_macsetting,settings,4);
-}
-
-
-void
-do_handle_macfeat (lua_State *L, struct macfeat *features) {
-
- dump_intfield(L,"feature", features->feature);
- dump_intfield(L,"ismutex", features->ismutex);
- dump_intfield(L,"default_setting", features->default_setting);
- dump_intfield(L,"strid", features->strid);
-
- if (features->featname != NULL) {
- lua_newtable(L);
- handle_macname(L,features->featname);
- lua_setfield(L,-2,"featname");
- }
-
- if (features->settings != NULL) {
- lua_newtable(L);
- handle_macsetting(L,features->settings);
- lua_setfield(L,-2,"settings");
- }
-}
-
-void
-handle_macfeat (lua_State *L, struct macfeat *features) {
- struct macfeat *next;
- NESTED_TABLE(do_handle_macfeat,features,6);
-}
-
-char *tex_type_enum[4] = { "unset", "text", "math", "mathext"};
-
-/* has an offset of 1, ui_none = 0. */
-char *uni_interp_enum[9] = {
- "unset", "none", "adobe", "greek", "japanese",
- "trad_chinese", "simp_chinese", "korean", "ams" };
-
-
-void
-handle_splinefont(lua_State *L, struct splinefont *sf) {
- int k,l;
-
- dump_stringfield(L,"table_version", LUA_OTF_VERSION);
- dump_stringfield(L,"fontname", sf->fontname);
- dump_stringfield(L,"fullname", sf->fullname);
- dump_stringfield(L,"familyname", sf->familyname);
- dump_stringfield(L,"weight", sf->weight);
- dump_stringfield(L,"copyright", sf->copyright);
- dump_stringfield(L,"filename", sf->filename);
- dump_stringfield(L,"defbasefilename", sf->defbasefilename);
- dump_stringfield(L,"version", sf->version);
- dump_floatfield (L,"italicangle", sf->italicangle);
- dump_floatfield (L,"upos", sf->upos);
- dump_floatfield (L,"uwidth", sf->uwidth);
- dump_intfield (L,"units_per_em", sf->units_per_em);
- dump_intfield (L,"ascent", sf->ascent);
- dump_intfield (L,"descent", sf->descent);
- dump_intfield (L,"vertical_origin", sf->vertical_origin);
- dump_intfield (L,"uniqueid", sf->uniqueid);
- dump_intfield (L,"glyphcnt", sf->glyphcnt);
- dump_intfield (L,"glyphmax", sf->glyphmax);
-
- if (sf->possub != NULL) {
- lua_newtable(L);
- handle_generic_fpst(L,sf->possub);
- lua_setfield(L,-2,"lookups");
- }
-
- lua_checkstack(L,4);
- lua_createtable(L,sf->glyphcnt,0);
- /* here is a bit of hackery for .notdef's that appear in the middle
- of a type1 font. This situation should be handled nicer, because the
- trick assumes a specific way of handling cff fonts, and that will
- fail. The current code will at least make sure that the intended use
- works, for now. */
- l = 0;
- for (k=0;k<sf->glyphcnt;k++,l++) {
- lua_pushnumber(L,l);
- lua_createtable(L,0,12);
- if (sf->glyphs[k]) {
- if (k>0 && strcmp(sf->glyphs[k]->name,".notdef") == 0) {
- l--;
- } else {
- handle_splinechar(L,sf->glyphs[k], sf->hasvmetrics);
- }
- }
- lua_rawset(L,-3);
- }
- lua_setfield(L,-2,"glyphs");
-
- dump_intfield(L,"changed", sf->changed);
- dump_intfield(L,"hasvmetrics", sf->hasvmetrics);
- dump_intfield(L,"order2", sf->order2);
- dump_intfield(L,"strokedfont", sf->strokedfont);
- dump_intfield(L,"weight_width_slope_only", sf->weight_width_slope_only);
- dump_intfield(L,"head_optimized_for_cleartype",sf->head_optimized_for_cleartype);
- dump_enumfield(L,"uni_interp", (sf->uni_interp+1), uni_interp_enum);
-
- if (sf->map != NULL ) {
- lua_newtable(L);
- handle_encmap(L,sf->map);
- lua_setfield(L,-2,"map");
- }
-
- dump_stringfield(L,"origname", sf->origname); /* new */
-
- if (sf->private != NULL) {
- lua_newtable(L);
- handle_psdict(L, sf->private);
- lua_setfield(L,-2,"private");
- }
-
- dump_stringfield(L,"xuid", sf->xuid);
-
- lua_createtable(L,0,40);
- handle_pfminfo(L,sf->pfminfo);
- lua_setfield(L,-2,"pfminfo");
-
- if (sf->names != NULL) {
- lua_newtable(L);
- handle_ttflangname(L,sf->names);
- lua_setfield(L,-2,"names");
- }
-
- lua_createtable(L,0,4);
- dump_stringfield(L,"registry", sf->cidregistry);
- dump_stringfield(L,"ordering", sf->ordering);
- dump_intfield (L,"version", sf->cidversion);
- dump_intfield (L,"supplement", sf->supplement);
- lua_setfield(L,-2,"cidinfo");
-
- if (sf->subfontcnt>0) {
- lua_createtable(L,sf->subfontcnt,0);
- for (k=0;k<sf->subfontcnt;k++) {
- lua_checkstack(L,10);
- lua_newtable(L);
- handle_splinefont(L,sf->subfonts[k]);
- lua_rawseti(L,-2,(k+1));
- }
- lua_setfield(L,-2,"subfonts");
- }
-
- /* always the parent of a subfont, so why bother? */
- /*
- if (sf->cidmaster != NULL) {
- lua_pushstring(L, sf->cidmaster->origname);
- lua_setfield(L,-2,"cidmaster");
- }
- */
-
- dump_stringfield(L,"comments", sf->comments);
-
- if (sf->ttf_tables != NULL) {
- lua_newtable(L);
- handle_ttf_table(L,sf->ttf_tables);
- lua_setfield(L,-2,"ttf_tables");
- }
-
- if (sf->texdata.type != tex_unset) {
- lua_newtable(L);
- dump_enumfield(L,"type", sf->texdata.type, tex_type_enum);
- lua_newtable(L);
- for (k=0;k<22;k++) {
- lua_pushnumber(L,k);
- lua_pushnumber(L,sf->texdata.params[k]);
- lua_rawset(L,-3);
- }
- lua_setfield(L,-2,"params");
- lua_setfield(L,-2,"texdata");
- }
- if (sf->anchor != NULL) {
- lua_newtable(L);
- handle_anchorclass(L,sf->anchor);
- lua_setfield(L,-2,"anchor_classes");
- }
- if (sf->kerns != NULL) {
- lua_newtable(L);
- handle_kernclass(L,sf->kerns);
- lua_setfield(L,-2,"kerns");
- }
- if (sf->vkerns != NULL) {
- lua_newtable(L);
- handle_kernclass(L,sf->vkerns);
- lua_setfield(L,-2,"vkerns");
- }
- if (sf->gsub_lookups != NULL) {
- lua_newtable(L);
- handle_lookup(L,sf->gsub_lookups);
- lua_setfield(L,-2,"gsub");
- }
- if (sf->gpos_lookups != NULL) {
- lua_newtable(L);
- handle_lookup(L,sf->gpos_lookups);
- lua_setfield(L,-2,"gpos");
- }
-
- /* Todo: a set of Apple-related items */
- /*
- ASM *sm;
- if (sf->features != NULL) {
- lua_newtable(L);
- handle_macfeat(L,sf->features);
- lua_setfield(L,-2,"features");
- }
- struct mmset *mm;
- */
-
- dump_stringfield(L,"chosenname", sf->chosenname);
-
- dump_intfield(L,"macstyle", sf->macstyle);
- dump_stringfield(L,"fondname", sf->fondname);
-
- dump_intfield(L,"design_size", sf->design_size);
- dump_intfield(L,"fontstyle_id", sf->fontstyle_id);
-
- if (sf->fontstyle_name != NULL) {
- lua_newtable(L);
- handle_otfname(L,sf->fontstyle_name);
- lua_setfield(L,-2,"fontstyle_name");
- }
-
- dump_intfield(L,"design_range_bottom",sf->design_range_bottom);
- dump_intfield(L,"design_range_top", sf->design_range_top);
- dump_floatfield(L,"strokewidth", sf->strokewidth);
- /*dump_intfield(L,"mark_class_cnt", sf->mark_class_cnt);*/
-
- if (sf->mark_class_cnt>0) {
- lua_newtable(L);
- for ( k=0; k<sf->mark_class_cnt; ++k ) {
- lua_pushnumber(L,(k+1));
- lua_pushstring(L,sf->mark_classes[k]);
- lua_rawset(L,-3);
- }
- lua_setfield(L,-1,"mark_classes");
-
- lua_newtable(L);
- for ( k=0; k<sf->mark_class_cnt; ++k ) {
- lua_pushnumber(L,(k+1));
- lua_pushstring(L,sf->mark_class_names[k]);
- lua_rawset(L,-3);
- }
- lua_setfield(L,-1,"mark_class_names");
- }
-
- dump_intfield(L,"creationtime", sf->creationtime);
- dump_intfield(L,"modificationtime", sf->modificationtime);
-
- dump_intfield(L,"os2_version", sf->os2_version);
- /* Grid-fitting And Scan-conversion Procedures: not needed */
-
- /*
- dump_intfield(L,"gasp_version", sf->gasp_version);
- dump_intfield(L,"gasp_cnt", sf->gasp_cnt);
- dump_intfield(L,"gasp", (int)sf->gasp);
- */
-
- /* uint8 sfd_version; */ /* Used only when reading in an sfd file */
- /* struct gfi_data *fontinfo; */ /* TH: looks like this is screen-related */
-}
-
-int
-ff_make_table (lua_State *L) {
- SplineFont *sf;
- sf = *(check_isfont(L,1));
- if (sf == NULL) {
- lua_pushboolean(L,0);
- } else {
- lua_createtable(L,0,60);
- handle_splinefont(L,sf);
- }
- return 1;
-}
-
-void do_ff_info (lua_State *L, SplineFont *sf) {
- lua_newtable(L);
- dump_stringfield(L,"familyname", sf->familyname);
- dump_stringfield(L,"fontname", sf->fontname);
- dump_stringfield(L,"fullname", sf->fullname);
- dump_intfield (L,"italicangle", sf->italicangle);
- dump_stringfield(L,"version", sf->version);
- dump_stringfield(L,"weight", sf->weight);
-
-}
-
-static int
-ff_info (lua_State *L) {
- SplineFont *sf;
- FILE *l;
- int i;
- const char *fontname;
- int openflags = 1;
- fontname = luaL_checkstring(L,1);
- if (!strlen(fontname)) {
- lua_pushfstring(L,"font loading failed: empty string given\n", fontname);
- lua_error(L);
- return 1;
- }
- /* test fontname for existance */
- if ((l = fopen(fontname,"r"))) {
- fclose(l);
- } else {
- lua_pushfstring(L,"font loading failed for %s (read error)\n", fontname);
- lua_error(L);
- }
- sf = ReadSplineFontInfo((char *)fontname,openflags);
- if (sf==NULL) {
- lua_pushfstring(L,"font loading failed for %s\n", fontname);
- lua_error(L);
- } else {
- if (sf->next != NULL) {
- i = 1;
- lua_newtable(L);
- while (sf) {
- do_ff_info(L, sf);
- lua_rawseti(L,-2,i);
- i++;
- SplineFontFree(sf);
- sf = sf->next;
- }
- } else {
- do_ff_info(L, sf);
- SplineFontFree(sf);
- }
- }
- return 1;
-}
-
-/* possible flags:
-
- ttf_flag_shortps = 1,
- ttf_flag_nohints = 2,
- ttf_flag_applemode=4,
- ttf_flag_pfed_comments=8,
- ttf_flag_pfed_colors=0x10,
- ttf_flag_otmode=0x20,
- ttf_flag_glyphmap=0x40,
- ttf_flag_TeXtable=0x80,
- ttf_flag_ofm=0x100,
- ttf_flag_oldkern=0x200,
- ttf_flag_brokensize=0x400
-
- ps_flag_nohintsubs = 0x10000,
- ps_flag_noflex=0x20000,
- ps_flag_nohints = 0x40000,
- ps_flag_restrict256=0x80000,
- ps_flag_afm = 0x100000,
- ps_flag_pfm = 0x200000,
- ps_flag_tfm = 0x400000,
- ps_flag_round = 0x800000,
- ps_flag_nocffsugar = 0x1000000,
- ps_flag_identitycidmap = 0x2000000,
- ps_flag_afmwithmarks = 0x4000000,
- ps_flag_noseac = 0x8000000,
-
-
-*/
-
-extern int readbinfile(FILE *f, unsigned char **b, int *s);
-
-static void ff_do_cff (SplineFont *sf, char *filename, unsigned char **buf, int *bufsiz) {
- FILE *f;
- int32 *bsizes = NULL;
- int flags = ps_flag_nocffsugar + ps_flag_nohints;
- EncMap *map;
-
- map = EncMap1to1(sf->glyphcnt);
-
- if(WriteTTFFont(filename, sf, ff_cff, bsizes, bf_none, flags, map)) {
- /* success */
- f = fopen(filename,"rb");
- readbinfile(f , buf, bufsiz);
- /*fprintf(stdout,"\n%s => CFF, size: %d\n", sf->filename, *bufsiz);*/
- fclose(f);
- return;
- }
- /* errors */
- /*fprintf(stdout,"\n%s => CFF, failed\n", sf->filename);*/
-
-}
-
-/* exported for writecff.c */
-
-int ff_createcff (char *file, unsigned char **buf, int *bufsiz) {
- SplineFont *sf;
- int k ;
- char s[] = "tempfile.cff";
- int openflags = 1;
- int notdefpos = 0;
- sf = ReadSplineFont(file,openflags);
- if (sf) {
- /* this is not the best way. nicer to have no temp file at all */
- ff_do_cff(sf, s, buf,bufsiz);
- for (k=0;k<sf->glyphcnt;k++) {
- if (sf->glyphs[k] && strcmp(sf->glyphs[k]->name,".notdef")==0) {
- notdefpos=k;
- break;
- }
- }
- remove(s);
- SplineFontFree(sf);
- }
- return notdefpos;
-}
-
-int ff_get_ttc_index(char *ffname, char*psname) {
- SplineFont *sf;
- int i = 0;
- int openflags = 1;
- int index = 0;
-
- sf = ReadSplineFontInfo((char *)ffname,openflags);
- if (sf==NULL) {
- perror("font loading failed unexpectedly\n");
- exit(EXIT_FAILURE);
- }
- while (sf != NULL) {
- if (strcmp(sf->fontname,psname)==0) {
- index = i;
- break;
- }
- i++;
- sf = sf->next;
- }
- return index;
-}
-
-
-static int ff_make_cff (lua_State *L) {
- SplineFont **sf;
- char *s;
- unsigned char *buf = NULL;
- int bufsiz = 0;
- sf = check_isfont(L,1);
- s = (char *)luaL_checkstring(L,2);
- ff_do_cff (*sf, s, &buf, &bufsiz);
- return 0;
-}
-
-
-static struct luaL_reg fflib[] = {
- {"open", ff_open},
- {"info", ff_info},
- {"close", ff_close},
- {"apply_afmfile", ff_apply_afmfile},
- {"apply_featurefile", ff_apply_featurefile},
- {"to_table", ff_make_table},
- {"to_cff", ff_make_cff},
- {NULL, NULL}
-};
-
-static const struct luaL_reg fflib_m [] = {
- {"__gc", ff_close }, /* doesnt work yet! */
- {NULL, NULL} /* sentinel */
-};
-
-
-int luaopen_ff (lua_State *L) {
- LoadPrefs();
- luaL_newmetatable(L,FONT_METATABLE);
- luaL_register(L, NULL, fflib_m);
- luaL_openlib(L, "fontforge", fflib, 0);
- return 1;
-}
-