| #include <stdio.h> |
| #include <stdlib.h> |
| |
| // Reference Paeth filter as per PNG spec |
| static int ref_paeth(int a, int b, int c) |
| { |
| int p = a + b - c; |
| int pa = abs(p-a); |
| int pb = abs(p-b); |
| int pc = abs(p-c); |
| if (pa <= pb && pa <= pc) return a; |
| if (pb <= pc) return b; |
| return c; |
| } |
| |
| // Optimized Paeth filter |
| static int opt_paeth(int a, int b, int c) |
| { |
| int thresh = c*3 - (a + b); |
| int lo = a < b ? a : b; |
| int hi = a < b ? b : a; |
| int t0 = (hi <= thresh) ? lo : c; |
| int t1 = (thresh <= lo) ? hi : t0; |
| return t1; |
| } |
| |
| int main() |
| { |
| // Exhaustively test the functions match for all byte inputs a, b,c in [0,255] |
| for (int i = 0; i < (1 << 24); ++i) { |
| int a = i & 0xff; |
| int b = (i >> 8) & 0xff; |
| int c = (i >> 16) & 0xff; |
| |
| int ref = ref_paeth(a, b, c); |
| int opt = opt_paeth(a, b, c); |
| if (ref != opt) { |
| fprintf(stderr, "mismatch at a=%3d b=%3d c=%3d: ref=%3d opt=%3d\n", a, b, c, ref, opt); |
| return 1; |
| } |
| } |
| |
| printf("all ok!\n"); |
| return 0; |
| } |
| |
| // vim:sw=3:sts=3:et |