diff options
Diffstat (limited to 'Build/source/texk/ttf2pk/vplaux.c')
-rw-r--r-- | Build/source/texk/ttf2pk/vplaux.c | 706 |
1 files changed, 0 insertions, 706 deletions
diff --git a/Build/source/texk/ttf2pk/vplaux.c b/Build/source/texk/ttf2pk/vplaux.c deleted file mode 100644 index fb3ff8bb716..00000000000 --- a/Build/source/texk/ttf2pk/vplaux.c +++ /dev/null @@ -1,706 +0,0 @@ -/* - * vplaux.c - * - * This file is part of the ttf2pk package. - * - * Copyright 1997-1999, 2000 by - * Frederic Loyer <loyer@ensta.fr> - * Werner Lemberg <wl@gnu.org> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <math.h> - -#include "ttf2tfm.h" -#include "newobj.h" -#include "ttfenc.h" -#include "texenc.h" -#include "tfmaux.h" -#include "vplaux.h" -#include "errormsg.h" -#include "case.h" - - -#undef PI -#define PI 3.14159265358979323846264338327 - - -#define vout(s) fprintf(out, s) - -#define voutln(str) {fprintf(out, "%s\n", str); vlevout(level);} -#define voutln2(f, s) {fprintf(out, f, s); vlevnlout(level);} -#define voutln3(f, a, b) {fprintf(out, f, a, b); vlevnlout(level);} -#define voutln4(f, a, b, c) {fprintf(out, f, a, b, c); vlevnlout(level);} - - -static char vcharbuf[6]; -static char vnamebuf[100]; - -/* the depth of parenthesis nesting in VPL file being written */ -static int level; - - -static FILE *out; - - -static void -vlevout(register int l) -{ - while (l--) - vout(" "); -} - - -static void -vlevnlout(int level) -{ - vout("\n"); - vlevout(level); -} - - -static void -vleft(int *levelp) -{ - (*levelp)++; - vout("("); -} - - -static void -vright(int *levelp) -{ - (*levelp)--; - voutln(")"); -} - - -static char * -vchar(int c, - char *buf, - Boolean forceoctal) -{ - if (forceoctal == 0 && isalnum(c)) - (void)sprintf(buf, "C %c", c); - else - (void)sprintf(buf, "O %o", (unsigned)c); - return buf; -} - - -static char * -vname(int c, - char *buf, - ttfinfo **array, - Boolean forceoctal) -{ - if (!forceoctal && isalnum(c)) - buf[0] = '\0'; - else - sprintf(buf, " (comment %s)", array[c]->adobename); - return buf; -} - - -static int -texheight(register ttfinfo *ti, - ttfinfo *ac, - int xh) -{ - register const char **p; - register ttfinfo *aci, *acci; - char buffer[200]; - - - if (xh <= 50 || *(ti->adobename + 1)) - return ti->ury; /* that was the simple case */ - - for (p = accents; *p; p++) /* otherwise we look for accented letters. */ - /* We even check glyphs not in any encoding */ - if (NULL != (aci = findadobe(*p, ac))) - { - strcpy(buffer, ti->adobename); - strcat(buffer, *p); - if (NULL != (acci = findadobe(buffer, ac))) - return acci->ury - aci->ury + xh; - } - return ti->ury; -} - - -/* - * Compute uppercase mapping, when making a small caps font. - */ - -void -upmap(Font *fnt) -{ - register ttfinfo *ti, *Ti; - register const char *p; - register char *q; - register pcc *np, *nq; - int i, j; - char lwr[50]; - - - for (Ti = fnt->charlist; Ti; Ti = Ti->next) - { - p = Ti->adobename; - if (isupper(*p)) - { - q = lwr; - for (; *p; p++) - *q++ = tolower(*p); - *q = '\0'; - - if (NULL != (ti = findmappedadobe(lwr, fnt->inencptrs))) - { - for (i = ti->outcode; i >= 0; i = fnt->nextout[i]) - fnt->uppercase[i] = Ti; - for (i = Ti->outcode; i >= 0; i = fnt->nextout[i]) - fnt->lowercase[i] = ti; - } - } - } - - /* - * Note that, contrary to the normal true/false conventions, - * uppercase[i] is NULL and lowercase[i] is non-NULL when `i' is the - * ASCII code of an uppercase letter; and vice versa for lowercase - * letters. - */ - - if (NULL != (ti = findmappedadobe("germandbls", fnt->inencptrs))) - if (NULL != (Ti = findmappedadobe("S", fnt->inencptrs))) - /* we also construct SS */ - { - for (i = ti->outcode; i >= 0; i = fnt->nextout[i]) - fnt->uppercase[i] = ti; - ti->incode = -1; - ti->width = Ti->width << 1; - ti->llx = Ti->llx; - ti->lly = Ti->lly; - ti->urx = Ti->width + Ti->urx; - ti->ury = Ti->ury; - ti->kerns = Ti->kerns; - - np = newpcc(); - np->partname = "S"; - nq = newpcc(); - nq->partname = "S"; - nq->xoffset = Ti->width; - np->next = nq; - ti->pccs = np; - ti->constructed = True; - } - - for (i = 0; casetable[i].upper; i++) - { - if ((ti = findmappedadobe(casetable[i].lower, fnt->inencptrs))) - for (j = ti->outcode; j >= 0; j = fnt->nextout[j]) - fnt->uppercase[j] = findmappedadobe(casetable[i].upper, - fnt->inencptrs); - } -} - -/* - * The logic above seems to work well enough, but it leaves useless - * characters like `fi' and `fl' in the font if they were present - * initially, and it omits characters like `dotlessj' if they are - * absent initially. - */ - - -void -writevpl(Font *fnt, char makevpl, Boolean forceoctal) -{ - register int i, j, k; - register ttfinfo *ti; - register lig *nlig; - register kern *nkern; - register pcc *npcc; - ttfinfo *asucc, *asub, *api; - ttfptr *kern_eq; - int xoff, yoff, ht; - int bc, ec; - char buf[200]; - char header[256]; - Boolean unlabeled; - float Slant; - - - out = fnt->vplout; - - header[0] = '\0'; - strncat(header, "Created by `", 12); - strncat(header, fnt->titlebuf, 255 - 12 - 1); - strncat(header, "'", 1); - - voutln2("(VTITLE %s)", header); - voutln("(COMMENT Please change VTITLE if you edit this file)"); - (void)sprintf(buf, "TeX-%s%s%s%s", - fnt->fullname, - (fnt->efactor == 1.0 ? "" : "-E"), - (fnt->slant == 0.0 ? "" : "-S"), - (makevpl == 1 ? "" : "-CSC")); - - if (strlen(buf) > 19) /* too long, will retain first 9 and last 10 chars */ - { - register char *p, *q; - - - for (p = &buf[9], q = &buf[strlen(buf)-10]; p < &buf[19]; - p++, q++) - *p = *q; - buf[19] = '\0'; - } - voutln2("(FAMILY %s)", buf); - - { - char tbuf[300]; - const char *base_encoding = fnt->codingscheme; - - - if (strcmp(fnt->outencoding->name, base_encoding) == 0) - sprintf(tbuf, "%s", fnt->outencoding->name); - else - sprintf(tbuf, "%s + %s", base_encoding, fnt->outencoding->name); - - if (strlen(tbuf) > 39) - { - warning("Coding scheme too long; shortening to 39 characters"); - tbuf[39] = '\0'; - } - voutln2("(CODINGSCHEME %s)", tbuf); - } - - { - long t, sc; - char *s; - int n, pos; - - - s = header; - n = strlen(s); - t = ((long)n) << 24; - sc = 16; - pos = 18; - - voutln( - "(COMMENT The following `HEADER' lines are equivalent to the string)"); - voutln2("(COMMENT \"%s\")", header); - - while (n > 0) - { - t |= ((long)(*(unsigned char *)s++)) << sc; - sc -= 8; - if (sc < 0) - { - voutln3("(HEADER D %d O %lo)", pos, t); - t = 0; - sc = 24; - pos++; - } - n--; - } - if (t) - voutln3("(HEADER D %d O %lo)", pos, t); - } - - voutln("(DESIGNSIZE R 10.0)"); - voutln("(DESIGNUNITS R 1000)"); - voutln("(COMMENT DESIGNSIZE (1 em) IS IN POINTS)"); - voutln("(COMMENT OTHER DIMENSIONS ARE MULTIPLES OF DESIGNSIZE/1000)"); - -#if 0 - /* Let vptovf compute the checksum. */ - voutln2("(CHECKSUM O %lo)", cksum ^ 0xFFFFFFFF); -#endif - - if (fnt->boundarychar >= 0) - voutln2("(BOUNDARYCHAR O %lo)", (unsigned long)fnt->boundarychar); - - vleft(&level); - voutln("FONTDIMEN"); - - Slant = fnt->slant - fnt->efactor * tan(fnt->italicangle * (PI / 180.0)); - - if (Slant) - voutln2("(SLANT R %f)", Slant); - voutln2("(SPACE D %d)", fnt->fontspace); - if (!fnt->fixedpitch) - { - voutln2("(STRETCH D %d)", transform(200, 0, fnt->efactor, fnt->slant)); - voutln2("(SHRINK D %d)", transform(100, 0, fnt->efactor, fnt->slant)); - } - voutln2("(XHEIGHT D %d)", fnt->xheight); - voutln2("(QUAD D %d)", transform(1000, 0, fnt->efactor, fnt->slant)); - voutln2("(EXTRASPACE D %d)", - fnt->fixedpitch ? fnt->fontspace : - transform(111, 0, fnt->efactor, fnt->slant)); - vright(&level); - - vleft(&level); - voutln("MAPFONT D 0"); - voutln2("(FONTNAME %s)", fnt->fullname); -#if 0 - voutln2("(FONTCHECKSUM O %lo)", (unsigned long)cksum); -#endif - vright(&level); - - if (makevpl > 1) - { - vleft(&level); - voutln("MAPFONT D 1"); - voutln2("(FONTNAME %s)", fnt->fullname); - voutln2("(FONTAT D %d)", (int)(1000.0 * fnt->capheight + 0.5)); -#if 0 - voutln2("(FONTCHECKSUM O %lo)", (unsigned long)cksum); -#endif - vright(&level); - } - - for (i = 0; i <= 0xFF && fnt->outencptrs[i] == NULL; i++) - ; - bc = i; - for (i = 0xFF; i >= 0 && fnt->outencptrs[i] == NULL; i--) - ; - ec = i; - - vleft(&level); - voutln("LIGTABLE"); - ti = findadobe("||", fnt->charlist); - unlabeled = True; - for (nlig = ti->ligs; nlig; nlig = nlig->next) - if (NULL != (asucc = findmappedadobe(nlig->succ, fnt->inencptrs))) - { - if (NULL != (asub = findmappedadobe(nlig->sub, fnt->inencptrs))) - if (asucc->outcode >= 0) - if (asub->outcode >= 0) - { - if (unlabeled) - { - voutln("(LABEL BOUNDARYCHAR)"); - unlabeled = False; - } - for (j = asucc->outcode; j >= 0; j = fnt->nextout[j]) - voutln4("(%s %s O %o)", vplligops[nlig->op], - vchar(j, vcharbuf, forceoctal), - (unsigned)asub->outcode); - } - } - if (!unlabeled) - voutln("(STOP)"); - - for (i = bc; i <= ec; i++) - if ((ti = fnt->outencptrs[i]) && ti->outcode == i) - { - unlabeled = True; - if (fnt->uppercase[i] == NULL) - /* omit ligatures from smallcap lowercase */ - for (nlig = ti->ligs; nlig; nlig = nlig->next) - if (NULL != (asucc = findmappedadobe(nlig->succ, fnt->inencptrs))) - if (NULL != (asub = findmappedadobe(nlig->sub, fnt->inencptrs))) - if (asucc->outcode >= 0) - if (asub->outcode >= 0) - { - if (unlabeled) - { - for (j = ti->outcode; j >= 0; j = fnt->nextout[j]) - voutln3("(LABEL %s)%s", - vchar(j, vcharbuf, forceoctal), - vname(j, vnamebuf, - fnt->outencptrs, forceoctal)); - unlabeled = False; - } - for (j = asucc->outcode; j >= 0; j = fnt->nextout[j]) - { - voutln4("(%s %s O %o)", vplligops[nlig->op], - vchar(j, vcharbuf, forceoctal), - (unsigned)asub->outcode); - if (nlig->boundleft) - break; - } - } - - for (nkern = (fnt->uppercase[i] ? fnt->uppercase[i]->kerns : ti->kerns); - nkern; nkern=nkern->next) - if (NULL != (asucc = findmappedadobe(nkern->succ, fnt->inencptrs))) - for (j = asucc->outcode; j >= 0; j = fnt->nextout[j]) - { - if (fnt->uppercase[j] == NULL) - { - if (unlabeled) - { - for (k = ti->outcode; k >= 0; k = fnt->nextout[k]) - voutln3("(LABEL %s)%s", - vchar(k, vcharbuf, forceoctal), - vname(k, vnamebuf, fnt->outencptrs, forceoctal)); - unlabeled = False; - } - - /* - * If other characters have the same kerns as this - * one, output the label here. This makes the TFM - * file much smaller than if we output all the - * kerns again under a different label. - */ - - for (kern_eq = ti->kern_equivs; kern_eq; - kern_eq = kern_eq->next) - { - k = kern_eq->ch->outcode; - if (k >= 0 && k <= 0xFF) - voutln3("(LABEL %s)%s", - vchar(k, vcharbuf, forceoctal), - vname(k, vnamebuf, fnt->outencptrs, forceoctal)); - } - ti->kern_equivs = NULL; /* Only output those labels once. */ - - if (fnt->uppercase[i]) - { - if (fnt->lowercase[j]) - { - for (k = fnt->lowercase[j]->outcode; k >= 0; - k = fnt->nextout[k]) - voutln4("(KRN %s R %.1f)%s", - vchar(k, vcharbuf, forceoctal), - fnt->capheight * nkern->delta, - vname(k, vnamebuf, fnt->outencptrs, forceoctal)); - } - else - voutln4("(KRN %s R %.1f)%s", - vchar(j, vcharbuf, forceoctal), - fnt->capheight * nkern->delta, - vname(j, vnamebuf, fnt->outencptrs, forceoctal)); - } - else - { - voutln4("(KRN %s R %d)%s", - vchar(j, vcharbuf, forceoctal), - nkern->delta, - vname(j, vnamebuf, fnt->outencptrs, forceoctal)); - if (fnt->lowercase[j]) - for (k = fnt->lowercase[j]->outcode; k >= 0; - k = fnt->nextout[k]) - voutln4("(KRN %s R %.1f)%s", - vchar(k, vcharbuf, forceoctal), - fnt->capheight * nkern->delta, - vname(k, vnamebuf, fnt->outencptrs, forceoctal)); - } - } - } - if (!unlabeled) - voutln("(STOP)"); - } - vright(&level); - - for (i = bc; i <= ec; i++) - if (NULL != (ti = fnt->outencptrs[i])) - { - vleft(&level); - fprintf(out, "CHARACTER %s%s\n ", - vchar(i, vcharbuf, forceoctal), - vname(i, vnamebuf, fnt->outencptrs, forceoctal)); - - if (fnt->uppercase[i]) - { - ti = fnt->uppercase[i]; - voutln2("(CHARWD R %.1f)", fnt->capheight * (ti->width)); - if (0 != (ht = texheight(ti, fnt->charlist, fnt->xheight))) - voutln2("(CHARHT R %.1f)", fnt->capheight * ht); - if (ti->lly) - voutln2("(CHARDP R %.1f)", -fnt->capheight * ti->lly); - if (ti->urx > ti->width) - voutln2("(CHARIC R %.1f)", fnt->capheight * (ti->urx - ti->width)); - } - else - { - voutln2("(CHARWD R %d)", ti->width); - if (0 != (ht = texheight(ti, fnt->charlist, fnt->xheight))) - voutln2("(CHARHT R %d)", ht); - if (ti->lly) - voutln2("(CHARDP R %d)", -ti->lly); - if (ti->urx > ti->width) - voutln2("(CHARIC R %d)", ti->urx - ti->width); - } - - if (ti->incode != i || fnt->uppercase[i] || ti->constructed) - { - vleft(&level); - voutln("MAP"); - if (fnt->uppercase[i]) - voutln("(SELECTFONT D 1)"); - - if (ti->pccs && (ti->incode < 0 || ti->constructed)) - { - xoff = 0; - yoff = 0; - - for (npcc = ti->pccs; npcc; npcc = npcc->next) - if (NULL != (api = findmappedadobe(npcc->partname, - fnt->inencptrs))) - if (api->outcode >= 0) - { - if (npcc->xoffset != xoff) - { - if (fnt->uppercase[i]) - { - voutln2("(MOVERIGHT R %.1f)", - fnt->capheight * (npcc->xoffset - xoff)); - } - else - voutln2("(MOVERIGHT R %d)", npcc->xoffset - xoff); - - xoff = npcc->xoffset; - } - - if (npcc->yoffset != yoff) - { - if (fnt->uppercase[i]) - { - voutln2("(MOVEUP R %.1f)", - fnt->capheight * (npcc->yoffset - yoff)); - } - else - voutln2("(MOVEUP R %d)", npcc->yoffset - yoff); - - yoff = npcc->yoffset; - } - - voutln2("(SETCHAR O %o)", (unsigned)api->incode); - xoff += fnt->outencptrs[api->outcode]->width; - } - } - else - voutln2("(SETCHAR O %o)", (unsigned)ti->incode); - vright(&level); - } - vright(&level); - } - - if (level) - oops("I forgot to match the parentheses."); -} - - -void -writeovp(Font *fnt) -{ - register int i; - register ttfinfo *ti; - long bc, ec; - char header[256]; - float Slant; - ttfinfo *ofm_array[65536]; - - - out = fnt->vplout; - - header[0] = '\0'; - strncat(header, "Created by `", 12); - strncat(header, fnt->titlebuf, 255 - 12 - 1); - strncat(header, "'", 1); - - voutln2("(VTITLE %s)", header); - voutln("(COMMENT Please change VTITLE if you edit this file)"); - - voutln("(OFMLEVEL H 1)"); - voutln("(FONTDIR TL)"); - voutln2("(FAMILY %s)", fnt->outname); - voutln("(FACE F MRR)"); - voutln("(CODINGSCHEME UNSPECIFIED)"); - voutln("(DESIGNSIZE R 10.0)"); - voutln("(DESIGNUNITS R 1000)"); - voutln("(COMMENT DESIGNSIZE (1 em) IS IN POINTS)"); - voutln("(COMMENT OTHER DIMENSIONS ARE MULTIPLES OF DESIGNSIZE/1000)"); - -#if 0 - /* Let vptovf compute the checksum. */ - voutln2("(CHECKSUM O %lo)", cksum ^ 0xFFFFFFFF); -#endif - - vleft(&level); - voutln("FONTDIMEN"); - - Slant = fnt->slant - fnt->efactor * tan(fnt->italicangle * (PI / 180.0)); - - if (Slant) - voutln2("(SLANT R %f)", Slant); - voutln2("(SPACE D %d)", fnt->fontspace); - if (!fnt->fixedpitch) - { - voutln2("(STRETCH D %d)", transform(200, 0, fnt->efactor, fnt->slant)); - voutln2("(SHRINK D %d)", transform(100, 0, fnt->efactor, fnt->slant)); - } - voutln2("(XHEIGHT D %d)", fnt->xheight); - voutln2("(QUAD D %d)", transform(1000, 0, fnt->efactor, fnt->slant)); - voutln2("(EXTRASPACE D %d)", - fnt->fixedpitch ? fnt->fontspace : - transform(111, 0, fnt->efactor, fnt->slant)); - vright(&level); - - for (i = 0; i < fnt->subfont_num; i++) - { - vleft(&level); - voutln2("MAPFONT D %d", i); - voutln2("(FONTNAME %s)", (fnt->subfont_list[i]).name); - voutln2("(FONTCHECKSUM O %lo)", (fnt->subfont_list[i]).cksum); - vright(&level); - } - - for (i = 0; i <= 0xFFFF; i++) - ofm_array[i] = NULL; - - for (ti = fnt->charlist; ti != NULL; ti = ti->next) - if (ti->charcode >= 0 && ti->charcode <= 0xFFFF) - ofm_array[ti->charcode] = ti; - - for (i = 0; i <= 0xFFFF && ofm_array[i] == NULL; i++) - ; - bc = i; - for (i = 0xFFFF; i >= 0 && ofm_array[i] == NULL; i--) - ; - ec = i; - - if (ec < bc) - oops("No TTF characters."); - - for (i = bc; i <= ec; i++) - { - if ((ti = ofm_array[i]) == NULL) continue; - - vleft(&level); - fprintf(out, "CHARACTER H %lX\n ", ti->charcode); - - voutln2("(CHARWD R %d)", ti->width); - if (ti->ury) - voutln2("(CHARHT R %d)", ti->ury); - if (ti->lly) - voutln2("(CHARDP R %d)", -ti->lly); - if (ti->urx > ti->width) - voutln2("(CHARIC R %d)", ti->urx - ti->width); - - vleft(&level); - voutln("MAP"); - if (ti->fntnum) - voutln2("(SELECTFONT D %d)", ti->fntnum); - - voutln2("(SETCHAR H %X)", (unsigned)ti->incode); - vright(&level); - - vright(&level); - } - - if (level) - oops("I forgot to match the parentheses."); -} - - -/* end */ |