summaryrefslogtreecommitdiff
path: root/graphics/gimp-refocus-plugin/files/patch-src__tilebuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/gimp-refocus-plugin/files/patch-src__tilebuf.c')
-rw-r--r--graphics/gimp-refocus-plugin/files/patch-src__tilebuf.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/graphics/gimp-refocus-plugin/files/patch-src__tilebuf.c b/graphics/gimp-refocus-plugin/files/patch-src__tilebuf.c
new file mode 100644
index 000000000000..1b308c2aec59
--- /dev/null
+++ b/graphics/gimp-refocus-plugin/files/patch-src__tilebuf.c
@@ -0,0 +1,189 @@
+--- 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);
+ }