1/****************************************************************************
2**
3** Copyright (C) 2017 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the plugins of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#include <qqmlextensionplugin.h>
41#include <qqmlengine.h>
42#include <sharedimageprovider.h>
43
44
45/*!
46 \qmlmodule Qt.labs.sharedimage 1
47 \title Qt Quick Shared Image Provider
48 \ingroup qmlmodules
49 \brief Adds an image provider which utilizes shared CPU memory
50
51 \section2 Summary
52
53 This module provides functionality to save memory in use cases where
54 several Qt Quick applications use the same local image files. It does this
55 by placing the decoded QImage data in shared system memory, making it
56 accessible to all the processes (see QSharedMemory).
57
58 This module only shares CPU memory. It does not provide sharing of GPU
59 memory or textures.
60
61 \section2 Usage
62
63 To use this module, import it like this:
64 \code
65 import Qt.labs.sharedimage 1.0
66 \endcode
67
68 The sharing functionality is provided through a QQuickImageProvider. Use
69 the "image:" scheme for the URL source of the image, followed by the
70 identifier \e shared, followed by the image file path. For example:
71
72 \code
73 Image { source: "image://shared/usr/share/wallpapers/mybackground.jpg" }
74 \endcode
75
76 This will look for the file \e /usr/share/wallpapers/mybackground.jpg.
77 The first process that does this will read the image file
78 using normal Qt image loading. The decoded image data will then be placed
79 in shared memory, using the full file path as key. Later processes
80 requesting the same image will discover that the data is already available
81 in shared memory. They will then use that instead of loading the image file
82 again.
83
84 The shared image data will be kept available until the last process has deleted
85 its last reference to the shared image, at which point it is automatically released.
86
87 If system memory sharing is not available, the shared image provider falls
88 back to normal, unshared image loading.
89
90 The file path must be absolute. To use a relative path, make it absolute
91 using \e Qt.resolvedUrl() and replace the URL scheme. For example:
92
93 \code
94 ...
95 property string imagePrefix: Qt.resolvedUrl("../myimages/").replace("file://", "image://shared/")
96 Image { source: imagePrefix + "myimage.png" }
97 \endcode
98
99 The shared image module does not provide any directly usable QML types.
100*/
101
102extern void qml_register_types_Qt_labs_sharedimage();
103GHS_KEEP_REFERENCE(qml_register_types_Qt_labs_sharedimage);
104
105QT_BEGIN_NAMESPACE
106
107class QtQuickSharedImagePlugin : public QQmlEngineExtensionPlugin
108{
109 Q_OBJECT
110 Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
111public:
112 QtQuickSharedImagePlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent)
113 {
114 volatile auto registration = &qml_register_types_Qt_labs_sharedimage;
115 Q_UNUSED(registration);
116 }
117
118 void initializeEngine(QQmlEngine *engine, const char *uri) override
119 {
120 Q_UNUSED(uri);
121 engine->addImageProvider(id: "shared", new SharedImageProvider);
122 }
123};
124
125QT_END_NAMESPACE
126
127#include "plugin.moc"
128

source code of qtdeclarative/src/imports/sharedimage/plugin.cpp