masked images weren't using the image allocation API
authorTony Cook <tony@develop-help.com>
Thu, 12 Jul 2012 12:59:24 +0000 (22:59 +1000)
committerTony Cook <tony@develop-help.com>
Tue, 14 Aug 2012 09:58:16 +0000 (19:58 +1000)
Since the reference counting for context objects requires that image
implementations use the API, this broke.

maskimg.c

index 5ed0660..725b8b6 100644 (file)
--- a/maskimg.c
+++ b/maskimg.c
@@ -11,6 +11,8 @@ maskimg.c - implements masked images/image subsets
 =cut
 */
 
+#define IMAGER_NO_CONTEXT
+
 #include "imager.h"
 #include "imageri.h"
 
@@ -124,13 +126,15 @@ sample is treated as boolean.
 =cut
 */
 
-i_img *i_img_masked_new(i_img *targ, i_img *mask, i_img_dim x, i_img_dim y, i_img_dim w, i_img_dim h) {
+i_img *
+i_img_masked_new(i_img *targ, i_img *mask, i_img_dim x, i_img_dim y, i_img_dim w, i_img_dim h) {
   i_img *im;
   i_img_mask_ext *ext;
+  dIMCTXim(targ);
 
-  i_clear_error();
+  im_clear_error(aIMCTX);
   if (x >= targ->xsize || y >= targ->ysize) {
-    i_push_error(0, "subset outside of target image");
+    im_push_error(aIMCTX, 0, "subset outside of target image");
     return NULL;
   }
   if (mask) {
@@ -144,8 +148,10 @@ i_img *i_img_masked_new(i_img *targ, i_img *mask, i_img_dim x, i_img_dim y, i_im
   if (y+h > targ->ysize)
     h = targ->ysize - y;
 
-  im = mymalloc(sizeof(i_img));
+  im = im_img_alloc(aIMCTX);
+
   memcpy(im, &IIM_base_masked, sizeof(i_img));
+  i_tags_new(&im->tags);
   im->xsize = w;
   im->ysize = h;
   im->channels = targ->channels;
@@ -159,6 +165,8 @@ i_img *i_img_masked_new(i_img *targ, i_img *mask, i_img_dim x, i_img_dim y, i_im
   ext->samps = mymalloc(sizeof(i_sample_t) * im->xsize);
   im->ext_data = ext;
 
+  im_img_init(aIMCTX, im);
+
   return im;
 }
 
@@ -585,6 +593,7 @@ psamp_masked(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y,
     return result;
   }
   else {
+    dIMCTXim(im);
     i_push_error(0, "Image position outside of image");
     return -1;
   }
@@ -652,6 +661,7 @@ psampf_masked(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y,
     return result;
   }
   else {
+    dIMCTXim(im);
     i_push_error(0, "Image position outside of image");
     return -1;
   }