Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/engine/edged.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/edged.c')
-rw-r--r--src/engine/edged.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/engine/edged.c b/src/engine/edged.c
new file mode 100644
index 0000000..918f308
--- /dev/null
+++ b/src/engine/edged.c
@@ -0,0 +1,66 @@
+#ifndef UNSUPPORTED
+static void do_edge(void *data, struct taskinfo *task, int r1, int r2)
+{
+ struct filter *f = (struct filter *) data;
+ int y;
+ unsigned int *pixels = f->image->palette->pixels;
+ register unsigned int black = f->image->palette->pixels[0];
+ register cpixel_t *output, *end;
+ register spixel_t *up, *down, *input;
+ for (y = r1; y < r2; y++) {
+ output = p_add(((cpixel_t *) f->image->currlines[y]), 1);
+ input = ((spixel_t *) f->childimage->currlines[y]) + 1;
+ if (y != 0)
+ up = ((spixel_t *) f->childimage->currlines[y - 1]) + 2;
+ else
+ up = ((spixel_t *) f->childimage->currlines[y]) + 2;
+ if (y != f->image->height - 1)
+ down = ((spixel_t *) f->childimage->currlines[y + 1]) + 2;
+ else
+ down = ((spixel_t *) f->childimage->currlines[y]) + 2;
+ end =
+ p_add(((cpixel_t *) f->image->currlines[y]),
+ f->image->width - 1);
+ p_setp(output, -1, 0);
+ p_setp(output, f->image->width - 2, 0);
+ while (output < end) {
+ if (input[1] != input[0] || input[0] != up[0]
+ || input[0] != down[0]) {
+ if (output < end - 2) {
+ p_set(output, pixels[input[0]]);
+ p_setp(output, 1, pixels[input[1]]);
+ p_setp(output, 2, pixels[input[2]]);
+ p_inc(output, 3);
+ input += 3;
+ up += 3;
+ down += 3;
+ while (output < end - 1
+ && (input[0] != up[-1] || input[0] != down[-1]))
+ {
+ p_set(output, pixels[input[0]]);
+ p_setp(output, 1, pixels[input[1]]);
+ p_inc(output, 2);
+ input += 2;
+ up += 2;
+ down += 2;
+ }
+ if (output < end
+ && (input[-1] != input[0] || up[-2] != input[0]
+ || down[-2] != input[0])) {
+ p_set(output, pixels[input[0]]);
+ p_inc(output, 1);
+ input++;
+ up++;
+ down++;
+ }
+ } else
+ p_set(output, pixels[*input]), p_inc(output, 1),
+ input++, up++, down++;
+ } else
+ p_set(output, black), p_inc(output, 1), input++, up++,
+ down++;
+ }
+ }
+}
+#endif
+#undef do_edge