cd7f59d04508c4e3e6eac11c827d0975d312a1c8
[btb/d2x.git] / 2d / circle.c
1 /* $Id: circle.c,v 1.4 2002-10-10 18:55:32 btb Exp $ */
2 /*
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
13 */
14
15 #ifdef HAVE_CONFIG_H
16 #include <conf.h>
17 #endif
18
19 #ifdef RCS
20 static char rcsid[] = "$Id: circle.c,v 1.4 2002-10-10 18:55:32 btb Exp $";
21 #endif
22
23 #include "u_mem.h"
24
25 #include "gr.h"
26 #include "grdef.h"
27
28 #ifndef OGL
29
30 int gr_circle(fix xc1,fix yc1,fix r1)
31 {
32         int p,x, y, xc, yc, r;
33
34         r = f2i(r1);
35         xc = f2i(xc1);
36         yc = f2i(yc1);
37         p=3-(r*2);
38         x=0;
39         y=r;
40
41         // Big clip
42         if ( (xc+r) < 0 ) return 1;
43         if ( (xc-r) > GWIDTH ) return 1;
44         if ( (yc+r) < 0 ) return 1;
45         if ( (yc-r) > GHEIGHT ) return 1;
46
47         while(x<y)
48         {
49                 // Draw the first octant
50                 gr_pixel( xc-y, yc-x );
51                 gr_pixel( xc+y, yc-x );
52                 gr_pixel( xc-y, yc+x );
53                 gr_pixel( xc+y, yc+x );
54
55                 if (p<0)
56                         p=p+(x<<2)+6;
57                 else {
58                         // Draw the second octant
59                         gr_pixel( xc-x, yc-y );
60                         gr_pixel( xc+x, yc-y );
61                         gr_pixel( xc-x, yc+y );
62                         gr_pixel( xc+x, yc+y );
63                         p=p+((x-y)<<2)+10;
64                         y--;
65                 }
66                 x++;
67         }
68         if(x==y) {
69                 gr_pixel( xc-x, yc-y );
70                 gr_pixel( xc+x, yc-y );
71                 gr_pixel( xc-x, yc+y );
72                 gr_pixel( xc+x, yc+y );
73         }
74         return 0;
75 }
76
77 int gr_ucircle(fix xc1,fix yc1,fix r1)
78 {
79         int p,x, y, xc, yc, r;
80
81         r = f2i(r1);
82         xc = f2i(xc1);
83         yc = f2i(yc1);
84         p=3-(r*2);
85         x=0;
86         y=r;
87
88         while(x<y)
89         {
90                 // Draw the first octant
91                 gr_upixel( xc-y, yc-x );
92                 gr_upixel( xc+y, yc-x );
93                 gr_upixel( xc-y, yc+x );
94                 gr_upixel( xc+y, yc+x );
95
96                 if (p<0)
97                         p=p+(x<<2)+6;
98                 else {
99                         // Draw the second octant
100                         gr_upixel( xc-x, yc-y );
101                         gr_upixel( xc+x, yc-y );
102                         gr_upixel( xc-x, yc+y );
103                         gr_upixel( xc+x, yc+y );
104                         p=p+((x-y)<<2)+10;
105                         y--;
106                 }
107                 x++;
108         }
109         if(x==y) {
110                 gr_upixel( xc-x, yc-y );
111                 gr_upixel( xc+x, yc-y );
112                 gr_upixel( xc-x, yc+y );
113                 gr_upixel( xc+x, yc+y );
114         }
115         return 0;
116 }
117
118 #endif //!OGL