MCPcopy Create free account
hub / github.com/ClassiCube/ClassiCube / Png_Reconstruct

Function Png_Reconstruct

src/Bitmap.c:155–198  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

153}
154
155static 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

Callers 1

Png_DecodeFunction · 0.85

Calls 1

Math_AbsIFunction · 0.85

Tested by

no test coverage detected