Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickitemgenerator_p.h
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QQUICKITEMGENERATOR_P_H
5#define QQUICKITEMGENERATOR_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
22
23#include <QtCore/qeasingcurve.h>
24#include <QtCore/qhash.h>
25#include <QtCore/qmap.h>
26#include <QtCore/qstack.h>
27
28#include <array>
29#include <atomic>
30#include <functional>
31#include <memory>
32
33QT_BEGIN_NAMESPACE
34
35class QQuickItem;
36class QQuickShape;
37class QQuickShapePath;
38class QQmlContext;
39class QQuickShaderEffect;
40class QQuickShaderEffectSource;
41class QQuickMatrix4x4;
42class QQuickItemSpy;
43class QQuickTransform;
44class QQuickTransformSource;
45class QQuickAbstractAnimation;
46
47class Q_QUICKVECTORIMAGEGENERATOR_EXPORT QQuickItemGenerator : public QQuickGenerator
48{
49public:
50 QQuickItemGenerator(const QQuickVectorImageSource &source,
51 QQuickVectorImageGenerator::GeneratorFlags flags,
52 QQmlContext *context = nullptr);
53 ~QQuickItemGenerator() override;
54
55 QQuickItem *takeRootItem();
56
57 // When enabled, calls which have to be made on the GUI thread (such as setting the QML
58 // context, completing QML objects and starting animations) are queued instead of being made
59 // immediately. This allows running the generator on a worker thread: once the item tree has
60 // been moved to the GUI thread, the queued calls are executed there, in order.
61 void setDeferGuiThreadCalls(bool enabled);
62 QList<std::function<void()>> takeDeferredCalls();
63
64 // Generation stops with the Cancelled error state when the flag is set
65 void setCancellationFlag(const std::atomic<bool> *cancelled);
66
67 QString generateNodeBase(const NodeInfo &info, const QString &idSuffix = QString{}) override;
68 bool generateRootNode(const StructureNodeInfo &info) override;
69 bool generateStructureNode(const StructureNodeInfo &info) override;
70 void generateUseNode(const UseNodeInfo &info) override;
71 bool generateDefsNode(const StructureNodeInfo &info) override;
72 void generateDefsInstantiationNode(const StructureNodeInfo &info) override;
73 void generateImageNode(const ImageNodeInfo &info) override;
74 void generatePath(const PathNodeInfo &info,
75 const QRectF &overrideBoundingRect = QRectF{}) override;
76 void generateNode(const NodeInfo &info) override;
77 void generateTextNode(const TextNodeInfo &info) override;
78 void generateFilterNode(const FilterNodeInfo &info) override;
79 bool generateMaskNode(const MaskNodeInfo &info) override;
80 bool generateMarkerNode(const MarkerNodeInfo &info) override;
81 bool generatePatternNode(const PatternNodeInfo &info) override;
82 void outputShapePath(const PathNodeInfo &info, const QPainterPath *path,
83 const QQuadPath *quadPath,
84 QQuickVectorImageGenerator::PathSelector pathSelector,
85 const QRectF &boundingRect) override;
86
87 void setAnimationProvider(std::unique_ptr<QQuickGeneratorAnimationProvider> provider) override;
88
89private:
90 struct MaskDef
91 {
92 QQuickItem *container = nullptr;
93 QRectF maskRect;
94 bool isMaskRectRelativeCoordinates = false;
95 bool isMaskContentRelativeCoordinates = false;
96 QQuickItem *transformer = nullptr;
97 QQuickMatrix4x4 *transformerMatrix = nullptr;
98 };
99
100 struct PatternDef
101 {
102 QQuickItem *container = nullptr;
103 QRectF patternRect;
104 bool isPatternRectRelativeCoordinates = false;
105 };
106
107 struct MarkerDef
108 {
109 QList<std::function<void()>> recording;
110 MarkerNodeInfo info;
111 };
112
113 struct PendingLinkedTransform
114 {
115 QQuickItem *item;
116 QString transformReferenceId;
117 QQuickMatrix4x4 *linkedMatrix;
118 };
119
120 struct OpacityGroup
121 {
122 QQuickItem *wrapper = nullptr;
123 QRectF bounds;
124 int graphicItemCount = 0;
125 };
126
127 QQuickItem *m_rootItem = nullptr;
128 QStack<QQuickItem *> m_itemStack;
129 QQmlContext *m_context = nullptr;
130 QSizeF m_containerSize;
131 quint32 m_nodeCounter = 0;
132 QHash<QString, QList<std::function<void()>>> m_defs;
133 QList<std::function<void()>> *m_currentDefsRecord = nullptr;
134 QString m_currentDefsId;
135 QStack<QString> m_defsIdStack;
136 QList<std::function<void()>> *m_currentMarkerRecord = nullptr;
137 QHash<QString, MaskDef> m_maskDefs;
138 QHash<QString, PatternDef> m_patternDefs;
139 QHash<QString, MarkerDef> m_markerDefs;
140 QHash<QString, FilterNodeInfo> m_filterDefs;
141 QHash<QString, QRectF> m_bounds;
142 QQuickItemSpy *m_topLevelScaleSpy = nullptr;
143
144 QHash<QString, QQuickTransformSource *> m_transformSourceItems;
145 QHash<QString, QString> m_transformReferenceChildIds;
146 QList<PendingLinkedTransform> m_pendingLinkedTransforms;
147 std::unique_ptr<QQuickGeneratorAnimationProvider> m_animationProvider;
148 QStack<bool> m_scopePushed;
149 QStack<OpacityGroup> m_opacityGroups;
150 QStack<bool> m_opacityGroupPushed;
151 QMap<std::array<qreal, 4>, QEasingCurve> m_easingCache;
152
153 bool m_deferGuiThreadCalls = false;
154 QList<std::function<void()>> m_deferredCalls;
155 const std::atomic<bool> *m_cancelled = nullptr;
156
157 bool isStopped();
158 bool generateStructureNodeItem(const StructureNodeInfo &info);
159 void beginOpacityGroup(const StructureNodeInfo &info);
160 void endOpacityGroup();
161 void deferToGuiThread(std::function<void()> call);
162 void initializeQmlObject(QObject *object, std::function<void()> setup);
163 void startMasterAnimation(QQuickAbstractAnimation *animation);
164
165 QQuickTransformSource *resolveTransformReference(const QString &referenceId) const;
166
167 QRectF resolveBounds(const NodeInfo &info) const;
168 void registerBounds(const QString &id, const QRectF &bounds);
169
170 void beginDefsRecord(const QString &id);
171 void endDefsRecord();
172 void replayDefsRecord(const QString &id);
173
174 template <typename T>
175 typename QHash<QString, T>::iterator resolveDef(QHash<QString, T> &registeredDefs,
176 const QString &id);
177
178 QList<std::function<void()>> *activeRecord() const;
179 QQuickShape *createShapeContainer();
180 void pushItem(QQuickItem *item);
181 QQuickItem *popItem();
182 QQuickItem *currentItem() const;
183
184 void bindTextureSize(QQuickShaderEffectSource *ses);
185 void bindPatternTextureSize(QQuickShaderEffectSource *ses);
186 void bindAnimatedProperty(QObject *target, const QString &propertyName,
187 const QQuickAnimatedProperty &property);
188 void bindColorWithOpacity(QObject *target, const QString &colorPropertyName,
189 const QQuickAnimatedProperty &color,
190 const QQuickAnimatedProperty &opacity,
191 std::function<void(const QColor &)> setter);
192 void generateItemAnimations(QQuickItem *item, const NodeInfo &info);
193 QQuickTransform *createAnimatedTransformGroup(QQuickItem *item, const NodeInfo &info);
194 void bindMotionPath(QQuickItem *item, const QQuickAnimatedProperty &motionPath);
195
196 void generateMaskContainer(const MaskNodeInfo &info);
197 void generateMask(QQuickItem *item, const NodeInfo &info, const QPointF &sourceOrigin);
198 void generatePatternContainer(const PatternNodeInfo &info);
199 void generatePattern(QQuickShapePath *shapePath, const PathNodeInfo &info,
200 const QRectF &boundingRect, QTransform &fillTransform);
201 void generateMarkers(const PathNodeInfo &info);
202 QQuickItem *generateFilter(QQuickItem *item, const NodeInfo &info, QPointF *outputOrigin);
203 QQuickShaderEffectSource *generateFilterStep(const FilterNodeInfo::FilterStep &step,
204 QQuickShaderEffectSource *input1,
205 QQuickShaderEffectSource *input2,
206 const QRectF &stepRect, const QRectF &filterRect);
207 QQuickShaderEffectSource *generateFilterMerge(const QList<QQuickShaderEffectSource *> &inputs,
208 const QRectF &stepRect, const QRectF &filterRect);
209 QQuickShaderEffectSource *generateFilterFlood(const FilterNodeInfo::FilterStep &step,
210 QQuickShaderEffectSource *input,
211 const QRectF &stepRect, const QRectF &filterRect);
212 QQuickShaderEffectSource *generateFilterOffset(const FilterNodeInfo::FilterStep &step,
213 QQuickShaderEffectSource *input,
214 const QRectF &stepRect);
215 QQuickShaderEffectSource *generateFilterColorMatrix(const FilterNodeInfo::FilterStep &step,
216 QQuickShaderEffectSource *input,
217 const QRectF &stepRect,
218 const QRectF &filterRect);
219 QQuickShaderEffectSource *generateFilterBlend(const FilterNodeInfo::FilterStep &step,
220 QQuickShaderEffectSource *input1,
221 QQuickShaderEffectSource *input2,
222 const QRectF &stepRect, const QRectF &filterRect);
223 QQuickShaderEffectSource *generateFilterComposite(const FilterNodeInfo::FilterStep &step,
224 QQuickShaderEffectSource *input1,
225 QQuickShaderEffectSource *input2,
226 const QRectF &stepRect,
227 const QRectF &filterRect);
228 QQuickShaderEffectSource *generateFilterGaussianBlur(const FilterNodeInfo::FilterStep &step,
229 QQuickShaderEffectSource *input,
230 const QRectF &stepRect,
231 const QRectF &filterRect);
232};
233
234QT_END_NAMESPACE
235
236#endif // QQUICKITEMGENERATOR_P_H
Combined button and popup list for selecting options.