static void readttf_kern(Font *fnt) { register kern *nk; register ttfinfo *ti; TT_Kern_0_Pair* pairs0; TT_Error error; unsigned int i, j; if ((error = TT_Get_Kerning_Directory(face, &directory))) oops("Cannot get kerning directory (error code = 0x%x).", error); if (directory.nTables == 0) return; for (i = 0; i < directory.nTables; i++) { if ((error = TT_Load_Kerning_Table(face, i))) oops("Cannot load kerning table (error code = 0x%x).", error); switch (directory.tables[i].format) { case 0: pairs0 = directory.tables[i].t.kern0.pairs; for (j = 0; j < directory.tables[i].t.kern0.nPairs; j++, pairs0++) { ti = findglyph(pairs0->left, fnt->charlist); if (ti == NULL) warning("kern char not found"); else { nk = newkern(); nk->succ = findglyph(pairs0->right, fnt->charlist)->adobename; nk->delta = transform(pairs0->value * 1000 / fnt->units_per_em, 0, fnt->efactor, fnt->slant); nk->next = ti->kerns; ti->kerns = nk; } } return; /* we stop after the first format 0 kerning table */ default: break; } } return; }
static void image_ttf_make(INT32 args) { int col=0, i=0; struct object *o; TT_Error res; TT_Face face; if (sp[-args].type!=T_STRING) Pike_error("Image.TTF(): illegal argument 1\n"); res=TT_Open_Collection(engine, sp[-args].u.string->str, col, &face); if (res) my_tt_error("Image.TTF()","",res); while(! TT_Load_Kerning_Table( face, (TT_UShort)(i++) ) ); pop_n_elems(args); o=clone_object(image_ttf_face_program,0); ((struct image_ttf_face_struct*)o->storage)->face=face; push_object(o); }