Refactor some more code in adam7 png_reverse_filter function

This commit is contained in:
twinaphex 2015-02-26 20:59:42 +01:00
parent 75ccb24bf4
commit 97b3e9134d
2 changed files with 44 additions and 30 deletions

View File

@ -245,6 +245,11 @@ static bool png_reverse_filter_init(const struct png_ihdr *ihdr,
const uint32_t *palette) const uint32_t *palette)
{ {
size_t pass_size; size_t pass_size;
if (!pngp->adam7_pass_initialized && ihdr->interlace)
{
pngp->adam7_pass_initialized = true;
}
if (pngp->pass_initialized) if (pngp->pass_initialized)
return true; return true;
@ -397,55 +402,55 @@ static bool png_reverse_filter_adam7(uint32_t *data,
{ 0, 1, 1, 2 }, { 0, 1, 1, 2 },
}; };
for (; pngp->pass < ARRAY_SIZE(passes); pngp->pass++) for (; pngp->pass.pos < ARRAY_SIZE(passes); pngp->pass.pos++)
{ {
unsigned pass_width, pass_height; if (ihdr->width <= passes[pngp->pass.pos].x ||
size_t pass_size; ihdr->height <= passes[pngp->pass.pos].y) /* Empty pass */
struct png_ihdr tmp_ihdr;
uint32_t *tmp_data = NULL;
if (ihdr->width <= passes[pngp->pass].x ||
ihdr->height <= passes[pngp->pass].y) /* Empty pass */
continue; continue;
pass_width = (ihdr->width - pngp->pass.width = (ihdr->width -
passes[pngp->pass].x + passes[pngp->pass].stride_x - 1) / passes[pngp->pass].stride_x; passes[pngp->pass.pos].x + passes[pngp->pass.pos].stride_x - 1) / passes[pngp->pass.pos].stride_x;
pass_height = (ihdr->height - passes[pngp->pass].y + pngp->pass.height = (ihdr->height - passes[pngp->pass.pos].y +
passes[pngp->pass].stride_y - 1) / passes[pngp->pass].stride_y; passes[pngp->pass.pos].stride_y - 1) / passes[pngp->pass.pos].stride_y;
tmp_data = (uint32_t*)malloc( pngp->data = (uint32_t*)malloc(
pass_width * pass_height * sizeof(uint32_t)); pngp->pass.width * pngp->pass.height * sizeof(uint32_t));
if (!tmp_data) if (!pngp->data)
return false; return false;
tmp_ihdr = *ihdr; pngp->ihdr = *ihdr;
tmp_ihdr.width = pass_width; pngp->ihdr.width = pngp->pass.width;
tmp_ihdr.height = pass_height; pngp->ihdr.height = pngp->pass.height;
png_pass_geom(&tmp_ihdr, pass_width, png_pass_geom(&pngp->ihdr, pngp->pass.width,
pass_height, NULL, NULL, &pass_size); pngp->pass.height, NULL, NULL, &pngp->pass.size);
if (pass_size > pngp->stream.total_out) if (pngp->pass.size > pngp->stream.total_out)
{ {
free(tmp_data); free(pngp->data);
return false; return false;
} }
if (!png_reverse_filter(tmp_data, if (!png_reverse_filter(pngp->data,
&tmp_ihdr, inflate_buf, pngp, palette)) &pngp->ihdr, inflate_buf, pngp, palette))
{ {
free(tmp_data); free(pngp->data);
return false; return false;
} }
inflate_buf += pass_size; inflate_buf += pngp->pass.size;
pngp->stream.total_out -= pass_size; pngp->stream.total_out -= pngp->pass.size;
deinterlace_pass(data, deinterlace_pass(data,
ihdr, tmp_data, pass_width, pass_height, &passes[pngp->pass]); ihdr, pngp->data, pngp->pass.width, pngp->pass.height, &passes[pngp->pass.pos]);
free(tmp_data); free(pngp->data);
pngp->adam7_pass_initialized = false;
pngp->pass.width = 0;
pngp->pass.height = 0;
pngp->pass.size = 0;
} }
return true; return true;

View File

@ -63,15 +63,24 @@ struct png_ihdr
struct rpng_process_t struct rpng_process_t
{ {
bool adam7_pass_initialized;
bool pass_initialized; bool pass_initialized;
uint32_t *data;
struct png_ihdr ihdr;
uint8_t *prev_scanline; uint8_t *prev_scanline;
uint8_t *decoded_scanline; uint8_t *decoded_scanline;
uint8_t *inflate_buf; uint8_t *inflate_buf;
size_t inflate_buf_size; size_t inflate_buf_size;
unsigned bpp; unsigned bpp;
unsigned pitch; unsigned pitch;
unsigned pass;
unsigned h; unsigned h;
struct
{
unsigned width;
unsigned height;
size_t size;
unsigned pos;
} pass;
z_stream stream; z_stream stream;
}; };