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
|
// For an animated image format, QImageIOHandler::nextImageDelay() should
|
||||||
// provide the time to wait until showing the next frame; but multi-frame
|
// 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.
|
// 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 (cacheMode == QMovie::CacheNone) {
|
||||||
if (frameNumber != currentFrameNumber+1) {
|
if (frameNumber != currentFrameNumber+1) {
|
||||||
@ -363,7 +363,7 @@ QFrameInfo QMoviePrivate::infoForFrame(int frameNumber)
|
|||||||
}
|
}
|
||||||
if (frameNumber > greatestFrameNumber)
|
if (frameNumber > greatestFrameNumber)
|
||||||
greatestFrameNumber = frameNumber;
|
greatestFrameNumber = frameNumber;
|
||||||
return QFrameInfo(QPixmap::fromImage(std::move(anImage)), nextFrameDelay);
|
return QFrameInfo(QPixmap::fromImage(std::move(anImage)), nextFrameDelay());
|
||||||
} else if (frameNumber != 0) {
|
} else if (frameNumber != 0) {
|
||||||
// We've read all frames now. Return an end marker
|
// We've read all frames now. Return an end marker
|
||||||
haveReadAll = true;
|
haveReadAll = true;
|
||||||
@ -391,7 +391,7 @@ QFrameInfo QMoviePrivate::infoForFrame(int frameNumber)
|
|||||||
return QFrameInfo(); // Invalid
|
return QFrameInfo(); // Invalid
|
||||||
}
|
}
|
||||||
greatestFrameNumber = i;
|
greatestFrameNumber = i;
|
||||||
QFrameInfo info(QPixmap::fromImage(std::move(anImage)), nextFrameDelay);
|
QFrameInfo info(QPixmap::fromImage(std::move(anImage)), nextFrameDelay());
|
||||||
// Cache it!
|
// Cache it!
|
||||||
frameMap.insert(i, info);
|
frameMap.insert(i, info);
|
||||||
if (i == frameNumber) {
|
if (i == frameNumber) {
|
||||||
|
@ -36,6 +36,7 @@ private slots:
|
|||||||
void playMovie();
|
void playMovie();
|
||||||
void jumpToFrame_data();
|
void jumpToFrame_data();
|
||||||
void jumpToFrame();
|
void jumpToFrame();
|
||||||
|
void frameDelay();
|
||||||
void changeMovieFile();
|
void changeMovieFile();
|
||||||
#ifndef QT_NO_WIDGETS
|
#ifndef QT_NO_WIDGETS
|
||||||
void infiniteLoop();
|
void infiniteLoop();
|
||||||
@ -181,6 +182,17 @@ void tst_QMovie::jumpToFrame()
|
|||||||
QCOMPARE(movie.currentFrameNumber(), 0);
|
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()
|
void tst_QMovie::changeMovieFile()
|
||||||
{
|
{
|
||||||
QMovie movie(QFINDTESTDATA("animations/comicsecard.gif"));
|
QMovie movie(QFINDTESTDATA("animations/comicsecard.gif"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user