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;
};
};
};
|