X-Git-Url: http://git.imager.perl.org/imager.git/blobdiff_plain/9b1ec2b8d2aae25c8864e28af1e7c85e78ca9575..e3bf99ccc9c9505c5f4266c897f32812ddaeeb7d:/compose.im diff --git a/compose.im b/compose.im index 5e0c236a..6d609648 100644 --- a/compose.im +++ b/compose.im @@ -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);