updating for APNG 0.10. splitting out render_op in to dispose_op and blend_op. bug 257197. r=asmith13, sr=vlad

This commit is contained in:
pavlov@pavlov.net 2007-03-22 16:35:51 -07:00
Родитель fcafe0ab51
Коммит ac98b1e96d
7 изменённых файлов: 88 добавлений и 59 удалений

Просмотреть файл

@ -909,7 +909,8 @@ defined(PNG_READ_BACKGROUND_SUPPORTED)
png_uint_32 next_frame_y_offset; png_uint_32 next_frame_y_offset;
png_uint_16 next_frame_delay_num; png_uint_16 next_frame_delay_num;
png_uint_16 next_frame_delay_den; png_uint_16 next_frame_delay_den;
png_byte next_frame_render_op; png_byte next_frame_dispose_op;
png_byte next_frame_blend_op;
#endif #endif
} png_info; } png_info;
@ -1411,11 +1412,14 @@ struct png_struct_def
/* For png_struct.apng_flags: */ /* For png_struct.apng_flags: */
#define PNG_FIRST_FRAME_HIDDEN 0x0001 #define PNG_FIRST_FRAME_HIDDEN 0x0001
/* dispose_op flags from render_op inside fcTL */ /* dispose_op flags from inside fcTL */
#define PNG_RENDER_OP_DISPOSE_MASK 0x07 #define PNG_DISPOSE_OP_NONE 0x00
#define PNG_RENDER_OP_DISPOSE_NONE 0x01 #define PNG_DISPOSE_OP_BACKGROUND 0x01
#define PNG_RENDER_OP_DISPOSE_BACKGROUND 0x02 #define PNG_DISPOSE_OP_PREVIOUS 0x02
#define PNG_RENDER_OP_DISPOSE_PREVIOUS 0x04
/* blend_op flags from inside fcTL */
#define PNG_BLEND_OP_SOURCE 0x00
#define PNG_BLEND_OP_OVER 0x01
/* This triggers a compiler error in png.c, if png.c and png.h /* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number. * do not agree upon the version number.
@ -1740,8 +1744,8 @@ extern PNG_EXPORT (void,png_write_frame_head) PNGARG((png_structp png_ptr,
png_infop png_info, png_bytepp row_pointers, png_infop png_info, png_bytepp row_pointers,
png_uint_32 width, png_uint_32 height, png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset, png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_byte render_op, png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
png_byte first_frame_hidden)); png_byte blend_op, png_byte first_frame_hidden));
extern PNG_EXPORT (void,png_write_frame_tail) PNGARG((png_structp png_ptr, extern PNG_EXPORT (void,png_write_frame_tail) PNGARG((png_structp png_ptr,
png_infop png_info)); png_infop png_info));
@ -2441,17 +2445,19 @@ extern PNG_EXPORT(png_uint_32,png_get_num_iterations)
extern PNG_EXPORT(png_uint_32,png_get_next_frame_fcTL) extern PNG_EXPORT(png_uint_32,png_get_next_frame_fcTL)
PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width,
png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset, png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset,
png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *render_op)); png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op,
png_byte *blend_op));
extern PNG_EXPORT(png_uint_32,png_set_next_frame_fcTL) extern PNG_EXPORT(png_uint_32,png_set_next_frame_fcTL)
PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width, PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width,
png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset, png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_byte render_op)); png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
png_byte blend_op));
extern PNG_EXPORT(void,png_ensure_fcTL_is_valid) extern PNG_EXPORT(void,png_ensure_fcTL_is_valid)
PNGARG((png_structp png_ptr, PNGARG((png_structp png_ptr,
png_uint_32 width, png_uint_32 height, png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset, png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_uint_16 delay_num, png_uint_16 delay_den,
png_byte render_op)); png_byte dispose_op, png_byte blend_op));
extern PNG_EXPORT(png_uint_32,png_get_next_frame_width) extern PNG_EXPORT(png_uint_32,png_get_next_frame_width)
PNGARG((png_structp png_ptr, png_infop info_ptr)); PNGARG((png_structp png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_uint_32,png_get_next_frame_height) extern PNG_EXPORT(png_uint_32,png_get_next_frame_height)
@ -2464,7 +2470,9 @@ extern PNG_EXPORT(png_uint_16,png_get_next_frame_delay_num)
PNGARG((png_structp png_ptr, png_infop info_ptr)); PNGARG((png_structp png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_uint_16,png_get_next_frame_delay_den) extern PNG_EXPORT(png_uint_16,png_get_next_frame_delay_den)
PNGARG((png_structp png_ptr, png_infop info_ptr)); PNGARG((png_structp png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_byte,png_get_next_frame_render_op) extern PNG_EXPORT(png_byte,png_get_next_frame_dispose_op)
PNGARG((png_structp png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_byte,png_get_next_frame_blend_op)
PNGARG((png_structp png_ptr, png_infop info_ptr)); PNGARG((png_structp png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_byte,png_first_frame_is_hidden) extern PNG_EXPORT(png_byte,png_first_frame_is_hidden)
PNGARG((png_structp png_ptr, png_infop info_ptr)); PNGARG((png_structp png_ptr, png_infop info_ptr));
@ -3233,7 +3241,8 @@ PNG_EXTERN void png_write_acTL PNGARG((png_structp png_ptr,
PNG_EXTERN void png_write_fcTL PNGARG((png_structp png_ptr, PNG_EXTERN void png_write_fcTL PNGARG((png_structp png_ptr,
png_uint_32 width, png_uint_32 height, png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset, png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_byte render_op)); png_uint_16 delay_num, png_uint_16 delay_den,
png_byte dispose_op, png_byte blend_op));
#endif #endif
/* Called when finished processing a row of data */ /* Called when finished processing a row of data */

