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 <functional>
30#include <memory>
31
32QT_BEGIN_NAMESPACE
33
34class QQuickItem;
35class QQuickShape;
36class QQuickShapePath;
37class QQmlContext;
38class QQuickShaderEffect;
39class QQuickShaderEffectSource;
40class QQuickMatrix4x4;
41class QQuickItemSpy;
42class QQuickTransform;
43class QQuickTransformSource;
44class QQuickAbstractAnimation;
45
46class Q_QUICKVECTORIMAGEGENERATOR_EXPORT QQuickItemGenerator : public QQuickGenerator
47{
48public:
49 QQuickItemGenerator(const QQuickVectorImageSource &source,
50 QQuickVectorImageGenerator::GeneratorFlags flags,
51 QQmlContext *context = nullptr);
52 ~QQuickItemGenerator() override;
53
54 QQuickItem *takeRootItem();
55
56 QString generateNodeBase(const NodeInfo &info, const QString &idSuffix = QString{}) override;
57 bool generateRootNode(const StructureNodeInfo &info) override;
58 bool generateStructureNode(const StructureNodeInfo &info) override;
59 void generateUseNode(const UseNodeInfo &info) override;
60 bool generateDefsNode(const StructureNodeInfo &info) override;
61 void generateDefsInstantiationNode(const StructureNodeInfo &info) override;
62 void generateImageNode(const ImageNodeInfo &info) override;
63 void generatePath(const PathNodeInfo &info,
64 const QRectF &overrideBoundingRect = QRectF{}) override;
65 void generateNode(const NodeInfo &info) override;
66 void generateTextNode(const TextNodeInfo &info) override;
67 void generateFilterNode(const FilterNodeInfo &info) override;
68 bool generateMaskNode(const MaskNodeInfo &info) override;
69 bool generateMarkerNode(const MarkerNodeInfo &info) override;
70 bool generatePatternNode(const PatternNodeInfo &info) override;
71 void outputShapePath(const PathNodeInfo &info, const QPainterPath *path,
72 const QQuadPath *quadPath,
73 QQuickVectorImageGenerator::PathSelector pathSelector,
74 const QRectF &boundingRect) override;
75
76 void setAnimationProvider(std::unique_ptr<QQuickGeneratorAnimationProvider> provider) override;
77
78private:
79 struct MaskDef
80 {
81 QQuickItem *container = nullptr;
82 QRectF maskRect;
83 bool isMaskRectRelativeCoordinates = false;
84 bool isMaskContentRelativeCoordinates = false;
85 QQuickItem *transformer = nullptr;
86 QQuickMatrix4x4 *transformerMatrix = nullptr;
87 };
88
89 struct PatternDef
90 {
91 QQuickItem *container = nullptr;
92 QRectF patternRect;
93 bool isPatternRectRelativeCoordinates = false;
94 };
95
96 struct MarkerDef
97 {
98 QList<std::function<void()>> recording;
99 MarkerNodeInfo info;
100 };
101
102 struct PendingLinkedTransform
103 {
104 QQuickItem *item;
105 QString transformReferenceId;
106 QQuickMatrix4x4 *linkedMatrix;
107 };
108
109 QQuickItem *m_rootItem = nullptr;
110 QStack<QQuickItem *> m_itemStack;
111 QQmlContext *m_context = nullptr;
112 QSizeF m_containerSize;
113 quint32 m_nodeCounter = 0;
114 QHash<QString, QList<std::function<void()>>> m_defs;
115 QList<std::function<void()>> *m_currentDefsRecord = nullptr;
116 QString m_currentDefsId;
117 QStack<QString> m_defsIdStack;
118 QList<std::function<void()>> *m_currentMarkerRecord = nullptr;
119 QHash<QString, MaskDef> m_maskDefs;
120 QHash<QString, PatternDef> m_patternDefs;
121 QHash<QString, MarkerDef> m_markerDefs;
122 QHash<QString, FilterNodeInfo> m_filterDefs;
123 QHash<QString, QRectF> m_bounds;
124 QQuickItemSpy *m_topLevelScaleSpy = nullptr;
125
126 QHash<QString, QQuickTransformSource *> m_transformSourceItems;
127 QHash<QString, QString> m_transformReferenceChildIds;
128 QList<PendingLinkedTransform> m_pendingLinkedTransforms;
129 std::unique_ptr<QQuickGeneratorAnimationProvider> m_animationProvider;
130 QStack<bool> m_scopePushed;
131 QMap<std::array<qreal, 4>, QEasingCurve> m_easingCache;
132
133 QQuickTransformSource *resolveTransformReference(const QString &referenceId) const;
134
135 QRectF resolveBounds(const NodeInfo &info) const;
136 void registerBounds(const QString &id, const QRectF &bounds);
137
138 void beginDefsRecord(const QString &id);
139 void endDefsRecord();
140 void replayDefsRecord(const QString &id);
141
142 template <typename T>
143 typename QHash<QString, T>::iterator resolveDef(QHash<QString, T> &registeredDefs,
144 const QString &id);
145
146 QList<std::function<void()>> *activeRecord() const;
147 QQuickShape *createShapeContainer();
148 void pushItem(QQuickItem *item);
149 QQuickItem *popItem();
150 QQuickItem *currentItem() const;
151
152 void bindTextureSize(QQuickShaderEffectSource *ses);
153 void bindPatternTextureSize(QQuickShaderEffectSource *ses);
154 void bindPropertyAnimation(QObject *target, const QString &property,
155 const QQuickAnimatedProperty::PropertyAnimation &anim,
156 const std::function<QVariant(const QVariant &)> &extractor,
157 int valueIndex = 0, const QVariant &resetValue = QVariant());
158 void bindAnimatedProperty(QObject *target, const QString &property,
159 const QQuickAnimatedProperty &animatedProperty,
160 const std::function<QVariant(const QVariant &)> &extractor,
161 int valueIndex = 0);
162 void bindColorWithOpacity(QObject *target, const QString &colorProperty,
163 const QQuickAnimatedProperty &color,
164 const QQuickAnimatedProperty &opacity,
165 std::function<void(const QColor &)> setter);
166 void generateItemAnimations(QQuickItem *item, const NodeInfo &info);
167 QQuickTransform *createAnimatedTransformGroup(QQuickItem *item, const NodeInfo &info);
168 void bindMotionPath(QQuickItem *item, const QQuickAnimatedProperty &motionPath);
169
170 void generateMaskContainer(const MaskNodeInfo &info);
171 void generateMask(QQuickItem *item, const NodeInfo &info, const QPointF &sourceOrigin);
172 void generatePatternContainer(const PatternNodeInfo &info);
173 void generatePattern(QQuickShapePath *shapePath, const PathNodeInfo &info,
174 const QRectF &boundingRect, QTransform &fillTransform);
175 void generateMarkers(const PathNodeInfo &info);
176 QQuickItem *generateFilter(QQuickItem *item, const NodeInfo &info, QPointF *outputOrigin);
177 QQuickShaderEffectSource *generateFilterStep(const FilterNodeInfo::FilterStep &step,
178 QQuickShaderEffectSource *input1,
179 QQuickShaderEffectSource *input2,
180 const QRectF &stepRect, const QRectF &filterRect);
181 QQuickShaderEffectSource *generateFilterMerge(const QList<QQuickShaderEffectSource *> &inputs,
182 const QRectF &stepRect, const QRectF &filterRect);
183 QQuickShaderEffectSource *generateFilterFlood(const FilterNodeInfo::FilterStep &step,
184 QQuickShaderEffectSource *input,
185 const QRectF &stepRect, const QRectF &filterRect);
186 QQuickShaderEffectSource *generateFilterOffset(const FilterNodeInfo::FilterStep &step,
187 QQuickShaderEffectSource *input,
188 const QRectF &stepRect);
189 QQuickShaderEffectSource *generateFilterColorMatrix(const FilterNodeInfo::FilterStep &step,
190 QQuickShaderEffectSource *input,
191 const QRectF &stepRect,
192 const QRectF &filterRect);
193 QQuickShaderEffectSource *generateFilterBlend(const FilterNodeInfo::FilterStep &step,
194 QQuickShaderEffectSource *input1,
195 QQuickShaderEffectSource *input2,
196 const QRectF &stepRect, const QRectF &filterRect);
197 QQuickShaderEffectSource *generateFilterComposite(const FilterNodeInfo::FilterStep &step,
198 QQuickShaderEffectSource *input1,
199 QQuickShaderEffectSource *input2,
200 const QRectF &stepRect,
201 const QRectF &filterRect);
202 QQuickShaderEffectSource *generateFilterGaussianBlur(const FilterNodeInfo::FilterStep &step,
203 QQuickShaderEffectSource *input,
204 const QRectF &stepRect,
205 const QRectF &filterRect);
206};
207
208QT_END_NAMESPACE
209
210#endif // QQUICKITEMGENERATOR_P_H
void updateState(State newState, State oldState) override
QQuickCallbackAnimationJob(std::function< void()> function)
QAbstractAnimationJob * transition(QQuickStateActions &, QQmlProperties &, TransitionDirection, QObject *=nullptr) override
QQuickFunctionAction(std::function< void()> function, QObject *parent=nullptr)
int processAnimationTime(int timeMs)
Definition utils_p.h:239
Combined button and popup list for selecting options.
static qreal meanAngle(QPointF p0, QPointF p1, QPointF p2)
static void completeParserStatus(QQuickAbstractAnimation *anim)
static QRectF resolveRect(const QRectF &rect, FilterNodeInfo::CoordinateSystem cs, const QRectF &itemBounds)
static QQuickPropertyAction * createImmediateSetter(QObject *target, const QString &property, const QVariant &value, QObject *parent)
static QQuickShaderEffect * makeFilterEffect(QQuickItem *inputItem, const QUrl &shader, QQmlContext *context, QQuickItem *parent)
static QQuickShaderEffectSource * makeSES(QQuickItem *item, const QRectF &rect, QQuickItem *parent)
static QQuickPropertyAnimation * createSegmentAnimation(QObject *target, const QString &property, const QVariant &value, const QQuickAnimatedProperty::PropertyAnimation &anim, int frameTime, int time, QObject *parent, QMap< std::array< qreal, 4 >, QEasingCurve > &easingCache)
static QEasingCurve easingForAnimationFrame(const QQuickAnimatedProperty::PropertyAnimation &anim, int time, QMap< std::array< qreal, 4 >, QEasingCurve > &cache)
static QQuickAbstractAnimation * createAnimationForOneEntry(QObject *target, const QString &property, const QQuickAnimatedProperty::PropertyAnimation &anim, const QVariant &defaultValue, QObject *parent, QMap< std::array< qreal, 4 >, QEasingCurve > &easingCache)
static QQuickAnimatedProperty::PropertyAnimation transformAnimation(const QQuickAnimatedProperty::PropertyAnimation &anim, const std::function< QVariant(const QVariant &)> &extractor, int valueIndex)
static QQuickShapeGradient * createShapeGradient(const QGradient &grad, const QRectF &coordSys, QObject *parent)
static QQuickShaderEffectSource * makeEffectSES(QQuickShaderEffect *effect, const QRectF &stepRect, const QRectF &filterRect, QQuickItem *parent)