diff options
Diffstat (limited to 'src/quick/util/qquickpixmapcache_p.h')
-rw-r--r-- | src/quick/util/qquickpixmapcache_p.h | 188 |
1 files changed, 42 insertions, 146 deletions
diff --git a/src/quick/util/qquickpixmapcache_p.h b/src/quick/util/qquickpixmapcache_p.h index ed6422a2bf..8c0c085b50 100644 --- a/src/quick/util/qquickpixmapcache_p.h +++ b/src/quick/util/qquickpixmapcache_p.h @@ -15,176 +15,72 @@ // We mean it. // -#include <QtCore/qcoreapplication.h> -#include <QtCore/qstring.h> -#include <QtGui/qpixmap.h> +#include <QtCore/qmutex.h> #include <QtCore/qurl.h> -#include <private/qtquickglobal_p.h> #include <QtQuick/qquickimageprovider.h> - -#include <private/qintrusivelist_p.h> +#include <private/qquickpixmap_p.h> QT_BEGIN_NAMESPACE -class QQmlEngine; class QQuickPixmapData; -class QQuickTextureFactory; -class QQuickImageProviderOptionsPrivate; -class QQuickDefaultTextureFactory : public QQuickTextureFactory +/*! \internal + A composite key to identify a QQuickPixmapData instance in a QHash. +*/ +struct Q_AUTOTEST_EXPORT QQuickPixmapKey { - Q_OBJECT -public: - QQuickDefaultTextureFactory(const QImage &i); - QSGTexture *createTexture(QQuickWindow *window) const override; - QSize textureSize() const override { return size; } - int textureByteCount() const override { return size.width() * size.height() * 4; } - QImage image() const override { return im; } - -private: - QImage im; - QSize size; + const QUrl *url; + const QRect *region; + const QSize *size; + int frame; + QQuickImageProviderOptions options; }; -class QQuickImageProviderPrivate +/*! \internal + A singleton managing the storage and garbage collection of QQuickPixmapData + instances. It's exported only for the sake of autotests, and should not be + manipulated outside qquickpixmap.cpp and qquickpixmapcache.cpp. +*/ +class Q_AUTOTEST_EXPORT QQuickPixmapCache : public QObject { -public: - QQuickImageProvider::ImageType type; - QQuickImageProvider::Flags flags; - bool isProviderWithOptions; -}; + Q_OBJECT -// ### Qt 6: Make public moving to qquickimageprovider.h -class Q_QUICK_PRIVATE_EXPORT QQuickImageProviderOptions -{ public: - enum AutoTransform { - UsePluginDefaultTransform = -1, - ApplyTransform = 0, - DoNotApplyTransform = 1 - }; - - QQuickImageProviderOptions(); - ~QQuickImageProviderOptions(); - - QQuickImageProviderOptions(const QQuickImageProviderOptions&); - QQuickImageProviderOptions& operator=(const QQuickImageProviderOptions&); - - bool operator==(const QQuickImageProviderOptions&) const; + static QQuickPixmapCache *instance(); + ~QQuickPixmapCache() override; - AutoTransform autoTransform() const; - void setAutoTransform(AutoTransform autoTransform); + void unreferencePixmap(QQuickPixmapData *); + void referencePixmap(QQuickPixmapData *); - bool preserveAspectRatioCrop() const; - void setPreserveAspectRatioCrop(bool preserveAspectRatioCrop); + void purgeCache(); - bool preserveAspectRatioFit() const; - void setPreserveAspectRatioFit(bool preserveAspectRatioFit); - - QColorSpace targetColorSpace() const; - void setTargetColorSpace(const QColorSpace &colorSpace); +protected: + void timerEvent(QTimerEvent *) override; private: - QSharedDataPointer<QQuickImageProviderOptionsPrivate> d; -}; + QQuickPixmapCache() = default; + Q_DISABLE_COPY(QQuickPixmapCache) -class Q_QUICK_PRIVATE_EXPORT QQuickPixmap -{ - Q_DECLARE_TR_FUNCTIONS(QQuickPixmap) -public: - QQuickPixmap(); - QQuickPixmap(QQmlEngine *, const QUrl &); - QQuickPixmap(QQmlEngine *, const QUrl &, const QRect ®ion, const QSize &); - QQuickPixmap(const QUrl &, const QImage &image); - ~QQuickPixmap(); - - enum Status { Null, Ready, Error, Loading }; - - enum Option { - Asynchronous = 0x00000001, - Cache = 0x00000002 - }; - Q_DECLARE_FLAGS(Options, Option) - - bool isNull() const; - bool isReady() const; - bool isError() const; - bool isLoading() const; - - Status status() const; - QString error() const; - const QUrl &url() const; - const QSize &implicitSize() const; - const QRect &requestRegion() const; - const QSize &requestSize() const; - QQuickImageProviderOptions::AutoTransform autoTransform() const; - int frameCount() const; - QImage image() const; - void setImage(const QImage &); - void setPixmap(const QQuickPixmap &other); - - QColorSpace colorSpace() const; - - QQuickTextureFactory *textureFactory() const; - - QRect rect() const; - int width() const; - int height() const; - - void load(QQmlEngine *, const QUrl &); - void load(QQmlEngine *, const QUrl &, QQuickPixmap::Options options); - void load(QQmlEngine *, const QUrl &, const QRect &requestRegion, const QSize &requestSize); - void load(QQmlEngine *, const QUrl &, const QRect &requestRegion, const QSize &requestSize, QQuickPixmap::Options options); - void load(QQmlEngine *, const QUrl &, const QRect &requestRegion, const QSize &requestSize, - QQuickPixmap::Options options, const QQuickImageProviderOptions &providerOptions, int frame = 0, int frameCount = 1, - qreal devicePixelRatio = 1.0); - void loadImageFromDevice(QQmlEngine *engine, QIODevice *device, const QUrl &url, - const QRect &requestRegion, const QSize &requestSize, - const QQuickImageProviderOptions &providerOptions, int frame = 0, int frameCount = 1); - - void clear(); - void clear(QObject *); - - bool connectFinished(QObject *, const char *); - bool connectFinished(QObject *, int); - bool connectDownloadProgress(QObject *, const char *); - bool connectDownloadProgress(QObject *, int); - - static void purgeCache(); - static bool isCached(const QUrl &url, const QRect &requestRegion, const QSize &requestSize, - const int frame, const QQuickImageProviderOptions &options); - - static const QLatin1String itemGrabberScheme; + void shrinkCache(int remove); + int destroyCache(); + qsizetype referencedCost() const; private: - Q_DISABLE_COPY(QQuickPixmap) - QQuickPixmapData *d; - QIntrusiveListNode dataListNode; - friend class QQuickPixmapData; -}; + QHash<QQuickPixmapKey, QQuickPixmapData *> m_cache; + mutable QMutex m_cacheMutex; // avoid simultaneous iteration and modification -Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickPixmap::Options) + QQuickPixmapData *m_unreferencedPixmaps = nullptr; + QQuickPixmapData *m_lastUnreferencedPixmap = nullptr; -// ### Qt 6: This should be made public in Qt 6. It's functionality can't be merged into -// QQuickImageProvider without breaking source compatibility. -class Q_QUICK_PRIVATE_EXPORT QQuickImageProviderWithOptions : public QQuickAsyncImageProvider -{ -public: - QQuickImageProviderWithOptions(ImageType type, Flags flags = Flags()); - - QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize) override; - QPixmap requestPixmap(const QString &id, QSize *size, const QSize& requestedSize) override; - QQuickTextureFactory *requestTexture(const QString &id, QSize *size, const QSize &requestedSize) override; - QQuickImageResponse *requestImageResponse(const QString &id, const QSize &requestedSize) override; + int m_unreferencedCost = 0; + int m_timerId = -1; + bool m_destroying = false; - virtual QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize, const QQuickImageProviderOptions &options); - virtual QPixmap requestPixmap(const QString &id, QSize *size, const QSize& requestedSize, const QQuickImageProviderOptions &options); - virtual QQuickTextureFactory *requestTexture(const QString &id, QSize *size, const QSize &requestedSize, const QQuickImageProviderOptions &options); - virtual QQuickImageResponse *requestImageResponse(const QString &id, const QSize &requestedSize, const QQuickImageProviderOptions &options); - - static QSize loadSize(const QSize &originalSize, const QSize &requestedSize, const QByteArray &format, const QQuickImageProviderOptions &options, - qreal devicePixelRatio = 1.0); - static QQuickImageProviderWithOptions *checkedCast(QQuickImageProvider *provider); + friend class QQuickPixmap; + friend class QQuickPixmapData; + friend class tst_qquickpixmapcache; + friend class tst_qquicktext; + friend class tst_qquicktextedit; }; QT_END_NAMESPACE |