| 5156 | #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ |
| 5157 | |
| 5158 | static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, |
| 5159 | size_t length, size_t bytewidth, unsigned char filterType) |
| 5160 | { |
| 5161 | size_t i; |
| 5162 | switch(filterType) |
| 5163 | { |
| 5164 | case 0: /*None*/ |
| 5165 | for(i = 0; i < length; i++) out[i] = scanline[i]; |
| 5166 | break; |
| 5167 | case 1: /*Sub*/ |
| 5168 | if(prevline) |
| 5169 | { |
| 5170 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; |
| 5171 | for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; |
| 5172 | } |
| 5173 | else |
| 5174 | { |
| 5175 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; |
| 5176 | for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; |
| 5177 | } |
| 5178 | break; |
| 5179 | case 2: /*Up*/ |
| 5180 | if(prevline) |
| 5181 | { |
| 5182 | for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i]; |
| 5183 | } |
| 5184 | else |
| 5185 | { |
| 5186 | for(i = 0; i < length; i++) out[i] = scanline[i]; |
| 5187 | } |
| 5188 | break; |
| 5189 | case 3: /*Average*/ |
| 5190 | if(prevline) |
| 5191 | { |
| 5192 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2; |
| 5193 | for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2); |
| 5194 | } |
| 5195 | else |
| 5196 | { |
| 5197 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; |
| 5198 | for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2; |
| 5199 | } |
| 5200 | break; |
| 5201 | case 4: /*Paeth*/ |
| 5202 | if(prevline) |
| 5203 | { |
| 5204 | /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ |
| 5205 | for(i = 0; i < bytewidth; i++) out[i] = (scanline[i] - prevline[i]); |
| 5206 | for(i = bytewidth; i < length; i++) |
| 5207 | { |
| 5208 | out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); |
| 5209 | } |
| 5210 | } |
| 5211 | else |
| 5212 | { |
| 5213 | for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; |
| 5214 | /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ |
| 5215 | for(i = bytewidth; i < length; i++) out[i] = (scanline[i] - scanline[i - bytewidth]); |
no test coverage detected