--- ray/src/common/font.c 2003/02/22 02:07:22 2.12
+++ ray/src/common/font.c 2021/11/20 15:53:24 2.23
@@ -1,90 +1,38 @@
#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.23 2021/11/20 15:53:24 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
+)
{
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 +40,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(errmsg, "cannot find font file \"%s\"\n", fname);
+ eputs(errmsg);
+ return(NULL);
}
+ if ((fp = fopen(pathname, "r")) == NULL) {
+ sprintf(errmsg, "cannot open font file \"%s\"\n", pathname);
+ eputs(errmsg);
+ 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)
@@ -164,36 +113,42 @@ char *fname;
f->next = fontlist;
return(fontlist = f);
nonint:
- sprintf(errmsg, "non-integer in font file \"%s\"", pathname);
- error(USER, errmsg);
+ sprintf(errmsg, "non-integer in font file \"%s\"\n", pathname);
+ eputs(errmsg);
+ fclose(fp);
+ return(NULL);
fonterr:
- sprintf(errmsg, "%s character (%d) in font file \"%s\"",
+ sprintf(errmsg, "%s character (%d) in font file \"%s\"\n",
err, gn, pathname);
- error(USER, errmsg);
+ eputs(errmsg);
+ 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-- > 1) | 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 +157,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 +176,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 +212,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;