254 reader = std::move(r);
255 nextImageTimer =
new QTimer(qq);
256 nextImageTimer->setSingleShot(
true);
257 QObject::connect(nextImageTimer, SIGNAL(timeout()),
258 qq, SLOT(_q_loadNextFrame()));
317 if (haveReadAll && (frameNumber > greatestFrameNumber)) {
319 return QFrameInfo::endMarker();
328 const bool supportsAnimation = reader->supportsOption(QImageIOHandler::Animation);
329 const int stopAtFrame = supportsAnimation ? -1 :
frameCount();
334 const auto nextFrameDelay = [&]() {
return supportsAnimation ? reader->nextImageDelay() : 1000; };
336 if (cacheMode == QMovie::CacheNone) {
339 if (!reader->jumpToImage(frameNumber)) {
340 if (frameNumber == 0) {
343 if (reader->device()->isSequential())
345 QString fileName = reader->fileName();
347 QIODevice *device = reader->device();
348 QColor bgColor = reader->backgroundColor();
349 QSize scaledSize = reader->scaledSize();
350 if (fileName.isEmpty())
351 reader = std::make_unique<QImageReader>(device, format);
353 reader = std::make_unique<QImageReader>(absoluteFilePath, format);
354 if (!reader->canRead())
355 emit q->error(reader->error());
356 reader->device()->seek(initialDevicePos);
357 reader->setBackgroundColor(bgColor);
358 reader->setScaledSize(scaledSize);
364 qCDebug(lcImageIo,
"CacheNone: read frame %d of %d", frameNumber, stopAtFrame);
365 if (stopAtFrame > 0 ? (frameNumber < stopAtFrame) : reader->canRead()) {
369 reader->jumpToImage(frameNumber);
370 QImage anImage = reader->read();
371 if (anImage.isNull()) {
377 return QFrameInfo(QPixmap::fromImage(std::move(anImage)), nextFrameDelay());
378 }
else if (frameNumber != 0) {
381 return QFrameInfo::endMarker();
393 qCDebug(lcImageIo,
"CacheAll: read frame %d of %d", frameNumber, stopAtFrame);
394 if (stopAtFrame > 0 ? (frameNumber < stopAtFrame) : reader->canRead()) {
398 reader->jumpToImage(frameNumber);
399 QImage anImage = reader->read();
400 if (anImage.isNull()) {
405 QFrameInfo info(QPixmap::fromImage(std::move(anImage)), nextFrameDelay());
407 auto &e = frameMap[i] = std::move(info);
408 if (i == frameNumber) {
419 const auto it = frameMap.find(frameNumber);
420 return it == frameMap.cend() ? QFrameInfo() : it->second;
490 if (starting && movieState == QMovie::NotRunning) {
491 enterState(QMovie::Running);
495 if (frameRect.size() != currentPixmap.rect().size()) {
496 frameRect = currentPixmap.rect();
497 emit q->resized(frameRect.size());
500 emit q->updated(frameRect);
501 emit q->frameChanged(currentFrameNumber);
503 if (speed && movieState == QMovie::Running)
504 nextImageTimer->start(nextDelay);
508 emit q->error(reader->error());
512 if (movieState != QMovie::Paused) {
516 enterState(QMovie::NotRunning);
601QMovie::QMovie(QIODevice *device,
const QByteArray &format, QObject *parent)
602 : QObject(*
new QMoviePrivate, parent)
605 d->init(
this, std::make_unique<QImageReader>(device, format));
606 d->initialDevicePos = device->pos();
617QMovie::QMovie(
const QString &fileName,
const QByteArray &format, QObject *parent)
618 : QObject(*
new QMoviePrivate, parent)
621 d->init(
this, std::make_unique<QImageReader>(fileName, format));
622 d->absoluteFilePath = QDir(fileName).absolutePath();
623 if (d->reader->device())
624 d->initialDevicePos = d->reader->device()->pos();
1011QList<QByteArray> QMovie::supportedFormats()
1013 QList<QByteArray> list = QImageReader::supportedImageFormats();
1016 buffer.open(QIODevice::ReadOnly);
1018 const auto doesntSupportAnimation =
1019 [&buffer](
const QByteArray &format) {
1020 return !QImageReader(&buffer, format).supportsOption(QImageIOHandler::Animation);
1023 list.removeIf(doesntSupportAnimation);