aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qquickpixmapcache_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/util/qquickpixmapcache_p.h')
-rw-r--r--src/quick/util/qquickpixmapcache_p.h223
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 &region, 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