gd_arc.c 1.7 KB

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