Просмотреть файл

@ -838,7 +838,7 @@ png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 *width, png_uint_32 *height, png_uint_32 *width, png_uint_32 *height,
png_uint_32 *x_offset, png_uint_32 *y_offset, png_uint_32 *x_offset, png_uint_32 *y_offset,
png_uint_16 *delay_num, png_uint_16 *delay_den, png_uint_16 *delay_num, png_uint_16 *delay_den,
png_byte *render_op) png_byte *dispose_op, png_byte *blend_op)
{ {
png_debug1(1, "in %s retrieval function\n", "fcTL"); png_debug1(1, "in %s retrieval function\n", "fcTL");
@ -846,7 +846,8 @@ png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
(info_ptr->valid & PNG_INFO_fcTL) && (info_ptr->valid & PNG_INFO_fcTL) &&
width != NULL && height != NULL && width != NULL && height != NULL &&
x_offset != NULL && x_offset != NULL && x_offset != NULL && x_offset != NULL &&
delay_num != NULL && delay_den != NULL && render_op != NULL) delay_num != NULL && delay_den != NULL &&
dispose_op != NULL && blend_op != NULL)
{ {
*width = info_ptr->next_frame_width; *width = info_ptr->next_frame_width;
*height = info_ptr->next_frame_height; *height = info_ptr->next_frame_height;
@ -854,7 +855,8 @@ png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
*y_offset = info_ptr->next_frame_y_offset; *y_offset = info_ptr->next_frame_y_offset;
*delay_num = info_ptr->next_frame_delay_num; *delay_num = info_ptr->next_frame_delay_num;
*delay_den = info_ptr->next_frame_delay_den; *delay_den = info_ptr->next_frame_delay_den;
*render_op = info_ptr->next_frame_render_op; *dispose_op = info_ptr->next_frame_dispose_op;
*blend_op = info_ptr->next_frame_blend_op;
return (1); return (1);
} }
@ -922,12 +924,22 @@ png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr)
} }
png_byte PNGAPI png_byte PNGAPI
png_get_next_frame_render_op(png_structp png_ptr, png_infop info_ptr) png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr)
{ {
png_debug(1, "in png_get_next_frame_render_op()\n"); png_debug(1, "in png_get_next_frame_dispose_op()\n");
if (png_ptr != NULL && info_ptr != NULL) if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_render_op); return (info_ptr->next_frame_dispose_op);
return (0);
}
png_byte PNGAPI
png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr)
{
png_debug(1, "in png_get_next_frame_blend_op()\n");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_blend_op);
return (0); return (0);
} }

