// set timeout and frame disposal method for the current frame void nsPNGDecoder::SetAnimFrameInfo() { png_uint_16 delay_num, delay_den; /* delay, in seconds is delay_num/delay_den */ png_byte dispose_op; png_byte blend_op; PRInt32 timeout; /* in milliseconds */ delay_num = png_get_next_frame_delay_num(mPNG, mInfo); delay_den = png_get_next_frame_delay_den(mPNG, mInfo); dispose_op = png_get_next_frame_dispose_op(mPNG, mInfo); blend_op = png_get_next_frame_blend_op(mPNG, mInfo); if (delay_num == 0) { timeout = 0; // SetFrameTimeout() will set to a minimum } else { if (delay_den == 0) delay_den = 100; // so says the APNG spec // Need to cast delay_num to float to have a proper division and // the result to int to avoid compiler warning timeout = static_cast<PRInt32> (static_cast<PRFloat64>(delay_num) * 1000 / delay_den); } PRUint32 numFrames = mImage->GetNumFrames(); mImage->SetFrameTimeout(numFrames - 1, timeout); if (dispose_op == PNG_DISPOSE_OP_PREVIOUS) mImage->SetFrameDisposalMethod(numFrames - 1, RasterImage::kDisposeRestorePrevious); else if (dispose_op == PNG_DISPOSE_OP_BACKGROUND) mImage->SetFrameDisposalMethod(numFrames - 1, RasterImage::kDisposeClear); else mImage->SetFrameDisposalMethod(numFrames - 1, RasterImage::kDisposeKeep); if (blend_op == PNG_BLEND_OP_SOURCE) mImage->SetFrameBlendMethod(numFrames - 1, RasterImage::kBlendSource); /*else // 'over' is the default mImage->SetFrameBlendMethod(numFrames - 1, RasterImage::kBlendOver); */ }
nsPNGDecoder::AnimFrameInfo::AnimFrameInfo(png_structp aPNG, png_infop aInfo) : mDispose(DisposalMethod::KEEP) , mBlend(BlendMethod::OVER) , mTimeout(0) { png_uint_16 delay_num, delay_den; // delay, in seconds is delay_num/delay_den png_byte dispose_op; png_byte blend_op; delay_num = png_get_next_frame_delay_num(aPNG, aInfo); delay_den = png_get_next_frame_delay_den(aPNG, aInfo); dispose_op = png_get_next_frame_dispose_op(aPNG, aInfo); blend_op = png_get_next_frame_blend_op(aPNG, aInfo); if (delay_num == 0) { mTimeout = 0; // SetFrameTimeout() will set to a minimum } else { if (delay_den == 0) { delay_den = 100; // so says the APNG spec } // Need to cast delay_num to float to have a proper division and // the result to int to avoid compiler warning mTimeout = static_cast<int32_t>(static_cast<double>(delay_num) * 1000 / delay_den); } if (dispose_op == PNG_DISPOSE_OP_PREVIOUS) { mDispose = DisposalMethod::RESTORE_PREVIOUS; } else if (dispose_op == PNG_DISPOSE_OP_BACKGROUND) { mDispose = DisposalMethod::CLEAR; } else { mDispose = DisposalMethod::KEEP; } if (blend_op == PNG_BLEND_OP_SOURCE) { mBlend = BlendMethod::SOURCE; } else { mBlend = BlendMethod::OVER; } }
nsPNGDecoder::AnimFrameInfo::AnimFrameInfo(png_structp aPNG, png_infop aInfo) : mDispose(FrameBlender::kDisposeKeep) , mBlend(FrameBlender::kBlendOver) , mTimeout(0) { png_uint_16 delay_num, delay_den; /* delay, in seconds is delay_num/delay_den */ png_byte dispose_op; png_byte blend_op; delay_num = png_get_next_frame_delay_num(aPNG, aInfo); delay_den = png_get_next_frame_delay_den(aPNG, aInfo); dispose_op = png_get_next_frame_dispose_op(aPNG, aInfo); blend_op = png_get_next_frame_blend_op(aPNG, aInfo); if (delay_num == 0) { mTimeout = 0; // SetFrameTimeout() will set to a minimum } else { if (delay_den == 0) delay_den = 100; // so says the APNG spec // Need to cast delay_num to float to have a proper division and // the result to int to avoid compiler warning mTimeout = static_cast<int32_t>(static_cast<double>(delay_num) * 1000 / delay_den); } if (dispose_op == PNG_DISPOSE_OP_PREVIOUS) { mDispose = FrameBlender::kDisposeRestorePrevious; } else if (dispose_op == PNG_DISPOSE_OP_BACKGROUND) { mDispose = FrameBlender::kDisposeClear; } else { mDispose = FrameBlender::kDisposeKeep; } if (blend_op == PNG_BLEND_OP_SOURCE) { mBlend = FrameBlender::kBlendSource; } else { mBlend = FrameBlender::kBlendOver; } }