58 virtual ~QSGNodeVisitorEx();
63 virtual bool visit(QSGTransformNode *) = 0;
64 virtual void endVisit(QSGTransformNode *) = 0;
65 virtual bool visit(QSGClipNode *) = 0;
66 virtual void endVisit(QSGClipNode *) = 0;
67 virtual bool visit(QSGGeometryNode *) = 0;
68 virtual void endVisit(QSGGeometryNode *) = 0;
69 virtual bool visit(QSGOpacityNode *) = 0;
70 virtual void endVisit(QSGOpacityNode *) = 0;
71 virtual bool visit(QSGInternalImageNode *) = 0;
72 virtual void endVisit(QSGInternalImageNode *) = 0;
73 virtual bool visit(QSGPainterNode *) = 0;
74 virtual void endVisit(QSGPainterNode *) = 0;
75 virtual bool visit(QSGInternalRectangleNode *) = 0;
76 virtual void endVisit(QSGInternalRectangleNode *) = 0;
77 virtual bool visit(QSGGlyphNode *) = 0;
78 virtual void endVisit(QSGGlyphNode *) = 0;
79 virtual bool visit(QSGRootNode *) = 0;
80 virtual void endVisit(QSGRootNode *) = 0;
81#if QT_CONFIG(quick_sprite)
82 virtual bool visit(QSGSpriteNode *) = 0;
83 virtual void endVisit(QSGSpriteNode *) = 0;
85 virtual bool visit(QSGRenderNode *) = 0;
86 virtual void endVisit(QSGRenderNode *) = 0;
88 void visitChildren(QSGNode *node);
104 ~QSGInternalRectangleNode() override;
106 virtual void setRect(
const QRectF &rect) = 0;
107 virtual void setColor(
const QColor &color) = 0;
108 virtual void setPenColor(
const QColor &color) = 0;
109 virtual void setPenWidth(qreal width) = 0;
110 virtual void setGradientStops(
const QGradientStops &stops) = 0;
111 virtual void setGradientVertical(
bool vertical) = 0;
112 virtual void setRadius(qreal radius) = 0;
113 virtual void setTopLeftRadius(qreal radius) = 0;
114 virtual void setTopRightRadius(qreal radius) = 0;
115 virtual void setBottomLeftRadius(qreal radius) = 0;
116 virtual void setBottomRightRadius(qreal radius) = 0;
117 virtual void resetTopLeftRadius() = 0;
118 virtual void resetTopRightRadius() = 0;
119 virtual void resetBottomLeftRadius() = 0;
120 virtual void resetBottomRightRadius() = 0;
121 virtual void setAntialiasing(
bool antialiasing) { Q_UNUSED(antialiasing); }
122 virtual void setAligned(
bool aligned) = 0;
124 virtual void update() = 0;
126 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
133 ~QSGInternalImageNode() override;
135 virtual void setTargetRect(
const QRectF &rect) = 0;
136 virtual void setInnerTargetRect(
const QRectF &rect) = 0;
137 virtual void setInnerSourceRect(
const QRectF &rect) = 0;
141 virtual void setSubSourceRect(
const QRectF &rect) = 0;
142 virtual void setTexture(QSGTexture *texture) = 0;
143 virtual void setAntialiasing(
bool antialiasing) { Q_UNUSED(antialiasing); }
144 virtual void setMirror(
bool horizontally,
bool vertically) = 0;
145 virtual void setMipmapFiltering(QSGTexture::Filtering filtering) = 0;
146 virtual void setFiltering(QSGTexture::Filtering filtering) = 0;
147 virtual void setHorizontalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
148 virtual void setVerticalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
150 virtual void update() = 0;
152 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
158 ~QSGPainterNode() override;
160 virtual void setPreferredRenderTarget(QQuickPaintedItem::RenderTarget target) = 0;
161 virtual void setSize(
const QSize &size) = 0;
162 virtual void setDirty(
const QRect &dirtyRect = QRect()) = 0;
163 virtual void setOpaquePainting(
bool opaque) = 0;
164 virtual void setLinearFiltering(
bool linearFiltering) = 0;
165 virtual void setMipmapping(
bool mipmapping) = 0;
166 virtual void setSmoothPainting(
bool s) = 0;
167 virtual void setFillColor(
const QColor &c) = 0;
168 virtual void setContentsScale(qreal s) = 0;
169 virtual void setFastFBOResizing(
bool dynamic) = 0;
170 virtual void setTextureSize(
const QSize &size) = 0;
172 virtual QImage toImage()
const = 0;
173 virtual void update() = 0;
174 virtual QSGTexture *texture()
const = 0;
176 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
179class Q_QUICK_EXPORT
QSGLayer :
public QSGDynamicTexture
183 ~QSGLayer() override;
190 virtual void setItem(QSGNode *item) = 0;
191 virtual void setRect(
const QRectF &logicalRect) = 0;
192 virtual void setSize(
const QSize &pixelSize) = 0;
193 virtual void scheduleUpdate() = 0;
194 virtual QImage toImage()
const = 0;
195 virtual void setLive(
bool live) = 0;
196 virtual void setRecursive(
bool recursive) = 0;
197 virtual void setFormat(Format format) = 0;
198 virtual void setHasMipmaps(
bool mipmap) = 0;
199 virtual void setDevicePixelRatio(qreal ratio) = 0;
200 virtual void setMirrorHorizontal(
bool mirror) = 0;
201 virtual void setMirrorVertical(
bool mirror) = 0;
202 virtual void setSamples(
int samples) = 0;
203 Q_SLOT
virtual void markDirtyTexture() = 0;
204 Q_SLOT
virtual void invalidated() = 0;
207 void updateRequested();
208 void scheduledUpdateCompleted();
211 QSGLayer(QSGTexturePrivate &dd);
242 ~QSGGuiThreadShaderEffectManager() override;
250 virtual bool hasSeparateSamplerAndTextureObjects()
const = 0;
252 virtual QString log()
const = 0;
253 virtual Status status()
const = 0;
267 VariableType type = Constant;
277 QVector<Variable> variables;
285 virtual void prepareShaderCode(ShaderInfo::Type typeHint,
const QUrl &src, ShaderInfo *result) = 0;
288 void shaderCodePrepared(
bool ok, ShaderInfo::Type typeHint,
const QUrl &src, ShaderInfo *result);
289 void logAndStatusChanged();
301 ~QSGShaderEffectNode() override;
303 enum DirtyShaderFlag {
305 DirtyShaderConstant = 0x02,
306 DirtyShaderTexture = 0x04,
307 DirtyShaderGeometry = 0x08,
308 DirtyShaderMesh = 0x10,
310 DirtyShaderAll = 0xFF
312 Q_DECLARE_FLAGS(DirtyShaderFlags, DirtyShaderFlag)
320 struct VariableData {
321 enum SpecialType { None, Unused, Source, SubRect, Opacity, Matrix };
324 SpecialType specialType;
325 int propertyIndex = -1;
330 bool hasShaderCode =
false;
331 QSGGuiThreadShaderEffectManager::ShaderInfo shaderInfo;
332 QVector<VariableData> varData;
336 DirtyShaderFlags dirty;
339 struct ShaderSyncData {
340 const ShaderData *shader;
341 const QSet<
int> *dirtyConstants;
342 const QSet<
int> *dirtyTextures;
344 ShaderSyncData vertex;
345 ShaderSyncData fragment;
346 void *materialTypeCacheKey;
352 virtual QRectF updateNormalizedTextureSubRect(
bool supportsAtlasTextures) = 0;
353 virtual void syncMaterial(SyncData *syncData) = 0;
355 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
358 void textureChanged();
364Q_QUICK_EXPORT QDebug operator<<(QDebug debug,
const QSGShaderEffectNode::VariableData &vd);
370 enum AntialiasingMode
372 DefaultAntialiasing = -1,
374 LowQualitySubPixelAntialiasing,
375 HighQualitySubPixelAntialiasing
379 ~QSGGlyphNode() override;
381 virtual void setGlyphs(
const QPointF &position,
const QGlyphRun &glyphs) = 0;
382 virtual void setColor(
const QColor &color) = 0;
383 virtual void setStyle(QQuickText::TextStyle style) = 0;
384 virtual void setStyleColor(
const QColor &color) = 0;
385 virtual QPointF baseLine()
const = 0;
387 virtual QRectF boundingRect()
const {
return m_bounding_rect; }
388 virtual void setBoundingRect(
const QRectF &bounds) { m_bounding_rect = bounds; }
390 virtual void setPreferredAntialiasingMode(AntialiasingMode) = 0;
391 virtual void setRenderTypeQuality(
int renderTypeQuality) { Q_UNUSED(renderTypeQuality) }
393 virtual void update() = 0;
395 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
397 QRectF m_bounding_rect;
413 QSGDistanceFieldGlyphCache(
const QRawFont &font,
414 int renderTypeQuality);
415 virtual ~QSGDistanceFieldGlyphCache();
423 bool isNull()
const {
return width == 0 || height == 0; }
436 bool isNull()
const {
return width <= 0 || height <= 0; }
437 bool isValid()
const {
return width >= 0 && height >= 0; }
441 QRhiTexture *texture =
nullptr;
444 bool operator == (
const Texture &other)
const {
445 return texture == other.texture;
449 const QRawFont &referenceFont()
const {
return m_referenceFont; }
451 qreal fontScale(qreal pixelSize)
const
453 return pixelSize / baseFontSize();
455 qreal distanceFieldRadius()
const
457 return QT_DISTANCEFIELD_RADIUS(m_doubleGlyphResolution) / qreal(QT_DISTANCEFIELD_SCALE(m_doubleGlyphResolution));
459 int glyphCount()
const {
return m_glyphCount; }
460 bool doubleGlyphResolution()
const {
return m_doubleGlyphResolution; }
461 int renderTypeQuality()
const {
return m_renderTypeQuality; }
463 Metrics glyphMetrics(glyph_t glyph, qreal pixelSize);
464 inline TexCoord glyphTexCoord(glyph_t glyph);
465 inline const Texture *glyphTexture(glyph_t glyph);
467 void populate(
const QVector<glyph_t> &glyphs);
468 void release(
const QVector<glyph_t> &glyphs);
472 void registerGlyphNode(QSGDistanceFieldGlyphConsumer *node) { m_registeredNodes.insert(node); }
473 void unregisterGlyphNode(QSGDistanceFieldGlyphConsumer *node) { m_registeredNodes.remove(node); }
475 virtual void processPendingGlyphs();
477 virtual bool eightBitFormatIsAlphaSwizzled()
const = 0;
478 virtual bool screenSpaceDerivativesSupported()
const = 0;
479 virtual bool isActive()
const;
482 struct GlyphPosition {
488 Texture *texture =
nullptr;
497 virtual void requestGlyphs(
const QSet<glyph_t> &glyphs) = 0;
498 virtual void storeGlyphs(
const QList<QDistanceField> &glyphs) = 0;
499 virtual void referenceGlyphs(
const QSet<glyph_t> &glyphs) = 0;
500 virtual void releaseGlyphs(
const QSet<glyph_t> &glyphs) = 0;
502 void setGlyphsPosition(
const QList<GlyphPosition> &glyphs);
503 void setGlyphsTexture(
const QVector<glyph_t> &glyphs,
const Texture &tex);
504 void markGlyphsToRender(
const QVector<glyph_t> &glyphs);
505 inline void removeGlyph(glyph_t glyph);
507 void updateRhiTexture(QRhiTexture *oldTex, QRhiTexture *newTex,
const QSize &newTexSize);
509 inline bool containsGlyph(glyph_t glyph);
511 GlyphData &glyphData(glyph_t glyph);
512 GlyphData &emptyData(glyph_t glyph);
514 int baseFontSize()
const;
516#if defined(QSG_DISTANCEFIELD_CACHE_DEBUG)
517 virtual void saveTexture(QRhiTexture *texture,
const QString &nameBase)
const = 0;
520 bool m_doubleGlyphResolution;
521 int m_renderTypeQuality;
524 QRawFont m_referenceFont;
528 QList<Texture> m_textures;
529 QHash<glyph_t, GlyphData> m_glyphsData;
530 QDataBuffer<glyph_t> m_pendingGlyphs;
531 QSet<glyph_t> m_populatingGlyphs;
532 QSGDistanceFieldGlyphConsumerList m_registeredNodes;
534 static Texture s_emptyTexture;