| 153 | } |
| 154 | |
| 155 | static void Png_Reconstruct(cc_uint8 type, cc_uint8 bytesPerPixel, cc_uint8* line, cc_uint8* prior, cc_uint32 lineLen) { |
| 156 | cc_uint32 i, j; |
| 157 | |
| 158 | switch (type) { |
| 159 | case PNG_FILTER_SUB: |
| 160 | for (i = bytesPerPixel, j = 0; i < lineLen; i++, j++) { |
| 161 | line[i] += line[j]; |
| 162 | } |
| 163 | return; |
| 164 | |
| 165 | case PNG_FILTER_UP: |
| 166 | for (i = 0; i < lineLen; i++) { |
| 167 | line[i] += prior[i]; |
| 168 | } |
| 169 | return; |
| 170 | |
| 171 | case PNG_FILTER_AVERAGE: |
| 172 | for (i = 0; i < bytesPerPixel; i++) { |
| 173 | line[i] += (prior[i] >> 1); |
| 174 | } |
| 175 | for (j = 0; i < lineLen; i++, j++) { |
| 176 | line[i] += ((prior[i] + line[j]) >> 1); |
| 177 | } |
| 178 | return; |
| 179 | |
| 180 | case PNG_FILTER_PAETH: |
| 181 | /* TODO: verify this is right */ |
| 182 | for (i = 0; i < bytesPerPixel; i++) { |
| 183 | line[i] += prior[i]; |
| 184 | } |
| 185 | for (j = 0; i < lineLen; i++, j++) { |
| 186 | cc_uint8 a = line[j], b = prior[i], c = prior[j]; |
| 187 | int p = a + b - c; |
| 188 | int pa = Math_AbsI(p - a); |
| 189 | int pb = Math_AbsI(p - b); |
| 190 | int pc = Math_AbsI(p - c); |
| 191 | |
| 192 | if (pa <= pb && pa <= pc) { line[i] += a; } |
| 193 | else if (pb <= pc) { line[i] += b; } |
| 194 | else { line[i] += c; } |
| 195 | } |
| 196 | return; |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | #define Bitmap_Set(dst, r,g,b,a) dst = BitmapCol_Make(r, g, b, a); |
| 201 |
no test coverage detected