]> git.imager.perl.org - imager.git/blobdiff - draw.c
- added support for registering file readers
[imager.git] / draw.c
diff --git a/draw.c b/draw.c
index 6cca0a002d7df71f61a98fa55636c774e03e1fa2..b9ab1667aa6c682d0206db3212c3e127dcce8d79 100644 (file)
--- a/draw.c
+++ b/draw.c
@@ -1,7 +1,7 @@
-#include "image.h"
+#include "imager.h"
 #include "draw.h"
 #include "log.h"
-#include "imagei.h"
+#include "imageri.h"
 
 #include <limits.h>
 
@@ -201,8 +201,20 @@ i_arc_hlines(i_int_hlines *hlines,int x,int y,float rad,float d1,float d2) {
   }
 }
 
+/*
+=item i_arc(im, x, y, rad, d1, d2, color)
+
+=category Drawing
+=synopsis i_arc(im, 50, 50, 20, 45, 135, &color);
+
+Fills an arc centered at (x,y) with radius I<rad> covering the range
+of angles in degrees from d1 to d2, with the color.
+
+=cut
+*/
+
 void
-i_arc(i_img *im,int x,int y,float rad,float d1,float d2,i_color *val) {
+i_arc(i_img *im,int x,int y,float rad,float d1,float d2,const i_color *val) {
   i_int_hlines hlines;
 
   i_int_init_hlines_img(&hlines, im);
@@ -214,6 +226,18 @@ i_arc(i_img *im,int x,int y,float rad,float d1,float d2,i_color *val) {
   i_int_hlines_destroy(&hlines);
 }
 
+/*
+=item i_arc_cfill(im, x, y, rad, d1, d2, fill)
+
+=category Drawing
+=synopsis i_arc_cfill(im, 50, 50, 35, 90, 135, fill);
+
+Fills an arc centered at (x,y) with radius I<rad> covering the range
+of angles in degrees from d1 to d2, with the fill object.
+
+=cut
+*/
+
 #define MIN_CIRCLE_STEPS 8
 #define MAX_CIRCLE_STEPS 360
 
@@ -277,8 +301,9 @@ arc_poly(int *count, double **xvals, double **yvals,
   angle_inc = 2 * PI / steps;
 
   point_count = steps + 5; /* rough */
-  *xvals = mymalloc(point_count * sizeof(double));
-  *yvals = mymalloc(point_count * sizeof(double));
+  /* point_count is always relatively small, so allocation won't overflow */
+  *xvals = mymalloc(point_count * sizeof(double)); /* checked 17feb2005 tonyc */
+  *yvals = mymalloc(point_count * sizeof(double)); /* checked 17feb2005 tonyc */
 
   /* from centre to edge at d1 */
   (*xvals)[0] = x;
@@ -301,9 +326,21 @@ arc_poly(int *count, double **xvals, double **yvals,
   ++*count;
 }
 
+/*
+=item i_arc_aa(im, x, y, rad, d1, d2, color)
+
+=category Drawing
+=synopsis i_arc_aa(im, 50, 50, 35, 90, 135, &color);
+
+Antialias fills an arc centered at (x,y) with radius I<rad> covering
+the range of angles in degrees from d1 to d2, with the color.
+
+=cut
+*/
+
 void
 i_arc_aa(i_img *im, double x, double y, double rad, double d1, double d2,
-        i_color *val) {
+        const i_color *val) {
   double *xvals, *yvals;
   int count;
 
@@ -315,6 +352,18 @@ i_arc_aa(i_img *im, double x, double y, double rad, double d1, double d2,
   myfree(yvals);
 }
 
+/*
+=item i_arc_aa_cfill(im, x, y, rad, d1, d2, fill)
+
+=category Drawing
+=synopsis i_arc_aa_cfill(im, 50, 50, 35, 90, 135, fill);
+
+Antialias fills an arc centered at (x,y) with radius I<rad> covering
+the range of angles in degrees from d1 to d2, with the fill object.
+
+=cut
+*/
+
 void
 i_arc_aa_cfill(i_img *im, double x, double y, double rad, double d1, double d2,
               i_fill_t *fill) {
@@ -334,9 +383,6 @@ i_arc_aa_cfill(i_img *im, double x, double y, double rad, double d1, double d2,
 
 typedef int frac;
 static  frac float_to_frac(float x) { return (frac)(0.5+x*16.0); }
-static   int frac_sub     (frac x)  { return (x%16); }
-static   int frac_int     (frac x)  { return (x/16); }
-static float frac_to_float(float x) { return (float)x/16.0; }
 
 static 
 void
@@ -345,19 +391,6 @@ polar_to_plane(float cx, float cy, float angle, float radius, frac *x, frac *y)
   *y = float_to_frac(cy+radius*sin(angle));
 }
 
-static
-void
-order_pair(frac *x, frac *y) {
-  frac t = *x;
-  if (t>*y) {
-    *x = *y;
-    *y = t;
-  }
-}
-
-
-
-
 static
 void
 make_minmax_list(i_mmarray *dot, float x, float y, float radius) {
@@ -425,8 +458,19 @@ i_pixel_coverage(i_mmarray *dot, int x, int y) {
   return cnt;
 }
 
+/*
+=item i_circle_aa(im, x, y, rad, color)
+
+=category Drawing
+=synopsis i_circle_aa(im, 50, 50, 45, &color);
+
+Antialias fills a circle centered at (x,y) for radius I<rad> with
+color.
+
+=cut
+*/
 void
-i_circle_aa(i_img *im, float x, float y, float rad, i_color *val) {
+i_circle_aa(i_img *im, float x, float y, float rad, const i_color *val) {
   i_mmarray dot;
   i_color temp;
   int ly;
@@ -468,13 +512,19 @@ i_circle_aa(i_img *im, float x, float y, float rad, i_color *val) {
   i_mmarray_dst(&dot);
 }
 
+/*
+=item i_box(im, x1, y1, x2, y2, color)
 
+=category Drawing
+=synopsis i_box(im, 0, 0, im->xsize-1, im->ysize-1, &color).
 
+Outlines the box from (x1,y1) to (x2,y2) inclusive with I<color>.
 
-
+=cut
+*/
 
 void
-i_box(i_img *im,int x1,int y1,int x2,int y2,i_color *val) {
+i_box(i_img *im,int x1,int y1,int x2,int y2,const i_color *val) {
   int x,y;
   mm_log((1,"i_box(im* 0x%x,x1 %d,y1 %d,x2 %d,y2 %d,val 0x%x)\n",im,x1,y1,x2,y2,val));
   for(x=x1;x<x2+1;x++) {
@@ -487,13 +537,35 @@ i_box(i_img *im,int x1,int y1,int x2,int y2,i_color *val) {
   }
 }
 
+/*
+=item i_box_filled(im, x1, y1, x2, y2, color)
+
+=category Drawing
+=synopsis i_box_filled(im, 0, 0, im->xsize-1, im->ysize-1, &color);
+
+Fills the box from (x1,y1) to (x2,y2) inclusive with color.
+
+=cut
+*/
+
 void
-i_box_filled(i_img *im,int x1,int y1,int x2,int y2,i_color *val) {
+i_box_filled(i_img *im,int x1,int y1,int x2,int y2, const i_color *val) {
   int x,y;
   mm_log((1,"i_box_filled(im* 0x%x,x1 %d,y1 %d,x2 %d,y2 %d,val 0x%x)\n",im,x1,y1,x2,y2,val));
   for(x=x1;x<x2+1;x++) for (y=y1;y<y2+1;y++) i_ppix(im,x,y,val);
 }
 
+/*
+=item i_box_cfill(im, x1, y1, x2, y2, fill)
+
+=category Drawing
+=synopsis i_box_cfill(im, 0, 0, im->xsize-1, im->ysize-1, fill);
+
+Fills the box from (x1,y1) to (x2,y2) inclusive with fill.
+
+=cut
+*/
+
 void
 i_box_cfill(i_img *im,int x1,int y1,int x2,int y2,i_fill_t *fill) {
   mm_log((1,"i_box_cfill(im* 0x%x,x1 %d,y1 %d,x2 %d,y2 %d,fill 0x%x)\n",im,x1,y1,x2,y2,fill));
@@ -557,6 +629,8 @@ i_box_cfill(i_img *im,int x1,int y1,int x2,int y2,i_fill_t *fill) {
 /* 
 =item i_line(im, x1, y1, x2, y2, val, endp)
 
+=category Drawing
+
 Draw a line to image using bresenhams linedrawing algorithm
 
    im   - image to draw to
@@ -571,7 +645,7 @@ Draw a line to image using bresenhams linedrawing algorithm
 */
 
 void
-i_line(i_img *im, int x1, int y1, int x2, int y2, i_color *val, int endp) {
+i_line(i_img *im, int x1, int y1, int x2, int y2, const i_color *val, int endp) {
   int x, y;
   int dx, dy;
   int p;
@@ -756,10 +830,20 @@ i_line_aa3(i_img *im,int x1,int y1,int x2,int y2,i_color *val) {
 }
 
 
+/*
+=item i_line_aa(im, x1, x2, y1, y2, color, endp)
+
+=category Drawing
+
+Antialias draws a line from (x1,y1) to (x2, y2) in color.
 
+The point (x2, y2) is drawn only if endp is set.
+
+=cut
+*/
 
 void
-i_line_aa(i_img *im, int x1, int y1, int x2, int y2, i_color *val, int endp) {
+i_line_aa(i_img *im, int x1, int y1, int x2, int y2, const i_color *val, int endp) {
   int x, y;
   int dx, dy;
   int p;
@@ -903,7 +987,7 @@ perm(int n,int k) {
    to get a new level - this may lead to errors who knows lets test it */
 
 void
-i_bezier_multi(i_img *im,int l,double *x,double *y,i_color *val) {
+i_bezier_multi(i_img *im,int l,const double *x,const double *y, const i_color *val) {
   double *bzcoef;
   double t,cx,cy;
   int k,i;
@@ -1192,11 +1276,22 @@ i_flood_fill_low(i_img *im,int seedx,int seedy,
   return btm;
 }
 
+/*
+=item i_flood_fill(im, seedx, seedy, color)
+
+=category Drawing
+=synopsis i_flood_fill(im, 50, 50, &color);
 
+Flood fills the 4-connected region starting from the point (seedx,
+seedy) with I<color>.
 
+Returns false if (seedx, seedy) are outside the image.
+
+=cut
+*/
 
 undef_int
-i_flood_fill(i_img *im, int seedx, int seedy, i_color *dcol) {
+i_flood_fill(i_img *im, int seedx, int seedy, const i_color *dcol) {
   int bxmin, bxmax, bymin, bymax;
   struct i_bitmap *btm;
   int x, y;
@@ -1218,7 +1313,19 @@ i_flood_fill(i_img *im, int seedx, int seedy, i_color *dcol) {
   return 1;
 }
 
+/*
+=item i_flood_cfill(im, seedx, seedy, fill)
+
+=category Drawing
+=synopsis i_flood_cfill(im, 50, 50, fill);
 
+Flood fills the 4-connected region starting from the point (seedx,
+seedy) with I<fill>.
+
+Returns false if (seedx, seedy) are outside the image.
+
+=cut
+*/
 
 undef_int
 i_flood_cfill(i_img *im, int seedx, int seedy, i_fill_t *fill) {