| 5005 | #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ |
| 5006 | |
| 5007 | static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, |
| 5008 | size_t length, size_t bytewidth, unsigned char filterType) |
| 5009 | { |
| 5010 | size_t i; |
| 5011 | switch(filterType) |
| 5012 | { |
| 5013 | case 0: /*None*/ |
| 5014 | for(i = 0; i < length; i++) out[i] = scanline[i]; |
| 5015 | break; |
| 5016 | case 1: /*Sub*/ |
| 5017 | if(prevline) |
| 5018 | { |
| 5019 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; |
| 5020 | for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; |
| 5021 | } |
| 5022 | else |
| 5023 | { |
| 5024 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; |
| 5025 | for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; |
| 5026 | } |
| 5027 | break; |
| 5028 | case 2: /*Up*/ |
| 5029 | if(prevline) |
| 5030 | { |
| 5031 | for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i]; |
| 5032 | } |
| 5033 | else |
| 5034 | { |
| 5035 | for(i = 0; i < length; i++) out[i] = scanline[i]; |
| 5036 | } |
| 5037 | break; |
| 5038 | case 3: /*Average*/ |
| 5039 | if(prevline) |
| 5040 | { |
| 5041 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2; |
| 5042 | for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2); |
| 5043 | } |
| 5044 | else |
| 5045 | { |
| 5046 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; |
| 5047 | for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2; |
| 5048 | } |
| 5049 | break; |
| 5050 | case 4: /*Paeth*/ |
| 5051 | if(prevline) |
| 5052 | { |
| 5053 | /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ |
| 5054 | for(i = 0; i < bytewidth; i++) out[i] = (scanline[i] - prevline[i]); |
| 5055 | for(i = bytewidth; i < length; i++) |
| 5056 | { |
| 5057 | out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); |
| 5058 | } |
| 5059 | } |
| 5060 | else |
| 5061 | { |
| 5062 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; |
| 5063 | /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ |
| 5064 | for(i = bytewidth; i < length; i++) out[i] = (scanline[i] - scanline[i - bytewidth]); |
no test coverage detected