MCPcopy Create free account
hub / github.com/DFHack/dfhack / postProcessScanlines

Function postProcessScanlines

depends/lodepng/lodepng.cpp:4306–4347  ·  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

4304the IDAT chunks (with filter index bytes and possible padding bits)
4305return value is error*/
4306static unsigned postProcessScanlines(unsigned char* out, unsigned char* in,
4307 unsigned w, unsigned h, const LodePNGInfo* info_png) {
4308 /*
4309 This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype.
4310 Steps:
4311 *) if no Adam7: 1) unfilter 2) remove padding bits (= possible extra bits per scanline if bpp < 8)
4312 *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace
4313 NOTE: the in buffer will be overwritten with intermediate data!
4314 */
4315 unsigned bpp = lodepng_get_bpp(&info_png->color);
4316 if(bpp == 0) return 31; /*error: invalid colortype*/
4317
4318 if(info_png->interlace_method == 0) {
4319 if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) {
4320 CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp));
4321 removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h);
4322 }
4323 /*we can immediately filter into the out buffer, no other steps needed*/
4324 else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp));
4325 } else /*interlace_method is 1 (Adam7)*/ {
4326 unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
4327 unsigned i;
4328
4329 Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
4330
4331 for(i = 0; i != 7; ++i) {
4332 CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp));
4333 /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline,
4334 move bytes instead of bits or move not at all*/
4335 if(bpp < 8) {
4336 /*remove padding bits in scanlines; after this there still may be padding
4337 bits between the different reduced images: each reduced image still starts nicely at a byte*/
4338 removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp,
4339 ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]);
4340 }
4341 }
4342
4343 Adam7_deinterlace(out, in, w, h, bpp);
4344 }
4345
4346 return 0;
4347}
4348
4349static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) {
4350 unsigned pos = 0, i;

Callers 1

decodeGenericFunction · 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