コード例 #1
0
// 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); */
}
コード例 #2
0
ファイル: nsPNGDecoder.cpp プロジェクト: hobinjk/gecko-dev
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;
  }
}
コード例 #3
0
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;
  }
}