Subversion Repositories wimsdev

Rev

Rev 8103 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*    Copyright (C) 2002-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis
  2.  *
  3.  *  This program is free software; you can redistribute it and/or modify
  4.  *  it under the terms of the GNU General Public License as published by
  5.  *  the Free Software Foundation; either version 2 of the License, or
  6.  *  (at your option) any later version.
  7.  *
  8.  *  This program is distributed in the hope that it will be useful,
  9.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.  *  GNU General Public License for more details.
  12.  *
  13.  *  You should have received a copy of the GNU General Public License
  14.  *  along with this program; if not, write to the Free Software
  15.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16.  */
  17.  
  18. /* tex 2 gif translator, font loader */
  19. #include "texgif.h"
  20.  
  21. void mf2font(char *fontname, int density)
  22. {
  23.     loadtfm(fontname);
  24.     makegf(fontname,density);
  25.     loadgf(fontname,density);
  26.     gf2font(fontname,density);
  27. }
  28.  
  29. FONT *loadfont(char *fname, int checksum, int density, FONT *ft)
  30. {
  31.     char namebuf[2048];
  32.     char *fcache, *cc;
  33.     long int l,l2;
  34.     FILE *f;
  35.     int newfont;
  36.  
  37.     newfont=0;
  38.     for(cc=fname; isalnum(*cc); cc++);
  39.     if(*cc!=0) texgif_error("Bad font name.");
  40.     snprintf(namebuf,sizeof(namebuf),"%s/%d/%s.font",fontdir,density,fname);
  41.     f=fopen(namebuf,"r"); if(f==NULL) {
  42.         renewfont: mf2font(fname,density);
  43.         f=fopen(namebuf,"r"); newfont=1;
  44.     }
  45.     if(f==NULL) return NULL;
  46.     fseek(f,0,SEEK_END); l=ftell(f); fseek(f,0,SEEK_SET);
  47.     if(l<=0 || l>FILE_LENGTH_LIMIT) return NULL;
  48.     fcache=xmalloc(l+16);
  49.     l2=fread(fcache,1,l,f); if(l2!=l) {
  50.         texgif_error("Error reading font file.");
  51.     }
  52.     memmove(&ft->checksum,fcache,sizeof(int));
  53.     memmove(&ft->designsize,fcache+sizeof(int),sizeof(int));
  54.     memmove(&ft->bc,fcache+2*sizeof(int),sizeof(int));
  55.     memmove(&ft->ec,fcache+3*sizeof(int),sizeof(int));
  56.     ft->cnt=ft->ec-ft->bc+1;
  57.     cc=fcache+4*sizeof(int); ft->fh=(FONTHEADER *) cc;
  58.     ft->data=fcache+4*sizeof(int)+ft->cnt*sizeof(FONTHEADER);
  59.     ft->cache=fcache;
  60.     fclose(f);
  61.     if(checksum!=ft->checksum && checksum!=0 && ft->checksum!=0) {
  62.         if(newfont) {
  63.             fprintf(stderr,"%08X != %08X\n",checksum, ft->checksum);
  64.             texgif_error("Font checksum discord.");
  65.         }
  66.         free(fcache); unlink(namebuf); goto renewfont;
  67.     }
  68.     return ft;
  69. }
  70.  
  71.