xref: /PHP-7.0/ext/gd/libgd/gd_arc.c (revision ba7c3a1b)
1 #if HAVE_GD_BUNDLED
2 # include "gd.h"
3 #else
4 # include <gd.h>
5 #endif
6 
7 #include "gd_intern.h"
8 
9 
10 /**
11  * Integer Ellipse functions (gdImageEllipse and gdImageFilledEllipse)
12  * Function added by Pierre-Alain Joye 02/08/2003 (paj@pearfr.org)
13  * See the ellipse function simplification for the equation
14  * as well as the midpoint algorithm.
15  */
16 
gdImageEllipse(gdImagePtr im,int mx,int my,int w,int h,int c)17 void gdImageEllipse(gdImagePtr im, int mx, int my, int w, int h, int c)
18 {
19 	int x=0,mx1=0,mx2=0,my1=0,my2=0;
20 	long aq,bq,dx,dy,r,rx,ry,a,b;
21 
22 	a=w>>1;
23 	b=h>>1;
24 	gdImageSetPixel(im,mx+a, my, c);
25 	gdImageSetPixel(im,mx-a, my, c);
26 	mx1 = mx-a;my1 = my;
27 	mx2 = mx+a;my2 = my;
28 
29 	aq = a * a;
30 	bq = b * b;
31 	dx = aq << 1;
32 	dy = bq << 1;
33 	r  = a * bq;
34 	rx = r << 1;
35 	ry = 0;
36 	x = a;
37 	while (x > 0){
38 		if (r > 0) {
39 			my1++;my2--;
40 			ry +=dx;
41 			r  -=ry;
42 		}
43 		if (r <= 0){
44 			x--;
45 			mx1++;mx2--;
46 			rx -=dy;
47 			r  +=rx;
48 		}
49 		gdImageSetPixel(im,mx1, my1, c);
50 		gdImageSetPixel(im,mx1, my2, c);
51 		gdImageSetPixel(im,mx2, my1, c);
52 		gdImageSetPixel(im,mx2, my2, c);
53 	}
54 }
55 
gdImageFilledEllipse(gdImagePtr im,int mx,int my,int w,int h,int c)56 void gdImageFilledEllipse (gdImagePtr im, int mx, int my, int w, int h, int c)
57 {
58 	int x=0,mx1=0,mx2=0,my1=0,my2=0;
59 	long aq,bq,dx,dy,r,rx,ry,a,b;
60 	int i;
61 	int old_y2;
62 
63 	a=w>>1;
64 	b=h>>1;
65 
66 	for (x = mx-a; x <= mx+a; x++) {
67 		gdImageSetPixel(im, x, my, c);
68 	}
69 
70 	mx1 = mx-a;my1 = my;
71 	mx2 = mx+a;my2 = my;
72 
73 	aq = a * a;
74 	bq = b * b;
75 	dx = aq << 1;
76 	dy = bq << 1;
77 	r  = a * bq;
78 	rx = r << 1;
79 	ry = 0;
80 	x = a;
81 	old_y2=-2;
82 	while (x > 0){
83 		if (r > 0) {
84 			my1++;my2--;
85 			ry +=dx;
86 			r  -=ry;
87 		}
88 		if (r <= 0){
89 			x--;
90 			mx1++;mx2--;
91 			rx -=dy;
92 			r  +=rx;
93 		}
94 		if(old_y2!=my2){
95 			for(i=mx1;i<=mx2;i++){
96 				gdImageSetPixel(im,i,my1,c);
97 				gdImageSetPixel(im,i,my2,c);
98 			}
99 		}
100 		old_y2 = my2;
101 	}
102 }
103 
104 
105