MCPcopy Create free account
hub / github.com/OpenXcom/OpenXcom / postProcessScanlines

Function postProcessScanlines

src/lodepng.cpp:4204–4252  ·  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

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

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