void QQuickImageBase::requestFinished() { Q_D(QQuickImageBase); if (d->pix.isError()) { qmlInfo(this) << d->pix.error(); d->pix.clear(this); d->status = Error; if (d->progress != 0.0) { d->progress = 0.0; emit progressChanged(d->progress); } } else { d->status = Ready; if (d->progress != 1.0) { d->progress = 1.0; emit progressChanged(d->progress); } } pixmapChange(); emit statusChanged(d->status); if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); } if (autoTransform() != d->oldAutoTransform) { d->oldAutoTransform = autoTransform(); emitAutoTransformBaseChanged(); } update(); }
void QQuickImageBase::load() { Q_D(QQuickImageBase); if (d->url.isEmpty()) { d->pix.clear(this); if (d->progress != 0.0) { d->progress = 0.0; emit progressChanged(d->progress); } pixmapChange(); d->status = Null; emit statusChanged(d->status); if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); } update(); } else { QQuickPixmap::Options options; if (d->async) options |= QQuickPixmap::Asynchronous; if (d->cache) options |= QQuickPixmap::Cache; d->pix.clear(this); d->pix.load(qmlEngine(this), d->url, d->sourcesize, options); if (d->pix.isLoading()) { if (d->progress != 0.0) { d->progress = 0.0; emit progressChanged(d->progress); } if (d->status != Loading) { d->status = Loading; emit statusChanged(d->status); } static int thisRequestProgress = -1; static int thisRequestFinished = -1; if (thisRequestProgress == -1) { thisRequestProgress = QQuickImageBase::staticMetaObject.indexOfSlot("requestProgress(qint64,qint64)"); thisRequestFinished = QQuickImageBase::staticMetaObject.indexOfSlot("requestFinished()"); } d->pix.connectFinished(this, thisRequestFinished); d->pix.connectDownloadProgress(this, thisRequestProgress); update(); //pixmap may have invalidated texture, updatePaintNode needs to be called before the next repaint } else { requestFinished(); } } }
void QQuickAnimatedImage::load() { Q_D(QQuickAnimatedImage); if (d->url.isEmpty()) { if (d->progress != 0) { d->progress = 0; emit progressChanged(d->progress); } d->setImage(QImage()); d->status = Null; emit statusChanged(d->status); if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); } if (isPlaying() != d->oldPlaying) emit playingChanged(); } else { QString lf = QQmlFile::urlToLocalFileOrQrc(d->url); if (!lf.isEmpty()) { d->_movie = new QMovie(lf); movieRequestFinished(); } else { if (d->status != Loading) { d->status = Loading; emit statusChanged(d->status); } if (d->progress != 0) { d->progress = 0; emit progressChanged(d->progress); } QNetworkRequest req(d->url); req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true); d->reply = qmlEngine(this)->networkAccessManager()->get(req); QObject::connect(d->reply, SIGNAL(finished()), this, SLOT(movieRequestFinished())); QObject::connect(d->reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(requestProgress(qint64,qint64))); } } }
int QDeclarativeImageBase::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QDeclarativeImplicitSizeItem::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { if (_id < 9) qt_static_metacall(this, _c, _id, _a); _id -= 9; } #ifndef QT_NO_PROPERTIES else if (_c == QMetaObject::ReadProperty) { void *_v = _a[0]; switch (_id) { case 0: *reinterpret_cast< Status*>(_v) = status(); break; case 1: *reinterpret_cast< QUrl*>(_v) = source(); break; case 2: *reinterpret_cast< qreal*>(_v) = progress(); break; case 3: *reinterpret_cast< bool*>(_v) = asynchronous(); break; case 4: *reinterpret_cast< bool*>(_v) = cache(); break; case 5: *reinterpret_cast< QSize*>(_v) = sourceSize(); break; case 6: *reinterpret_cast< bool*>(_v) = mirror(); break; } _id -= 7; } else if (_c == QMetaObject::WriteProperty) { void *_v = _a[0]; switch (_id) { case 1: setSource(*reinterpret_cast< QUrl*>(_v)); break; case 3: setAsynchronous(*reinterpret_cast< bool*>(_v)); break; case 4: setCache(*reinterpret_cast< bool*>(_v)); break; case 5: setSourceSize(*reinterpret_cast< QSize*>(_v)); break; case 6: setMirror(*reinterpret_cast< bool*>(_v)); break; } _id -= 7; } else if (_c == QMetaObject::ResetProperty) { switch (_id) { case 5: resetSourceSize(); break; } _id -= 7; } else if (_c == QMetaObject::QueryPropertyDesignable) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyScriptable) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyStored) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyEditable) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyUser) { _id -= 7; } #endif // QT_NO_PROPERTIES return _id; }
void QQuickBorderImage::load() { Q_D(QQuickBorderImage); if (d->url.isEmpty()) { d->pix.clear(this); d->status = Null; setImplicitSize(0, 0); emit statusChanged(d->status); if (d->progress != 0.0) { d->progress = 0.0; emit progressChanged(d->progress); } if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); } pixmapChange(); return; } else { if (d->url.path().endsWith(QLatin1String("sci"))) { QString lf = QQmlFile::urlToLocalFileOrQrc(d->url); if (!lf.isEmpty()) { QFile file(lf); file.open(QIODevice::ReadOnly); setGridScaledImage(QQuickGridScaledImage(&file)); return; } else { if (d->progress != 0.0) { d->progress = 0.0; emit progressChanged(d->progress); } d->status = Loading; QNetworkRequest req(d->url); d->sciReply = qmlEngine(this)->networkAccessManager()->get(req); qmlobject_connect(d->sciReply, QNetworkReply, SIGNAL(finished()), this, QQuickBorderImage, SLOT(sciRequestFinished())) } } else {
void QDeclarativeImageBase::load() { Q_D(QDeclarativeImageBase); if (d->url.isEmpty()) { d->pix.clear(); d->status = Null; d->progress = 0.0; setImplicitWidth(0); setImplicitHeight(0); emit progressChanged(d->progress); emit statusChanged(d->status); pixmapChange(); update(); } else { QDeclarativePixmap::Options options; if (d->async) options |= QDeclarativePixmap::Asynchronous; if (d->cache) options |= QDeclarativePixmap::Cache; d->pix.load(qmlEngine(this), d->url, d->explicitSourceSize ? sourceSize() : QSize(), options); if (d->pix.isLoading()) { d->progress = 0.0; d->status = Loading; emit progressChanged(d->progress); emit statusChanged(d->status); static int thisRequestProgress = -1; static int thisRequestFinished = -1; if (thisRequestProgress == -1) { thisRequestProgress = QDeclarativeImageBase::staticMetaObject.indexOfSlot("requestProgress(qint64,qint64)"); thisRequestFinished = QDeclarativeImageBase::staticMetaObject.indexOfSlot("requestFinished()"); } d->pix.connectFinished(this, thisRequestFinished); d->pix.connectDownloadProgress(this, thisRequestProgress); } else { requestFinished(); } } }
void QQuickImageBase::load() { Q_D(QQuickImageBase); if (d->url.isEmpty()) { d->pix.clear(this); if (d->progress != 0.0) { d->progress = 0.0; emit progressChanged(d->progress); } pixmapChange(); d->status = Null; emit statusChanged(d->status); if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); } if (autoTransform() != d->oldAutoTransform) { d->oldAutoTransform = autoTransform(); emitAutoTransformBaseChanged(); } update(); } else { QQuickPixmap::Options options; if (d->async) options |= QQuickPixmap::Asynchronous; if (d->cache) options |= QQuickPixmap::Cache; d->pix.clear(this); const qreal targetDevicePixelRatio = (window() ? window()->effectiveDevicePixelRatio() : qApp->devicePixelRatio()); d->devicePixelRatio = 1.0; QUrl loadUrl = d->url; // QQuickImageProvider and SVG can generate a high resolution image when // sourceSize is set. If sourceSize is not set then the provider default size // will be used, as usual. bool setDevicePixelRatio = false; if (d->sourcesize.isValid()) { if (loadUrl.scheme() == QStringLiteral("image")) { setDevicePixelRatio = true; } else { QString stringUrl = loadUrl.path(QUrl::PrettyDecoded); if (stringUrl.endsWith(QLatin1String("svg")) || stringUrl.endsWith(QLatin1String("svgz"))) { setDevicePixelRatio = true; } } if (setDevicePixelRatio) d->devicePixelRatio = targetDevicePixelRatio; } if (!setDevicePixelRatio) { // (possible) local file: loadUrl and d->devicePixelRatio will be modified if // an "@2x" file is found. resolve2xLocalFile(d->url, targetDevicePixelRatio, &loadUrl, &d->devicePixelRatio); } d->pix.load(qmlEngine(this), loadUrl, d->sourcesize * d->devicePixelRatio, options, d->autoTransform); if (d->pix.isLoading()) { if (d->progress != 0.0) { d->progress = 0.0; emit progressChanged(d->progress); } if (d->status != Loading) { d->status = Loading; emit statusChanged(d->status); } static int thisRequestProgress = -1; static int thisRequestFinished = -1; if (thisRequestProgress == -1) { thisRequestProgress = QQuickImageBase::staticMetaObject.indexOfSlot("requestProgress(qint64,qint64)"); thisRequestFinished = QQuickImageBase::staticMetaObject.indexOfSlot("requestFinished()"); } d->pix.connectFinished(this, thisRequestFinished); d->pix.connectDownloadProgress(this, thisRequestProgress); update(); //pixmap may have invalidated texture, updatePaintNode needs to be called before the next repaint } else { requestFinished(); } } }
std::vector<SpriteFramePtr> SpriteFrame::loadSpriteFrames(const std::string& filename, bool mipmaps) { std::vector<SpriteFramePtr> frames; std::vector<uint8_t> data; if (!sharedEngine->getFileSystem()->loadFile(filename, data)) { return frames; } rapidjson::MemoryStream is(reinterpret_cast<char*>(data.data()), data.size()); rapidjson::Document document; document.ParseStream<0>(is); if (document.HasParseError()) { log("Failed to parse %s", filename.c_str()); return frames; } const rapidjson::Value& metaObject = document["meta"]; const rapidjson::Value& sizeObject = metaObject["size"]; Size2 textureSize(static_cast<float>(sizeObject["w"].GetInt()), static_cast<float>(sizeObject["h"].GetInt())); graphics::TexturePtr texture = sharedEngine->getCache()->getTexture(metaObject["image"].GetString(), false, mipmaps); const rapidjson::Value& framesArray = document["frames"]; frames.reserve(framesArray.Size()); for (rapidjson::SizeType index = 0; index < framesArray.Size(); ++index) { const rapidjson::Value& frameObject = framesArray[index]; const rapidjson::Value& rectangleObject = frameObject["frame"]; Rectangle rectangle(static_cast<float>(rectangleObject["x"].GetInt()), static_cast<float>(rectangleObject["y"].GetInt()), static_cast<float>(rectangleObject["w"].GetInt()), static_cast<float>(rectangleObject["h"].GetInt())); bool rotated = frameObject["rotated"].GetBool(); const rapidjson::Value& sourceSizeObject = frameObject["sourceSize"]; Size2 sourceSize(static_cast<float>(sourceSizeObject["w"].GetInt()), static_cast<float>(sourceSizeObject["h"].GetInt())); const rapidjson::Value& spriteSourceSizeObject = frameObject["spriteSourceSize"]; Vector2 sourceOffset(static_cast<float>(spriteSourceSizeObject["x"].GetInt()), static_cast<float>(spriteSourceSizeObject["y"].GetInt())); const rapidjson::Value& pivotObject = frameObject["pivot"]; Vector2 pivot(pivotObject["x"].GetFloat(), pivotObject["y"].GetFloat()); frames.push_back(std::make_shared<SpriteFrame>(rectangle, texture, rotated, sourceSize, sourceOffset, pivot)); } return frames; }
void QQuickAnimatedImage::movieRequestFinished() { Q_D(QQuickAnimatedImage); if (d->reply) { d->redirectCount++; if (d->redirectCount < ANIMATEDIMAGE_MAXIMUM_REDIRECT_RECURSION) { QVariant redirect = d->reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (redirect.isValid()) { QUrl url = d->reply->url().resolved(redirect.toUrl()); d->reply->deleteLater(); setSource(url); return; } } d->redirectCount=0; d->_movie = new QMovie(d->reply); } if (!d->_movie->isValid()) { qmlInfo(this) << "Error Reading Animated Image File " << d->url.toString(); delete d->_movie; d->_movie = 0; d->setImage(QImage()); if (d->progress != 0) { d->progress = 0; emit progressChanged(d->progress); } d->status = Error; emit statusChanged(d->status); if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); } if (isPlaying() != d->oldPlaying) emit playingChanged(); return; } connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)), this, SLOT(playingStatusChanged())); connect(d->_movie, SIGNAL(frameChanged(int)), this, SLOT(movieUpdate())); d->_movie->setCacheMode(QMovie::CacheAll); d->status = Ready; emit statusChanged(d->status); if (d->progress != 1.0) { d->progress = 1.0; emit progressChanged(d->progress); } bool pausedAtStart = d->paused; if (d->playing) { d->_movie->start(); } if (pausedAtStart) d->_movie->setPaused(true); if (d->paused || !d->playing) { d->_movie->jumpToFrame(d->preset_currentframe); d->preset_currentframe = 0; } d->setImage(d->_movie->currentPixmap().toImage()); if (isPlaying() != d->oldPlaying) emit playingChanged(); if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); } }