Просмотреть файл

@ -2190,14 +2190,15 @@ png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
void /* PRIVATE */ void /* PRIVATE */
png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{ {
png_byte data[21]; png_byte data[22];
png_uint_32 width; png_uint_32 width;
png_uint_32 height; png_uint_32 height;
png_uint_32 x_offset; png_uint_32 x_offset;
png_uint_32 y_offset; png_uint_32 y_offset;
png_uint_16 delay_num; png_uint_16 delay_num;
png_uint_16 delay_den; png_uint_16 delay_den;
png_byte render_op; png_byte dispose_op;
png_byte blend_op;
png_debug(1, "in png_handle_fcTL\n"); png_debug(1, "in png_handle_fcTL\n");
@ -2220,7 +2221,7 @@ png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_crc_finish(png_ptr, length); png_crc_finish(png_ptr, length);
return; return;
} }
else if (length != 25) else if (length != 26)
{ {
png_warning(png_ptr, "fcTL with invalid length skipped"); png_warning(png_ptr, "fcTL with invalid length skipped");
png_crc_finish(png_ptr, length); png_crc_finish(png_ptr, length);
@ -2229,7 +2230,7 @@ png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_ensure_sequence_number(png_ptr, length); png_ensure_sequence_number(png_ptr, length);
png_crc_read(png_ptr, data, 21); png_crc_read(png_ptr, data, 22);
png_crc_finish(png_ptr, 0); png_crc_finish(png_ptr, 0);
width = png_get_uint_31(png_ptr, data); width = png_get_uint_31(png_ptr, data);
@ -2238,7 +2239,8 @@ png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
y_offset = png_get_uint_31(png_ptr, data + 12); y_offset = png_get_uint_31(png_ptr, data + 12);
delay_num = png_get_uint_16(data + 16); delay_num = png_get_uint_16(data + 16);
delay_den = png_get_uint_16(data + 18); delay_den = png_get_uint_16(data + 18);
render_op = data[20]; dispose_op = data[20];
blend_op = data[21];
if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0)) if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0))
png_error(png_ptr, "fcTL for the first frame must have zero offset"); png_error(png_ptr, "fcTL for the first frame must have zero offset");
@ -2250,7 +2252,7 @@ png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
/* the set function will do more error checking */ /* the set function will do more error checking */
png_set_next_frame_fcTL(png_ptr, info_ptr, width, height, png_set_next_frame_fcTL(png_ptr, info_ptr, width, height,
x_offset, y_offset, delay_num, delay_den, x_offset, y_offset, delay_num, delay_den,
render_op); dispose_op, blend_op);
png_read_reinit(png_ptr, info_ptr); png_read_reinit(png_ptr, info_ptr);

Просмотреть файл

