| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "Fuzz.h" |
| #include <stdlib.h> |
| |
| // This really is just an example Fuzz*.cpp file. |
| // It tests that two different ways of calculating the Paeth predictor function are equivalent. |
| |
| static uint8_t paeth_std(uint8_t a, uint8_t b, uint8_t c) { |
| int p = a+b-c; |
| |
| int pa = abs(p-a), |
| pb = abs(p-b), |
| pc = abs(p-c); |
| |
| if (pb < pa) { pa = pb; a = b; } |
| if (pc < pa) { a = c; } |
| return a; |
| } |
| |
| static uint8_t paeth_alt(uint8_t a, uint8_t b, uint8_t c) { |
| int min = SkTMin(a,b), |
| max = SkTMax(a,b); |
| int delta = (max-min)/3; |
| |
| if (c <= min+delta) return max; |
| if (c >= max-delta) return min; |
| return c; |
| } |
| |
| DEF_FUZZ(Paeth, fuzz) { |
| auto a = fuzz->nextB(), |
| b = fuzz->nextB(), |
| c = fuzz->nextB(); |
| SkDebugf("Paeth(%d,%d,%d)\n", a,b,c); |
| |
| if (a == b && b == c) { |
| fuzz->signalBoring(); // Not really boring, just demoing signalBoring(). |
| } |
| |
| if (paeth_alt(a,b,c) != paeth_std(a,b,c)) { |
| fuzz->signalBug(); |
| } |
| } |