MCPcopy Create free account
hub / github.com/creatale/node-dv / postProcessScanlines

Function postProcessScanlines

deps/lodepng/lodepng.cpp:4224–4272  ·  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

4222the IDAT chunks (with filter index bytes and possible padding bits)
4223return value is error*/
4224static unsigned postProcessScanlines(unsigned char* out, unsigned char* in,
4225 unsigned w, unsigned h, const LodePNGInfo* info_png)
4226{
4227 /*
4228 This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype.
4229 Steps:
4230 *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8)
4231 *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace
4232 NOTE: the in buffer will be overwritten with intermediate data!
4233 */
4234 unsigned bpp = lodepng_get_bpp(&info_png->color);
4235 if(bpp == 0) return 31; /*error: invalid colortype*/
4236
4237 if(info_png->interlace_method == 0)
4238 {
4239 if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8)
4240 {
4241 CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp));
4242 removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h);
4243 }
4244 /*we can immediately filter into the out buffer, no other steps needed*/
4245 else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp));
4246 }
4247 else /*interlace_method is 1 (Adam7)*/
4248 {
4249 unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
4250 unsigned i;
4251
4252 Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
4253
4254 for(i = 0; i != 7; ++i)
4255 {
4256 CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp));
4257 /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline,
4258 move bytes instead of bits or move not at all*/
4259 if(bpp < 8)
4260 {
4261 /*remove padding bits in scanlines; after this there still may be padding
4262 bits between the different reduced images: each reduced image still starts nicely at a byte*/
4263 removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp,
4264 ((passw[i] * bpp + 7) / 8) * 8, passh[i]);
4265 }
4266 }
4267
4268 Adam7_deinterlace(out, in, w, h, bpp);
4269 }
4270
4271 return 0;
4272}
4273
4274static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength)
4275{

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