diff options
Diffstat (limited to 'src/quick/util/qquickpixmapcache_p.h')
-rw-r--r-- | src/quick/util/qquickpixmapcache_p.h | 223 |
1 files changed, 44 insertions, 179 deletions
diff --git a/src/quick/util/qquickpixmapcache_p.h b/src/quick/util/qquickpixmapcache_p.h index 87724d6210..8c0c085b50 100644 --- a/src/quick/util/qquickpixmapcache_p.h +++ b/src/quick/util/qquickpixmapcache_p.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQuick module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QQUICKPIXMAPCACHE_H #define QQUICKPIXMAPCACHE_H @@ -51,171 +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); - - 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); - 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 |