Back to index

radiance  4R0+20100331
Classes | Defines | Typedefs | Functions | Variables
text.c File Reference
#include "copyright.h"
#include "ray.h"
#include "paths.h"
#include "otypes.h"
#include "rtotypes.h"
#include "font.h"

Go to the source code of this file.

Classes

struct  tline
struct  TEXT

Defines

#define fndx(m)   ((m)->otype==MIX_TEXT ? 2 : 0)
#define tndx(m)   ((m)->otype==MIX_TEXT ? 3 : 1)
#define sndx(m)
#define TLSTR(l)   ((char *)((l)+1))
#define R   (tm->oargs.farg+3)
#define D   (tm->oargs.farg+6)

Typedefs

typedef struct tline TLINE

Functions

static TLINEtlalloc (char *s)
static TEXTgettext (OBJREC *tm)
static int intext (FVECT p, OBJREC *m)
static int inglyph (double x, double y, GLYPH *gl)
int do_text (register OBJREC *m, RAY *r)
static TEXTgettext (register OBJREC *tm)
void freetext (OBJREC *m)
static int inglyph (double x, double y, register GLYPH *gl)

Variables

static const char RCSid [] = "$Id: text.c,v 2.25 2004/03/30 16:13:01 schorsch Exp $"

Class Documentation

struct tline

Definition at line 64 of file text.c.

Collaboration diagram for tline:
Class Members
struct tline * next
short * spc
int width
struct TEXT

Definition at line 73 of file text.c.

Collaboration diagram for TEXT:
Class Members
FVECT down
FONT * f
FVECT right
TLINE tl

Define Documentation

#define D   (tm->oargs.farg+6)
#define fndx (   m)    ((m)->otype==MIX_TEXT ? 2 : 0)

Definition at line 59 of file text.c.

#define R   (tm->oargs.farg+3)
#define sndx (   m)
Value:
((m)->otype==PAT_BTEXT ? 11 : \
                            (m)->otype==PAT_CTEXT ? 15 : 9)

Definition at line 61 of file text.c.

#define TLSTR (   l)    ((char *)((l)+1))

Definition at line 71 of file text.c.

#define tndx (   m)    ((m)->otype==MIX_TEXT ? 3 : 1)

Definition at line 60 of file text.c.


Typedef Documentation

typedef struct tline TLINE

Function Documentation

int do_text ( register OBJREC m,
RAY r 
)

Definition at line 86 of file text.c.

{
       FVECT  v;
       int  foreground;
                            /* get transformed position */
       if (r->rox != NULL)
              multp3(v, r->rop, r->rox->b.xfm);
       else
              VCOPY(v, r->rop);
                            /* check if we are within a text glyph */
       foreground = intext(v, m);
                            /* modify */
       if (m->otype == MIX_TEXT) {
              OBJECT  omod;
              char  *modname = m->oargs.sarg[foreground ? 0 : 1];
              if (!strcmp(modname, VOIDID))
                     omod = OVOID;
              else if ((omod = lastmod(objndx(m), modname)) == OVOID) {
                     sprintf(errmsg, "undefined modifier \"%s\"", modname);
                     objerror(m, USER, errmsg);
              }
              if (rayshade(r, omod)) {
                     if (m->omod != OVOID)
                            objerror(m, USER, "inappropriate modifier");
                     return(1);
              }
       } else if (m->otype == PAT_BTEXT) {
              if (foreground)
                     scalecolor(r->pcol, m->oargs.farg[9]);
              else
                     scalecolor(r->pcol, m->oargs.farg[10]);
       } else { /* PAT_CTEXT */
              COLOR  cval;
              if (foreground)
                     setcolor(cval, m->oargs.farg[9],
                                   m->oargs.farg[10],
                                   m->oargs.farg[11]);
              else
                     setcolor(cval, m->oargs.farg[12],
                                   m->oargs.farg[13],
                                   m->oargs.farg[14]);
              multcolor(r->pcol, cval);
       }
       return(0);
}

