tboxgen.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tboxgen.c (2309B)
       ---
            1 #include        <stdio.h>
            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 }