59 virtual ~QSGNodeVisitorEx();
64 virtual bool visit(QSGTransformNode *) = 0;
65 virtual void endVisit(QSGTransformNode *) = 0;
66 virtual bool visit(QSGClipNode *) = 0;
67 virtual void endVisit(QSGClipNode *) = 0;
68 virtual bool visit(QSGGeometryNode *) = 0;
69 virtual void endVisit(QSGGeometryNode *) = 0;
70 virtual bool visit(QSGOpacityNode *) = 0;
71 virtual void endVisit(QSGOpacityNode *) = 0;
72 virtual bool visit(QSGInternalImageNode *) = 0;
73 virtual void endVisit(QSGInternalImageNode *) = 0;
74 virtual bool visit(QSGPainterNode *) = 0;
75 virtual void endVisit(QSGPainterNode *) = 0;
76 virtual bool visit(QSGInternalRectangleNode *) = 0;
77 virtual void endVisit(QSGInternalRectangleNode *) = 0;
78 virtual bool visit(QSGGlyphNode *) = 0;
79 virtual void endVisit(QSGGlyphNode *) = 0;
80 virtual bool visit(QSGRootNode *) = 0;
81 virtual void endVisit(QSGRootNode *) = 0;
82#if QT_CONFIG(quick_sprite)
83 virtual bool visit(QSGSpriteNode *) = 0;
84 virtual void endVisit(QSGSpriteNode *) = 0;
86 virtual bool visit(QSGRenderNode *) = 0;
87 virtual void endVisit(QSGRenderNode *) = 0;
89 void visitChildren(QSGNode *node);
105 ~QSGInternalRectangleNode() override;
107 virtual void setRect(
const QRectF &rect) = 0;
108 virtual void setColor(
const QColor &color) = 0;
109 virtual void setPenColor(
const QColor &color) = 0;
110 virtual void setPenWidth(qreal width) = 0;
111 virtual void setGradientStops(
const QGradientStops &stops) = 0;
112 virtual void setGradientVertical(
bool vertical) = 0;
113 virtual void setRadius(qreal radius) = 0;
114 virtual void setTopLeftRadius(qreal radius) = 0;
115 virtual void setTopRightRadius(qreal radius) = 0;
116 virtual void setBottomLeftRadius(qreal radius) = 0;
117 virtual void setBottomRightRadius(qreal radius) = 0;
118 virtual void resetTopLeftRadius() = 0;
119 virtual void resetTopRightRadius() = 0;
120 virtual void resetBottomLeftRadius() = 0;
121 virtual void resetBottomRightRadius() = 0;
122 virtual void setAntialiasing(
bool antialiasing) { Q_UNUSED(antialiasing); }
123 virtual void setAligned(
bool aligned) = 0;
125 virtual void update() = 0;
127 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
134 ~QSGInternalImageNode() override;
136 virtual void setTargetRect(
const QRectF &rect) = 0;
137 virtual void setInnerTargetRect(
const QRectF &rect) = 0;
138 virtual void setInnerSourceRect(
const QRectF &rect) = 0;
142 virtual void setSubSourceRect(
const QRectF &rect) = 0;
143 virtual void setTexture(QSGTexture *texture) = 0;
144 virtual void setAntialiasing(
bool antialiasing) { Q_UNUSED(antialiasing); }
145 virtual void setMirror(
bool horizontally,
bool vertically) = 0;
146 virtual void setMipmapFiltering(QSGTexture::Filtering filtering) = 0;
147 virtual void setFiltering(QSGTexture::Filtering filtering) = 0;
148 virtual void setHorizontalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
149 virtual void setVerticalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
151 virtual void update() = 0;
153 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
159 ~QSGPainterNode() override;
161 virtual void setPreferredRenderTarget(QQuickPaintedItem::RenderTarget target) = 0;
162 virtual void setSize(
const QSize &size) = 0;
163 virtual void setDirty(
const QRect &dirtyRect = QRect()) = 0;
164 virtual void setOpaquePainting(
bool opaque) = 0;
165 virtual void setLinearFiltering(
bool linearFiltering) = 0;
166 virtual void setMipmapping(
bool mipmapping) = 0;
167 virtual void setSmoothPainting(
bool s) = 0;
168 virtual void setFillColor(
const QColor &c) = 0;
169 virtual void setContentsScale(qreal s) = 0;
170 virtual void setFastFBOResizing(
bool dynamic) = 0;
171 virtual void setTextureSize(
const QSize &size) = 0;
173 virtual QImage toImage()
const = 0;
174 virtual void update() = 0;
175 virtual QSGTexture *texture()
const = 0;
177 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
180class Q_QUICK_EXPORT
QSGLayer :
public QSGDynamicTexture
184 ~QSGLayer() override;
191 virtual void setItem(QSGNode *item) = 0;
192 virtual void setRect(
const QRectF &logicalRect) = 0;
193 virtual void setSize(
const QSize &pixelSize) = 0;
194 virtual void scheduleUpdate() = 0;
195 virtual QImage toImage()
const = 0;
196 virtual void setLive(
bool live) = 0;
197 virtual void setRecursive(
bool recursive) = 0;
198 virtual void setFormat(Format format) = 0;
199 virtual void setHasMipmaps(
bool mipmap) = 0;
200 virtual void setDevicePixelRatio(qreal ratio) = 0;
201 virtual void setMirrorHorizontal(
bool mirror) = 0;
202 virtual void setMirrorVertical(
bool mirror) = 0;
203 virtual void setSamples(
int samples) = 0;
204 Q_SLOT
virtual void markDirtyTexture() = 0;
205 Q_SLOT
virtual void invalidated() = 0;
208 void updateRequested();
209 void scheduledUpdateCompleted();
212 QSGLayer(QSGTexturePrivate &dd);
243 ~QSGGuiThreadShaderEffectManager() override;
251 virtual bool hasSeparateSamplerAndTextureObjects()
const = 0;
253 virtual QString log()
const = 0;
254 virtual Status status()
const = 0;
268 VariableType type = Constant;
278 QList<Variable> variables;
286 virtual void prepareShaderCode(ShaderInfo::Type typeHint,
const QUrl &src, ShaderInfo *result) = 0;
289 void shaderCodePrepared(
bool ok, ShaderInfo::Type typeHint,
const QUrl &src, ShaderInfo *result);
290 void logAndStatusChanged();
302 ~QSGShaderEffectNode() override;
304 enum DirtyShaderFlag {
306 DirtyShaderConstant = 0x02,
307 DirtyShaderTexture = 0x04,
308 DirtyShaderGeometry = 0x08,
309 DirtyShaderMesh = 0x10,
311 DirtyShaderAll = 0xFF
313 Q_DECLARE_FLAGS(DirtyShaderFlags, DirtyShaderFlag)
321 struct VariableData {
322 enum SpecialType { None, Unused, Source, SubRect, Opacity, Matrix };
325 SpecialType specialType;
326 int propertyIndex = -1;
331 bool hasShaderCode =
false;
332 QSGGuiThreadShaderEffectManager::ShaderInfo shaderInfo;
333 QList<VariableData> varData;
337 DirtyShaderFlags dirty;
340 struct ShaderSyncData {
341 const ShaderData *shader;
342 const QSet<
int> *dirtyConstants;
343 const QSet<
int> *dirtyTextures;
345 ShaderSyncData vertex;
346 ShaderSyncData fragment;
347 void *materialTypeCacheKey;
353 virtual QRectF updateNormalizedTextureSubRect(
bool supportsAtlasTextures) = 0;
354 virtual void syncMaterial(SyncData *syncData) = 0;
356 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
359 void textureChanged();
365Q_QUICK_EXPORT QDebug operator<<(QDebug debug,
const QSGShaderEffectNode::VariableData &vd);
371 enum AntialiasingMode
373 DefaultAntialiasing = -1,
375 LowQualitySubPixelAntialiasing,
376 HighQualitySubPixelAntialiasing
380 ~QSGGlyphNode() override;
382 virtual void setGlyphs(
const QPointF &position,
const QGlyphRun &glyphs) = 0;
383 virtual void setColor(
const QColor &color) = 0;
384 virtual void setStyle(QQuickText::TextStyle style) = 0;
385 virtual void setStyleColor(
const QColor &color) = 0;
386 virtual QPointF baseLine()
const = 0;
388 virtual QRectF boundingRect()
const {
return m_bounding_rect; }
389 virtual void setBoundingRect(
const QRectF &bounds) { m_bounding_rect = bounds; }
391 virtual void setPreferredAntialiasingMode(AntialiasingMode) = 0;
392 virtual void setRenderTypeQuality(
int renderTypeQuality) { Q_UNUSED(renderTypeQuality) }
394 virtual void update() = 0;
396 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
398 QRectF m_bounding_rect;
414 QSGDistanceFieldGlyphCache(
const QRawFont &font,
415 int renderTypeQuality);
416 virtual ~QSGDistanceFieldGlyphCache();
424 bool isNull()
const {
return width == 0 || height == 0; }
437 bool isNull()
const {
return width <= 0 || height <= 0; }
438 bool isValid()
const {
return width >= 0 && height >= 0; }
442 QRhiTexture *texture =
nullptr;
445 bool operator == (
const Texture &other)
const {
446 return texture == other.texture;
450 const QRawFont &referenceFont()
const {
return m_referenceFont; }
452 qreal fontScale(qreal pixelSize)
const
454 return pixelSize / baseFontSize();
456 qreal distanceFieldRadius()
const
458 return QT_DISTANCEFIELD_RADIUS(m_doubleGlyphResolution) / qreal(QT_DISTANCEFIELD_SCALE(m_doubleGlyphResolution));
460 int glyphCount()
const {
return m_glyphCount; }
461 bool doubleGlyphResolution()
const {
return m_doubleGlyphResolution; }
462 int renderTypeQuality()
const {
return m_renderTypeQuality; }
464 Metrics glyphMetrics(glyph_t glyph, qreal pixelSize);
465 inline TexCoord glyphTexCoord(glyph_t glyph);
466 inline const Texture *glyphTexture(glyph_t glyph);
468 void populate(
const QList<glyph_t> &glyphs);
469 void release(
const QList<glyph_t> &glyphs);
473 void registerGlyphNode(QSGDistanceFieldGlyphConsumer *node) { m_registeredNodes.insert(node); }
474 void unregisterGlyphNode(QSGDistanceFieldGlyphConsumer *node) { m_registeredNodes.remove(node); }
476 virtual void processPendingGlyphs();
478 virtual bool eightBitFormatIsAlphaSwizzled()
const = 0;
479 virtual bool screenSpaceDerivativesSupported()
const = 0;
480 virtual bool isActive()
const;
483 struct GlyphPosition {
489 Texture *texture =
nullptr;
498 virtual void requestGlyphs(
const QSet<glyph_t> &glyphs) = 0;
499 virtual void storeGlyphs(
const QList<QDistanceField> &glyphs) = 0;
500 virtual void referenceGlyphs(
const QSet<glyph_t> &glyphs) = 0;
501 virtual void releaseGlyphs(
const QSet<glyph_t> &glyphs) = 0;
503 void setGlyphsPosition(
const QList<GlyphPosition> &glyphs);
504 void setGlyphsTexture(
const QList<glyph_t> &glyphs,
const Texture &tex);
505 void markGlyphsToRender(
const QList<glyph_t> &glyphs);
506 inline void removeGlyph(glyph_t glyph);
508 void updateRhiTexture(QRhiTexture *oldTex, QRhiTexture *newTex,
const QSize &newTexSize);
510 inline bool containsGlyph(glyph_t glyph);
512 GlyphData &glyphData(glyph_t glyph);
513 GlyphData &emptyData(glyph_t glyph);
515 int baseFontSize()
const;
517#if defined(QSG_DISTANCEFIELD_CACHE_DEBUG)
518 virtual void saveTexture(QRhiTexture *texture,
const QString &nameBase)
const = 0;
521 bool m_doubleGlyphResolution;
522 int m_renderTypeQuality;
525 QRawFont m_referenceFont;
529 QList<Texture> m_textures;
530 QHash<glyph_t, GlyphData> m_glyphsData;
531 QDataBuffer<glyph_t> m_pendingGlyphs;
532 QSet<glyph_t> m_populatingGlyphs;
533 QSGDistanceFieldGlyphConsumerList m_registeredNodes;
535 static Texture s_emptyTexture;