]> git.imager.perl.org - imager.git/blobdiff - compose.im
hopefully avoid coverity complaining about a float vs int comparison
[imager.git] / compose.im
index 5e0c236aa3bade567ced5294f78516fa96335ef0..6d60964855eb5722bb430429ba5adca018a6fec8 100644 (file)
@@ -4,18 +4,25 @@
 
 int
 i_compose_mask(i_img *out, i_img *src, i_img *mask, 
-              int out_left, int out_top,
-              int src_left, int src_top,
-              int mask_left, int mask_top,
-              int width, int height,
+              i_img_dim out_left, i_img_dim out_top,
+              i_img_dim src_left, i_img_dim src_top,
+              i_img_dim mask_left, i_img_dim mask_top,
+              i_img_dim width, i_img_dim height,
               int combine,
               double opacity) {
   i_render r;
-  int dy;
+  i_img_dim dy;
   i_fill_combine_f combinef_8;
   i_fill_combinef_f combinef_double;
   int channel_zero = 0;
 
+  mm_log((1, "i_compose_mask(out %p, src %p, mask %p, out(" i_DFp "), "
+         "src(" i_DFp "), mask(" i_DFp "), size(" i_DFp "),"
+         " combine %d opacity %f\n", out, src, 
+         mask, i_DFcp(out_left, out_top), i_DFcp(src_left, src_top),
+         i_DFcp(mask_left, mask_top), i_DFcp(width, height),
+         combine, opacity));
+
   i_clear_error();
   if (out_left >= out->xsize
       || out_top >= out->ysize
@@ -35,6 +42,8 @@ i_compose_mask(i_img *out, i_img *src, i_img *mask,
 
   if (out_left < 0) {
     width = out_left + width;
+    src_left -= out_left;
+    mask_left -= out_left;
     out_left = 0;
   }
   if (out_left + width > out->xsize)
@@ -42,6 +51,8 @@ i_compose_mask(i_img *out, i_img *src, i_img *mask,
 
   if (out_top < 0) {
     height = out_top + height;
+    mask_top -= out_top;
+    src_top -= out_top;
     out_top = 0;
   }
   if (out_top + height > out->ysize)
@@ -49,6 +60,8 @@ i_compose_mask(i_img *out, i_img *src, i_img *mask,
 
   if (src_left < 0) {
     width = src_left + width;
+    out_left -= src_left;
+    mask_left -= src_left;
     src_left = 0;
   }
   if (src_left + width > src->xsize)
@@ -56,29 +69,42 @@ i_compose_mask(i_img *out, i_img *src, i_img *mask,
 
   if (src_top < 0) {
     height = src_top + height;
+    out_top -= src_top;
+    mask_top -= src_top;
     src_top = 0;
   }
   if (src_top + height > src->ysize)
-    height = src->ysize - src_left;
+    height = src->ysize - src_top;
 
   if (mask_left < 0) {
     width = mask_left + width;
+    out_left -= mask_left;
+    src_left -= mask_left;
     mask_left = 0;
   }
   if (mask_left + width > mask->xsize)
     width = mask->xsize - mask_left;
   
   if (mask_top < 0) {
-    height = mask->ysize + height;
+    height = mask_top + height;
+    src_top -= mask_top;
+    out_top -= mask_top;
     mask_top = 0;
   }
   if (mask_top + height > mask->ysize)
-    height = mask->xsize - mask_top;
+    height = mask->ysize - mask_top;
 
   if (opacity > 1.0)
     opacity = 1.0;
-  else if (opacity <= 0)
+  else if (opacity <= 0) {
+    i_push_error(0, "opacity must be positive");
     return 0;
+  }
+
+  mm_log((1, "after adjustments: (out(" i_DFp "), src(" i_DFp "),"
+         " mask(" i_DFp "), size(" i_DFp ")\n", 
+         i_DFcp(out_left, out_top), i_DFcp(src_left, src_top),
+         i_DFcp(mask_left, mask_top), i_DFcp(width, height)));
 
   i_get_combine(combine, &combinef_8, &combinef_double);
 
@@ -97,7 +123,7 @@ i_compose_mask(i_img *out, i_img *src, i_img *mask,
     IM_GSAMP(mask, mask_left, mask_left + width, mask_top + dy, 
             mask_line, &channel_zero, 1);
     if (opacity < 1.0) {
-      int i;
+      i_img_dim i;
       IM_SAMPLE_T *maskp = mask_line;
       for (i = 0; i < width; ++i) {
        *maskp = IM_ROUND(*maskp * opacity);
@@ -118,16 +144,21 @@ i_compose_mask(i_img *out, i_img *src, i_img *mask,
 
 int
 i_compose(i_img *out, i_img *src,
-         int out_left, int out_top,
-         int src_left, int src_top,
-         int width, int height,
+         i_img_dim out_left, i_img_dim out_top,
+         i_img_dim src_left, i_img_dim src_top,
+         i_img_dim width, i_img_dim height,
          int combine,
          double opacity) {
   i_render r;
-  int dy;
+  i_img_dim dy;
   i_fill_combine_f combinef_8;
   i_fill_combinef_f combinef_double;
 
+  mm_log((1, "i_compose(out %p, src %p, out(" i_DFp "), src(" i_DFp "), "
+         "size(" i_DFp "), combine %d opacity %f\n", out, src,
+         i_DFcp(out_left, out_top), i_DFcp(src_left, src_top),
+         i_DFcp(width, height), combine, opacity));
+
   i_clear_error();
   if (out_left >= out->xsize
       || out_top >= out->ysize
@@ -143,6 +174,7 @@ i_compose(i_img *out, i_img *src,
 
   if (out_left < 0) {
     width = out_left + width;
+    src_left -= out_left;
     out_left = 0;
   }
   if (out_left + width > out->xsize)
@@ -150,6 +182,7 @@ i_compose(i_img *out, i_img *src,
 
   if (out_top < 0) {
     height = out_top + height;
+    src_top -= out_top;
     out_top = 0;
   }
   if (out_top + height > out->ysize)
@@ -157,6 +190,7 @@ i_compose(i_img *out, i_img *src,
 
   if (src_left < 0) {
     width = src_left + width;
+    out_left -= src_left;
     src_left = 0;
   }
   if (src_left + width > src->xsize)
@@ -164,15 +198,18 @@ i_compose(i_img *out, i_img *src,
 
   if (src_top < 0) {
     height = src_top + height;
+    out_top -= src_top;
     src_top = 0;
   }
   if (src_top + height > src->ysize)
-    height = src->ysize - src_left;
+    height = src->ysize - src_top;
 
   if (opacity > 1.0)
     opacity = 1.0;
-  else if (opacity <= 0)
+  else if (opacity <= 0) {
+    i_push_error(0, "opacity must be positive");
     return 0;
+  }
 
   i_get_combine(combine, &combinef_8, &combinef_double);
 
@@ -183,7 +220,7 @@ i_compose(i_img *out, i_img *src,
   int adapt_channels = out->channels;
 
   if (opacity != 1.0) {
-    int i;
+    i_img_dim i;
     IM_SAMPLE_T mask_value = IM_ROUND(opacity * IM_SAMPLE_MAX);
     mask_line = mymalloc(sizeof(IM_SAMPLE_T) * width);