float ImageSource::frameDurationAtIndex(size_t index) { if (!m_decoder) return 0; RGBA32Buffer* buffer = m_decoder->frameBufferAtIndex(index); if (!buffer || buffer->status() == RGBA32Buffer::FrameEmpty) return 0; return buffer->duration() / 1000.0f; }
float ImageSource::frameDurationAtIndex(size_t index) { if (!m_decoder) return 0; RGBA32Buffer* buffer = m_decoder->frameBufferAtIndex(index); if (!buffer || buffer->status() == RGBA32Buffer::FrameEmpty) return 0; // Many annoying ads specify a 0 duration to make an image flash as quickly // as possible. We follow WinIE's behavior and use a duration of 100 ms // for any frames that specify a duration of <= 50 ms. See // <http://bugs.webkit.org/show_bug.cgi?id=14413> or Radar 4051389 for // more. const float duration = buffer->duration() / 1000.0f; return (duration < 0.051f) ? 0.100f : duration; }
float ImageSource::frameDurationAtIndex(size_t index) { if (!m_decoder) return 0; RGBA32Buffer* buffer = m_decoder->frameBufferAtIndex(index); if (!buffer || buffer->status() == RGBA32Buffer::FrameEmpty) return 0; float duration = buffer->duration() / 1000.0f; // Follow other ports (and WinIE's) behavior to slow annoying ads that // specify a 0 duration. if (duration < 0.051f) return 0.100f; return duration; }
float ImageSource::frameDurationAtIndex(size_t index) { float duration = 0; #ifdef ANDROID_ANIMATED_GIF if (m_decoder.m_gifDecoder) { RGBA32Buffer* buffer = m_decoder.m_gifDecoder->frameBufferAtIndex(index); if (!buffer || buffer->status() == RGBA32Buffer::FrameEmpty) return 0; duration = buffer->duration() / 1000.0f; } #else SkASSERT(index == 0); #endif // Many annoying ads specify a 0 duration to make an image flash as quickly as possible. // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify // a duration of <= 10 ms. See gfxImageFrame::GetTimeout in Gecko or Radar 4051389 for more. if (duration <= 0.010f) duration = 0.100f; return duration; }