(RPNG) Create rpng_reverse_filter_adam7_iterate

This commit is contained in:
twinaphex 2015-03-13 21:54:51 +01:00
parent 2c48b2a25d
commit 39b718aa03
1 changed files with 35 additions and 27 deletions

View File

@ -437,36 +437,30 @@ static bool png_reverse_filter_regular(uint32_t **data_, const struct png_ihdr *
return false; return false;
} }
static int png_reverse_filter_adam7(uint32_t **data_, static int png_reverse_filter_adam7_iterate(uint32_t **data_,
const struct png_ihdr *ihdr, const struct png_ihdr *ihdr,
struct rpng_process_t *pngp) struct rpng_process_t *pngp)
{ {
int ret = 0; int ret = 0;
bool to_cont = pngp->pass.pos < ARRAY_SIZE(passes); bool to_next = pngp->pass.pos < ARRAY_SIZE(passes);
uint32_t *data = *data_; uint32_t *data = *data_;
if (!to_cont) if (!to_next)
{ return 1;
ret = 1;
goto end;
}
ret = png_reverse_filter_init(ihdr, pngp); ret = png_reverse_filter_init(ihdr, pngp);
if (ret == 1) if (ret == 1)
goto cont; return 0;
if (ret == -1) if (ret == -1)
{ return -1;
ret = -1;
goto end;
}
if (png_reverse_filter_init(&pngp->ihdr, pngp) == -1) if (png_reverse_filter_init(&pngp->ihdr, pngp) == -1)
goto error; return -2;
if (!png_reverse_filter_regular(&pngp->data, if (!png_reverse_filter_regular(&pngp->data,
&pngp->ihdr, pngp)) &pngp->ihdr, pngp))
goto error; return -2;
pngp->inflate_buf += pngp->pass.size; pngp->inflate_buf += pngp->pass.size;
pngp->adam7_restore_buf_size += pngp->pass.size; pngp->adam7_restore_buf_size += pngp->pass.size;
@ -482,22 +476,35 @@ static int png_reverse_filter_adam7(uint32_t **data_,
pngp->pass.size = 0; pngp->pass.size = 0;
pngp->adam7_pass_initialized = false; pngp->adam7_pass_initialized = false;
cont:
pngp->pass.pos++;
return 0; return 0;
}
static int png_reverse_filter_adam7(uint32_t **data_,
const struct png_ihdr *ihdr,
struct rpng_process_t *pngp)
{
int ret = png_reverse_filter_adam7_iterate(data_,
ihdr, pngp);
switch (ret)
{
case -1:
case 1: /* end */
break;
case 0: /* continue iterating */
pngp->pass.pos++;
return 0;
case -2: /* error */
if (pngp->data)
free(pngp->data);
pngp->inflate_buf -= pngp->adam7_restore_buf_size;
pngp->adam7_restore_buf_size = 0;
return -1;
}
end:
pngp->inflate_buf -= pngp->adam7_restore_buf_size; pngp->inflate_buf -= pngp->adam7_restore_buf_size;
pngp->adam7_restore_buf_size = 0; pngp->adam7_restore_buf_size = 0;
return ret; return ret;
error:
if (pngp->data)
free(pngp->data);
pngp->inflate_buf -= pngp->adam7_restore_buf_size;
pngp->adam7_restore_buf_size = 0;
return -1;
} }
static bool png_reverse_filter_loop(struct rpng_t *rpng, static bool png_reverse_filter_loop(struct rpng_t *rpng,
@ -513,8 +520,6 @@ static bool png_reverse_filter_loop(struct rpng_t *rpng,
ihdr = &rpng->ihdr; ihdr = &rpng->ihdr;
pngp = &rpng->process; pngp = &rpng->process;
if (png_reverse_filter_init(ihdr, pngp) == -1)
return false;
if (rpng->ihdr.interlace == 1) if (rpng->ihdr.interlace == 1)
{ {
@ -526,6 +531,9 @@ static bool png_reverse_filter_loop(struct rpng_t *rpng,
} }
else else
{ {
if (png_reverse_filter_init(ihdr, pngp) == -1)
return false;
if (!png_reverse_filter_regular(data, if (!png_reverse_filter_regular(data,
ihdr, pngp)) ihdr, pngp))
ret = -1; ret = -1;