|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 3319 (0xcf7) Types: TextFile Names: »sun_ellipse.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12 └─⟦af5ba6c8e⟧ »unix3.0/DVIWARE.tar.Z« └─⟦ca79c7339⟧ └─⟦this⟧ »DVIware/crt-viewers/sunview/dvisun/sun_ellipse.c«
/* Fast circle/ellipse generator for SUNs */ #include <sunwindow/window_hs.h> extern char *malloc(); extern int draw_mode, pen_size; extern struct pixrect *display; static struct precomputed { int xradius, yradius; /* Size of object (circle/ellipse) */ int pen_size; /* Size of pen used for this ellipse */ struct pixrect *pr; /* Data for display */ struct precomputed *next; /* Link to next in list */ } ellipses; #define panic(msg) Fatal(msg) /* Create a new precomputed object */ static struct precomputed *new_precomputed() { struct precomputed *result; result = (struct precomputed *) malloc(sizeof(struct precomputed)); if (!result) panic("Out of memory"); return(result); } static int cirpx[]={999, 996, 984, 965, 938, 905, 864, 819, 768, 713, 655, 594, 531, 470, 407, 346, 288, 233, 182, 137, 96, 63, 36, 17, 5, 1, 5, 17, 36, 63, 96, 137, 182, 233, 288, 346, 407, 470, 531, 594, 655, 713, 768, 819, 864, 905, 938, 965, 984, 994, 999}; static float cirpy[]={530, 563, 624, 684, 741, 794, 842, 885, 922, 952, 976, 991, 999, 999, 991, 976, 952, 922, 885, 842, 794, 741, 684, 624, 563, 500, 438, 377, 317, 260, 207, 159, 116, 79, 49, 25, 10, 1, 1, 10, 25, 49, 79, 116, 159, 207, 260, 317, 377, 438, 470}; /* Draw a line of the correct thickness between the indicated points */ static void line_btw(pr, x0, y0, x1, y1) struct pixrect *pr; int x0, y0, x1, y1; { register int i; for (i=0; i<pen_size; i++) { pr_vector(pr, x0, y0, x1, y1, PIX_SRC, 1); if (abs(y1-y0) > abs(x1-x0)) { ++x0; ++x1; } else { ++y0; ++y1; } } } /* Make an ellipse and return its pixrect */ static struct pixrect *make_ellipse(xrad, yrad) int xrad, yrad; { struct pixrect *pr; register int i, lastx, lasty, curx, cury; int zerox, zeroy, istep, imax; pr = mem_create(xrad*2+1, yrad*2+1, 1); if (!pr) panic("Out of memory"); imax = sizeof(cirpx) / sizeof(cirpx[0]) - 1; zerox = lastx = (cirpx[0]*xrad + 250) / 500; zeroy = lasty = (cirpy[0]*yrad + 250) / 500; if (xrad < 76 && yrad < 76) istep = 2; else istep = 1; for (i=1; i<imax; i += istep) { curx = (cirpx[i]*xrad + 250) / 500; cury = (cirpy[i]*yrad + 250) / 500; line_btw(pr, lastx, lasty, curx, cury); lastx = curx; lasty = cury; } line_btw(pr, lastx, lasty, zerox, zeroy); return(pr); } /* Draw a circle at the current location. Arguments are in pixels. */ void sun_draw_ellipse(x, y, xrad, yrad) int x, y, xrad, yrad; { register struct precomputed *p, *prev; register struct pixrect *pr; prev = &ellipses; for (p = prev->next; p && p->xradius < xrad; p = p->next) prev = p; while (p && p->xradius == xrad && p->yradius < yrad) { prev = p; p = p->next; } while (p && p->xradius == xrad && p->yradius == yrad && p->pen_size < pen_size) { prev = p; p = p->next; } if (!p || p->xradius != xrad || p->yradius != yrad || p->pen_size != pen_size) { p = new_precomputed(); p->pr = make_ellipse(xrad, yrad); p->xradius = xrad; p->yradius = yrad; p->pen_size = pen_size; p->next = prev->next; prev->next = p; } pr = p->pr; pr_rop(display, x-xrad, y-yrad, pr->pr_width, pr->pr_height, draw_mode, pr, 0, 0); }