convert line ends
[canaan.git] / prj / tech / libsrc / g2 / g2ring.c
blobadf9d904fcbac80efe6b891a43b8986b2c8aa514
1 /*
2 * $Source: x:/prj/tech/libsrc/g2/RCS/g2ring.c $
3 * $Revision: 1.2 $
4 * $Author: buzzard $
5 * $Date: 1997/10/31 17:49:41 $
6 */
8 #include <dev2d.h>
9 #include <buffer.h>
10 #include <rastel.h>
12 bool gd_secret_hack_nest_rings;
14 int g2_ring (fix x0, fix y0, fix co, fix ci)
16 grs_raster *r0, *r, *r0i, *ri;
17 int y, y_max;
18 int y_in_min, y_in_max;
19 fix a_o, b_o, a_i, b_i;
20 gdulin_func *uhline_func;
22 if (co < ci) {
23 fix foo=co;
24 co=ci;
25 ci=foo;
28 a_o = co*grd_bm.w;
29 a_i = ci*grd_bm.w;
30 b_o = fix_div(a_o, grd_cap->aspect);
31 b_i = fix_div(a_i, grd_cap->aspect);
33 r0 = gr_rasterize_fix_elipse(x0, y0, a_o, b_o);
34 if (r0==NULL)
35 return CLIP_ALL;
36 uhline_func=gd_uhline_expose(0,0,0);
37 y = r0->top;
38 y_max = r0->bot;
39 r = r0+1;
40 r0i = gr_rasterize_fix_elipse(x0, y0, a_i, b_i);
41 if (r0i!=NULL) {
42 y_in_min = r0i->top;
43 y_in_max = r0i->bot;
44 ri = r0i+1;
45 while (y < y_in_min) {
46 gd_hline_opt(r->left, y, r->right, uhline_func);
47 y++;
48 r++;
50 if (gd_secret_hack_nest_rings) {
51 while (y < y_in_max) {
52 gd_hline_opt(r->left, y, ri->left-1, uhline_func);
53 gd_hline_opt(ri->right+1, y, r->right, uhline_func);
54 ++y;
55 ++r;
56 ++ri;
58 } else {
59 // make sure we don't have any dropouts/gaps in the ring,
60 // since while that might be "correct" it will show our
61 // horizontal scan bias
63 int xl,xll,xln,xli;
64 int xr,xrl,xrn,xri;
65 xl=r->left;
66 xr=r->right;
67 if (r==r0+1) {
68 xll=xr+1;
69 xrl=xl-1;
70 } else {
71 xll=(r-1)->left;
72 xrl=(r-1)->right;
74 if (y_in_max == y_max)
75 y_in_max--;
76 while (y < y_in_max) {
77 xln = (r+1)->left;
78 xrn = (r+1)->right;
79 xli = ri->left;
80 xri = ri->right;
81 if (xli < xln)
82 xli = xln-1;
83 if (xli < xll)
84 xli = xll-1;
85 if (xri > xrn)
86 xri = xrn+1;
87 if (xri > xrl)
88 xri = xrl+1;
89 if (xri <= xli) {
90 gd_hline_opt(r->left, y, r->right, uhline_func);
91 } else {
92 gd_hline_opt(r->left, y, xli, uhline_func);
93 gd_hline_opt(xri, y, r->right, uhline_func);
95 xll = xl;
96 xrl = xr;
97 xl = xln;
98 xr = xrn;
99 y++;
100 r++;
101 ri++;
104 gr_free_temp(r0i);
106 while (y < y_max) {
107 gd_hline_opt(r->left, y, r->right, uhline_func);
108 y++;
109 r++;
111 gr_free_temp(r0);
112 return CLIP_NONE;