/* Copyright (C) 2002-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* tex 2 gif translator, font loader */
void mf2font(char *fontname, int density)
{
loadtfm(fontname);
makegf(fontname,density);
loadgf(fontname,density);
gf2font(fontname,density);
}
FONT *loadfont(char *fname, int checksum, int density, FONT *ft)
{
char namebuf[2048];
char *fcache, *cc;
long int l,l2;
FILE *f;
int newfont;
newfont=0;
if(*cc!=0) error("Bad font name.");
snprintf(namebuf
,sizeof(namebuf
),"%s/%d/%s.font",fontdir
,density
,fname
);
f
=fopen(namebuf
,"r"); if(f
==NULL
) {
renewfont: mf2font(fname,density);
f
=fopen(namebuf
,"r"); newfont
=1;
}
if(f==NULL) return NULL;
if(l<=0 || l>FILE_LENGTH_LIMIT) return NULL;
fcache=xmalloc(l+16);
l2
=fread(fcache
,1,l
,f
); if(l2
!=l
) {
error("Error reading font file.");
}
memmove(&ft
->checksum
,fcache
,sizeof(int));
memmove(&ft
->designsize
,fcache
+sizeof(int),sizeof(int));
memmove(&ft
->bc
,fcache
+2*sizeof(int),sizeof(int));
memmove(&ft
->ec
,fcache
+3*sizeof(int),sizeof(int));
ft->cnt=ft->ec-ft->bc+1;
cc=fcache+4*sizeof(int); ft->fh=(FONTHEADER *) cc;
ft->data=fcache+4*sizeof(int)+ft->cnt*sizeof(FONTHEADER);
ft->cache=fcache;
if(checksum!=ft->checksum && checksum!=0 && ft->checksum!=0) {
if(newfont) {
fprintf(stderr
,"%08X != %08X\n",checksum
, ft
->checksum
);
error("Font checksum discord.");
}
free(fcache
); unlink
(namebuf
); goto renewfont
;
}
return ft;
}