mirror of
https://github.com/libretro/RetroArch
synced 2025-04-11 00:44:20 +00:00
Refactor some more code in adam7 png_reverse_filter function
This commit is contained in:
parent
75ccb24bf4
commit
97b3e9134d
@ -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;
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user