@ -1046,7 +1046,7 @@ png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 width, png_uint_32 height, png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset, png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_uint_16 delay_num, png_uint_16 delay_den,
png_byte render_op) png_byte dispose_op, png_byte blend_op)
{ {
png_debug1(1, "in %s storage function\n", "fcTL"); png_debug1(1, "in %s storage function\n", "fcTL");
@ -1059,7 +1059,7 @@ png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
} }
png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
delay_num, delay_den, render_op); delay_num, delay_den, dispose_op, blend_op);
info_ptr->next_frame_width = width; info_ptr->next_frame_width = width;
info_ptr->next_frame_height = height; info_ptr->next_frame_height = height;
@ -1067,7 +1067,8 @@ png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
info_ptr->next_frame_y_offset = y_offset; info_ptr->next_frame_y_offset = y_offset;
info_ptr->next_frame_delay_num = delay_num; info_ptr->next_frame_delay_num = delay_num;
info_ptr->next_frame_delay_den = delay_den; info_ptr->next_frame_delay_den = delay_den;
info_ptr->next_frame_render_op = render_op; info_ptr->next_frame_dispose_op = dispose_op;
info_ptr->next_frame_blend_op = blend_op;
info_ptr->valid |= PNG_INFO_fcTL; info_ptr->valid |= PNG_INFO_fcTL;
@ -1079,7 +1080,7 @@ png_ensure_fcTL_is_valid(png_structp png_ptr,
png_uint_32 width, png_uint_32 height, png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset, png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_uint_16 delay_num, png_uint_16 delay_den,
png_byte render_op) png_byte dispose_op, png_byte blend_op)
{ {
if (width > png_ptr->first_frame_width || if (width > png_ptr->first_frame_width ||
height > png_ptr->first_frame_height) height > png_ptr->first_frame_height)
@ -1093,23 +1094,25 @@ png_ensure_fcTL_is_valid(png_structp png_ptr,
png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)"); png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)");
if (y_offset > PNG_UINT_31_MAX) if (y_offset > PNG_UINT_31_MAX)
png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)"); png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)");
if (render_op & 0xF0)
/* Bits 4 through 7 are reserved and must be set to zero (APNG spec) */ if (dispose_op != PNG_DISPOSE_OP_NONE &&
png_error(png_ptr, "invalid render_op in fcTL"); dispose_op != PNG_DISPOSE_OP_BACKGROUND &&
if (render_op & 0x08 && png_ptr->color_type == PNG_COLOR_TYPE_GRAY) dispose_op != PNG_DISPOSE_OP_PREVIOUS)
png_error(png_ptr, "APNG_RENDER_OP_BLEND_FLAG is not valid for " png_error(png_ptr, "invalid dispose_op in fcTL");
if (blend_op != PNG_BLEND_OP_SOURCE &&
blend_op != PNG_BLEND_OP_OVER)
png_error(png_ptr, "invalid blend_op in fcTL");
if (blend_op == PNG_BLEND_OP_OVER) {
if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
png_error(png_ptr, "PNG_BLEND_OP_OVER is not valid for "
"color type 'greyscale without alpha'"); "color type 'greyscale without alpha'");
if ((render_op & 0x08) && else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) &&
(png_ptr->color_type & PNG_COLOR_MASK_COLOR) &&
!(png_ptr->color_type & PNG_COLOR_MASK_ALPHA)) !(png_ptr->color_type & PNG_COLOR_MASK_ALPHA))
png_error(png_ptr, "APNG_RENDER_OP_BLEND_FLAG is not valid for " png_error(png_ptr, "PNG_BLEND_OP_OVER is not valid for "
"color type 'truecolor without alpha'"); "color type 'truecolor without alpha'");
if (!(render_op & PNG_RENDER_OP_DISPOSE_MASK)) }
png_error(png_ptr, "no DISPOSE_ flag found in fcTL");
if ( (render_op & PNG_RENDER_OP_DISPOSE_MASK) != PNG_RENDER_OP_DISPOSE_NONE &&
(render_op & PNG_RENDER_OP_DISPOSE_MASK) != PNG_RENDER_OP_DISPOSE_BACKGROUND &&
(render_op & PNG_RENDER_OP_DISPOSE_MASK) != PNG_RENDER_OP_DISPOSE_PREVIOUS)
png_error(png_ptr, "multiple DISPOSE_ flags set in fcTL");
} }
#endif /* PNG_APNG_SUPPORTED */ #endif /* PNG_APNG_SUPPORTED */

Просмотреть файл

