]> git.imager.perl.org - imager.git/blobdiff - filters.c
Imager 0.58 release
[imager.git] / filters.c
index 85d55c3c77b819da8b61c1c1fb2790cbc16ba077..704ea2d83424a6dfdc26cb24afee81db0250e5a5 100644 (file)
--- a/filters.c
+++ b/filters.c
@@ -984,7 +984,7 @@ i_gradgen(i_img *im, int num, int *xo, int *yo, i_color *ival, int dmeasure) {
        fdist[p]  = i_max(xd*xd, yd*yd); /* manhattan distance */
        break;
       default:
-       m_fatal(3,"i_gradgen: Unknown distance measure\n");
+       i_fatal(3,"i_gradgen: Unknown distance measure\n");
       }
       cs += fdist[p];
     }
@@ -1037,7 +1037,7 @@ i_nearest_color_foo(i_img *im, int num, int *xo, int *yo, i_color *ival, int dme
       mindist = i_max(xd*xd, yd*yd); /* manhattan distance */
       break;
     default:
-      m_fatal(3,"i_nearest_color: Unknown distance measure\n");
+      i_fatal(3,"i_nearest_color: Unknown distance measure\n");
     }
 
     for(p = 1; p<num; p++) {
@@ -1054,7 +1054,7 @@ i_nearest_color_foo(i_img *im, int num, int *xo, int *yo, i_color *ival, int dme
        curdist = i_max(xd*xd, yd*yd); /* manhattan distance */
        break;
       default:
-       m_fatal(3,"i_nearest_color: Unknown distance measure\n");
+       i_fatal(3,"i_nearest_color: Unknown distance measure\n");
       }
       if (curdist < mindist) {
        mindist = curdist;
@@ -1197,7 +1197,7 @@ i_nearest_color(i_img *im, int num, int *xo, int *yo, i_color *oval, int dmeasur
       mindist = i_max(xd*xd, yd*yd); /* manhattan distance */
       break;
     default:
-      m_fatal(3,"i_nearest_color: Unknown distance measure\n");
+      i_fatal(3,"i_nearest_color: Unknown distance measure\n");
     }
     
     for(p = 1; p<num; p++) {
@@ -1214,7 +1214,7 @@ i_nearest_color(i_img *im, int num, int *xo, int *yo, i_color *oval, int dmeasur
        curdist = i_max(xd*xd, yd*yd); /* manhattan distance */
        break;
       default:
-       m_fatal(3,"i_nearest_color: Unknown distance measure\n");
+       i_fatal(3,"i_nearest_color: Unknown distance measure\n");
       }
       if (curdist < mindist) {
        mindist = curdist;
@@ -1316,7 +1316,7 @@ i_unsharp_mask(i_img *im, double stddev, double scale) {
 }
 
 /*
-=item i_diff_image(im1, im2, mindiff)
+=item i_diff_image(im1, im2, mindist)
 
 Creates a new image that is transparent, except where the pixel in im2
 is different from im1, where it is the pixel from im2.
@@ -1327,7 +1327,7 @@ The samples must differ by at least mindiff to be considered different.
 */
 
 i_img *
-i_diff_image(i_img *im1, i_img *im2, int mindiff) {
+i_diff_image(i_img *im1, i_img *im2, double mindist) {
   i_img *out;
   int outchans, diffchans;
   int xsize, ysize;
@@ -1352,6 +1352,7 @@ i_diff_image(i_img *im1, i_img *im2, int mindiff) {
     i_color *line2 = mymalloc(xsize * sizeof(*line1)); /* checked 17feb2005 tonyc */
     i_color empty;
     int x, y, ch;
+    int imindist = (int)mindist;
 
     for (ch = 0; ch < MAXCHANNELS; ++ch)
       empty.channel[ch] = 0;
@@ -1368,7 +1369,7 @@ i_diff_image(i_img *im1, i_img *im2, int mindiff) {
         int diff = 0;
         for (ch = 0; ch < diffchans; ++ch) {
           if (line1[x].channel[ch] != line2[x].channel[ch]
-              && abs(line1[x].channel[ch] - line2[x].channel[ch]) > mindiff) {
+              && abs(line1[x].channel[ch] - line2[x].channel[ch]) > imindist) {
             diff = 1;
             break;
           }
@@ -1386,7 +1387,7 @@ i_diff_image(i_img *im1, i_img *im2, int mindiff) {
     i_fcolor *line2 = mymalloc(xsize * sizeof(*line2)); /* checked 17feb2005 tonyc */
     i_fcolor empty;
     int x, y, ch;
-    double dist = mindiff / 255;
+    double dist = mindist / 255.0;
 
     for (ch = 0; ch < MAXCHANNELS; ++ch)
       empty.channel[ch] = 0;
@@ -1403,7 +1404,7 @@ i_diff_image(i_img *im1, i_img *im2, int mindiff) {
         int diff = 0;
         for (ch = 0; ch < diffchans; ++ch) {
           if (line1[x].channel[ch] != line2[x].channel[ch]
-              && abs(line1[x].channel[ch] - line2[x].channel[ch]) > dist) {
+              && fabs(line1[x].channel[ch] - line2[x].channel[ch]) > dist) {
             diff = 1;
             break;
           }
@@ -1764,7 +1765,8 @@ fount_init_state(struct fount_state *state, double xa, double ya,
                  i_fountain_repeat repeat, int combine, int super_sample, 
                  double ssample_param, int count, i_fountain_seg *segs) {
   int i, j;
-  i_fountain_seg *my_segs = mymalloc(sizeof(i_fountain_seg) * count);
+  int bytes;
+  i_fountain_seg *my_segs = mymalloc(sizeof(i_fountain_seg) * count); /* checked 2jul06 - duplicating original */
   /*int have_alpha = im->channels == 2 || im->channels == 4;*/
   
   memset(state, 0, sizeof(*state));
@@ -1846,13 +1848,25 @@ fount_init_state(struct fount_state *state, double xa, double ya,
   switch (super_sample) {
   case i_fts_grid:
     ssample_param = floor(0.5 + sqrt(ssample_param));
-    state->ssample_data = mymalloc(sizeof(i_fcolor) * ssample_param * ssample_param);
+    bytes = ssample_param * ssample_param * sizeof(i_fcolor);
+    if (bytes / sizeof(i_fcolor) == ssample_param * ssample_param) {
+      state->ssample_data = mymalloc(sizeof(i_fcolor) * ssample_param * ssample_param); /* checked 1jul06 tonyc */
+    }
+    else {
+      super_sample = i_fts_none;
+    }
     break;
 
   case i_fts_random:
   case i_fts_circle:
     ssample_param = floor(0.5+ssample_param);
-    state->ssample_data = mymalloc(sizeof(i_fcolor) * ssample_param);
+    bytes = sizeof(i_fcolor) * ssample_param;
+    if (bytes / sizeof(i_fcolor) == ssample_param) {
+      state->ssample_data = mymalloc(sizeof(i_fcolor) * ssample_param);
+    }
+    else {
+      super_sample = i_fts_none;
+    }
     break;
   }
   state->parm = ssample_param;