MCPcopy Create free account
hub / github.com/FLIF-hub/FLIF / postProcessScanlines

Function postProcessScanlines

extern/lodepng.cpp:4165–4213  ·  view source on GitHub ↗

out must be buffer big enough to contain full image, and in must contain the full decompressed data from the IDAT chunks (with filter index bytes and possible padding bits) return value is error*/

Source from the content-addressed store, hash-verified

4163the IDAT chunks (with filter index bytes and possible padding bits)
4164return value is error*/
4165static unsigned postProcessScanlines(unsigned char* out, unsigned char* in,
4166 unsigned w, unsigned h, const LodePNGInfo* info_png)
4167{
4168 /*
4169 This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype.
4170 Steps:
4171 *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8)
4172 *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace
4173 NOTE: the in buffer will be overwritten with intermediate data!
4174 */
4175 unsigned bpp = lodepng_get_bpp(&info_png->color);
4176 if(bpp == 0) return 31; /*error: invalid colortype*/
4177
4178 if(info_png->interlace_method == 0)
4179 {
4180 if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8)
4181 {
4182 CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp));
4183 removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h);
4184 }
4185 /*we can immediately filter into the out buffer, no other steps needed*/
4186 else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp));
4187 }
4188 else /*interlace_method is 1 (Adam7)*/
4189 {
4190 unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
4191 unsigned i;
4192
4193 Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
4194
4195 for(i = 0; i != 7; ++i)
4196 {
4197 CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp));
4198 /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline,
4199 move bytes instead of bits or move not at all*/
4200 if(bpp < 8)
4201 {
4202 /*remove padding bits in scanlines; after this there still may be padding
4203 bits between the different reduced images: each reduced image still starts nicely at a byte*/
4204 removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp,
4205 ((passw[i] * bpp + 7) / 8) * 8, passh[i]);
4206 }
4207 }
4208
4209 Adam7_deinterlace(out, in, w, h, bpp);
4210 }
4211
4212 return 0;
4213}
4214
4215static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength)
4216{

Callers 1

lodepng.cppFile · 0.85

Calls 5

lodepng_get_bppFunction · 0.85
unfilterFunction · 0.85
removePaddingBitsFunction · 0.85
Adam7_getpassvaluesFunction · 0.85
Adam7_deinterlaceFunction · 0.85

Tested by

no test coverage detected