MCPcopy Create free account
hub / github.com/ValveSoftware/openvr / postProcessScanlines

Function postProcessScanlines

samples/shared/lodepng.cpp:4058–4106  ·  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

4056the IDAT chunks (with filter index bytes and possible padding bits)
4057return value is error*/
4058static unsigned postProcessScanlines(unsigned char* out, unsigned char* in,
4059 unsigned w, unsigned h, const LodePNGInfo* info_png)
4060{
4061 /*
4062 This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype.
4063 Steps:
4064 *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8)
4065 *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace
4066 NOTE: the in buffer will be overwritten with intermediate data!
4067 */
4068 unsigned bpp = lodepng_get_bpp(&info_png->color);
4069 if(bpp == 0) return 31; /*error: invalid colortype*/
4070
4071 if(info_png->interlace_method == 0)
4072 {
4073 if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8)
4074 {
4075 CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp));
4076 removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h);
4077 }
4078 /*we can immediatly filter into the out buffer, no other steps needed*/
4079 else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp));
4080 }
4081 else /*interlace_method is 1 (Adam7)*/
4082 {
4083 unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
4084 unsigned i;
4085
4086 Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
4087
4088 for(i = 0; i < 7; i++)
4089 {
4090 CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp));
4091 /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline,
4092 move bytes instead of bits or move not at all*/
4093 if(bpp < 8)
4094 {
4095 /*remove padding bits in scanlines; after this there still may be padding
4096 bits between the different reduced images: each reduced image still starts nicely at a byte*/
4097 removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp,
4098 ((passw[i] * bpp + 7) / 8) * 8, passh[i]);
4099 }
4100 }
4101
4102 Adam7_deinterlace(out, in, w, h, bpp);
4103 }
4104
4105 return 0;
4106}
4107
4108static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength)
4109{

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