Here is the call graph for this function:

void freetext ( OBJREC m)

Definition at line 249 of file text.c.

{
       register TEXT  *tp;
       register TLINE  *tlp;

       tp = (TEXT *)m->os;
       if (tp == NULL)
              return;
       while ((tlp = tp->tl.next) != NULL) {
              tp->tl.next = tlp->next;
              free((void *)tlp->spc);
              free((void *)tlp);
       }
       freefont(tp->f);     /* release font reference */
       free((void *)tp);
       m->os = NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static TEXT* gettext ( OBJREC tm) [static]

Here is the caller graph for this function:

static TEXT* gettext ( register OBJREC tm) [static]

Definition at line 155 of file text.c.

{
#define  R    (tm->oargs.farg+3)
#define  D    (tm->oargs.farg+6)
       FVECT  DxR;
       double  d;
       FILE  *fp;
       char  linbuf[512];
       TEXT  *t;
       register int  i;
       register TLINE  *tlp;
       register char  *s;

       if ((t = (TEXT *)tm->os) != NULL)
              return(t);
                                          /* check arguments */
       if (tm->oargs.nsargs - tndx(tm) < 1 || tm->oargs.nfargs < sndx(tm))
              objerror(tm, USER, "bad # arguments");
       if ((t = (TEXT *)malloc(sizeof(TEXT))) == NULL)
              error(SYSTEM, "out of memory in gettext");
                                          /* compute vectors */
       fcross(DxR, D, R);
       fcross(t->right, DxR, D);
       d = DOT(t->right,t->right);
       if (d <= FTINY*FTINY*FTINY*FTINY)
              objerror(tm, USER, "illegal motion vector");
       d = DOT(D,D)/d;
       for (i = 0; i < 3; i++)
              t->right[i] *= d;
       fcross(t->down, R, DxR);
       d = DOT(R,R)/DOT(t->down,t->down);
       for (i = 0; i < 3; i++)
              t->down[i] *= d;
                                          /* get text */
       tlp = &t->tl;
       if (tm->oargs.nsargs - tndx(tm) > 1) {    /* single line */
              s = linbuf;
              for (i = tndx(tm)+1; i < tm->oargs.nsargs; i++) {
                     strcpy(s, tm->oargs.sarg[i]);
                     s += strlen(s);
                     *s++ = ' ';
              }
              *--s = '\0';
              tlp->next = tlalloc(linbuf);
              tlp = tlp->next;
       } else {                           /* text file */
              if ((s = getpath(tm->oargs.sarg[tndx(tm)],
                            getrlibpath(), R_OK)) == NULL) {
                     sprintf(errmsg, "cannot find text file \"%s\"",
                                   tm->oargs.sarg[tndx(tm)]);
                     error(USER, errmsg);
              }
              if ((fp = fopen(s, "r")) == NULL) {
                     sprintf(errmsg, "cannot open text file \"%s\"", s);
                     error(SYSTEM, errmsg);
              }
              while (fgets(linbuf, sizeof(linbuf), fp) != NULL) {
                     s = linbuf + strlen(linbuf) - 1;
                     if (*s == '\n')
                            *s = '\0';
                     tlp->next = tlalloc(linbuf);
                     tlp = tlp->next;
              }
              fclose(fp);
       }
       tlp->next = NULL;
                                          /* get the font */
       t->f = getfont(tm->oargs.sarg[fndx(tm)]);
                                          /* compute character spacing */
       i = sndx(tm);
       d = i < tm->oargs.nfargs ? tm->oargs.farg[i] : 0.0;
       i = d * 255.0;
       t->tl.width = 0;
       for (tlp = t->tl.next; tlp != NULL; tlp = tlp->next) {
              if (i < 0)
                     tlp->width = squeeztext(tlp->spc, TLSTR(tlp), t->f, -i);
              else if (i > 0)
                     tlp->width = proptext(tlp->spc, TLSTR(tlp), t->f, i, 3);
              else
                     tlp->width = uniftext(tlp->spc, TLSTR(tlp), t->f);
              if (tlp->width > t->tl.width)
                     t->tl.width = tlp->width;
       }
                                          /* we're done */
       tm->os = (char *)t;
       return(t);
#undef  R
#undef  D
}

Here is the call graph for this function:

static int inglyph ( double  x,
double  y,
GLYPH gl 
) [static]

Here is the caller graph for this function:

static int inglyph ( double  x,
double  y,
register GLYPH gl 
) [static]

Definition at line 313 of file text.c.

{
       int  n, ncross;
       int  xlb, ylb;
       int  tv;
       register GORD  *p0, *p1;

       if (gl == NULL)
              return(0);
       xlb = x;
       ylb = y;
       if (gl->left > xlb || gl->right <= xlb || /* check extent */
                     gl->bottom > ylb || gl->top <= ylb)
              return(0);
       xlb = xlb<<1 | 1;           /* add 1/2 to test points... */
       ylb = ylb<<1 | 1;           /* ...so no equal comparisons */
       n = gl->nverts;                    /* get # of vertices */
       p0 = gvlist(gl) + 2*(n-1);  /* connect last to first */
       p1 = gvlist(gl);
       ncross = 0;
                                   /* positive x axis cross test */
       while (n--) {
              if ((p0[1]<<1 > ylb) ^ (p1[1]<<1 > ylb)) {
                     tv = (p0[0]<<1 > xlb) | ((p1[0]<<1 > xlb) << 1);
                     if (tv == 03)
                            ncross++;
                     else if (tv)
                            ncross += (p1[1] > p0[1]) ^
                                          ((p0[1]-y)*(p1[0]-x) >
                                          (p0[0]-x)*(p1[1]-y));
              }
              p0 = p1;
              p1 += 2;
       }
       return(ncross & 01);
}
static int intext ( FVECT  p,
OBJREC m 
) [static]

Definition at line 271 of file text.c.

{
       register TEXT  *tp;
       register TLINE  *tlp;
       FVECT  v;
       double  y, x;
       register int  i, h;
                            /* first, compute position in text */
       tp = gettext(m);
       v[0] = p[0] - m->oargs.farg[0];
       v[1] = p[1] - m->oargs.farg[1];
       v[2] = p[2] - m->oargs.farg[2];
       x = DOT(v, tp->right);
       i = sndx(m);
       if (i < m->oargs.nfargs)
              x *= tp->f->mwidth + 255.*fabs(m->oargs.farg[i]);
       else
              x *= 255.;
       h = x;
       i = y = DOT(v, tp->down);
       if (x < 0.0 || y < 0.0)
              return(0);
       x -= (double)h;
       y = ((i+1) - y)*255.;
                            /* find the line position */
       for (tlp = tp->tl.next; tlp != NULL; tlp = tlp->next)
              if (--i < 0)
                     break;
       if (tlp == NULL || h >= tlp->width)
              return(0);
       for (i = 0; (h -= tlp->spc[i]) >= 0; i++)
              if (h < 255 && inglyph(h+x, y,
                            tp->f->fg[TLSTR(tlp)[i]&0xff]))
                     return(1);
       return(0);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static TLINE * tlalloc ( char *  s) [static]

Definition at line 137 of file text.c.

{
       register int  siz;
       register TLINE  *tl;

       siz = strlen(s) + 1;
       if ((tl=(TLINE *)malloc(sizeof(TLINE)+siz)) == NULL ||
                     (tl->spc=(short *)malloc(siz*sizeof(short))) == NULL)
              error(SYSTEM, "out of memory in tlalloc");
       tl->next = NULL;
       strcpy(TLSTR(tl), s);
       return(tl);
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

const char RCSid[] = "$Id: text.c,v 2.25 2004/03/30 16:13:01 schorsch Exp $" [static]

Definition at line 2 of file text.c.