#include #include // 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