Example #1
0
static int png_reverse_filter_iterate(rpng_t *rpng, uint32_t **data)
{
   if (!rpng)
      return false;

   if (rpng->ihdr.interlace)
      return png_reverse_filter_adam7(data, &rpng->ihdr, rpng->process);

   return png_reverse_filter_regular_iterate(data, &rpng->ihdr, rpng->process);
}
Example #2
0
static int png_reverse_filter_adam7_iterate(uint32_t **data_,
      const struct png_ihdr *ihdr,
      struct rpng_process_t *pngp)
{
   int ret = 0;
   bool to_next = pngp->pass.pos < ARRAY_SIZE(passes);
   uint32_t *data = *data_;

   if (!to_next)
      return PNG_PROCESS_END;

   ret = png_reverse_filter_init(ihdr, pngp);

   if (ret == 1)
      return PNG_PROCESS_NEXT;
   if (ret == -1)
      return PNG_PROCESS_ERROR_END;

   if (png_reverse_filter_init(&pngp->ihdr, pngp) == -1)
      return PNG_PROCESS_ERROR;

   do{
      ret = png_reverse_filter_regular_iterate(&pngp->data,
            &pngp->ihdr, pngp);
   }while(ret == PNG_PROCESS_NEXT);

   if (ret == PNG_PROCESS_ERROR || ret == PNG_PROCESS_ERROR_END)
      return PNG_PROCESS_ERROR;

   pngp->inflate_buf            += pngp->pass.size;
   pngp->adam7_restore_buf_size += pngp->pass.size;

   zlib_stream_decrement_total_out(pngp->stream, pngp->pass.size);

   png_reverse_filter_adam7_deinterlace_pass(data,
         ihdr, pngp->data, pngp->pass.width, pngp->pass.height, &passes[pngp->pass.pos]);

   free(pngp->data);

   pngp->pass.width  = 0;
   pngp->pass.height = 0;
   pngp->pass.size   = 0;
   pngp->adam7_pass_initialized = false;

   return PNG_PROCESS_NEXT;
}