#include <QtCore/qdebug.h>
#include <private/qobject_p.h>
#include <QSslError>
+#include <QQmlFile>
+#include <QMetaMethod>
#define IMAGEREQUEST_MAX_REQUEST_COUNT 8
#define IMAGEREQUEST_MAX_REDIRECT_RECURSION 16
return url.toString(QUrl::RemoveScheme | QUrl::RemoveAuthority).mid(1);
}
-QSGTexture *QQuickDefaultTextureFactory::createTexture(QQuickCanvas *) const
+QSGTexture *QQuickDefaultTextureFactory::createTexture(QQuickWindow *) const
{
QSGPlainTexture *t = new QSGPlainTexture();
t->setImage(im);
}
QQuickPixmapData(QQuickPixmap *pixmap, const QUrl &u, QQuickTextureFactory *texture, const QSize &s, const QSize &r)
- : refCount(1), inCache(false), privatePixmap(false), pixmapStatus(QQuickPixmap::Ready),
+ : refCount(1), inCache(false), pixmapStatus(QQuickPixmap::Ready),
url(u), implicitSize(s), requestSize(r), textureFactory(texture), reply(0), prevUnreferenced(0),
prevUnreferencedPtr(0), nextUnreferenced(0)
{
}
QQuickPixmapData(QQuickPixmap *pixmap, QQuickTextureFactory *texture)
- : refCount(1), inCache(false), privatePixmap(true), pixmapStatus(QQuickPixmap::Ready),
+ : refCount(1), inCache(false), pixmapStatus(QQuickPixmap::Ready),
textureFactory(texture), reply(0), prevUnreferenced(0),
prevUnreferencedPtr(0), nextUnreferenced(0)
{
uint refCount;
bool inCache:1;
- bool privatePixmap:1;
QQuickPixmap::Status pixmapStatus;
QUrl url;
{
QImageReader imgio(dev);
- bool force_scale = false;
- if (url.path().endsWith(QLatin1String(".svg"),Qt::CaseInsensitive)) {
- imgio.setFormat("svg"); // QSvgPlugin::capabilities bug QTBUG-9053
- force_scale = true;
- }
+ const bool force_scale = imgio.format() == "svg" || imgio.format() == "svgz";
if (requestSize.width() > 0 || requestSize.height() > 0) {
QSize s = imgio.size();
mutex.lock();
// manually cancel all outstanding jobs.
foreach (QQuickPixmapReply *reply, jobs) {
+ if (reply->data && reply->data->reply == reply)
+ reply->data->reply = 0;
delete reply;
}
jobs.clear();
}
} else {
- QString lf = QQmlEnginePrivate::urlToLocalFileOrQrc(url);
+ QString lf = QQmlFile::urlToLocalFileOrQrc(url);
if (!lf.isEmpty()) {
// Image is local - load/decode immediately
QImage image;
void QQuickPixmapReader::run()
{
if (replyDownloadProgress == -1) {
- const QMetaObject *nr = &QNetworkReply::staticMetaObject;
- const QMetaObject *pr = &QQuickPixmapReply::staticMetaObject;
+ replyDownloadProgress = QMetaMethod::fromSignal(&QNetworkReply::downloadProgress).methodIndex();
+ replyFinished = QMetaMethod::fromSignal(&QNetworkReply::finished).methodIndex();
+ downloadProgress = QMetaMethod::fromSignal(&QQuickPixmapReply::downloadProgress).methodIndex();
const QMetaObject *ir = &QQuickPixmapReaderThreadObject::staticMetaObject;
- replyDownloadProgress = nr->indexOfSignal("downloadProgress(qint64,qint64)");
- replyFinished = nr->indexOfSignal("finished()");
- downloadProgress = pr->indexOfSignal("downloadProgress(qint64,qint64)");
threadNetworkRequestDone = ir->indexOfSlot("networkRequestDone()");
}
: data(d), engineForReader(0), requestSize(d->requestSize), url(d->url), loading(false), redirectCount(0)
{
if (finishedIndex == -1) {
- finishedIndex = QQuickPixmapReply::staticMetaObject.indexOfSignal("finished()");
- downloadProgressIndex = QQuickPixmapReply::staticMetaObject.indexOfSignal("downloadProgress(qint64,qint64)");
+ finishedIndex = QMetaMethod::fromSignal(&QQuickPixmapReply::finished).methodIndex();
+ downloadProgressIndex = QMetaMethod::fromSignal(&QQuickPixmapReply::downloadProgress).methodIndex();
}
}
QQuickPixmapReply::~QQuickPixmapReply()
{
+ // note: this->data->reply must be set to zero if this->data->reply == this
+ // but it must be done within mutex locking, to be guaranteed to be safe.
}
bool QQuickPixmapReply::event(QEvent *event)
QQuickPixmap::tr("Failed to get image from provider: %1").arg(url.toString()));
}
- QString localFile = QQmlEnginePrivate::urlToLocalFileOrQrc(url);
+ QString localFile = QQmlFile::urlToLocalFileOrQrc(url);
if (localFile.isEmpty())
return 0;
QHash<QQuickPixmapKey, QQuickPixmapData *>::Iterator iter = store->m_cache.find(key);
if (iter == store->m_cache.end()) {
- if (options & QQuickPixmap::Asynchronous) {
- // pixmaps can only be loaded synchronously
- if (url.scheme() == QLatin1String("image")) {
- QQuickImageProvider *provider = static_cast<QQuickImageProvider *>(engine->imageProvider(imageProviderId(url)));
- if (provider && provider->imageType() == QQuickImageProvider::Pixmap) {
+ if (url.scheme() == QLatin1String("image")) {
+ if (QQuickImageProvider *provider = static_cast<QQuickImageProvider *>(engine->imageProvider(imageProviderId(url)))) {
+ if (provider->imageType() == QQuickImageProvider::Pixmap) {
+ // pixmaps can only be loaded synchronously
options &= ~QQuickPixmap::Asynchronous;
+ } else if (provider->flags() & QQuickImageProvider::ForceAsynchronousImageLoading) {
+ options |= QQuickPixmap::Asynchronous;
}
}
}