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 QString &fileName, QQuickVectorImageGenerator::GeneratorFlags flags,
50 QQmlContext *context = nullptr);
51 ~QQuickItemGenerator() override;
52
53 QQuickItem *takeRootItem();
54
55 QString generateNodeBase(const NodeInfo &info, const QString &idSuffix = QString{}) override;
56 bool generateRootNode(const StructureNodeInfo &info) override;
57 bool generateStructureNode(const StructureNodeInfo &info) override;
58 void generateUseNode(const UseNodeInfo &info) override;
59 bool generateDefsNode(const StructureNodeInfo &info) override;
60 void generateDefsInstantiationNode(const StructureNodeInfo &info) override;
61 void generateImageNode(const ImageNodeInfo &info) override;
62 void generatePath(const PathNodeInfo &info,
63 const QRectF &overrideBoundingRect = QRectF{}) override;
64 void generateNode(const NodeInfo &info) override;
65 void generateTextNode(const TextNodeInfo &info) override;
66 void generateFilterNode(const FilterNodeInfo &info) override;
67 bool generateMaskNode(const MaskNodeInfo &info) override;
68 bool generateMarkerNode(const MarkerNodeInfo &info) override;
69 bool generatePatternNode(const PatternNodeInfo &info) override;
70 void outputShapePath(const PathNodeInfo &info, const QPainterPath *path,
71 const QQuadPath *quadPath,
72 QQuickVectorImageGenerator::PathSelector pathSelector,
73 const QRectF &boundingRect) override;
74
75 void setAnimationProvider(std::unique_ptr<QQuickGeneratorAnimationProvider> provider) override;
76
77private:
78 struct MaskDef
79 {
80 QQuickItem *container = nullptr;
81 QRectF maskRect;
82 bool isMaskRectRelativeCoordinates = false;
83 bool isMaskContentRelativeCoordinates = false;
84 QQuickItem *transformer = nullptr;
85 QQuickMatrix4x4 *transformerMatrix = nullptr;
86 };
87
88 struct PatternDef
89 {
90 QQuickItem *container = nullptr;
91 QRectF patternRect;
92 bool isPatternRectRelativeCoordinates = false;
93 };
94
95 struct MarkerDef
96 {
97 QList<std::function<void()>> recording;
98 MarkerNodeInfo info;
99 };
100
101 struct PendingLinkedTransform
102 {
103 QQuickItem *item;
104 QString transformReferenceId;
105 QQuickMatrix4x4 *linkedMatrix;
106 };
107
108 QQuickItem *m_rootItem = nullptr;
109 QStack<QQuickItem *> m_itemStack;
110 QQmlContext *m_context = nullptr;
111 QSizeF m_containerSize;
112 quint32 m_nodeCounter = 0;
113 QHash<QString, QList<std::function<void()>>> m_defs;
114 QList<std::function<void()>> *m_currentDefsRecord = nullptr;
115 QList<std::function<void()>> *m_currentMarkerRecord = nullptr;
116 QHash<QString, MaskDef> m_maskDefs;
117 QHash<QString, PatternDef> m_patternDefs;
118 QHash<QString, MarkerDef> m_markerDefs;
119 QHash<QString, FilterNodeInfo> m_filterDefs;
120 QQuickItemSpy *m_topLevelScaleSpy = nullptr;
121
122 QHash<QString, QQuickTransformSource *> m_transformSourceItems;
123 QList<PendingLinkedTransform> m_pendingLinkedTransforms;
124 std::unique_ptr<QQuickGeneratorAnimationProvider> m_animationProvider;
125 QStack<bool> m_scopePushed;
126 QMap<std::array<qreal, 4>, QEasingCurve> m_easingCache;
127
128 QList<std::function<void()>> *activeRecord() const;
129 QQuickShape *createShapeContainer();
130 void pushItem(QQuickItem *item);
131 QQuickItem *popItem();
132 QQuickItem *currentItem() const;
133
134 void bindTextureSize(QQuickShaderEffectSource *ses);
135 void bindPatternTextureSize(QQuickShaderEffectSource *ses);
136 void bindPropertyAnimation(QObject *target, const QString &property,
137 const QQuickAnimatedProperty::PropertyAnimation &anim,
138 const std::function<QVariant(const QVariant &)> &extractor,
139 int valueIndex = 0, const QVariant &resetValue = QVariant());
140 void bindAnimatedProperty(QObject *target, const QString &property,
141 const QQuickAnimatedProperty &animatedProperty,
142 const std::function<QVariant(const QVariant &)> &extractor,
143 int valueIndex = 0);
144 void bindColorWithOpacity(QObject *target, const QString &colorProperty,
145 const QQuickAnimatedProperty &color,
146 const QQuickAnimatedProperty &opacity,
147 std::function<void(const QColor &)> setter);
148 void generateItemAnimations(QQuickItem *item, const NodeInfo &info);
149 QQuickTransform *createAnimatedTransformGroup(QQuickItem *item, const NodeInfo &info);
150 void bindMotionPath(QQuickItem *item, const QQuickAnimatedProperty &motionPath);
151
152 void generateMaskContainer(const MaskNodeInfo &info);
153 void generateMask(QQuickItem *item, const NodeInfo &info, const QPointF &sourceOrigin);
154 void generatePatternContainer(const PatternNodeInfo &info);
155 void generatePattern(QQuickShapePath *shapePath, const PathNodeInfo &info,
156 const QRectF &boundingRect, QTransform &fillTransform);
157 void generateMarkers(const PathNodeInfo &info);
158 QQuickItem *generateFilter(QQuickItem *item, const NodeInfo &info, QPointF *outputOrigin);
159 QQuickShaderEffectSource *generateFilterStep(const FilterNodeInfo::FilterStep &step,
160 QQuickShaderEffectSource *input1,
161 QQuickShaderEffectSource *input2,
162 const QRectF &stepRect, const QRectF &filterRect);
163 QQuickShaderEffectSource *generateFilterMerge(const QList<QQuickShaderEffectSource *> &inputs,
164 const QRectF &stepRect, const QRectF &filterRect);
165 QQuickShaderEffectSource *generateFilterFlood(const FilterNodeInfo::FilterStep &step,
166 QQuickShaderEffectSource *input,
167 const QRectF &stepRect, const QRectF &filterRect);
168 QQuickShaderEffectSource *generateFilterOffset(const FilterNodeInfo::FilterStep &step,
169 QQuickShaderEffectSource *input,
170 const QRectF &stepRect);
171 QQuickShaderEffectSource *generateFilterColorMatrix(const FilterNodeInfo::FilterStep &step,
172 QQuickShaderEffectSource *input,
173 const QRectF &stepRect,
174 const QRectF &filterRect);
175 QQuickShaderEffectSource *generateFilterBlend(const FilterNodeInfo::FilterStep &step,
176 QQuickShaderEffectSource *input1,
177 QQuickShaderEffectSource *input2,
178 const QRectF &stepRect, const QRectF &filterRect);
179 QQuickShaderEffectSource *generateFilterComposite(const FilterNodeInfo::FilterStep &step,
180 QQuickShaderEffectSource *input1,
181 QQuickShaderEffectSource *input2,
182 const QRectF &stepRect,
183 const QRectF &filterRect);
184 QQuickShaderEffectSource *generateFilterGaussianBlur(const FilterNodeInfo::FilterStep &step,
185 QQuickShaderEffectSource *input,
186 const QRectF &stepRect,
187 const QRectF &filterRect);
188};
189
190QT_END_NAMESPACE
191
192#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)