Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/engine/stereod.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/stereod.c')
-rw-r--r--src/engine/stereod.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/engine/stereod.c b/src/engine/stereod.c
new file mode 100644
index 0000000..26ac857
--- /dev/null
+++ b/src/engine/stereod.c
@@ -0,0 +1,51 @@
+#ifndef UNSUPPORTED
+static void
+do_stereogram(void *data, struct taskinfo *task, int r1, int r2)
+{
+ struct filter *f = (struct filter *) data;
+ int i, y, lc;
+ struct stereogramdata *s = (struct stereogramdata *) f->data;
+ register cpixel_t *cs, *c, *src, *src1, *ce;
+ register spixel_t *c1;
+ unsigned int *pixels = f->image->palette->pixels;
+ s->minc = NCOLORS;
+ for (i = r1; i < r2; i++) {
+ int i1;
+ for (i1 = 0; i1 < 2; i1++) {
+ c1 = (spixel_t *) f->childimage->currlines[i];
+ c = cs = (cpixel_t *) f->image->currlines[2 * i + i1];
+ ce = p_add(cs, f->image->width);
+ src = src1 = c;
+ lc = 1024;
+ while (c < ce) {
+ y = *c1;
+ if (y == lc)
+ p_inc(src, 2);
+ else {
+ lc = y;
+ if (y < s->minc && y != 0)
+ s->minc = y;
+ y = table[y];
+ src = p_add(c, -y);
+ }
+ if (src < src1) {
+ p_set(c, pixels[(rand() & 15)]);
+ p_setp(c, 1, pixels[(rand() & 15)]);
+ } else {
+ if (src <= cs) {
+ p_set(c, pixels[(rand() & 15)]);
+ p_setp(c, 1, pixels[(rand() & 15)]);
+ } else {
+ p_copy(c, 0, src, 0);
+ p_copy(c, 1, src, 1);
+ }
+ src1 = src;
+ }
+ p_inc(c, 2);
+ c1++;
+ }
+ }
+ }
+}
+#endif
+#undef do_stereogram