X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=pngtest.c;h=abce0f86298da6fd5ee2022510239cf38f6977b4;hb=6f1d4d9e2434fdc38ff64bce5cff59c7698540b6;hp=542ee95931a6007e4b6a41eb4d69392d3578ef03;hpb=f125affdc66153880ba8dc33d8369e5a0dc9a6a7;p=platform%2Fupstream%2Flibpng.git diff --git a/pngtest.c b/pngtest.c index 542ee95..abce0f8 100644 --- a/pngtest.c +++ b/pngtest.c @@ -875,6 +875,10 @@ test_one_file(const char *inname, const char *outname) volatile int num_passes; int pass; int bit_depth, color_type; +#ifdef PNG_APNG_SUPPORTED + png_uint_32 num_frames; + png_uint_32 num_plays; +#endif row_buf = NULL; error_parameters.file_name = inname; @@ -1383,6 +1387,22 @@ test_one_file(const char *inname, const char *outname) } } #endif + +#ifdef PNG_APNG_SUPPORTED + if (png_get_valid(read_ptr, read_info_ptr, PNG_INFO_acTL)) + { + if (png_get_acTL(read_ptr, read_info_ptr, &num_frames, &num_plays)) + { + png_byte is_hidden; + pngtest_debug2("Handling acTL chunks (frames %ld, plays %ld)", + num_frames, num_plays); + png_set_acTL(write_ptr, write_info_ptr, num_frames, num_plays); + is_hidden = png_get_first_frame_is_hidden(read_ptr, read_info_ptr); + png_set_first_frame_is_hidden(write_ptr, write_info_ptr, is_hidden); + } + } +#endif + #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED { png_unknown_chunkp unknowns; @@ -1463,6 +1483,110 @@ test_one_file(const char *inname, const char *outname) t_misc += (t_stop - t_start); t_start = t_stop; #endif +#ifdef PNG_APNG_SUPPORTED + if (png_get_valid(read_ptr, read_info_ptr, PNG_INFO_acTL)) + { + png_uint_32 frame; + for (frame = 0; frame < num_frames; frame++) + { + png_uint_32 frame_width; + png_uint_32 frame_height; + png_uint_32 x_offset; + png_uint_32 y_offset; + png_uint_16 delay_num; + png_uint_16 delay_den; + png_byte dispose_op; + png_byte blend_op; + png_read_frame_head(read_ptr, read_info_ptr); + if (png_get_valid(read_ptr, read_info_ptr, PNG_INFO_fcTL)) + { + png_get_next_frame_fcTL(read_ptr, read_info_ptr, + &frame_width, &frame_height, + &x_offset, &y_offset, + &delay_num, &delay_den, + &dispose_op, &blend_op); + } + else + { + frame_width = width; + frame_height = height; + x_offset = 0; + y_offset = 0; + delay_num = 1; + delay_den = 1; + dispose_op = PNG_DISPOSE_OP_NONE; + blend_op = PNG_BLEND_OP_SOURCE; + } +#ifdef PNG_WRITE_APNG_SUPPORTED + png_write_frame_head(write_ptr, write_info_ptr, (png_bytepp)&row_buf, + frame_width, frame_height, + x_offset, y_offset, + delay_num, delay_den, + dispose_op, blend_op); +#endif + for (pass = 0; pass < num_passes; pass++) + { +# ifdef calc_pass_height + png_uint_32 pass_height; + + if (num_passes == 7) /* interlaced */ + { + if (PNG_PASS_COLS(frame_width, pass) > 0) + pass_height = PNG_PASS_ROWS(frame_height, pass); + + else + pass_height = 0; + } + + else /* not interlaced */ + pass_height = frame_height; +# else +# define pass_height frame_height +# endif + + pngtest_debug1("Writing row data for pass %d", pass); + for (y = 0; y < pass_height; y++) + { +#ifndef SINGLE_ROWBUF_ALLOC + pngtest_debug2("Allocating row buffer (pass %d, y = %u)...", pass, y); + + row_buf = (png_bytep)png_malloc(read_ptr, + png_get_rowbytes(read_ptr, read_info_ptr)); + + pngtest_debug2("\t0x%08lx (%lu bytes)", (unsigned long)row_buf, + (unsigned long)png_get_rowbytes(read_ptr, read_info_ptr)); + +#endif /* !SINGLE_ROWBUF_ALLOC */ + png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1); + +#ifdef PNG_WRITE_SUPPORTED +#ifdef PNGTEST_TIMING + t_stop = (float)clock(); + t_decode += (t_stop - t_start); + t_start = t_stop; +#endif + png_write_rows(write_ptr, (png_bytepp)&row_buf, 1); +#ifdef PNGTEST_TIMING + t_stop = (float)clock(); + t_encode += (t_stop - t_start); + t_start = t_stop; +#endif +#endif /* PNG_WRITE_SUPPORTED */ + +#ifndef SINGLE_ROWBUF_ALLOC + pngtest_debug2("Freeing row buffer (pass %d, y = %u)", pass, y); + png_free(read_ptr, row_buf); + row_buf = NULL; +#endif /* !SINGLE_ROWBUF_ALLOC */ + } + } +#ifdef PNG_WRITE_APNG_SUPPORTED + png_write_frame_tail(write_ptr, write_info_ptr); +#endif + } + } + else +#endif for (pass = 0; pass < num_passes; pass++) { # ifdef calc_pass_height