freebsd-ports/graphics/gimp-refocus-plugin/files/patch-src__tilebuf.c
Mario Sergio Fujikawa Ferreira 09c482df59 New port Refocus 0.9.0: GIMP plugin to "refocus" images through FIR Wiener filtering
Approved by:	eadler (mentor)
Obtained from:	gentoo portage (patches)
2014-04-07 23:54:13 +00:00

189 lines
6.1 KiB
C

--- src/tilebuf.c 2014-03-27 20:00:17.000000000 -0300
+++ src/tilebuf.c 2014-03-27 20:00:58.000000000 -0300
@@ -18,6 +18,7 @@
* Version $Id: tilebuf.c,v 1.1.1.1 2003/01/30 21:30:19 ernstl Exp $
*/
+#include <stdio.h>
#include "tilebuf.h"
#include "util.h"
#include <string.h>
@@ -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)]);
}
@@ -140,7 +146,10 @@
for (x = x_lo - 1; x >= buf->real_x; x--)
{
- copy_col (buf, 2 * x_lo - x, y_start, y_end - y_start, x);
+ gint sx = 2 * x_lo - x;
+ copy_col (buf,
+ sx<=buf->real_x+buf->real_width-1?sx:buf->real_x+buf->real_width-1,
+ y_start, y_end - y_start, x);
};
}
break;
@@ -171,7 +180,9 @@
for (x = x_hi; x < buf->real_x + buf->real_width; x++)
{
- copy_col (buf, 2 * (x_hi - 1) - x, y_start, y_end - y_start, x);
+ gint sx = 2 * (x_hi - 1) - x;
+ copy_col (buf, sx>=buf->real_x?sx:buf->real_x,
+ y_start, y_end - y_start, x);
};
}
break;
@@ -200,7 +211,10 @@
for (y = y_lo - 1; y >= buf->real_y; y--)
{
- copy_row (buf, buf->real_x, 2 * y_lo - y, buf->real_width, y);
+ gint sy = 2 * y_lo - y;
+ copy_row (buf, buf->real_x,
+ sy<=buf->real_y+buf->real_height-1?sy:buf->real_y+buf->real_height-1,
+ buf->real_width, y);
};
}
break;
@@ -212,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;
};
@@ -226,12 +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)*/
{
- copy_row (buf, buf->real_x, 2 * (y_hi - 1) - 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;
@@ -253,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,
@@ -262,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
@@ -309,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 */
@@ -321,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);
}