--- refocus-0.9.0/ChangeLog 2003-01-31 14:02:03.000000000 +0100 +++ refocus-0.9.0/ChangeLog 2010-07-04 15:13:21.414365851 +0200 @@ -2,3 +2,9 @@ * This is the first public release (0.9.0) of the refocus plug-in. +2007-09-28 Richard Lemieux bpp - source->has_alpha; GimpTile *tile = tile_sink_get_tile (sink, x, buf.y); +#ifdef RLXTEST + printf("convolve_image: x %d, y %d, tile->eheight %d\n", + x, buf.y, tile->eheight); +#endif convolve_tile (tile, pixpos_in_buf (&buf, x, buf.y), buf.row_stride, ncolors, sink->bpp, mat->data, mat_size); tile_sink_tile_unref (sink, tile); --- refocus-0.9.0/src/tilebuf.c 2010-07-04 15:12:14.223365075 +0200 +++ refocus-0.9.0/src/tilebuf.c 2010-07-04 15:17:46.752381257 +0200 @@ -18,6 +18,7 @@ * Version $Id: tilebuf.c,v 1.1.1.1 2003/01/30 21:30:19 ernstl Exp $ */ +#include #include "tilebuf.h" #include "util.h" #include @@ -39,6 +40,11 @@ guchar * pixpos_in_buf (TileStripBuffer * buf, const gint x, const gint y) { + /* + & data = array(? lines x row_stride columns) + & pixpos_in_buf = &data[(x - real_x)*bytes_per_pixel, y - real_y] + & (real_x, real_y) = origin of tile. + */ return (&buf->data[buf->row_stride * (y - buf->real_y) + buf->bpp * (x - buf->real_x)]); } @@ -220,7 +226,7 @@ static void fix_bottom_boundary (TileStripBuffer * buf, const gint y_hi) { - if (y_hi >= buf->real_y + buf->real_height) + if (y_hi >= buf->real_y + buf->real_height) /* (1) */ { return; }; @@ -234,13 +240,32 @@ break; case TB_BOUNDARY_MIRROR: { - register gint y; + register gint y2; - for (y = y_hi; y < buf->real_y + buf->real_height; y++) + /*if (y_hi < buf->y_limit)*/ + for (y2 = y_hi; y2 < buf->real_y + buf->real_height; y2++) /*(2)*/ { - gint sy = 2 * (y_hi - 1) - y; - copy_row (buf, buf->real_x, sy>=buf->real_y?sy:buf->real_y, - buf->real_width, y); + /* + &1 y < y_hi [domain of y, definition of y_hi, (1)] + &2 y_hi <= y2 < buf->real_y + buf->real_height [(1),(2)] + &3 i = 0, 1, ... + &4 y=y_hi-i-1 -> y2=y_hi+i [definition of mirror] + &5 y = y2 - 2*i - 1 [4] + &6 y = 2*y2 - 2*i - y2 - 1 [5,algebra] + &7 y = 2*y_hi - y2 - 1 [4,6] + */ + gint y = 2*y_hi - y2 - 1; + if (y < buf->real_y) break; +#ifdef RLXTEST + printf("fix_bottom_boundary: Copying row %d to %d, width %d, buf_loc %d %d, real_y %d\n", + 2*y_hi - y2 - 1, y2, buf->real_width, + buf->row_stride * (2*y_hi - y2 - 1 - buf->real_y) + + buf->bpp * (buf->real_x - buf->real_x), + buf->row_stride * (y2 - buf->real_y) + + buf->bpp * (buf->real_x - buf->real_x), + buf->real_y); +#endif + copy_row (buf, buf->real_x, y, buf->real_width,y2); }; } break; @@ -262,7 +287,21 @@ const gint y_lo = MAX (buf->real_y, source->y); const gint y_hi = MIN (buf->real_y + buf->real_height, source->y + source->height); - + /* + y: domain of y. + & 0 <= y. y is a 0-index. + & | & y in the source image + & 0 <= source->y <= y < source->y + source->height + | & y in the buffer + & 0 <= buf->real_y <= y < buf->real_y + buf->real_height + x: domain of x = domain of y with mapping y -> x, height -> width. + */ + +#ifdef RLXTEST + printf("buf->real_y %d, buf->real_height %d, source->y %d, source->heigh %d, y_hi %d\n", + buf->real_y, buf->real_height, + source->y, source->height, y_hi); +#endif fix_left_boundary (buf, x_lo, first_time ? buf->y : buf->y + tile_height (), y_hi); fix_right_boundary (buf, x_hi, @@ -271,7 +310,15 @@ { fix_top_boundary (buf, y_lo); }; +#ifdef RLXTEST + printf("fix_boundaries: Now goto fix_bottom_boundary: y_hi %d, real_y + real_height %d, data[%d]\n", + y_hi, buf->real_y + buf->real_height, + buf->real_height * buf->row_stride); +#endif fix_bottom_boundary (buf, y_hi); +#ifdef RLXTEST + printf("bottom boundary fixed\n"); +#endif } void @@ -318,6 +365,14 @@ gint x; gboolean not_finished = TRUE; + /* + & y_limit = height of picture, if full picture. + */ +#ifdef RLXTEST + printf("buf->y %d + tile_height%d () >= buf->y_limit %d\n", + buf->y,tile_height(),buf->y_limit); +#endif + if (buf->first_time) { /* Buf must already have been initialized so there is nothing to do */ @@ -330,19 +385,31 @@ } else { +#ifdef RLXTEST + printf("shift_buf: tile_height %d\n", tile_height()); +#endif memmove (pixpos_in_buf (buf, buf->real_x, buf->real_y), pixpos_in_buf (buf, buf->real_x, buf->real_y + tile_height ()), buf->row_stride * (tile_height () + buf->border_width)); buf->y += tile_height (); +#ifdef RLXTEST + printf("shift_buf: y %d, y_limit %d\n", buf->y, buf->y_limit); +#endif buf->real_y = buf->y - buf->border_width; for (x = buf->x - tile_width (); x <= buf->x + buf->width; x += tile_width ()) { copy_tile_to_buf (buf, source, x, buf->y + tile_height ()); +#ifdef RLXTEST + printf("shift_buf: x %d\n", x); +#endif }; fix_boundaries (buf, source, FALSE); }; +#ifdef RLXTEST + printf("shift_buf: done\n"); +#endif return (not_finished); } --- refocus-0.9.0/src/util.c 2003-01-30 22:30:19.000000000 +0100 +++ refocus-0.9.0/src/util.c 2010-07-04 15:13:21.416365300 +0200 @@ -18,6 +18,7 @@ * Version $Id: util.c,v 1.1.1.1 2003/01/30 21:30:19 ernstl Exp $ */ +#include #include "util.h" #include #include @@ -30,14 +31,38 @@ gint floorm (gint a, gint b) /* return largest multiple of b that is <= a */ + /* + & & m = floorm(a,b) + & a = b*m + r + & 0 <= r < b + */ { +#ifdef RLXTEST + printf("floorm: a/b %d, fl %g\n", a/b, floor ((gdouble) a / b)); +#endif return (b * floor ((gdouble) a / b)); } gint ceilm (gint a, gint b) /* return least multiple of b that is >= a */ + /* + & m = ceilm(a,b) + & a = b*m - r; + & m = a/b + % r = a%b + & -a = -b*m + r + + & ceilm = (r == 0 ? b*m : (b+1)*m) + */ { +#ifdef RLXTEST + printf("ceil: a %d, b %d, -(-a/b) %d,a/b+(a%b != 0 ? 1:0) %d, fl %g\n", + a,b, + -((-a)/b), + a/b+(a%b != 0 ? 1:0), + ceil ((gdouble) a / b) ); +#endif return (b * ceil ((gdouble) a / b)); }