diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/macbinary.c')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/macbinary.c | 1543 |
1 files changed, 0 insertions, 1543 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/macbinary.c b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/macbinary.c deleted file mode 100644 index ca8ceed899f..00000000000 --- a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/macbinary.c +++ /dev/null @@ -1,1543 +0,0 @@ -/* Copyright (C) 2000-2008 by George Williams */ -/* - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - - * The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "fontforgevw.h" -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <math.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <time.h> -#include <ustring.h> -#include "ttf.h" -#include "psfont.h" -#ifdef LUA_FF_LIB -# undef __Mac -#endif -#if __Mac -# include <ctype.h> -# include </Developer/Headers/FlatCarbon/Files.h> -#else -# include <utype.h> -# undef __Mac -# define __Mac 0 -#endif - -const int mac_dpi = 72; -/* I had always assumed that the mac still believed in 72dpi screens, but I */ -/* see that in geneva under OS/9, the pointsize does not match the pixel */ -/* size of the font. But the dpi is not constant (and the differences */ -/* excede those supplied by rounding errors) varying between 96 and 84dpi */ - -/* A Mac Resource fork */ -/* http://developer.apple.com/techpubs/mac/MoreToolbox/MoreToolbox-9.html */ -/* begins with a 16 byte header containing: */ -/* resource start offset */ -/* map start offset */ -/* resource length */ -/* map length */ -/* then 256-16 bytes of zeros */ -/* the resource section consists of (many) */ -/* 4 byte length count */ -/* resource data */ -/* the map section contains */ -/* A copy of the 16 byte header */ -/* a 4 byte mac internal value (I hope) */ -/* another 4 bytes of mac internal values (I hope) */ -/* a 2 byte offset from the start of the map section to the list of resource types */ -/* a 2 byte offset from the start of the map section to the list of resource names */ -/* The resource type list consists of */ -/* a 2 byte count of the number of resource types (-1) */ -/* (many copies of) */ -/* a 4 byte resource type ('FOND' for example) */ -/* a 2 byte count of the number of resources of this type (-1) */ -/* a 2 byte offset from the type list start to the resource table */ -/* a resource table looks like */ -/* a 2 byte offset from the resource name table to a pascal */ -/* string containing this resource's name (or 0xffff for none) */ -/* 1 byte of resource flags */ -/* 3 bytes of offset from the resource section to the length & */ -/* data of this instance of the resource type */ -/* 4 bytes of 0 */ -/* The resource name section consists of */ -/* a bunch of pascal strings (ie. preceded by a length byte) */ - -/* The POST resource isn't noticeably documented, it's pretty much a */ -/* straight copy of the pfb file cut up into 0x800 byte chunks. */ -/* (each section of the pfb file has it's own set of chunks, the last may be smaller than 0x800) */ -/* The NFNT resource http://developer.apple.com/techpubs/mac/Text/Text-250.html */ -/* The FOND resource http://developer.apple.com/techpubs/mac/Text/Text-269.html */ -/* The sfnt resource is basically a copy of the ttf file */ - -/* A MacBinary file */ -/* http://www.lazerware.com/formats/macbinary.html */ -/* begins with a 128 byte header */ -/* (which specifies lengths for data/resource forks) */ -/* (and contains mac type/creator data) */ -/* (and other stuff) */ -/* (and finally a crc checksum) */ -/* is followed by the data section (padded to a mult of 128 bytes) */ -/* is followed by the resource section (padded to a mult of 128 bytes) */ - -/* ******************************** Creation ******************************** */ - - -struct resource { - uint32 pos; - uint8 flags; - uint16 id; - char *name; - uint32 nameloc; - uint32 nameptloc; -}; - -struct resourcetype { - uint32 tag; - struct resource *res; - uint32 resloc; -}; - -struct macbinaryheader { - char *macfilename; - char *binfilename; /* if macfilename is null and this is set we will figure out macfilename by removing .bin */ - uint32 type; - uint32 creator; -}; - - -enum psstyle_flags { psf_bold = 1, psf_italic = 2, psf_outline = 4, - psf_shadow = 0x8, psf_condense = 0x10, psf_extend = 0x20 -}; - -uint16 _MacStyleCode(char *styles, SplineFont * sf, uint16 * psstylecode) -{ - unsigned short stylecode = 0, psstyle = 0; - - if (strstrmatch(styles, "Bold") || strstrmatch(styles, "Demi") || - strstrmatch(styles, "Heav") || strstrmatch(styles, "Blac") || -/* A few fonts have German/French styles in their names */ - strstrmatch(styles, "Fett") || strstrmatch(styles, "Gras")) { - stylecode = sf_bold; - psstyle = psf_bold; - } else if (sf != NULL && sf->weight != NULL && - (strstrmatch(sf->weight, "Bold") - || strstrmatch(sf->weight, "Demi") - || strstrmatch(sf->weight, "Heav") - || strstrmatch(sf->weight, "Blac") - || strstrmatch(sf->weight, "Fett") - || strstrmatch(sf->weight, "Gras"))) { - stylecode = sf_bold; - psstyle = psf_bold; - } - /* URW uses four leter abbreviations of Italic and Oblique */ - /* Somebody else uses two letter abbrevs */ - if ((sf != NULL && sf->italicangle != 0) || - strstrmatch(styles, "Ital") || - strstrmatch(styles, "Obli") || - strstrmatch(styles, "Slanted") || - strstrmatch(styles, "Kurs") || strstr(styles, "It")) { - stylecode |= sf_italic; - psstyle |= psf_italic; - } - if (strstrmatch(styles, "Underline")) { - stylecode |= sf_underline; - } - if (strstrmatch(styles, "Outl")) { - stylecode |= sf_outline; - psstyle |= psf_outline; - } - if (strstr(styles, "Shadow") != NULL) { - stylecode |= sf_shadow; - psstyle |= psf_shadow; - } - if (strstrmatch(styles, "Cond") || strstr(styles, "Cn") || - strstrmatch(styles, "Narrow")) { - stylecode |= sf_condense; - psstyle |= psf_condense; - } - if (strstrmatch(styles, "Exte") || strstr(styles, "Ex")) { - stylecode |= sf_extend; - psstyle |= psf_extend; - } - if ((psstyle & psf_extend) && (psstyle & psf_condense)) { - if (sf != NULL) - LogError(_ - ("Warning: %s(%s) is both extended and condensed. That's impossible.\n"), - sf->fontname, sf->origname); - else - LogError(_ - ("Warning: Both extended and condensed. That's impossible.\n")); - psstyle &= ~psf_extend; - stylecode &= ~sf_extend; - } - if (psstylecode != NULL) - *psstylecode = psstyle; - return (stylecode); -} - - - -/* ******************************** Reading ********************************* */ - -static SplineFont *SearchPostscriptResources(FILE * f, long rlistpos, - int subcnt, long rdata_pos, - long name_list, int flags) -{ - long here = ftell(f); - long *offsets, lenpos; - int rname = -1, tmp; - int ch1, ch2; - int len, type, i, j, rlen; - unsigned short id, *rsrcids; - /* I don't pretend to understand the rational behind the format of a */ - /* postscript font. It appears to be split up into chunks where the */ - /* maximum chunk size is 0x800, each section (ascii, binary, ascii, eof) */ - /* has its own set of chunks (ie chunks don't cross sections) */ - char *buffer = NULL; - int max = 0; - FILE *pfb; - FontDict *fd; - SplineFont *sf; - (void) name_list; - fseek(f, rlistpos, SEEK_SET); - rsrcids = gcalloc(subcnt, sizeof(short)); - offsets = gcalloc(subcnt, sizeof(long)); - for (i = 0; i < subcnt; ++i) { - rsrcids[i] = getushort(f); - tmp = (short) getushort(f); - if (rname == -1) - rname = tmp; - /* flags = */ getc(f); - ch1 = getc(f); - ch2 = getc(f); - offsets[i] = rdata_pos + ((ch1 << 16) | (ch2 << 8) | getc(f)); - /* mbz = */ getlong(f); - } - - pfb = tmpfile(); - if (pfb == NULL) { - LogError(_("Can't open temporary file for postscript output\n")); - fseek(f, here, SEEK_SET); - free(offsets); - return (NULL); - } - - putc(0x80, pfb); - putc(1, pfb); - lenpos = ftell(pfb); - putc(0, pfb); - putc(0, pfb); - putc(0, pfb); - putc(0, pfb); - len = 0; - type = 1; - id = 501; - for (i = 0; i < subcnt; ++i) { - for (j = 0; j < subcnt; ++j) - if (rsrcids[j] == id) - break; - if (j == subcnt) { - LogError(_("Missing POST resource %u\n"), id); - break; - } - id = id + 1; - fseek(f, offsets[j], SEEK_SET); - rlen = getlong(f); - ch1 = getc(f); - ch2 = getc(f); - rlen -= 2; /* those two bytes don't count as real data */ - if (ch1 == type) - len += rlen; - else { - long hold = ftell(pfb); - fseek(pfb, lenpos, SEEK_SET); - putc(len >> 24, pfb); - putc((len >> 16) & 0xff, pfb); - putc((len >> 8) & 0xff, pfb); - putc(len & 0xff, pfb); - fseek(pfb, hold, SEEK_SET); - if (ch1 == 5) /* end of font mark */ - break; - putc(0x80, pfb); - putc(ch1, pfb); - lenpos = ftell(pfb); - putc(0, pfb); - putc(0, pfb); - putc(0, pfb); - putc(0, pfb); - type = ch1; - len = rlen; - } - if (rlen > max) { - free(buffer); - max = rlen; - if (max < 0x800) - max = 0x800; - buffer = galloc(max); - if (buffer == NULL) { - LogError(_("Out of memory\n")); - exit(1); - } - } - if(fread(buffer, 1, rlen, f) != ((size_t)rlen) ) { - LogError(_("Unable to read %u bytes for buffer\n"),rlen); - exit(1); - } - fwrite(buffer, 1, rlen, pfb); - } - free(buffer); - free(offsets); - free(rsrcids); - putc(0x80, pfb); - putc(3, pfb); - fseek(pfb, lenpos, SEEK_SET); - putc(len >> 24, pfb); - putc((len >> 16) & 0xff, pfb); - putc((len >> 8) & 0xff, pfb); - putc(len & 0xff, pfb); - fseek(f, here, SEEK_SET); - rewind(pfb); - if (flags & ttf_onlynames) - return ((SplineFont *) _NamesReadPostscript(pfb)); /* This closes the font for us */ - - fd = _ReadPSFont(pfb); - sf = NULL; - if (fd != NULL) { - sf = SplineFontFromPSFont(fd); - PSFontFree(fd); - /* There is no FOND in a postscript file, so we can't read any kerning */ - } - fclose(pfb); - return (sf); -} - -static SplineFont *SearchTtfResources(FILE * f, long rlistpos, int subcnt, - long rdata_pos, long name_list, - char *filename, int flags, - enum openflags openflags) -{ - long here, start = ftell(f); - long roff; - int rname = -1; - int ch1, ch2; - int len, i, rlen, ilen; - /* The sfnt resource is just a copy of the ttf file */ - char *buffer = NULL; - int max = 0; - FILE *ttf; - SplineFont *sf; - int which = 0; - char **names; - char *pt, *lparen, *rparen; - char *chosenname = NULL; - (void) name_list; - fseek(f, rlistpos, SEEK_SET); - if (subcnt > 1 || (flags & ttf_onlynames)) { - names = gcalloc(subcnt + 1, sizeof(char *)); - for (i = 0; i < subcnt; ++i) { - /* resource id = */ getushort(f); - /* rname = (short) */ getushort(f); - /* flags = */ getc(f); - ch1 = getc(f); - ch2 = getc(f); - roff = rdata_pos + ((ch1 << 16) | (ch2 << 8) | getc(f)); - /* mbz = */ getlong(f); - here = ftell(f); - names[i] = TTFGetFontName(f, roff + 4, roff + 4); - if (names[i] == NULL) { - char buffer[32]; - sprintf(buffer, "Nameless%d", i); - names[i] = copy(buffer); - } - fseek(f, here, SEEK_SET); - } - if (flags & ttf_onlynames) { - return ((SplineFont *) names); - } - if ((pt = strrchr(filename, '/')) == NULL) - pt = filename; - /* Someone gave me a font "Nafees Nastaleeq(Updated).ttf" and complained */ - /* that ff wouldn't open it */ - /* Now someone will complain about "Nafees(Updated).ttc(fo(ob)ar)" */ - if ((lparen = strrchr(pt, '(')) != NULL && - (rparen = strrchr(lparen, ')')) != NULL && rparen[1] == '\0') { - char *find = copy(lparen + 1); - pt = strchr(find, ')'); - if (pt != NULL) - *pt = '\0'; - for (which = subcnt - 1; which >= 0; --which) - if (strcmp(names[which], find) == 0) - break; - if (which == -1) { - char *end; - which = strtol(find, &end, 10); - if (*end != '\0') - which = -1; - } - if (which == -1) { - char *fn = copy(filename); - fn[lparen - filename] = '\0'; - ff_post_error(_("Not in Collection"), _("%s is not in %.100s"), - find, fn); - free(fn); - } - free(find); - } else - which = 0; - if (lparen == NULL && which != -1) - chosenname = copy(names[which]); - for (i = 0; i < subcnt; ++i) - free(names[i]); - free(names); - fseek(f, rlistpos, SEEK_SET); - } - - for (i = 0; i < subcnt; ++i) { - /* resource id = */ getushort(f); - rname = (short) getushort(f); - /* flags = */ getc(f); - ch1 = getc(f); - ch2 = getc(f); - roff = rdata_pos + ((ch1 << 16) | (ch2 << 8) | getc(f)); - /* mbz = */ getlong(f); - if (i != which) - continue; - here = ftell(f); - - ttf = tmpfile(); - if (ttf == NULL) { - LogError(_("Can't open temporary file for truetype output.\n")); - continue; - } - - fseek(f, roff, SEEK_SET); - ilen = rlen = getlong(f); - if (rlen > 16 * 1024) - ilen = 16 * 1024; - if (ilen > max) { - free(buffer); - max = ilen; - if (max < 0x800) - max = 0x800; - buffer = malloc(max); - } - for (len = 0; len < rlen;) { - int temp = ilen; - if (rlen - len < ilen) - temp = rlen - len; - temp = fread(buffer, 1, temp, f); - if (temp == EOF) - break; - fwrite(buffer, 1, temp, ttf); - len += temp; - } - rewind(ttf); - sf = _SFReadTTF(ttf, flags, openflags, NULL, NULL); - fclose(ttf); - if (sf != NULL) { - free(buffer); - fseek(f, start, SEEK_SET); - if (sf->chosenname == NULL) - sf->chosenname = chosenname; - return (sf); - } - fseek(f, here, SEEK_SET); - } - free(chosenname); - free(buffer); - fseek(f, start, SEEK_SET); - return (NULL); -} - -typedef struct fond { - char *fondname; - int first, last; - int assoc_cnt; - struct assoc { - short size, style, id; - } *assoc; - /* size==0 => scalable */ - /* style>>8 is the bit depth (0=>1, 1=>2, 2=>4, 3=>8) */ - /* search order for ID is sfnt, NFNT, FONT */ - int stylewidthcnt; - struct stylewidths { - short style; - short *widthtab; /* 4.12 fixed number with the width specified as a fraction of an em */ - } *stylewidths; - int stylekerncnt; - struct stylekerns { - short style; - int kernpairs; - struct kerns { - unsigned char ch1, ch2; - short offset; /* 4.12 */ - } *kerns; - } *stylekerns; - char *psnames[48]; - struct fond *next; -} FOND; - -struct MacFontRec { - short fontType; - short firstChar; - short lastChar; - short widthMax; - short kernMax; /* bb learing */ - short Descent; /* maximum negative distance below baseline */ - short fRectWidth; /* bounding box width */ - short fRectHeight; /* bounding box height */ - unsigned short *offsetWidths; /* offset to start of offset/width table */ - /* 0xffff => undefined, else high byte is offset in locTable, */ - /* low byte is width */ - short ascent; - short descent; - short leading; - short rowWords; /* shorts per row */ - unsigned short *fontImage; /* rowWords*fRectHeight */ - /* Images for all characters plus one extra for undefined */ - unsigned short *locs; /* lastchar-firstchar+3 words */ - /* Horizontal offset to start of n'th character. Note: applies */ - /* to each row. Missing characters have same loc as following */ -}; - -static void FondListFree(FOND * list) -{ - FOND *next; - int i; - - while (list != NULL) { - next = list->next; - free(list->assoc); - for (i = 0; i < list->stylewidthcnt; ++i) - free(list->stylewidths[i].widthtab); - free(list->stylewidths); - for (i = 0; i < list->stylekerncnt; ++i) - free(list->stylekerns[i].kerns); - free(list->stylekerns); - for (i = 0; i < 48; ++i) - free(list->psnames[i]); - free(list); - list = next; - } -} - -/* There's probably only one fond in the file, but there could be more so be */ -/* prepared... */ -/* I want the fond: */ -/* to get the fractional widths for the SWIDTH entry on bdf */ -/* to get the font name */ -/* to get the font association tables */ -/* to get the style flags */ -/* http://developer.apple.com/techpubs/mac/Text/Text-269.html */ -static FOND *BuildFondList(FILE * f, long rlistpos, int subcnt, long rdata_pos, - long name_list, int flags) -{ - long here, start = ftell(f); - long offset; - int rname = -1; - char name[300]; - int ch1, ch2; - int i, j, k, cnt, isfixed; - FOND *head = NULL, *cur; - long widoff, kernoff, styleoff; - - fseek(f, rlistpos, SEEK_SET); - for (i = 0; i < subcnt; ++i) { - /* resource id = */ getushort(f); - rname = (short) getushort(f); - /* flags = */ getc(f); - ch1 = getc(f); - ch2 = getc(f); - offset = rdata_pos + ((ch1 << 16) | (ch2 << 8) | getc(f)); - /* mbz = */ getlong(f); - here = ftell(f); - - cur = gcalloc(1, sizeof(FOND)); - cur->next = head; - head = cur; - - if (rname != -1) { - fseek(f, name_list + rname, SEEK_SET); - ch1 = getc(f); - if( fread(name, 1, ch1, f) != ((size_t)ch1)) { - LogError(_("Unable to read %u bytes for name, but going on.\n"),ch1); - } - name[ch1] = '\0'; - cur->fondname = copy(name); - } - - offset += 4; - fseek(f, offset, SEEK_SET); - isfixed = getushort(f) & 0x8000 ? 1 : 0; - /* family id = */ getushort(f); - cur->first = getushort(f); - cur->last = getushort(f); -/* on a 1 point font... */ - /* ascent = */ getushort(f); - /* descent = (short) */ getushort(f); - /* leading = */ getushort(f); - /* widmax = */ getushort(f); - if ((widoff = getlong(f)) != 0) - widoff += offset; - if ((kernoff = getlong(f)) != 0) - kernoff += offset; - if ((styleoff = getlong(f)) != 0) - styleoff += offset; - for (j = 0; j < 9; ++j) - getushort(f); - /* internal & undefined, for international scripts = */ getlong(f); - /* version = */ getushort(f); - cur->assoc_cnt = getushort(f) + 1; - cur->assoc = gcalloc(cur->assoc_cnt, sizeof(struct assoc)); - for (j = 0; j < cur->assoc_cnt; ++j) { - cur->assoc[j].size = getushort(f); - cur->assoc[j].style = getushort(f); - cur->assoc[j].id = getushort(f); - } - if (widoff != 0) { - fseek(f, widoff, SEEK_SET); - cnt = getushort(f) + 1; - cur->stylewidthcnt = cnt; - cur->stylewidths = gcalloc(cnt, sizeof(struct stylewidths)); - for (j = 0; j < cnt; ++j) { - cur->stylewidths[j].style = getushort(f); - cur->stylewidths[j].widthtab = - galloc((cur->last - cur->first + 3) * sizeof(short)); - for (k = cur->first; k <= cur->last + 2; ++k) - cur->stylewidths[j].widthtab[k] = getushort(f); - } - } - if (kernoff != 0 && (flags & ttf_onlykerns)) { - fseek(f, kernoff, SEEK_SET); - cnt = getushort(f) + 1; - cur->stylekerncnt = cnt; - cur->stylekerns = gcalloc(cnt, sizeof(struct stylekerns)); - for (j = 0; j < cnt; ++j) { - cur->stylekerns[j].style = getushort(f); - cur->stylekerns[j].kernpairs = getushort(f); - cur->stylekerns[j].kerns = - galloc(cur->stylekerns[j].kernpairs * sizeof(struct kerns)); - for (k = 0; k < cur->stylekerns[j].kernpairs; ++k) { - cur->stylekerns[j].kerns[k].ch1 = getc(f); - cur->stylekerns[j].kerns[k].ch2 = getc(f); - cur->stylekerns[j].kerns[k].offset = getushort(f); - } - } - } - if (styleoff != 0) { - uint8 stringoffsets[48]; - int strcnt, stringlen, format; - char **strings, *pt; - fseek(f, styleoff, SEEK_SET); - /* class = */ getushort(f); - /* glyph encoding offset = */ getlong(f); - /* reserved = */ getlong(f); - for (j = 0; j < 48; ++j) - stringoffsets[j] = getc(f); - strcnt = getushort(f); - strings = galloc(strcnt * sizeof(char *)); - for (j = 0; j < strcnt; ++j) { - stringlen = getc(f); - strings[j] = galloc(stringlen + 2); - strings[j][0] = stringlen; - strings[j][stringlen + 1] = '\0'; - for (k = 0; k < stringlen; ++k) - strings[j][k + 1] = getc(f); - } - for (j = 0; j < 48; ++j) { - for (k = j - 1; k >= 0; --k) - if (stringoffsets[j] == stringoffsets[k]) - break; - if (k != -1) - continue; /* this style doesn't exist */ - format = stringoffsets[j] - 1; - stringlen = strings[0][0]; - if (format != 0) - for (k = 0; k < strings[format][0]; ++k) - stringlen += strings[strings[format][k + 1] - 1][0]; - pt = cur->psnames[j] = galloc(stringlen + 1); - strcpy(pt, strings[0] + 1); - pt += strings[0][0]; - if (format != 0) - for (k = 0; k < strings[format][0]; ++k) { - strcpy(pt, strings[strings[format][k + 1] - 1] + 1); - pt += strings[strings[format][k + 1] - 1][0]; - } - *pt = '\0'; - } - for (j = 0; j < strcnt; ++j) - free(strings[j]); - free(strings); - } - fseek(f, here, SEEK_SET); - } - fseek(f, start, SEEK_SET); - return (head); -} - -static char *BuildName(char *family, int style) -{ - char buffer[350] = ""; - - strncpy(buffer, family, 200); - if (style != 0) - strcat(buffer, "-"); - if (style & sf_bold) - strcat(buffer, "Bold"); - if (style & sf_italic) - strcat(buffer, "Italic"); - if (style & sf_underline) - strcat(buffer, "Underline"); - if (style & sf_outline) - strcat(buffer, "Outline"); - if (style & sf_shadow) - strcat(buffer, "Shadow"); - if (style & sf_condense) - strcat(buffer, "Condensed"); - if (style & sf_extend) - strcat(buffer, "Extended"); - return (copy(buffer)); -} - -static int GuessStyle(char *fontname, int *styles, int style_cnt) -{ - int which, style; - char *stylenames = _GetModifiers(fontname, NULL, NULL); - - style = _MacStyleCode(stylenames, NULL, NULL); - for (which = style_cnt; which >= 0; --which) - if (styles[which] == style) - return (which); - - return (-1); -} - -static FOND *PickFOND(FOND * fondlist, char *filename, char **name, int *style) -{ - int i, j; - FOND *test; - uint8 stylesused[96]; - char **names; - FOND **fonds = NULL, *fond = NULL; - int *styles = NULL; - int cnt, which; - char *pt, *lparen; - char *find = NULL; - - if ((pt = strrchr(filename, '/')) != NULL) - pt = filename; - if ((lparen = strchr(filename, '(')) != NULL && strchr(lparen, ')') != NULL) { - find = copy(lparen + 1); - pt = strchr(find, ')'); - if (pt != NULL) - *pt = '\0'; - for (test = fondlist; test != NULL; test = test->next) { - for (i = 0; i < 48; ++i) - if (test->psnames[i] != NULL - && strcmp(find, test->psnames[i]) == 0) { - *style = (i & 3) | ((i & ~3) << 1); /* PS styles skip underline bit */ - *name = copy(test->psnames[i]); - return (test); - } - } - } - - /* The file may contain multiple families, and each family may contain */ - /* multiple styles (and each style may contain multiple sizes, but that's */ - /* not an issue for us here) */ - names = NULL; - for (i = 0; i < 2; ++i) { - cnt = 0; - for (test = fondlist; test != NULL; test = test->next) - if (test->fondname != NULL) { - memset(stylesused, 0, sizeof(stylesused)); - for (j = 0; j < test->assoc_cnt; ++j) { - if (test->assoc[j].size != 0 - && !stylesused[test->assoc[j].style]) { - stylesused[test->assoc[j].style] = true; - if (names != NULL) { - names[cnt] = - BuildName(test->fondname, test->assoc[j].style); - styles[cnt] = test->assoc[j].style; - fonds[cnt] = test; - } - ++cnt; - } - } - } - if (names == NULL) { - names = gcalloc(cnt + 1, sizeof(char *)); - fonds = galloc(cnt * sizeof(FOND *)); - styles = galloc(cnt * sizeof(int)); - } - } - - if (find != NULL) { - for (which = cnt - 1; which >= 0; --which) - if (strcmp(names[which], find) == 0) - break; - if (which == -1 && strstrmatch(find, test->fondname) != NULL) - which = GuessStyle(find, styles, cnt); - if (which == -1) { - char *fn = copy(filename); - fn[lparen - filename] = '\0'; - ff_post_error(_("Not in Collection"), _("%s is not in %.100s"), - find, fn); - free(fn); - } - free(find); - } else - which = 0; - - if (which != -1) { - fond = fonds[which]; - *name = copy(names[which]); - *style = styles[which]; - } - for (i = 0; i < cnt; ++i) - free(names[i]); - free(names); - free(fonds); - free(styles); - if (which == -1) - return (NULL); - - return (fond); -} - - -/* Look for kerning info and merge it into the currently existing font "into" */ -static SplineFont *FindFamilyStyleKerns(SplineFont * into, EncMap * map, - FOND * fondlist, char *filename) -{ - char *name; - int style; - FOND *fond; - int i, j; - int ch1, ch2, offset; - KernPair *kp; - SplineChar *sc1, *sc2; - - fond = PickFOND(fondlist, filename, &name, &style); - if (fond == NULL || into == NULL) - return (NULL); - for (i = 0; i < fond->stylekerncnt; ++i) - if (fond->stylekerns[i].style == style) - break; - if (i == fond->stylekerncnt) { - LogError(_("No kerning table for %s\n"), name); - free(name); - return (NULL); - } - for (j = 0; j < fond->stylekerns[i].kernpairs; ++j) { - ch1 = fond->stylekerns[i].kerns[j].ch1; - ch2 = fond->stylekerns[i].kerns[j].ch2; - offset = - (fond->stylekerns[i].kerns[j].offset * - (into->ascent + into->descent) + (1 << 11)) >> 12; - sc1 = SFMakeChar(into, map, ch1); - sc2 = SFMakeChar(into, map, ch2); - for (kp = sc1->kerns; kp != NULL; kp = kp->next) - if (kp->sc == sc2) - break; - if (kp == NULL) { - uint32 script; - kp = chunkalloc(sizeof(KernPair)); - kp->sc = sc2; - kp->next = sc1->kerns; - sc1->kerns = kp; - script = SCScriptFromUnicode(sc1); - if (script == DEFAULT_SCRIPT) - script = SCScriptFromUnicode(sc2); - kp->subtable = - SFSubTableFindOrMake(sc1->parent, CHR('k', 'e', 'r', 'n'), - script, gpos_pair); - } - kp->off = offset; - } - return (into); -} - -/* Look for a bare truetype font in a binhex/macbinary wrapper */ -static SplineFont *MightBeTrueType(FILE * binary, int32 pos, int32 dlen, - int flags, enum openflags openflags) -{ - FILE *temp ; - char *buffer ; - int len; - SplineFont *sf; - - if (flags & ttf_onlynames) { - char **ret; - char *temp = TTFGetFontName(binary, pos, pos); - if (temp == NULL) - return (NULL); - ret = galloc(2 * sizeof(char *)); - ret[0] = temp; - ret[1] = NULL; - return ((SplineFont *) ret); - } - temp = tmpfile(); - buffer = galloc(8192); - - - fseek(binary, pos, SEEK_SET); - while (dlen > 0) { - len = dlen > 8192 ? 8192 : dlen; - len = fread(buffer, 1, dlen > 8192 ? 8192 : dlen, binary); - if (len == 0) - break; - fwrite(buffer, 1, len, temp); - dlen -= len; - } - rewind(temp); - sf = _SFReadTTF(temp, flags, openflags, NULL, NULL); - fclose(temp); - free(buffer); - return (sf); -} - -static SplineFont *IsResourceFork(FILE * f, long offset, char *filename, - int flags, enum openflags openflags, - SplineFont * into, EncMap * map) -{ - /* If it is a good resource fork then the first 16 bytes are repeated */ - /* at the location specified in bytes 4-7 */ - /* We include an offset because if we are looking at a mac binary file */ - /* the resource fork will actually start somewhere in the middle of the */ - /* file, not at the beginning */ - unsigned char buffer[16], buffer2[16]; - long rdata_pos, map_pos, type_list, name_list, rpos; - int32 rdata_len, map_len; - uint32 nfnt_pos, font_pos, fond_pos; - unsigned long tag; - int i, cnt, subcnt, nfnt_subcnt = 0, font_subcnt = 0, fond_subcnt = 0; - SplineFont *sf; - FOND *fondlist = NULL; - fond_pos = 0; - fseek(f, offset, SEEK_SET); - if (fread(buffer, 1, 16, f) != 16) - return (NULL); - rdata_pos = - offset + - ((buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]); - map_pos = - offset + - ((buffer[4] << 24) | (buffer[5] << 16) | (buffer[6] << 8) | buffer[7]); - rdata_len = - ((buffer[8] << 24) | (buffer[9] << 16) | (buffer[10] << 8) | - buffer[11]); - map_len = - ((buffer[12] << 24) | (buffer[13] << 16) | (buffer[14] << 8) | - buffer[15]); - if (rdata_pos + rdata_len != map_pos || rdata_len == 0) - return (NULL); - fseek(f, map_pos, SEEK_SET); - buffer2[15] = buffer[15] + 1; /* make it be different */ - if (fread(buffer2, 1, 16, f) != 16) - return (NULL); - -/* Apple's data fork resources appear to have a bunch of zeroes here instead */ -/* of a copy of the first 16 bytes */ - for (i = 0; i < 16; ++i) - if (buffer2[i] != 0) - break; - if (i != 16) { - for (i = 0; i < 16; ++i) - if (buffer[i] != buffer2[i]) - return (NULL); - } - getlong(f); /* skip the handle to the next resource map */ - getushort(f); /* skip the file resource number */ - getushort(f); /* skip the attributes */ - type_list = map_pos + getushort(f); - name_list = map_pos + getushort(f); - - fseek(f, type_list, SEEK_SET); - cnt = getushort(f) + 1; - for (i = 0; i < cnt; ++i) { - tag = getlong(f); - /* printf( "%c%c%c%c\n", tag>>24, (tag>>16)&0xff, (tag>>8)&0xff, tag&0xff ); */ - subcnt = getushort(f) + 1; - rpos = type_list + getushort(f); - sf = NULL; - if (tag == CHR('P', 'O', 'S', 'T') && !(flags & (ttf_onlystrikes | ttf_onlykerns))) /* No FOND */ - sf = SearchPostscriptResources(f, rpos, subcnt, rdata_pos, - name_list, flags); - else if (tag == CHR('s', 'f', 'n', 't') && !(flags & ttf_onlykerns)) - sf = SearchTtfResources(f, rpos, subcnt, rdata_pos, name_list, - filename, flags, openflags); - else if (tag == CHR('N', 'F', 'N', 'T')) { - nfnt_pos = rpos; - nfnt_subcnt = subcnt; - } else if (tag == CHR('F', 'O', 'N', 'T')) { - font_pos = rpos; - font_subcnt = subcnt; - } else if (tag == CHR('F', 'O', 'N', 'D')) { - fond_pos = rpos; - fond_subcnt = subcnt; - } - if (sf != NULL) - return (sf); - } - if (flags & ttf_onlynames) /* Not interested in bitmap resources here */ - return (NULL); - - if (flags & ttf_onlykerns) { /* For kerns */ - if (fond_subcnt != 0) - fondlist = - BuildFondList(f, fond_pos, fond_subcnt, rdata_pos, name_list, - flags); - into = FindFamilyStyleKerns(into, map, fondlist, filename); - FondListFree(fondlist); - return (into); - } - /* Ok. If no outline font, try for a bitmap */ - if (nfnt_subcnt == 0) { - nfnt_pos = font_pos; - nfnt_subcnt = font_subcnt; - } - return ((SplineFont *) - 1); /* It's a valid resource file, but just has no fonts */ -} - - -static SplineFont *IsResourceInBinary(FILE * f, char *filename, int flags, - enum openflags openflags, - SplineFont * into, EncMap * map) -{ - unsigned char header[128]; - unsigned long offset, dlen, rlen; - - if (fread(header, 1, 128, f) != 128) - return (NULL); - if (header[0] != 0 || header[74] != 0 || header[82] != 0 || header[1] <= 0 - || header[1] > 33 || header[63] != 0 || header[2 + header[1]] != 0) - return (NULL); - dlen = - ((header[0x53] << 24) | (header[0x54] << 16) | (header[0x55] << 8) | - header[0x56]); - rlen = - ((header[0x57] << 24) | (header[0x58] << 16) | (header[0x59] << 8) | - header[0x5a]); - /* 128 bytes for header, then the dlen is padded to a 128 byte boundary */ - offset = 128 + ((dlen + 127) & ~127); -/* Look for a bare truetype font in a binhex/macbinary wrapper */ - if (dlen != 0 && rlen <= dlen) { - int pos = ftell(f); - if (fread(header, 1, 4, f) != ((size_t)4)) { - LogError(_("Unable to read 4 bytes for header, but going on.\n")); - } - header[5] = '\0'; - if (strcmp((char *) header, "OTTO") == 0 - || strcmp((char *) header, "true") == 0 - || strcmp((char *) header, "ttcf") == 0 || (header[0] == 0 - && header[1] == 1 - && header[2] == 0 - && header[3] == 0)) - return (MightBeTrueType(f, pos, dlen, flags, openflags)); - } - return (IsResourceFork(f, offset, filename, flags, openflags, into, map)); -} - -static int lastch = 0, repeat = 0; -static void outchr(FILE * binary, int ch) -{ - int i; - - if (repeat) { - if (ch == 0) { - /* no repeat, output a literal 0x90 (the repeat flag) */ - lastch = 0x90; - putc(lastch, binary); - } else { - for (i = 1; i < ch; ++i) - putc(lastch, binary); - } - repeat = 0; - } else if (ch == 0x90) { - repeat = 1; - } else { - putc(ch, binary); - lastch = ch; - } -} - -static SplineFont *IsResourceInHex(FILE * f, char *filename, int flags, - enum openflags openflags, SplineFont * into, - EncMap * map) -{ - /* convert file from 6bit to 8bit */ - /* interesting data is enclosed between two colons */ - FILE *binary = tmpfile(); - char *sixbit = - "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr"; - int ch, val, cnt, i, dlen, rlen; - unsigned char header[20]; - char *pt; - SplineFont *ret; - - if (binary == NULL) { - LogError(_("can't create temporary file\n")); - return (NULL); - } - - lastch = repeat = 0; - while ((ch = getc(f)) != ':'); /* There may be comments before file start */ - cnt = val = 0; - while ((ch = getc(f)) != ':') { - if (isspace(ch)) - continue; - for (pt = sixbit; *pt != ch && *pt != '\0'; ++pt); - if (*pt == '\0') { - fclose(binary); - return (NULL); - } - val = (val << 6) | (pt - sixbit); - if (++cnt == 4) { - outchr(binary, (val >> 16) & 0xff); - outchr(binary, (val >> 8) & 0xff); - outchr(binary, val & 0xff); - val = cnt = 0; - } - } - if (cnt != 0) { - if (cnt == 1) - outchr(binary, val << 2); - else if (cnt == 2) { - val <<= 4; - outchr(binary, (val >> 8) & 0xff); - outchr(binary, val & 0xff); - } else if (cnt == 3) { - val <<= 6; - outchr(binary, (val >> 16) & 0xff); - outchr(binary, (val >> 8) & 0xff); - outchr(binary, val & 0xff); - } - } - - rewind(binary); - ch = getc(binary); /* Name length */ - /* skip name */ - for (i = 0; i < ch; ++i) - getc(binary); - if (getc(binary) != '\0') { - fclose(binary); - return (NULL); - } - if ( fread(header, 1, 20, binary) != 20 ) { - LogError(_("Can't read 20 bytes for header\n")); - return (NULL); - } - dlen = - (header[10] << 24) | (header[11] << 16) | (header[12] << 8) | - header[13]; - rlen = - (header[14] << 24) | (header[15] << 16) | (header[16] << 8) | - header[17]; -/* Look for a bare truetype font in a binhex/macbinary wrapper */ - if (dlen != 0 && rlen < dlen) { - int pos = ftell(binary); - if (fread(header, 1, 4, binary) != 4) { - LogError(_("Can't read 4 bytes for header\n")); - return (NULL); - } - header[5] = '\0'; - if (strcmp((char *) header, "OTTO") == 0 - || strcmp((char *) header, "true") == 0 - || strcmp((char *) header, "ttcf") == 0 || (header[0] == 0 - && header[1] == 1 - && header[2] == 0 - && header[3] == 0)) { - ret = MightBeTrueType(binary, pos, dlen, flags, openflags); - fclose(binary); - return (ret); - } - } - if (rlen == 0) { - fclose(binary); - return (NULL); - } - - ret = - IsResourceFork(binary, ftell(binary) + dlen + 2, filename, flags, - openflags, into, map); - - fclose(binary); - return (ret); -} - -static SplineFont *IsResourceInFile(char *filename, int flags, - enum openflags openflags, SplineFont * into, - EncMap * map) -{ - FILE *f; - char *spt, *pt; - SplineFont *sf; - char *temp = filename, *lparen; - - if ((pt = strrchr(filename, '/')) == NULL) - pt = filename; - if ((lparen = strchr(pt, '(')) != NULL && strchr(lparen, ')') != NULL) { - temp = copy(filename); - temp[lparen - filename] = '\0'; - } - f = fopen(temp, "rb"); - if (temp != filename) - free(temp); - if (f == NULL) - return (NULL); - spt = strrchr(filename, '/'); - if (spt == NULL) - spt = filename; - pt = strrchr(spt, '.'); - if (pt != NULL && (pt[1] == 'b' || pt[1] == 'B') - && (pt[2] == 'i' || pt[2] == 'I') && (pt[3] == 'n' || pt[3] == 'N') - && (pt[4] == '\0' || pt[4] == '(')) { - if ((sf = IsResourceInBinary(f, filename, flags, openflags, into, map))) { - fclose(f); - return (sf); - } - } else if (pt != NULL && (pt[1] == 'h' || pt[1] == 'H') - && (pt[2] == 'q' || pt[2] == 'Q') && (pt[3] == 'x' - || pt[3] == 'X') - && (pt[4] == '\0' || pt[4] == '(')) { - if ((sf = IsResourceInHex(f, filename, flags, openflags, into, map))) { - fclose(f); - return (sf); - } - } - - sf = IsResourceFork(f, 0, filename, flags, openflags, into, map); - fclose(f); -#if __Mac - if (sf == NULL) - sf = HasResourceFork(filename, flags, openflags, into, map); -#endif - return (sf); -} - -static SplineFont *FindResourceFile(char *filename, int flags, - enum openflags openflags, SplineFont * into, - EncMap * map) -{ - char *spt, *pt, *dpt; - char buffer[1400]; - SplineFont *sf; - - if ((sf = IsResourceInFile(filename, flags, openflags, into, map))) - return (sf); - - /* Well, look in the resource fork directory (if it exists), the resource */ - /* fork is placed there in a seperate file on (some) non-Mac disks */ - strcpy(buffer, filename); - spt = strrchr(buffer, '/'); - if (spt == NULL) { - spt = buffer; - pt = filename; - } else { - ++spt; - pt = filename + (spt - buffer); - } - strcpy(spt, "resource.frk/"); - strcat(spt, pt); - if ((sf = IsResourceInFile(buffer, flags, openflags, into, map))) - return (sf); - - /* however the resource fork does not appear to do long names properly */ - /* names are always lower case 8.3, do some simple things to check */ - spt = strrchr(buffer, '/') + 1; - for (pt = spt; *pt; ++pt) - if (isupper(*pt)) - *pt = tolower(*pt); - dpt = strchr(spt, '.'); - if (dpt == NULL) - dpt = spt + strlen(spt); - if (dpt - spt > 8 || strlen(dpt) > 4) { - char exten[8]; - strncpy(exten, dpt, 7); - exten[4] = '\0'; /* it includes the dot */ - if (dpt - spt > 6) - dpt = spt + 6; - *dpt++ = '~'; - *dpt++ = '1'; - strcpy(dpt, exten); - } - return (IsResourceInFile(buffer, flags, openflags, into, map)); -} - - -static char *createtmpfile(char *filename) -{ - char *p, *tempname; - p = strrchr(filename,'/'); - if (p != NULL) { - filename = p+1; - } - assert(strlen(filename)>=5); - tempname = malloc(strlen(filename)+2); - if (tempname == NULL) { - LogError(_("Out of memory\n")); - exit(1); - } - strcpy(tempname,filename); - strcpy(tempname+strlen(tempname)-5,"XXXXXX"); /* dfont -> XXXXXX */ - -#ifdef HAVE_MKSTEMP - { - int i = mkstemp(tempname); - if (i) { - close(i); - } - } -#else - mktemp(tempname); -#endif - return tempname; -} - -static char *SearchTtfResourcesFile(FILE * f, long rlistpos, int subcnt, - long rdata_pos, long name_list, - char *filename, char *fontname) -{ - long here; - long roff; - int rname = -1; - int ch1, ch2; - int len, i, rlen, ilen; - /* The sfnt resource is just a copy of the ttf file */ - char *buffer = NULL; - int max = 0; - FILE *ttf; - char *sf = NULL; - int which = 0; - char **names; - (void)name_list; - fseek(f, rlistpos, SEEK_SET); - if (subcnt > 1) { - names = gcalloc(subcnt + 1, sizeof(char *)); - for (i = 0; i < subcnt; ++i) { - /* resource id = */ getushort(f); - /* rname = (short) */ getushort(f); - /* flags = */ getc(f); - ch1 = getc(f); - ch2 = getc(f); - roff = rdata_pos + ((ch1 << 16) | (ch2 << 8) | getc(f)); - /* mbz = */ getlong(f); - here = ftell(f); - names[i] = TTFGetPSFontName(f, roff + 4, roff + 4); - if (names[i] == NULL) { - char buffer[32]; - sprintf(buffer, "Nameless%d", i); - names[i] = copy(buffer); - } - fseek(f, here, SEEK_SET); - } - if (1) { - char *find = fontname; - for (which = subcnt - 1; which >= 0; --which) - if (strcmp(names[which], find) == 0) - break; - if (which == -1) { - char *end; - which = strtol(find, &end, 10); - if (*end != '\0') - which = -1; - } - if (which == -1) { - ff_post_error(_("Not in Collection"), _("%s is not in %.100s"), - find, filename); - } - } else { - which = 0; - } - for (i = 0; i < subcnt; ++i) - free(names[i]); - free(names); - fseek(f, rlistpos, SEEK_SET); - } - - for (i = 0; i < subcnt; ++i) { - /* resource id = */ getushort(f); - rname = (short) getushort(f); - /* flags = */ getc(f); - ch1 = getc(f); - ch2 = getc(f); - roff = rdata_pos + ((ch1 << 16) | (ch2 << 8) | getc(f)); - /* mbz = */ getlong(f); - if (i != which) - continue; - here = ftell(f); - - sf = createtmpfile(filename); - ttf = fopen(sf, "wb"); - if (ttf == NULL) { - LogError(_("Can't open temporary file for truetype output.\n")); - continue; - } - - fseek(f, roff, SEEK_SET); - ilen = rlen = getlong(f); - if (rlen > 16 * 1024) - ilen = 16 * 1024; - if (ilen > max) { - free(buffer); - max = ilen; - if (max < 0x800) - max = 0x800; - buffer = malloc(max); - } - for (len = 0; len < rlen;) { - int temp = ilen; - if (rlen - len < ilen) - temp = rlen - len; - temp = fread(buffer, 1, temp, f); - if (temp == EOF) - break; - fwrite(buffer, 1, temp, ttf); - len += temp; - } - fclose(ttf); - } - free(buffer); - return sf; -} - -static char *IsResourceForkFile(FILE * f, char *filename, char *fontname) -{ - /* If it is a good resource fork then the first 16 bytes are repeated */ - /* at the location specified in bytes 4-7 */ - /* We include an offset because if we are looking at a mac binary file */ - /* the resource fork will actually start somewhere in the middle of the */ - /* file, not at the beginning */ - unsigned char buffer[16], buffer2[16]; - long rdata_pos, map_pos, type_list, name_list, rpos; - int32 rdata_len, map_len; - uint32 fond_pos; - unsigned long tag; - int i, cnt, subcnt; - char *sf = NULL; - fond_pos = 0; - fseek(f, 0, SEEK_SET); - if (fread(buffer, 1, 16, f) != 16) - return (NULL); - rdata_pos = - ((buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]); - map_pos = - ((buffer[4] << 24) | (buffer[5] << 16) | (buffer[6] << 8) | buffer[7]); - rdata_len = - ((buffer[8] << 24) | (buffer[9] << 16) | (buffer[10] << 8) | - buffer[11]); - map_len = - ((buffer[12] << 24) | (buffer[13] << 16) | (buffer[14] << 8) | - buffer[15]); - if (rdata_pos + rdata_len != map_pos || rdata_len == 0) - return (NULL); - fseek(f, map_pos, SEEK_SET); - buffer2[15] = buffer[15] + 1; /* make it be different */ - if (fread(buffer2, 1, 16, f) != 16) - return (NULL); - for (i = 0; i < 16; ++i) - if (buffer2[i] != 0) - break; - if (i != 16) { - for (i = 0; i < 16; ++i) - if (buffer[i] != buffer2[i]) - return (NULL); - } - getlong(f); /* skip the handle to the next resource map */ - getushort(f); /* skip the file resource number */ - getushort(f); /* skip the attributes */ - type_list = map_pos + getushort(f); - name_list = map_pos + getushort(f); - fseek(f, type_list, SEEK_SET); - cnt = getushort(f) + 1; - for (i = 0; i < cnt; ++i) { - tag = getlong(f); - subcnt = getushort(f) + 1; - rpos = type_list + getushort(f); - sf = NULL; - if (tag == CHR('s', 'f', 'n', 't')) { - sf = SearchTtfResourcesFile(f, rpos, subcnt, rdata_pos, name_list, - filename, fontname); - } - if (sf != NULL) - return (sf); - } - return NULL; -} - - -/* filename "/opt/tex/texmf-fonts/fonts/data/LucidaGrande.dfont", - fontname "Lucida Grande Bold" - */ -char *FindResourceTtfFont(char *filename, char *fontname) -{ - char *sf = NULL; - FILE *f = fopen(filename, "rb"); - if (f == NULL) - return (NULL); - sf = IsResourceForkFile(f, filename, fontname); - fclose(f); - return sf; -} - -SplineFont *SFReadMacBinary(char *filename, int flags, enum openflags openflags) -{ - SplineFont *sf = FindResourceFile(filename, flags, openflags, NULL, NULL); - - if (sf == NULL) - LogError(_("Couldn't find a font file named %s\n"), filename); - else if (sf == (SplineFont *) (-1)) { - LogError(_ - ("%s is a mac resource file but contains no postscript or truetype fonts\n"), - filename); - sf = NULL; - } - return (sf); -} - -char **NamesReadMacBinary(char *filename) -{ - return ((char **) FindResourceFile(filename, ttf_onlynames, 0, NULL, NULL)); -} - -/* should try to optimize this */ -SplineFont *SFReadMacBinaryInfo(char *filename, int flags, - enum openflags openflags) -{ - SplineFont *sf = FindResourceFile(filename, flags, openflags, NULL, NULL); - - if (sf == NULL) - LogError(_("Couldn't find a font file named %s\n"), filename); - else if (sf == (SplineFont *) (-1)) { - LogError(_ - ("%s is a mac resource file but contains no postscript or truetype fonts\n"), - filename); - sf = NULL; - } - return (sf); -} |