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 readttf_kern(Font *fnt) { kern *nk; ttfinfo *ti, *tj; FT_Error error; FT_Vector akerning; for (ti = fnt->charlist; ti; ti = ti->next) { kern head; kern *tail = &head; head.next = NULL; for (tj = fnt->charlist; tj; tj = tj->next) { if ((error = FT_Get_Kerning(face, ti->glyphindex, tj->glyphindex, FT_KERNING_UNSCALED, &akerning))) oops("Cannot get kerning vector (error code = 0x%x).", error); if (akerning.x) { nk = newkern(); nk->succ = tj->adobename; nk->delta = transform(akerning.x * 1000 / fnt->units_per_em, 0, fnt->efactor, fnt->slant); #if 0 nk->next = ti->kerns; ti->kerns = nk; #else /* We append the new kern to reproduce the old .vpl file */ tail->next = nk; tail = nk; #endif } } ti->kerns = head.next; } }