diff options
Diffstat (limited to 'src/engine/stereod.c')
-rw-r--r-- | src/engine/stereod.c | 51 |
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 |