summaryrefslogtreecommitdiff
path: root/image/png/paeth.ha
blob: 4abc373719f6098c862caebb716e99a43b6e4acc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Based on Go's implementation; BSD license
use math;

fn applypaeth(dec: *decoder) void = {
	const bpp = dec.bpp;
	let a = 0i32, b = 0i32, c = 0i32, pa = 0i32, pb = 0i32, pc = 0i32;
	for (let i = 0z; i < bpp; i += 1) {
		a = 0;
		c = 0;
		for (let j = i; j < len(dec.cr); j += bpp) {
			b = dec.pr[j]: i32;
			pa = b - c;
			pb = a - c;
			pc = math::absi32(pa + pb): i32;
			pa = math::absi32(pa): i32;
			pb = math::absi32(pb): i32;
			if (pa <= pb && pa <= pc) {
				void; // no-op
			} else if (pb <= pc) {
				a = b;
			} else {
				a = c;
			};
			a += dec.cr[j]: i32;
			a &= 0xff;
			dec.cr[j] = a: u8;
			c = b;
		};
	};
};