tboxgen.c - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
tboxgen.c (2309B)
---
     1 #include        
     2 #include        "pic.h"
     3 #include        "y.tab.h"
     4 
     5 obj *boxgen(void)
     6 {
     7         static double prevh = HT;
     8         static double prevw = WID;        /* golden mean, sort of */
     9         int i, at, battr, with;
    10         double ddval, fillval, xwith, ywith;
    11         double h, w, x0, y0, x1, y1;
    12         obj *p, *ppos;
    13         Attr *ap;
    14 
    15         h = getfval("boxht");
    16         w = getfval("boxwid");
    17         at = battr = with = 0;
    18         ddval = fillval = xwith = ywith = 0;
    19         for (i = 0; i < nattr; i++) {
    20                 ap = &attr[i];
    21                 switch (ap->a_type) {
    22                 case HEIGHT:
    23                         h = ap->a_val.f;
    24                         break;
    25                 case WIDTH:
    26                         w = ap->a_val.f;
    27                         break;
    28                 case SAME:
    29                         h = prevh;
    30                         w = prevw;
    31                         break;
    32                 case WITH:
    33                         with = ap->a_val.i;        /* corner */
    34                         break;
    35                 case AT:
    36                         ppos = ap->a_val.o;
    37                         curx = ppos->o_x;
    38                         cury = ppos->o_y;
    39                         at++;
    40                         break;
    41                 case INVIS:
    42                         battr |= INVIS;
    43                         break;
    44                 case NOEDGE:
    45                         battr |= NOEDGEBIT;
    46                         break;
    47                 case DOT:
    48                 case DASH:
    49                         battr |= ap->a_type==DOT ? DOTBIT : DASHBIT;
    50                         if (ap->a_sub == DEFAULT)
    51                                 ddval = getfval("dashwid");
    52                         else
    53                                 ddval = ap->a_val.f;
    54                         break;
    55                 case FILL:
    56                         battr |= FILLBIT;
    57                         if (ap->a_sub == DEFAULT)
    58                                 fillval = getfval("fillval");
    59                         else
    60                                 fillval = ap->a_val.f;
    61                         break;
    62                 case TEXTATTR:
    63                         savetext(ap->a_sub, ap->a_val.p);
    64                         break;
    65                 }
    66         }
    67         if (with) {
    68                 switch (with) {
    69                 case NORTH:        ywith = -h / 2; break;
    70                 case SOUTH:        ywith = h / 2; break;
    71                 case EAST:        xwith = -w / 2; break;
    72                 case WEST:        xwith = w / 2; break;
    73                 case NE:        xwith = -w / 2; ywith = -h / 2; break;
    74                 case SE:        xwith = -w / 2; ywith = h / 2; break;
    75                 case NW:        xwith = w / 2; ywith = -h / 2; break;
    76                 case SW:        xwith = w / 2; ywith = h / 2; break;
    77                 }
    78                 curx += xwith;
    79                 cury += ywith;
    80         }
    81         if (!at) {
    82                 if (isright(hvmode))
    83                         curx += w / 2;
    84                 else if (isleft(hvmode))
    85                         curx -= w / 2;
    86                 else if (isup(hvmode))
    87                         cury += h / 2;
    88                 else
    89                         cury -= h / 2;
    90         }
    91         x0 = curx - w / 2;
    92         y0 = cury - h / 2;
    93         x1 = curx + w / 2;
    94         y1 = cury + h / 2;
    95         extreme(x0, y0);
    96         extreme(x1, y1);
    97         p = makenode(BOX, 2);
    98         p->o_val[0] = w;
    99         p->o_val[1] = h;
   100         p->o_attr = battr;
   101         p->o_ddval = ddval;
   102         p->o_fillval = fillval;
   103         dprintf("B %g %g %g %g at %g %g, h=%g, w=%g\n", x0, y0, x1, y1, curx, cury, h, w);
   104         if (isright(hvmode))
   105                 curx = x1;
   106         else if (isleft(hvmode))
   107                 curx = x0;
   108         else if (isup(hvmode))
   109                 cury = y1;
   110         else
   111                 cury = y0;
   112         prevh = h;
   113         prevw = w;
   114         return(p);
   115 }