mirror of
https://github.com/php/php-src.git
synced 2026-04-02 21:52:36 +02:00
Add gdImageEllipse
Replace gdImageFilledEllipse by a new function (backported from the new phpgd) the new gdImageFilledEllipse fix bug bug #22103 (ellipse part)
This commit is contained in:
@@ -1534,7 +1534,11 @@ lsqrt (long n)
|
||||
void
|
||||
gdImageArc (gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color)
|
||||
{
|
||||
gdImageFilledArc (im, cx, cy, w, h, s, e, color, gdNoFill);
|
||||
if( (s%360)==(e%360) ){
|
||||
gdImageEllipse(im, cx, cy, w, h, color);
|
||||
} else {
|
||||
gdImageFilledArc (im, cx, cy, w, h, s, e, color, gdNoFill);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1620,10 +1624,103 @@ gdImageFilledArc (gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gdImageFilledEllipse (gdImagePtr im, int cx, int cy, int w, int h, int color)
|
||||
|
||||
/**
|
||||
* Integer Ellipse functions (gdImageEllipse and gdImageFilledEllipse)
|
||||
* Function added by Pierre-Alain Joye 02/08/2003 (paj@pearfr.org)
|
||||
* See the ellipse function simplification for the equation
|
||||
* as well as the midpoint algorithm.
|
||||
*/
|
||||
|
||||
void gdImageEllipse(gdImagePtr im, int mx, int my, int w, int h, int c)
|
||||
{
|
||||
gdImageFilledArc (im, cx, cy, w, h, 0, 360, color, gdPie);
|
||||
int x=0,mx1=0,mx2=0,my1=0,my2=0;
|
||||
long aq,bq,dx,dy,r,rx,ry,a,b;
|
||||
|
||||
a=w>>1;
|
||||
b=h>>1;
|
||||
gdImageSetPixel(im,mx+a, my, c);
|
||||
gdImageSetPixel(im,mx-a, my, c);
|
||||
mx1 = mx-a;my1 = my;
|
||||
mx2 = mx+a;my2 = my;
|
||||
|
||||
aq = a * a;
|
||||
bq = b * b;
|
||||
dx = aq << 1;
|
||||
dy = bq << 1;
|
||||
r = a * bq;
|
||||
rx = r << 1;
|
||||
ry = 0;
|
||||
x = a;
|
||||
while (x > 0){
|
||||
if (r > 0) {
|
||||
my1++;my2--;
|
||||
ry +=dx;
|
||||
r -=ry;
|
||||
}
|
||||
if (r <= 0){
|
||||
x--;
|
||||
mx1++;mx2--;
|
||||
rx -=dy;
|
||||
r +=rx;
|
||||
}
|
||||
gdImageSetPixel(im,mx1, my1, c);
|
||||
gdImageSetPixel(im,mx1, my2, c);
|
||||
gdImageSetPixel(im,mx2, my1, c);
|
||||
gdImageSetPixel(im,mx2, my2, c);
|
||||
}
|
||||
}
|
||||
|
||||
void gdImageFilledEllipse (gdImagePtr im, int mx, int my, int w, int h, int c)
|
||||
{
|
||||
int x=0,mx1=0,mx2=0,my1=0,my2=0;
|
||||
long aq,bq,dx,dy,r,rx,ry,a,b;
|
||||
int i;
|
||||
int old_y1,old_y2;
|
||||
|
||||
a=w>>1;
|
||||
b=h>>1;
|
||||
|
||||
gdImageLine(im, mx-a, my, mx+a, my, c);
|
||||
|
||||
mx1 = mx-a;my1 = my;
|
||||
mx2 = mx+a;my2 = my;
|
||||
|
||||
aq = a * a;
|
||||
bq = b * b;
|
||||
dx = aq << 1;
|
||||
dy = bq << 1;
|
||||
r = a * bq;
|
||||
rx = r << 1;
|
||||
ry = 0;
|
||||
x = a;
|
||||
old_y2=-1;
|
||||
old_y1=-1;
|
||||
while (x > 0){
|
||||
if (r > 0) {
|
||||
my1++;my2--;
|
||||
ry +=dx;
|
||||
r -=ry;
|
||||
}
|
||||
if (r <= 0){
|
||||
x--;
|
||||
mx1++;mx2--;
|
||||
rx -=dy;
|
||||
r +=rx;
|
||||
}
|
||||
if(old_y2!=my2){
|
||||
for(i=mx1;i<=mx2;i++){
|
||||
gdImageSetPixel(im,i,my1,c);
|
||||
}
|
||||
}
|
||||
if(old_y2!=my2){
|
||||
for(i=mx1;i<=mx2;i++){
|
||||
gdImageSetPixel(im,i,my2,c);
|
||||
}
|
||||
}
|
||||
old_y2 = my2;
|
||||
old_y1 = my1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -420,7 +420,7 @@ void* gdImageGdPtr(gdImagePtr im, int *size);
|
||||
/* Best to free this memory with gdFree(), not free() */
|
||||
void* gdImageGd2Ptr(gdImagePtr im, int cs, int fmt, int *size);
|
||||
|
||||
void gdImageEllipse(gdImagePtr im, int cx, int cy, int w, int h, int color);
|
||||
void gdImageEllipse(gdImagePtr im, int cx, int cy, int w, int h, int c);
|
||||
|
||||
/* Style is a bitwise OR ( | operator ) of these.
|
||||
gdArc and gdChord are mutually exclusive;
|
||||
|
||||
Reference in New Issue
Block a user