60 virtual ~QSGNodeVisitorEx();
65 virtual bool visit(QSGTransformNode *) = 0;
66 virtual void endVisit(QSGTransformNode *) = 0;
67 virtual bool visit(QSGClipNode *) = 0;
68 virtual void endVisit(QSGClipNode *) = 0;
69 virtual bool visit(QSGGeometryNode *) = 0;
70 virtual void endVisit(QSGGeometryNode *) = 0;
71 virtual bool visit(QSGOpacityNode *) = 0;
72 virtual void endVisit(QSGOpacityNode *) = 0;
73 virtual bool visit(QSGInternalImageNode *) = 0;
74 virtual void endVisit(QSGInternalImageNode *) = 0;
75 virtual bool visit(QSGPainterNode *) = 0;
76 virtual void endVisit(QSGPainterNode *) = 0;
77 virtual bool visit(QSGInternalRectangleNode *) = 0;
78 virtual void endVisit(QSGInternalRectangleNode *) = 0;
79 virtual bool visit(QSGGlyphNode *) = 0;
80 virtual void endVisit(QSGGlyphNode *) = 0;
81 virtual bool visit(QSGRootNode *) = 0;
82 virtual void endVisit(QSGRootNode *) = 0;
83#if QT_CONFIG(quick_sprite)
84 virtual bool visit(QSGSpriteNode *) = 0;
85 virtual void endVisit(QSGSpriteNode *) = 0;
87 virtual bool visit(QSGRenderNode *) = 0;
88 virtual void endVisit(QSGRenderNode *) = 0;
90 void visitChildren(QSGNode *node);
106 ~QSGInternalRectangleNode() override;
108 virtual void setRect(
const QRectF &rect) = 0;
109 virtual void setColor(
const QColor &color) = 0;
110 virtual void setPenColor(
const QColor &color) = 0;
111 virtual void setPenWidth(qreal width) = 0;
112 virtual void setGradientStops(
const QGradientStops &stops) = 0;
113 virtual void setGradientVertical(
bool vertical) = 0;
114 virtual void setRadius(qreal radius) = 0;
115 virtual void setTopLeftRadius(qreal radius) = 0;
116 virtual void setTopRightRadius(qreal radius) = 0;
117 virtual void setBottomLeftRadius(qreal radius) = 0;
118 virtual void setBottomRightRadius(qreal radius) = 0;
119 virtual void resetTopLeftRadius() = 0;
120 virtual void resetTopRightRadius() = 0;
121 virtual void resetBottomLeftRadius() = 0;
122 virtual void resetBottomRightRadius() = 0;
123 virtual void setAntialiasing(
bool antialiasing) { Q_UNUSED(antialiasing); }
124 virtual void setAligned(
bool aligned) = 0;
126 virtual void update() = 0;
128 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
135 ~QSGInternalImageNode() override;
137 virtual void setTargetRect(
const QRectF &rect) = 0;
138 virtual void setInnerTargetRect(
const QRectF &rect) = 0;
139 virtual void setInnerSourceRect(
const QRectF &rect) = 0;
143 virtual void setSubSourceRect(
const QRectF &rect) = 0;
144 virtual void setTexture(QSGTexture *texture) = 0;
145 virtual void setAntialiasing(
bool antialiasing) { Q_UNUSED(antialiasing); }
146 virtual void setMirror(
bool horizontally,
bool vertically) = 0;
147 virtual void setMipmapFiltering(QSGTexture::Filtering filtering) = 0;
148 virtual void setFiltering(QSGTexture::Filtering filtering) = 0;
149 virtual void setHorizontalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
150 virtual void setVerticalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
152 virtual void update() = 0;
154 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
160 ~QSGPainterNode() override;
162 virtual void setPreferredRenderTarget(QQuickPaintedItem::RenderTarget target) = 0;
163 virtual void setSize(
const QSize &size) = 0;
164 virtual void setDirty(
const QRect &dirtyRect = QRect()) = 0;
165 virtual void setOpaquePainting(
bool opaque) = 0;
166 virtual void setLinearFiltering(
bool linearFiltering) = 0;
167 virtual void setMipmapping(
bool mipmapping) = 0;
168 virtual void setSmoothPainting(
bool s) = 0;
169 virtual void setFillColor(
const QColor &c) = 0;
170 virtual void setContentsScale(qreal s) = 0;
171 virtual void setFastFBOResizing(
bool dynamic) = 0;
172 virtual void setTextureSize(
const QSize &size) = 0;
174 virtual QImage toImage()
const = 0;
175 virtual void update() = 0;
176 virtual QSGTexture *texture()
const = 0;
178 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
181class Q_QUICK_EXPORT
QSGLayer :
public QSGDynamicTexture
185 ~QSGLayer() override;
192 virtual void setItem(QSGNode *item) = 0;
193 virtual void setRect(
const QRectF &logicalRect) = 0;
194 virtual void setSize(
const QSize &pixelSize) = 0;
195 virtual void scheduleUpdate() = 0;
196 virtual QImage toImage()
const = 0;
197 virtual void setLive(
bool live) = 0;
198 virtual void setRecursive(
bool recursive) = 0;
199 virtual void setFormat(Format format) = 0;
200 virtual void setHasMipmaps(
bool mipmap) = 0;
201 virtual void setDevicePixelRatio(qreal ratio) = 0;
202 virtual void setMirrorHorizontal(
bool mirror) = 0;
203 virtual void setMirrorVertical(
bool mirror) = 0;
204 virtual void setSamples(
int samples) = 0;
205 Q_SLOT
virtual void markDirtyTexture() = 0;
206 Q_SLOT
virtual void invalidated() = 0;
209 void updateRequested();
210 void scheduledUpdateCompleted();
213 QSGLayer(QSGTexturePrivate &dd);
244 ~QSGGuiThreadShaderEffectManager() override;
252 virtual bool hasSeparateSamplerAndTextureObjects()
const = 0;
254 virtual QString log()
const = 0;
255 virtual Status status()
const = 0;
269 VariableType type = Constant;
279 QList<Variable> variables;
287 virtual void prepareShaderCode(ShaderInfo::Type typeHint,
const QUrl &src, ShaderInfo *result) = 0;
290 void shaderCodePrepared(
bool ok, ShaderInfo::Type typeHint,
const QUrl &src, ShaderInfo *result);
291 void logAndStatusChanged();
303 ~QSGShaderEffectNode() override;
305 enum DirtyShaderFlag {
307 DirtyShaderConstant = 0x02,
308 DirtyShaderTexture = 0x04,
309 DirtyShaderGeometry = 0x08,
310 DirtyShaderMesh = 0x10,
312 DirtyShaderAll = 0xFF
314 Q_DECLARE_FLAGS(DirtyShaderFlags, DirtyShaderFlag)
322 struct VariableData {
323 enum SpecialType { None, Unused, Source, SubRect, Opacity, Matrix };
326 SpecialType specialType;
327 int propertyIndex = -1;
332 bool hasShaderCode =
false;
333 QSGGuiThreadShaderEffectManager::ShaderInfo shaderInfo;
334 QList<VariableData> varData;
338 DirtyShaderFlags dirty;
341 struct ShaderSyncData {
342 const ShaderData *shader;
343 const QSet<
int> *dirtyConstants;
344 const QSet<
int> *dirtyTextures;
346 ShaderSyncData vertex;
347 ShaderSyncData fragment;
348 void *materialTypeCacheKey;
354 virtual QRectF updateNormalizedTextureSubRect(
bool supportsAtlasTextures) = 0;
355 virtual void syncMaterial(SyncData *syncData) = 0;
357 void accept(QSGNodeVisitorEx *visitor) override {
if (visitor->visit(
this)) visitor->visitChildren(
this); visitor->endVisit(
this); }
360 void textureChanged();
366Q_QUICK_EXPORT QDebug operator<<(QDebug debug,
const QSGShaderEffectNode::VariableData &vd);
372 enum AntialiasingMode
374 DefaultAntialiasing = -1,
376 LowQualitySubPixelAntialiasing,
377 HighQualitySubPixelAntialiasing
380 QSGGlyphNode(QSGTextNode::RenderType renderType) : m_renderType(renderType) {}
381 ~QSGGlyphNode() override;
383 virtual void setGlyphs(
const QPointF &position,
const QGlyphRun &glyphs) = 0;
384 virtual void setColor(
const QColor &color) = 0;
385 virtual void setStyle(QQuickText::TextStyle style) = 0;
386 virtual void setStyleColor(
const QColor &color) = 0;
387 virtual QPointF baseLine()
const = 0;
389 virtual QRectF boundingRect()
const {
return m_bounding_rect; }
390 virtual void setBoundingRect(
const QRectF &bounds) { m_bounding_rect = bounds; }
392 virtual void setPreferredAntialiasingMode(AntialiasingMode) = 0;
393 virtual void setRenderTypeQuality(
int renderTypeQuality) { Q_UNUSED(renderTypeQuality) }
395 QSGTextNode::RenderType renderType()
const {
return m_renderType; }
397 virtual void recycle();
399 virtual void update() = 0;
401 void accept(QSGNodeVisitorEx *visitor) override { visitor->visit(
this); visitor->endVisit(
this); }
403 QRectF m_bounding_rect;
404 QSGTextNode::RenderType m_renderType;
420 QSGDistanceFieldGlyphCache(
const QRawFont &font,
421 int renderTypeQuality);
422 virtual ~QSGDistanceFieldGlyphCache();
430 bool isNull()
const {
return width == 0 || height == 0; }
443 bool isNull()
const {
return width <= 0 || height <= 0; }
444 bool isValid()
const {
return width >= 0 && height >= 0; }
448 QRhiTexture *texture =
nullptr;
451 bool operator == (
const Texture &other)
const {
452 return texture == other.texture;
456 const QRawFont &referenceFont()
const {
return m_referenceFont; }
458 qreal fontScale(qreal pixelSize)
const
460 return pixelSize / baseFontSize();
462 qreal distanceFieldRadius()
const
464 return QT_DISTANCEFIELD_RADIUS(m_doubleGlyphResolution) / qreal(QT_DISTANCEFIELD_SCALE(m_doubleGlyphResolution));
466 int glyphCount()
const {
return m_glyphCount; }
467 bool doubleGlyphResolution()
const {
return m_doubleGlyphResolution; }
468 int renderTypeQuality()
const {
return m_renderTypeQuality; }
470 Metrics glyphMetrics(glyph_t glyph, qreal pixelSize);
471 inline TexCoord glyphTexCoord(glyph_t glyph);
472 inline const Texture *glyphTexture(glyph_t glyph);
474 void populate(
const QList<glyph_t> &glyphs);
475 void release(
const QList<glyph_t> &glyphs);
479 void registerGlyphNode(QSGDistanceFieldGlyphConsumer *node) { m_registeredNodes.insert(node); }
480 void unregisterGlyphNode(QSGDistanceFieldGlyphConsumer *node) { m_registeredNodes.remove(node); }
482 virtual void processPendingGlyphs();
484 virtual bool eightBitFormatIsAlphaSwizzled()
const = 0;
485 virtual bool screenSpaceDerivativesSupported()
const = 0;
486 virtual bool isActive()
const;
489 struct GlyphPosition {
495 Texture *texture =
nullptr;
504 virtual void requestGlyphs(
const QSet<glyph_t> &glyphs) = 0;
505 virtual void storeGlyphs(
const QList<QDistanceField> &glyphs) = 0;
506 virtual void referenceGlyphs(
const QSet<glyph_t> &glyphs) = 0;
507 virtual void releaseGlyphs(
const QSet<glyph_t> &glyphs) = 0;
509 void setGlyphsPosition(
const QList<GlyphPosition> &glyphs);
510 void setGlyphsTexture(
const QList<glyph_t> &glyphs,
const Texture &tex);
511 void markGlyphsToRender(
const QList<glyph_t> &glyphs);
512 inline void removeGlyph(glyph_t glyph);
514 void updateRhiTexture(QRhiTexture *oldTex, QRhiTexture *newTex,
const QSize &newTexSize);
516 inline bool containsGlyph(glyph_t glyph);
518 GlyphData &glyphData(glyph_t glyph);
519 GlyphData &emptyData(glyph_t glyph);
521 int baseFontSize()
const;
523#if defined(QSG_DISTANCEFIELD_CACHE_DEBUG)
524 virtual void saveTexture(QRhiTexture *texture,
const QString &nameBase)
const = 0;
527 bool m_doubleGlyphResolution;
528 int m_renderTypeQuality;
531 QRawFont m_referenceFont;
535 QList<Texture> m_textures;
536 QHash<glyph_t, GlyphData> m_glyphsData;
537 QDataBuffer<glyph_t> m_pendingGlyphs;
538 QSet<glyph_t> m_populatingGlyphs;
539 QSGDistanceFieldGlyphConsumerList m_registeredNodes;
541 static Texture s_emptyTexture;