URI:
       tcircgen.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tcircgen.c (2651B)
       ---
            1 #include        <stdio.h>
            2 #include        "pic.h"
            3 #include        "y.tab.h"
            4 
            5 obj*
            6 circgen(int type)
            7 {
            8         static double rad[2] = { HT2, WID2 };
            9         static double rad2[2] = { HT2, HT2 };
           10         int i, at, t, with, battr;
           11         double xwith, ywith;
           12         double r, r2, ddval, fillval;
           13         obj *p, *ppos;
           14         Attr *ap;
           15 
           16         battr = at = 0;
           17         with = xwith = ywith = fillval = 0;
           18         t = (type == CIRCLE) ? 0 : 1;
           19         r = 0;
           20         r2 = 0;
           21         ddval = 0;
           22         if (type == CIRCLE)
           23                 r = r2 = getfval("circlerad");
           24         else if (type == ELLIPSE) {
           25                 r = getfval("ellipsewid") / 2;
           26                 r2 = getfval("ellipseht") / 2;
           27         }
           28         for (i = 0; i < nattr; i++) {
           29                 ap = &attr[i];
           30                 switch (ap->a_type) {
           31                 case TEXTATTR:
           32                         savetext(ap->a_sub, ap->a_val.p);
           33                         break;
           34                 case RADIUS:
           35                         r = ap->a_val.f;
           36                         break;
           37                 case DIAMETER:
           38                 case WIDTH:
           39                         r = ap->a_val.f / 2;
           40                         break;
           41                 case HEIGHT:
           42                         r2 = ap->a_val.f / 2;
           43                         break;
           44                 case SAME:
           45                         r = rad[t];
           46                         r2 = rad2[t];
           47                         break;
           48                 case WITH:
           49                         with = ap->a_val.i;
           50                         break;
           51                 case AT:
           52                         ppos = ap->a_val.o;
           53                         curx = ppos->o_x;
           54                         cury = ppos->o_y;
           55                         at++;
           56                         break;
           57                 case INVIS:
           58                         battr |= INVIS;
           59                         break;
           60                 case DOT:
           61                 case DASH:
           62                         battr |= ap->a_type==DOT ? DOTBIT : DASHBIT;
           63                         if (ap->a_sub == DEFAULT)
           64                                 ddval = getfval("dashwid");
           65                         else
           66                                 ddval = ap->a_val.f;
           67                         break;
           68                 case FILL:
           69                         battr |= FILLBIT;
           70                         if (ap->a_sub == DEFAULT)
           71                                 fillval = getfval("fillval");
           72                         else
           73                                 fillval = ap->a_val.f;
           74                         break;
           75                 }
           76         }
           77         if (type == CIRCLE)
           78                 r2 = r;        /* probably superfluous */
           79         if (with) {
           80                 switch (with) {
           81                 case NORTH:        ywith = -r2; break;
           82                 case SOUTH:        ywith = r2; break;
           83                 case EAST:        xwith = -r; break;
           84                 case WEST:        xwith = r; break;
           85                 case NE:        xwith = -r * 0.707; ywith = -r2 * 0.707; break;
           86                 case SE:        xwith = -r * 0.707; ywith = r2 * 0.707; break;
           87                 case NW:        xwith = r * 0.707; ywith = -r2 * 0.707; break;
           88                 case SW:        xwith = r * 0.707; ywith = r2 * 0.707; break;
           89                 }
           90                 curx += xwith;
           91                 cury += ywith;
           92         }
           93         if (!at) {
           94                 if (isright(hvmode))
           95                         curx += r;
           96                 else if (isleft(hvmode))
           97                         curx -= r;
           98                 else if (isup(hvmode))
           99                         cury += r2;
          100                 else
          101                         cury -= r2;
          102         }
          103         p = makenode(type, 2);
          104         p->o_val[0] = rad[t] = r;
          105         p->o_val[1] = rad2[t] = r2;
          106         if (r <= 0 || r2 <= 0) {
          107                 ERROR "%s has invalid radius %g\n", (type==CIRCLE) ? "circle" : "ellipse", r<r2 ? r : r2 WARNING;
          108         }
          109         p->o_attr = battr;
          110         p->o_ddval = ddval;
          111         p->o_fillval = fillval;
          112         extreme(curx+r, cury+r2);
          113         extreme(curx-r, cury-r2);
          114         if (type == CIRCLE)
          115                 dprintf("C %g %g %g\n", curx, cury, r);
          116         if (type == ELLIPSE)
          117                 dprintf("E %g %g %g %g\n", curx, cury, r, r2);
          118         if (isright(hvmode))
          119                 curx += r;
          120         else if (isleft(hvmode))
          121                 curx -= r;
          122         else if (isup(hvmode))
          123                 cury += r2;
          124         else
          125                 cury -= r2;
          126         return(p);
          127 }