From 133693d9ce8a4a7ad0dad27253b1d902e6fcc59d Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sat, 23 Jan 2016 11:00:10 +0100 Subject: [PATCH] Fix pixmap usage in pictureloader fix #1765 --- cockatrice/src/pictureloader.cpp | 59 ++++++++++++++++++++---------- cockatrice/src/pictureloader.h | 62 +++++++++++++++++++------------- 2 files changed, 78 insertions(+), 43 deletions(-) diff --git a/cockatrice/src/pictureloader.cpp b/cockatrice/src/pictureloader.cpp index bd5c9aa1..b8e40581 100644 --- a/cockatrice/src/pictureloader.cpp +++ b/cockatrice/src/pictureloader.cpp @@ -88,10 +88,10 @@ CardSet *PictureToLoad::getCurrentSet() const return 0; } -QStringList PictureLoader::md5Blacklist = QStringList() +QStringList PictureLoaderWorker::md5Blacklist = QStringList() << "db0c48db407a907c16ade38de048a441"; // card back returned by gatherer when card is not found -PictureLoader::PictureLoader() +PictureLoaderWorker::PictureLoaderWorker() : QObject(0), downloadRunning(false), loadQueueRunning(false) { @@ -110,12 +110,12 @@ PictureLoader::PictureLoader() moveToThread(pictureLoaderThread); } -PictureLoader::~PictureLoader() +PictureLoaderWorker::~PictureLoaderWorker() { pictureLoaderThread->deleteLater(); } -void PictureLoader::processLoadQueue() +void PictureLoaderWorker::processLoadQueue() { if (loadQueueRunning) return; @@ -160,7 +160,7 @@ void PictureLoader::processLoadQueue() } } -bool PictureLoader::cardImageExistsOnDisk(QString & setName, QString & correctedCardname) +bool PictureLoaderWorker::cardImageExistsOnDisk(QString & setName, QString & correctedCardname) { QImage image; QImageReader imgReader; @@ -194,7 +194,7 @@ bool PictureLoader::cardImageExistsOnDisk(QString & setName, QString & corrected return false; } -QString PictureLoader::getPicUrl() +QString PictureLoaderWorker::getPicUrl() { if (!picDownload) return QString(""); @@ -242,7 +242,7 @@ QString PictureLoader::getPicUrl() return picUrl; } -void PictureLoader::startNextPicDownload() +void PictureLoaderWorker::startNextPicDownload() { if (cardsToDownload.isEmpty()) { cardBeingDownloaded = 0; @@ -267,7 +267,7 @@ void PictureLoader::startNextPicDownload() } } -void PictureLoader::picDownloadFailed() +void PictureLoaderWorker::picDownloadFailed() { if (cardBeingDownloaded.nextSet()) { @@ -283,13 +283,13 @@ void PictureLoader::picDownloadFailed() } } -bool PictureLoader::imageIsBlackListed(const QByteArray &picData) +bool PictureLoaderWorker::imageIsBlackListed(const QByteArray &picData) { QString md5sum = QCryptographicHash::hash(picData, QCryptographicHash::Md5).toHex(); return md5Blacklist.contains(md5sum); } -void PictureLoader::picDownloadFinished(QNetworkReply *reply) +void PictureLoaderWorker::picDownloadFinished(QNetworkReply *reply) { if (reply->error()) { qDebug() << "Download failed:" << reply->errorString(); @@ -349,7 +349,7 @@ void PictureLoader::picDownloadFinished(QNetworkReply *reply) startNextPicDownload(); } -void PictureLoader::enqueueImageLoad(CardInfo *card) +void PictureLoaderWorker::enqueueImageLoad(CardInfo *card) { QMutexLocker locker(&mutex); @@ -367,20 +367,31 @@ void PictureLoader::enqueueImageLoad(CardInfo *card) emit startLoadQueue(); } -void PictureLoader::picDownloadChanged() +void PictureLoaderWorker::picDownloadChanged() { QMutexLocker locker(&mutex); picDownload = settingsCache->getPicDownload(); - - QPixmapCache::clear(); } -void PictureLoader::picsPathChanged() +void PictureLoaderWorker::picsPathChanged() { QMutexLocker locker(&mutex); picsPath = settingsCache->getPicsPath(); +} - QPixmapCache::clear(); +PictureLoader::PictureLoader() + : QObject(0) +{ + worker = new PictureLoaderWorker; + connect(settingsCache, SIGNAL(picsPathChanged()), this, SLOT(picsPathChanged())); + connect(settingsCache, SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged())); + + connect(worker, SIGNAL(imageLoaded(CardInfo *, const QImage &)), this, SLOT(imageLoaded(CardInfo *, const QImage &))); +} + +PictureLoader::~PictureLoader() +{ + worker->deleteLater(); } void PictureLoader::internalGetCardBackPixmap(QPixmap &pixmap, QSize size) @@ -388,7 +399,7 @@ void PictureLoader::internalGetCardBackPixmap(QPixmap &pixmap, QSize size) QString backCacheKey = "_trice_card_back_" + QString::number(size.width()) + QString::number(size.height()); if(!QPixmapCache::find(backCacheKey, &pixmap)) { -qDebug() << "cache fail for" << backCacheKey; + qDebug() << "cache fail for" << backCacheKey; pixmap = QPixmap("theme:cardback").scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); QPixmapCache::insert(backCacheKey, pixmap); } @@ -425,7 +436,7 @@ void PictureLoader::getPixmap(QPixmap &pixmap, CardInfo *card, QSize size) if(card) { // add the card to the load queue - getInstance().enqueueImageLoad(card); + getInstance().worker->enqueueImageLoad(card); } } @@ -471,6 +482,16 @@ void PictureLoader::cacheCardPixmaps(QList cards) if(QPixmapCache::find(key, &tmp)) continue; - getInstance().enqueueImageLoad(card); + getInstance().worker->enqueueImageLoad(card); } } + +void PictureLoader::picDownloadChanged() +{ + QPixmapCache::clear(); +} + +void PictureLoader::picsPathChanged() +{ + QPixmapCache::clear(); +} \ No newline at end of file diff --git a/cockatrice/src/pictureloader.h b/cockatrice/src/pictureloader.h index 9a93a1c3..7934581c 100644 --- a/cockatrice/src/pictureloader.h +++ b/cockatrice/src/pictureloader.h @@ -28,6 +28,42 @@ public: bool nextSet(); }; +class PictureLoaderWorker : public QObject { +Q_OBJECT +public: + PictureLoaderWorker(); + ~PictureLoaderWorker(); + + void enqueueImageLoad(CardInfo *card); +private: + static QStringList md5Blacklist; + + QThread *pictureLoaderThread; + QString picsPath; + QList loadQueue; + QMutex mutex; + QNetworkAccessManager *networkManager; + QList cardsToDownload; + PictureToLoad cardBeingLoaded; + PictureToLoad cardBeingDownloaded; + bool picDownload, downloadRunning, loadQueueRunning; + void startNextPicDownload(); + QString getPicUrl(); + bool cardImageExistsOnDisk(QString & setName, QString & correctedCardname); + bool imageIsBlackListed(const QByteArray &picData); +private slots: + void picDownloadFinished(QNetworkReply *reply); + void picDownloadFailed(); + + void picDownloadChanged(); + void picsPathChanged(); +public slots: + void processLoadQueue(); +signals: + void startLoadQueue(); + void imageLoaded(CardInfo *card, const QImage &image); +}; + class PictureLoader : public QObject { Q_OBJECT public: @@ -43,24 +79,8 @@ private: PictureLoader(PictureLoader const&); void operator=(PictureLoader const&); - static QStringList md5Blacklist; - - QThread *pictureLoaderThread; - QString picsPath; - QList loadQueue; - QMutex mutex; - QNetworkAccessManager *networkManager; - QList cardsToDownload; - PictureToLoad cardBeingLoaded; - PictureToLoad cardBeingDownloaded; - bool picDownload, downloadRunning, loadQueueRunning; - void startNextPicDownload(); - void imageLoaded(CardInfo *card, const QImage &image); - QString getPicUrl(); - bool cardImageExistsOnDisk(QString & setName, QString & correctedCardname); - bool imageIsBlackListed(const QByteArray &picData); + PictureLoaderWorker * worker; public: - void enqueueImageLoad(CardInfo *card); static void getPixmap(QPixmap &pixmap, CardInfo *card, QSize size); static void clearPixmapCache(CardInfo *card); static void clearPixmapCache(); @@ -68,15 +88,9 @@ public: protected: static void internalGetCardBackPixmap(QPixmap &pixmap, QSize size); private slots: - void picDownloadFinished(QNetworkReply *reply); - void picDownloadFailed(); - void picDownloadChanged(); void picsPathChanged(); public slots: - void processLoadQueue(); -signals: - void startLoadQueue(); + void imageLoaded(CardInfo *card, const QImage &image); }; - #endif