summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinefont.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinefont.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinefont.c655
1 files changed, 0 insertions, 655 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinefont.c b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinefont.c
deleted file mode 100644
index 84e062c013e..00000000000
--- a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinefont.c
+++ /dev/null
@@ -1,655 +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 <utype.h>
-#include <ustring.h>
-#include <math.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <gfile.h>
-#include <time.h>
-#include "unicoderange.h"
-#include "psfont.h"
-
-#ifdef _WIN32
-#define MKDIR(A,B) mkdir(A)
-#else
-#define MKDIR(A,B) mkdir(A,B)
-#endif
-
-
-void SFUntickAll(SplineFont *sf) {
- int i;
-
- for ( i=0; i<sf->glyphcnt; ++i ) if ( sf->glyphs[i]!=NULL )
- sf->glyphs[i]->ticked = false;
-}
-
-SplineChar *SCBuildDummy(SplineChar *dummy,SplineFont *sf,EncMap *map,int i) {
- static char namebuf[100];
- static Layer layers[2];
-
- memset(dummy,'\0',sizeof(*dummy));
- dummy->color = COLOR_DEFAULT;
- dummy->layer_cnt = 2;
- dummy->layers = layers;
- if ( sf->cidmaster!=NULL ) {
- /* CID fonts don't have encodings, instead we must look up the cid */
- if ( sf->cidmaster->loading_cid_map )
- dummy->unicodeenc = -1;
- else
- dummy->unicodeenc = CID2NameUni(FindCidMap(sf->cidmaster->cidregistry,sf->cidmaster->ordering,sf->cidmaster->supplement,sf->cidmaster),
- i,namebuf,sizeof(namebuf));
- } else
- dummy->unicodeenc = UniFromEnc(i,map->enc);
-
- if ( sf->cidmaster!=NULL )
- dummy->name = namebuf;
- else if ( map->enc->psnames!=NULL && i<map->enc->char_cnt &&
- map->enc->psnames[i]!=NULL )
- dummy->name = map->enc->psnames[i];
- else if ( dummy->unicodeenc==-1 )
- dummy->name = NULL;
- else
- dummy->name = (char *) StdGlyphName(namebuf,dummy->unicodeenc,sf->uni_interp,sf->for_new_glyphs);
- if ( dummy->name==NULL ) {
- /*if ( dummy->unicodeenc!=-1 || i<256 )
- dummy->name = ".notdef";
- else*/ {
- int j;
- sprintf( namebuf, "NameMe.%d", i);
- j=0;
- while ( SFFindExistingSlot(sf,-1,namebuf)!=-1 )
- sprintf( namebuf, "NameMe.%d.%d", i, ++j);
- dummy->name = namebuf;
- }
- }
- dummy->width = dummy->vwidth = sf->ascent+sf->descent;
- if ( dummy->unicodeenc>0 && dummy->unicodeenc<0x10000 &&
- iscombining(dummy->unicodeenc)) {
- /* Mark characters should be 0 width */
- dummy->width = 0;
- /* Except in monospaced fonts on windows, where they should be the */
- /* same width as everything else */
- }
- /* Actually, in a monospace font, all glyphs should be the same width */
- /* whether mark or not */
- if ( sf->pfminfo.panose_set && sf->pfminfo.panose[3]==9 &&
- sf->glyphcnt>0 ) {
- for ( i=sf->glyphcnt-1; i>=0; --i )
- if ( SCWorthOutputting(sf->glyphs[i])) {
- dummy->width = sf->glyphs[i]->width;
- break;
- }
- }
- dummy->parent = sf;
- dummy->orig_pos = 0xffff;
-return( dummy );
-}
-
-static SplineChar *_SFMakeChar(SplineFont *sf,EncMap *map,int enc) {
- SplineChar dummy, *sc;
- SplineFont *ssf;
- int j, real_uni, gid;
- extern const int cns14pua[], amspua[];
-
- if ( enc>=map->enccount )
- gid = -1;
- else
- gid = map->map[enc];
- if ( sf->subfontcnt!=0 && gid!=-1 ) {
- ssf = NULL;
- for ( j=0; j<sf->subfontcnt; ++j )
- if ( gid<sf->subfonts[j]->glyphcnt ) {
- ssf = sf->subfonts[j];
- if ( ssf->glyphs[gid]!=NULL ) {
-return( ssf->glyphs[gid] );
- }
- }
- sf = ssf;
- }
-
- if ( gid==-1 || (sc = sf->glyphs[gid])==NULL ) {
- if (( map->enc->is_unicodebmp || map->enc->is_unicodefull ) &&
- ( enc>=0xe000 && enc<=0xf8ff ) &&
- ( sf->uni_interp==ui_ams || sf->uni_interp==ui_trad_chinese ) &&
- ( real_uni = (sf->uni_interp==ui_ams ? amspua : cns14pua)[enc-0xe000])!=0 ) {
- if ( real_uni<map->enccount ) {
- SplineChar *sc;
- /* if necessary, create the real unicode code point */
- /* and then make us be a duplicate of it */
- sc = _SFMakeChar(sf,map,real_uni);
- map->map[enc] = gid = sc->orig_pos;
- SCCharChangedUpdate(sc,ly_all);
-return( sc );
- }
- }
-
- SCBuildDummy(&dummy,sf,map,enc);
- /* Let's say a user has a postscript encoding where the glyph ".notdef" */
- /* is assigned to many slots. Once the user creates a .notdef glyph */
- /* all those slots should fill in. If they don't they damn well better*/
- /* when the user clicks on one to edit it */
- /* Used to do that with all encodings. It just confused people */
- if ( map->enc->psnames!=NULL &&
- (sc = SFGetChar(sf,dummy.unicodeenc,dummy.name))!=NULL ) {
- map->map[enc] = sc->orig_pos;
-return( sc );
- }
- sc = SFSplineCharCreate(sf);
- sc->unicodeenc = dummy.unicodeenc;
- sc->name = copy(dummy.name);
- sc->width = dummy.width;
- sc->orig_pos = 0xffff;
- /*SCLigDefault(sc);*/
- SFAddGlyphAndEncode(sf,sc,map,enc);
- }
-return( sc );
-}
-
-SplineChar *SFMakeChar(SplineFont *sf,EncMap *map, int enc) {
- int gid;
-
- if ( enc==-1 )
-return( NULL );
- if ( enc>=map->enccount )
- gid = -1;
- else
- gid = map->map[enc];
- if ( sf->mm!=NULL && (gid==-1 || sf->glyphs[gid]==NULL) ) {
- int j;
- _SFMakeChar(sf->mm->normal,map,enc);
- for ( j=0; j<sf->mm->instance_count; ++j )
- _SFMakeChar(sf->mm->instances[j],map,enc);
- }
-return( _SFMakeChar(sf,map,enc));
-}
-
-struct unicoderange specialnames[] = {
- { NULL, 0, 0, 0, 0, 0, 0 }
-};
-
-
-static SplineFont *_SFReadPostscript(FILE *file,char *filename) {
- FontDict *fd=NULL;
- SplineFont *sf=NULL;
-
- ff_progress_change_stages(2);
- fd = _ReadPSFont(file);
- ff_progress_next_stage();
- ff_progress_change_line2(_("Interpreting Glyphs"));
- if ( fd!=NULL ) {
- sf = SplineFontFromPSFont(fd);
- PSFontFree(fd);
- if ( sf!=NULL )
- CheckAfmOfPostscript(sf,filename,sf->map);
- }
-return( sf );
-}
-
-static SplineFont *SFReadPostscript(char *filename) {
- FontDict *fd=NULL;
- SplineFont *sf=NULL;
-
- ff_progress_change_stages(2);
- fd = ReadPSFont(filename);
- ff_progress_next_stage();
- ff_progress_change_line2(_("Interpreting Glyphs"));
- if ( fd!=NULL ) {
- sf = SplineFontFromPSFont(fd);
- PSFontFree(fd);
- if ( sf!=NULL )
- CheckAfmOfPostscript(sf,filename,sf->map);
- }
-return( sf );
-}
-
-
-struct compressors compressors[] = {
- { ".gz", "gunzip", "gzip" },
- { ".bz2", "bunzip2", "bzip2" },
- { ".bz", "bunzip2", "bzip2" },
- { ".Z", "gunzip", "compress" },
-/* file types which are both archived and compressed (.tgz, .zip) are handled */
-/* by the archiver above */
- { NULL, NULL, NULL }
-};
-
-char *Decompress(char *name, int compression) {
- char *dir = getenv("TMPDIR");
- char buf[1500];
- char *tmpfile;
-
- if ( dir==NULL ) dir = P_tmpdir;
- tmpfile = galloc(strlen(dir)+strlen(GFileNameTail(name))+2);
- strcpy(tmpfile,dir);
- strcat(tmpfile,"/");
- strcat(tmpfile,GFileNameTail(name));
- *strrchr(tmpfile,'.') = '\0';
-#if defined( _NO_SNPRINTF ) || defined( __VMS )
- sprintf( buf, "%s < %s > %s", compressors[compression].decomp, name, tmpfile );
-#else
- snprintf( buf, sizeof(buf), "%s < %s > %s", compressors[compression].decomp, name, tmpfile );
-#endif
- if ( system(buf)==0 )
-return( tmpfile );
- free(tmpfile);
-return( NULL );
-}
-
-static char *ForceFileToHaveName(FILE *file, char *exten) {
- char tmpfilename[L_tmpnam+100];
- static int try=0;
- FILE *newfile;
-
- forever {
- sprintf( tmpfilename, P_tmpdir "/fontforge%d-%d", getpid(), try++ );
- if ( exten!=NULL )
- strcat(tmpfilename,exten);
- if ( access( tmpfilename, F_OK )==-1 &&
- (newfile = fopen(tmpfilename,"w"))!=NULL ) {
- char buffer[1024];
- int len;
- while ( (len = fread(buffer,1,sizeof(buffer),file))>0 )
- fwrite(buffer,1,len,newfile);
- fclose(newfile);
- }
-return(copy(tmpfilename)); /* The filename does not exist */
- }
-}
-
-/* This does not check currently existing fontviews, and should only be used */
-/* by LoadSplineFont (which does) and by RevertFile (which knows what it's doing) */
-SplineFont *_ReadSplineFont(FILE *file,char *filename,enum openflags openflags) {
- SplineFont *sf;
- char ubuf[250], *temp;
- int fromsfd = false;
- int i;
- char *pt, *strippedname, *oldstrippedname, *tmpfile=NULL, *paren=NULL, *fullname=filename, *rparen;
- int len;
- int checked;
- int compression=0;
- int wasurl = false, nowlocal = true;
-
- if ( filename==NULL )
-return( NULL );
-
- strippedname = filename;
- pt = strrchr(filename,'/');
- if ( pt==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 ( (paren = strrchr(pt,'('))!=NULL &&
- (rparen = strrchr(paren,')'))!=NULL &&
- rparen[1]=='\0' ) {
- strippedname = copy(filename);
- strippedname[paren-filename] = '\0';
- }
-
- pt = strrchr(strippedname,'.');
-
- i = -1;
- if ( pt!=NULL ) for ( i=0; compressors[i].ext!=NULL; ++i )
- if ( strcmp(compressors[i].ext,pt)==0 )
- break;
- oldstrippedname = strippedname;
- if ( i==-1 || compressors[i].ext==NULL )
- i=-1;
- else {
- if ( file!=NULL ) {
- char *spuriousname = ForceFileToHaveName(file,compressors[i].ext);
- tmpfile = Decompress(spuriousname,i);
- fclose(file); file = NULL;
- unlink(spuriousname); free(spuriousname);
- } else
- tmpfile = Decompress(strippedname,i);
- if ( tmpfile!=NULL ) {
- strippedname = tmpfile;
- } else {
- ff_post_error(_("Decompress Failed!"),_("Decompress Failed!"));
-return( NULL );
- }
- compression = i+1;
- if ( strippedname!=filename && paren!=NULL ) {
- fullname = galloc(strlen(strippedname)+strlen(paren)+1);
- strcpy(fullname,strippedname);
- strcat(fullname,paren);
- } else
- fullname = strippedname;
- }
-
- /* If there are no pfaedit windows, give them something to look at */
- /* immediately. Otherwise delay a bit */
- strcpy(ubuf,_("Loading font from "));
- len = strlen(ubuf);
- if ( !wasurl || i==-1 ) /* If it wasn't compressed, or it wasn't an url, then the fullname is reasonable, else use the original name */
- strncat(ubuf,temp = copy(GFileNameTail(fullname)),100);
- else
- strncat(ubuf,temp = copy(GFileNameTail(filename)),100);
- free(temp);
- ubuf[100+len] = '\0';
- ff_progress_start_indicator(FontViewFirst()==NULL?0:10,_("Loading..."),ubuf,_("Reading Glyphs"),0,1);
- ff_progress_enable_stop(0);
-
- if ( file==NULL ) {
- file = fopen(strippedname,"rb");
- nowlocal = true;
- }
-
- sf = NULL;
- checked = false;
-/* checked == false => not checked */
-/* checked == 'u' => UFO */
-/* checked == 't' => TTF/OTF */
-/* checked == 'p' => pfb/general postscript */
-/* checked == 'P' => pdf */
-/* checked == 'c' => cff */
-/* checked == 'S' => svg */
-/* checked == 'f' => sfd */
-/* checked == 'F' => sfdir */
-/* checked == 'b' => bdf */
-/* checked == 'i' => ikarus */
- if ( file!=NULL ) {
- /* Try to guess the file type from the first few characters... */
- int ch1 = getc(file);
- int ch2 = getc(file);
- int ch3 = getc(file);
- int ch4 = getc(file);
- int ch9, ch10;
- fseek(file, 98, SEEK_SET);
- ch9 = getc(file);
- ch10 = getc(file);
- rewind(file);
- if (( ch1==0 && ch2==1 && ch3==0 && ch4==0 ) ||
- (ch1=='O' && ch2=='T' && ch3=='T' && ch4=='O') ||
- (ch1=='t' && ch2=='r' && ch3=='u' && ch4=='e') ||
- (ch1=='t' && ch2=='t' && ch3=='c' && ch4=='f') ) {
- sf = _SFReadTTF(file,0,openflags,fullname,NULL);
- checked = 't';
- } else if (( ch1=='%' && ch2=='!' ) ||
- ( ch1==0x80 && ch2=='\01' ) ) { /* PFB header */
- sf = _SFReadPostscript(file,fullname);
- checked = 'p';
- } else if ( ch1==1 && ch2==0 && ch3==4 ) {
- int len;
- fseek(file,0,SEEK_END);
- len = ftell(file);
- fseek(file,0,SEEK_SET);
- sf = _CFFParse(file,len,NULL);
- checked = 'c';
- } /* Too hard to figure out a valid mark for a mac resource file */
- if ( file!=NULL ) fclose(file);
- }
-
- if ( sf!=NULL )
- /* good */;
- else if (( strmatch(fullname+strlen(fullname)-4, ".ttf")==0 ||
- strmatch(fullname+strlen(strippedname)-4, ".ttc")==0 ||
- strmatch(fullname+strlen(fullname)-4, ".gai")==0 ||
- strmatch(fullname+strlen(fullname)-4, ".otf")==0 ||
- strmatch(fullname+strlen(fullname)-4, ".otb")==0 ) && checked!='t') {
- sf = SFReadTTF(fullname,0,openflags);
- } else if ( strmatch(fullname+strlen(strippedname)-4, ".bin")==0 ||
- strmatch(fullname+strlen(strippedname)-4, ".hqx")==0 ||
- strmatch(fullname+strlen(strippedname)-6, ".dfont")==0 ) {
- sf = SFReadMacBinary(fullname,0,openflags);
- } else if ( (strmatch(fullname+strlen(fullname)-4, ".pfa")==0 ||
- strmatch(fullname+strlen(fullname)-4, ".pfb")==0 ||
- strmatch(fullname+strlen(fullname)-4, ".pf3")==0 ||
- strmatch(fullname+strlen(fullname)-4, ".cid")==0 ||
- strmatch(fullname+strlen(fullname)-4, ".gsf")==0 ||
- strmatch(fullname+strlen(fullname)-4, ".pt3")==0 ||
- strmatch(fullname+strlen(fullname)-3, ".ps")==0 ) && checked!='p' ) {
- sf = SFReadPostscript(fullname);
- } else if ( strmatch(fullname+strlen(fullname)-4, ".cff")==0 && checked!='c' ) {
- sf = CFFParse(fullname);
- } else {
- sf = SFReadMacBinary(fullname,0,openflags);
- }
- ff_progress_end_indicator();
-
- if ( sf!=NULL ) {
- SplineFont *norm = sf->mm!=NULL ? sf->mm->normal : sf;
- if ( compression!=0 ) {
- free(sf->filename);
- *strrchr(oldstrippedname,'.') = '\0';
- sf->filename = copy( oldstrippedname );
- }
- if ( fromsfd )
- sf->compression = compression;
- free( norm->origname );
- if ( sf->chosenname!=NULL && strippedname==filename ) {
- norm->origname = galloc(strlen(filename)+strlen(sf->chosenname)+8);
- strcpy(norm->origname,filename);
- strcat(norm->origname,"(");
- strcat(norm->origname,sf->chosenname);
- strcat(norm->origname,")");
- } else
- norm->origname = copy(filename);
- free( norm->chosenname ); norm->chosenname = NULL;
- if ( sf->mm!=NULL ) {
- int j;
- for ( j=0; j<sf->mm->instance_count; ++j ) {
- free(sf->mm->instances[j]->origname);
- sf->mm->instances[j]->origname = copy(norm->origname);
- }
- }
- } else if ( !GFileExists(filename) )
- ff_post_error(_("Couldn't open font"),_("The requested file, %.100s, does not exist"),GFileNameTail(filename));
- else if ( !GFileReadable(filename) )
- ff_post_error(_("Couldn't open font"),_("You do not have permission to read %.100s"),GFileNameTail(filename));
- else
- ff_post_error(_("Couldn't open font"),_("%.100s is not in a known format (or is so badly corrupted as to be unreadable)"),GFileNameTail(filename));
-
- if ( oldstrippedname!=filename )
- free(oldstrippedname);
- if ( fullname!=filename && fullname!=strippedname )
- free(fullname);
- if ( tmpfile!=NULL ) {
- unlink(tmpfile);
- free(tmpfile);
- }
- if ( (openflags&of_fstypepermitted) && sf!=NULL && (sf->pfminfo.fstype&0xff)==0x0002 ) {
- /* Ok, they have told us from a script they have access to the font */
- } else if ( !fromsfd && sf!=NULL && (sf->pfminfo.fstype&0xff)==0x0002 ) {
- char *buts[3];
- buts[0] = _("_Yes"); buts[1] = _("_No"); buts[2] = NULL;
- if ( ff_ask(_("Restricted Font"),(const char **) buts,1,1,_("This font is marked with an FSType of 2 (Restricted\nLicense). That means it is not editable without the\npermission of the legal owner.\n\nDo you have such permission?"))==1 ) {
- SplineFontFree(sf);
-return( NULL );
- }
- }
-return( sf );
-}
-
-SplineFont *ReadSplineFont(char *filename,enum openflags openflags) {
-return( _ReadSplineFont(NULL,filename,openflags));
-}
-
-
-SplineFont *ReadSplineFontInfo(char *filename,enum openflags openflags) {
- SplineFont *sf, *sf_ptr;
- char **fontlist;
- char *pt =NULL, *strippedname=filename, *paren=NULL, *rparen=NULL, *fullname=filename;
- FILE *foo = NULL;
- int checked = 0;
- char s[512] = {0};
-
- if ( filename==NULL )
-return( NULL );
-
- pt = strrchr(filename,'/');
- if ( pt==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 ( (paren = strrchr(pt,'('))!=NULL &&
- (rparen = strrchr(paren,')'))!=NULL &&
- rparen[1]=='\0' ) {
- strippedname = copy(filename);
- strippedname[paren-filename] = '\0';
- }
-
- sf = NULL;
- foo = fopen(strippedname,"rb");
- checked = false;
- if ( foo!=NULL ) {
- /* Try to guess the file type from the first few characters... */
- int ch1 = getc(foo);
- int ch2 = getc(foo);
- int ch3 = getc(foo);
- int ch4 = getc(foo);
- fclose(foo);
- if (( ch1==0 && ch2==1 && ch3==0 && ch4==0 ) ||
- (ch1=='O' && ch2=='T' && ch3=='T' && ch4=='O') ||
- (ch1=='t' && ch2=='r' && ch3=='u' && ch4=='e') ) {
- sf = SFReadTTFInfo(fullname,0,openflags);
- checked = 't';
- } else if ((ch1=='t' && ch2=='t' && ch3=='c' && ch4=='f')) {
- char **old_fontlist;
- int i;
- /* read all fonts in a collection */
- fontlist = NamesReadTTF(fullname);
- old_fontlist = fontlist;
- if (fontlist) {
- while (*fontlist != NULL) {
- snprintf(s,511, "%s(%s)", fullname,*fontlist);
- sf_ptr = SFReadTTFInfo(s,0,openflags);
- if (sf != NULL)
- sf_ptr->next = sf;
- sf = sf_ptr;
- fontlist++;
- }
- /* fontlist is (g)allocated */
- fontlist = old_fontlist;
- for(i=0; fontlist[i]; i++)
- free(fontlist[i]);
- free(fontlist);
- old_fontlist = NULL;
- }
- } else if ( strmatch(fullname+strlen(strippedname)-4, ".bin")==0 ||
- strmatch(fullname+strlen(strippedname)-4, ".hqx")==0 ||
- strmatch(fullname+strlen(strippedname)-6, ".dfont")==0 ) {
- fontlist = NamesReadMacBinary(fullname);
- if (fontlist) {
- while (*fontlist != NULL) {
- snprintf(s,511, "%s(%s)", fullname,*fontlist);
- sf_ptr = SFReadMacBinaryInfo(s,0,openflags);
- if (sf != NULL)
- sf_ptr->next = sf;
- sf = sf_ptr;
- fontlist++;
- }
- }
- } else {
- sf = ReadSplineFont (fullname, openflags);
- }
- }
- if ( strippedname!=filename )
- free(strippedname);
-return( sf );
-}
-
-
-/* Use URW 4 letter abbreviations */
-char *knownweights[] = { "Demi", "Bold", "Regu", "Medi", "Book", "Thin",
- "Ligh", "Heav", "Blac", "Ultr", "Nord", "Norm", "Gras", "Stan", "Halb",
- "Fett", "Mage", "Mitt", "Buch", NULL };
-char *realweights[] = { "Demi", "Bold", "Regular", "Medium", "Book", "Thin",
- "Light", "Heavy", "Black", "Ultra", "Nord", "Normal", "Gras", "Standard", "Halbfett",
- "Fett", "Mager", "Mittel", "Buchschrift", NULL};
-static char *moreweights[] = { "ExtraLight", "VeryLight", NULL };
-char **noticeweights[] = { moreweights, realweights, knownweights, NULL };
-
-static char *modifierlist[] = { "Ital", "Obli", "Kursive", "Cursive", "Slanted",
- "Expa", "Cond", NULL };
-static char *modifierlistfull[] = { "Italic", "Oblique", "Kursive", "Cursive", "Slanted",
- "Expanded", "Condensed", NULL };
-static char **mods[] = { knownweights, modifierlist, NULL };
-static char **fullmods[] = { realweights, modifierlistfull, NULL };
-
-char *_GetModifiers(char *fontname, char *familyname,char *weight) {
- char *pt, *fpt;
- int i, j;
-
- /* URW fontnames don't match the familyname */
- /* "NimbusSanL-Regu" vs "Nimbus Sans L" (note "San" vs "Sans") */
- /* so look for a '-' if there is one and use that as the break point... */
-
- if ( (fpt=strchr(fontname,'-'))!=NULL ) {
- ++fpt;
- if ( *fpt=='\0' )
- fpt = NULL;
- } else if ( familyname!=NULL ) {
- for ( pt = fontname, fpt=familyname; *fpt!='\0' && *pt!='\0'; ) {
- if ( *fpt == *pt ) {
- ++fpt; ++pt;
- } else if ( *fpt==' ' )
- ++fpt;
- else if ( *pt==' ' )
- ++pt;
- else if ( *fpt=='a' || *fpt=='e' || *fpt=='i' || *fpt=='o' || *fpt=='u' )
- ++fpt; /* allow vowels to be omitted from family when in fontname */
- else
- break;
- }
- if ( *fpt=='\0' && *pt!='\0' )
- fpt = pt;
- else
- fpt = NULL;
- }
-
- if ( fpt == NULL ) {
- for ( i=0; mods[i]!=NULL; ++i ) for ( j=0; mods[i][j]!=NULL; ++j ) {
- pt = strstr(fontname,mods[i][j]);
- if ( pt!=NULL && (fpt==NULL || pt<fpt))
- fpt = pt;
- }
- }
- if ( fpt!=NULL ) {
- for ( i=0; mods[i]!=NULL; ++i ) for ( j=0; mods[i][j]!=NULL; ++j ) {
- if ( strcmp(fpt,mods[i][j])==0 )
-return( fullmods[i][j]);
- }
- if ( strcmp(fpt,"BoldItal")==0 )
-return( "BoldItalic" );
- else if ( strcmp(fpt,"BoldObli")==0 )
-return( "BoldOblique" );
-
-return( fpt );
- }
-
-return( weight==NULL || *weight=='\0' ? "Regular": weight );
-}
-
-char *SFGetModifiers(SplineFont *sf) {
-return( _GetModifiers(sf->fontname,sf->familyname,sf->weight));
-}
-