--- ray/src/common/font.c 2003/02/22 02:07:22 2.12 +++ ray/src/common/font.c 2022/02/02 00:03:40 2.26 @@ -1,90 +1,39 @@ #ifndef lint -static const char RCSid[] = "$Id: font.c,v 2.12 2003/02/22 02:07:22 greg Exp $"; +static const char RCSid[] = "$Id: font.c,v 2.26 2022/02/02 00:03:40 greg Exp $"; #endif /* * Polygonal font handling routines */ -/* ==================================================================== - * The Radiance Software License, Version 1.0 - * - * Copyright (c) 1990 - 2002 The Regents of the University of California, - * through Lawrence Berkeley National Laboratory. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. 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. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes Radiance software - * (http://radsite.lbl.gov/) - * developed by the Lawrence Berkeley National Laboratory - * (http://www.lbl.gov/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" - * and "The Regents of the University of California" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact radiance@radsite.lbl.gov. - * - * 5. Products derived from this software may not be called "Radiance", - * nor may "Radiance" appear in their name, without prior written - * permission of Lawrence Berkeley National Laboratory. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 Lawrence Berkeley National Laboratory OR - * ITS CONTRIBUTORS 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. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of Lawrence Berkeley National Laboratory. For more - * information on Lawrence Berkeley National Laboratory, please see - * . - */ +#include "copyright.h" -#include "standard.h" +#include +#include "paths.h" +#include "rtio.h" +#include "rterror.h" #include "font.h" #define galloc(nv) (GLYPH *)malloc(sizeof(GLYPH)+2*sizeof(GORD)*(nv)) - int retainfonts = 0; /* retain loaded fonts? */ static FONT *fontlist = NULL; /* list of loaded fonts */ FONT * -getfont(fname) /* return font fname */ -char *fname; +getfont( /* return font fname */ + char *fname +) { + char embuf[512]; FILE *fp; - char *pathname, *err; + char *pathname, *err = NULL; unsigned wsum, hsum, ngly; int gn, ngv, gv; - register GLYPH *g; + GLYPH *g; GORD *gp; - register FONT *f; + FONT *f; for (f = fontlist; f != NULL; f = f->next) if (!strcmp(f->name, fname)) { @@ -92,20 +41,21 @@ char *fname; return(f); } /* load the font file */ - if ((pathname = getpath(fname, getlibpath(), R_OK)) == NULL) { - sprintf(errmsg, "cannot find font file \"%s\"", fname); - error(USER, errmsg); + if ((pathname = getpath(fname, getrlibpath(), R_OK)) == NULL) { + sprintf(embuf, "cannot find font file \"%s\"\n", fname); + eputs(embuf); + return(NULL); } + if ((fp = fopen(pathname, "r")) == NULL) { + sprintf(embuf, "cannot open font file \"%s\"\n", pathname); + eputs(embuf); + return(NULL); + } f = (FONT *)calloc(1, sizeof(FONT)); if (f == NULL) goto memerr; - f->name = savestr(fname); + strcpy(f->name, fname); f->nref = 1; - if ((fp = fopen(pathname, "r")) == NULL) { - sprintf(errmsg, "cannot open font file \"%s\"", - pathname); - error(SYSTEM, errmsg); - } wsum = hsum = ngly = 0; /* get each glyph */ while ((ngv = fgetval(fp, 'i', (char *)&gn)) != EOF) { if (ngv == 0) @@ -123,6 +73,8 @@ char *fname; err = "bad # vertices for"; goto fonterr; } + if (ngv > f->maxgv) + f->maxgv = ngv; g = galloc(ngv); if (g == NULL) goto memerr; @@ -164,36 +116,42 @@ char *fname; f->next = fontlist; return(fontlist = f); nonint: - sprintf(errmsg, "non-integer in font file \"%s\"", pathname); - error(USER, errmsg); + sprintf(embuf, "non-integer in font file \"%s\"\n", pathname); + eputs(embuf); + fclose(fp); + return(NULL); fonterr: - sprintf(errmsg, "%s character (%d) in font file \"%s\"", + sprintf(embuf, "%s character (%d) in font file \"%s\"\n", err, gn, pathname); - error(USER, errmsg); + eputs(embuf); + fclose(fp); + return(NULL); memerr: - error(SYSTEM, "out of memory in fontglyph"); + eputs("out of memory in getfont()\n"); + fclose(fp); + return(NULL); } void -freefont(fnt) /* release a font (free all if NULL) */ -FONT *fnt; +freefont( /* release a font (free all if NULL) */ + FONT *fnt +) { FONT head; - register FONT *fl, *f; - register int i; + FONT *fl, *f; + int i; /* check reference count */ - if (fnt != NULL && (fnt->nref-- > 1 | retainfonts)) + if (fnt != NULL && ((fnt->nref -= (f->nref > 0)) | retainfonts)) return; head.next = fontlist; fl = &head; while ((f = fl->next) != NULL) - if ((fnt == NULL | fnt == f)) { + if ((fnt == NULL) | (fnt == f)) { fl->next = f->next; for (i = 0; i < 256; i++) if (f->fg[i] != NULL) free((void *)f->fg[i]); - freestr(f->name); free((void *)f); } else fl = f; @@ -202,10 +160,11 @@ FONT *fnt; int -uniftext(sp, tp, f) /* uniformly space text line */ -register short *sp; /* returned character spacing */ -register char *tp; /* text line */ -register FONT *f; /* font */ +uniftext( /* uniformly space text line */ + short *sp, /* returned character spacing */ + char *tp, /* text line */ + FONT *f /* font */ +) { int linelen; @@ -220,14 +179,15 @@ register FONT *f; /* font */ int -squeeztext(sp, tp, f, cis) /* squeeze text line */ -short *sp; /* returned character spacing */ -char *tp; /* text line */ -FONT *f; /* font */ -int cis; /* intercharacter spacing */ +squeeztext( /* squeeze text line */ + short *sp, /* returned character spacing */ + char *tp, /* text line */ + FONT *f, /* font */ + int cis /* intercharacter spacing */ +) { int linelen; - register GLYPH *gp; + GLYPH *gp; linelen = 0; gp = NULL; @@ -255,14 +215,15 @@ int cis; /* intercharacter spacing */ int -proptext(sp, tp, f, cis, nsi) /* space line proportionally */ -short *sp; /* returned character spacing */ -char *tp; /* text line */ -FONT *f; /* font */ -int cis; /* target intercharacter spacing */ -int nsi; /* minimum number of spaces for indent */ +proptext( /* space line proportionally */ + short *sp, /* returned character spacing */ + char *tp, /* text line */ + FONT *f, /* font */ + int cis, /* target intercharacter spacing */ + int nsi /* minimum number of spaces for indent */ +) { - register char *end, *tab; + char *end, *tab = NULL; GLYPH *gp; short *nsp; int alen, len, width;