@ -1524,8 +1524,8 @@ void PNGAPI
png_write_frame_head(png_structp png_ptr, png_infop info_ptr, png_write_frame_head(png_structp png_ptr, png_infop info_ptr,
png_bytepp row_pointers, png_uint_32 width, png_uint_32 height, png_bytepp row_pointers, png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset, png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_byte render_op, png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
png_byte first_frame_hidden) png_byte blend_op, png_byte first_frame_hidden)
{ {
png_debug(1, "in png_write_frame_head\n"); png_debug(1, "in png_write_frame_head\n");
@ -1540,7 +1540,7 @@ png_write_frame_head(png_structp png_ptr, png_infop info_ptr,
if ( !(png_ptr->num_frames_written == 0 && first_frame_hidden) ) if ( !(png_ptr->num_frames_written == 0 && first_frame_hidden) )
png_write_fcTL(png_ptr, width, height, x_offset, y_offset, png_write_fcTL(png_ptr, width, height, x_offset, y_offset,
delay_num, delay_den, render_op); delay_num, delay_den, dispose_op, blend_op);
} }
void PNGAPI void PNGAPI

Просмотреть файл

@ -1754,12 +1754,12 @@ png_write_acTL(png_structp png_ptr,
void /* PRIVATE */ void /* PRIVATE */
png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height, png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset, png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_byte render_op) png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, png_byte blend_op)
{ {
#ifdef PNG_USE_LOCAL_ARRAYS #ifdef PNG_USE_LOCAL_ARRAYS
PNG_fcTL; PNG_fcTL;
#endif #endif
png_byte data[25]; png_byte data[26];
png_debug(1, "in png_write_fcTL\n"); png_debug(1, "in png_write_fcTL\n");
@ -1773,7 +1773,7 @@ png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
/* more error checking */ /* more error checking */
png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
delay_num, delay_den, render_op); delay_num, delay_den, dispose_op, blend_op);
png_save_uint_32(data, png_ptr->next_seq_num); png_save_uint_32(data, png_ptr->next_seq_num);
png_save_uint_32(data + 4, width); png_save_uint_32(data + 4, width);
@ -1782,9 +1782,10 @@ png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
png_save_uint_32(data + 16, y_offset); png_save_uint_32(data + 16, y_offset);
png_save_uint_16(data + 20, delay_num); png_save_uint_16(data + 20, delay_num);
png_save_uint_16(data + 22, delay_den); png_save_uint_16(data + 22, delay_den);
data[24] = render_op; data[24] = dispose_op;
data[25] = blend_op;
png_write_chunk(png_ptr, (png_bytep)png_fcTL, data, (png_size_t)25); png_write_chunk(png_ptr, (png_bytep)png_fcTL, data, (png_size_t)26);
png_ptr->next_seq_num++; png_ptr->next_seq_num++;
} }

Просмотреть файл

@ -114,12 +114,14 @@ void nsPNGDecoder::CreateFrame(png_uint_32 x_offset, png_uint_32 y_offset,
void nsPNGDecoder::SetAnimFrameInfo() void nsPNGDecoder::SetAnimFrameInfo()
{ {
png_uint_16 delay_num, delay_den; /* in seconds */ png_uint_16 delay_num, delay_den; /* in seconds */
png_byte render_op; png_byte dispose_op;
PRInt32 timeout; /* in milliseconds */ PRInt32 timeout; /* in milliseconds */
delay_num = png_get_next_frame_delay_num(mPNG, mInfo); delay_num = png_get_next_frame_delay_num(mPNG, mInfo);
delay_den = png_get_next_frame_delay_den(mPNG, mInfo); delay_den = png_get_next_frame_delay_den(mPNG, mInfo);
render_op = png_get_next_frame_render_op(mPNG, mInfo); dispose_op = png_get_next_frame_dispose_op(mPNG, mInfo);
// XXX need to handle blend_op here!
if (delay_num == 0) { if (delay_num == 0) {
timeout = 0; // gfxImageFrame::SetTimeout() will set to a minimum timeout = 0; // gfxImageFrame::SetTimeout() will set to a minimum
@ -134,9 +136,9 @@ void nsPNGDecoder::SetAnimFrameInfo()
} }
mFrame->SetTimeout(timeout); mFrame->SetTimeout(timeout);
if (render_op & PNG_RENDER_OP_DISPOSE_PREVIOUS) if (dispose_op == PNG_DISPOSE_OP_PREVIOUS)
mFrame->SetFrameDisposalMethod(imgIContainer::kDisposeRestorePrevious); mFrame->SetFrameDisposalMethod(imgIContainer::kDisposeRestorePrevious);
else if (render_op & PNG_RENDER_OP_DISPOSE_BACKGROUND) else if (dispose_op == PNG_DISPOSE_OP_BACKGROUND)
mFrame->SetFrameDisposalMethod(imgIContainer::kDisposeClear); mFrame->SetFrameDisposalMethod(imgIContainer::kDisposeClear);
else else
mFrame->SetFrameDisposalMethod(imgIContainer::kDisposeKeep); mFrame->SetFrameDisposalMethod(imgIContainer::kDisposeKeep);