QMovie: fix regression in frame delays
The recent addition of support for multi-frame (non-animation) formats had an unwanted side effect of sometimes calling QImageReader::nextImageDelay() when the reader is at a different frame than intended. Fix by effectively reverting to the previous call pattern. Fixes: QTBUG-124227 Pick-to: 6.5 Change-Id: I735f8d67afb17bd4c77f9b4507a71796b7d66958 Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io> (cherry picked from commit 5f0ed0ac0ddffd3779fae0db956df8d48d629f92) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
5241ebcea6
commit
3516762d73
@ -319,7 +319,7 @@ QFrameInfo QMoviePrivate::infoForFrame(int frameNumber)
|
||||
// For an animated image format, QImageIOHandler::nextImageDelay() should
|
||||
// provide the time to wait until showing the next frame; but multi-frame
|
||||
// formats are not expected to provide this value, so use 1000 ms by default.
|
||||
const int nextFrameDelay = supportsAnimation ? reader->nextImageDelay() : 1000;
|
||||
const auto nextFrameDelay = [&]() { return supportsAnimation ? reader->nextImageDelay() : 1000; };
|
||||
|
||||
if (cacheMode == QMovie::CacheNone) {
|
||||
if (frameNumber != currentFrameNumber+1) {
|
||||
@ -363,7 +363,7 @@ QFrameInfo QMoviePrivate::infoForFrame(int frameNumber)
|
||||
}
|
||||
if (frameNumber > greatestFrameNumber)
|
||||
greatestFrameNumber = frameNumber;
|
||||
return QFrameInfo(QPixmap::fromImage(std::move(anImage)), nextFrameDelay);
|
||||
return QFrameInfo(QPixmap::fromImage(std::move(anImage)), nextFrameDelay());
|
||||
} else if (frameNumber != 0) {
|
||||
// We've read all frames now. Return an end marker
|
||||
haveReadAll = true;
|
||||
@ -391,7 +391,7 @@ QFrameInfo QMoviePrivate::infoForFrame(int frameNumber)
|
||||
return QFrameInfo(); // Invalid
|
||||
}
|
||||
greatestFrameNumber = i;
|
||||
QFrameInfo info(QPixmap::fromImage(std::move(anImage)), nextFrameDelay);
|
||||
QFrameInfo info(QPixmap::fromImage(std::move(anImage)), nextFrameDelay());
|
||||
// Cache it!
|
||||
frameMap.insert(i, info);
|
||||
if (i == frameNumber) {
|
||||
|
@ -36,6 +36,7 @@ private slots:
|
||||
void playMovie();
|
||||
void jumpToFrame_data();
|
||||
void jumpToFrame();
|
||||
void frameDelay();
|
||||
void changeMovieFile();
|
||||
#ifndef QT_NO_WIDGETS
|
||||
void infiniteLoop();
|
||||
@ -181,6 +182,17 @@ void tst_QMovie::jumpToFrame()
|
||||
QCOMPARE(movie.currentFrameNumber(), 0);
|
||||
}
|
||||
|
||||
void tst_QMovie::frameDelay()
|
||||
{
|
||||
QMovie movie(QFINDTESTDATA("animations/comicsecard.gif"));
|
||||
QList<int> frameDelays{ 200, 800, 800, 2000, 2600 };
|
||||
for (int i = 0; i < movie.frameCount(); i++) {
|
||||
movie.jumpToFrame(i);
|
||||
// Processing may have taken a little time, so round to nearest 100ms
|
||||
QCOMPARE(100 * qRound(movie.nextFrameDelay() / 100.0f), frameDelays[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void tst_QMovie::changeMovieFile()
|
||||
{
|
||||
QMovie movie(QFINDTESTDATA("animations/comicsecard.gif"));
|
||||
|
Loading…
x
Reference in New Issue
Block a user