11#include <QtCore/QLoggingCategory>
12#include <QtGui/QWindow>
13#include <QtQuick/QSGSimpleRectNode>
26 addNodeMapping(m_background, backgroundRenderable);
41 return m_nodes.
value(node,
nullptr);
47 return m_renderableNodes;
57 m_renderableNodes.append(node);
63 nodeGeometryUpdated(node);
66 nodeMaterialUpdated(node);
69 nodeMatrixUpdated(node);
78 nodeOpacityUpdated(node);
93 if (m_renderableNodes.isEmpty())
96 auto iterator = m_renderableNodes.begin();
98 auto backgroundNode = *iterator;
99 dirtyRegion += backgroundNode->renderNode(
painter,
true);
102 for (; iterator != m_renderableNodes.end(); ++iterator) {
103 auto node = *iterator;
104 dirtyRegion += node->renderNode(
painter);
113 m_renderableNodes.clear();
124 for (
auto i = m_renderableNodes.rbegin();
i != m_renderableNodes.rend(); ++
i) {
126 if (!m_dirtyRegion.
isEmpty()) {
128 node->addDirtyRegion(m_dirtyRegion,
true);
131 if (!m_obscuredRegion.
isEmpty()) {
133 node->subtractDirtyRegion(m_obscuredRegion);
137 if (node->isOpaque()) {
138 m_obscuredRegion += node->boundingRectMin();
141 if (node->isDirty()) {
143 if (!m_background->
rect().
toRect().contains(node->boundingRectMax(),
true)) {
147 if (!outsideRegions.isEmpty())
148 node->subtractDirtyRegion(outsideRegions);
152 if (node->isOpaque()) {
154 m_dirtyRegion -= node->boundingRectMin();
157 m_dirtyRegion += node->dirtyRegion();
160 QRegion prevDirty = node->previousDirtyRegion();
161 if (!prevDirty.isNull())
162 m_dirtyRegion += prevDirty;
178 for (
auto j = m_renderableNodes.begin();
j != m_renderableNodes.end(); ++
j) {
181 if ((!node->isOpaque() || node->boundingRectMax() != node->boundingRectMin()) && !m_dirtyRegion.
isEmpty()) {
187 node->addDirtyRegion(m_dirtyRegion,
true);
190 m_dirtyRegion += node->dirtyRegion();
193 QRegion updateRegion = m_dirtyRegion;
223 return m_background->
color();
231void QSGAbstractSoftwareRenderer::nodeAdded(
QSGNode *node)
233 qCDebug(lc2DRender,
"nodeAdded %p", (
void*)node);
238void QSGAbstractSoftwareRenderer::nodeRemoved(
QSGNode *node)
240 qCDebug(lc2DRender,
"nodeRemoved %p", (
void*)node);
244 if (renderable !=
nullptr) {
246 QRegion dirtyRegion = renderable->previousDirtyRegion(
true);
248 dirtyRegion = renderable->boundingRectMax();
249 m_dirtyRegion += dirtyRegion;
262void QSGAbstractSoftwareRenderer::nodeGeometryUpdated(
QSGNode *node)
264 qCDebug(lc2DRender,
"nodeGeometryUpdated");
268 if (renderable !=
nullptr) {
269 renderable->markGeometryDirty();
275void QSGAbstractSoftwareRenderer::nodeMaterialUpdated(
QSGNode *node)
277 qCDebug(lc2DRender,
"nodeMaterialUpdated");
281 if (renderable !=
nullptr) {
282 renderable->markMaterialDirty();
288void QSGAbstractSoftwareRenderer::nodeMatrixUpdated(
QSGNode *node)
290 qCDebug(lc2DRender,
"nodeMaterialUpdated");
296void QSGAbstractSoftwareRenderer::nodeOpacityUpdated(
QSGNode *node)
298 qCDebug(lc2DRender,
"nodeOpacityUpdated");
The QColor class provides colors based on RGB, HSV or CMYK values.
bool remove(const Key &key)
Removes the item that has the key from the hash.
T value(const Key &key) const noexcept
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
The QPainter class performs low-level painting on widgets and other paint devices.
QRect toAlignedRect() const noexcept
constexpr QRect toRect() const noexcept
Returns a QRect based on the values of this rectangle.
\inmodule QtCore\reentrant
The QRegion class specifies a clip region for a painter.
bool contains(const QPoint &p) const
Returns true if the region contains the point p; otherwise returns false.
bool isEmpty() const
Returns true if the region is empty; otherwise returns false.
QRegion subtracted(const QRegion &r) const
QSGRootNode * rootNode() const
Returns the root of the QSGNode scene.
const QVector< QSGSoftwareRenderableNode * > & renderableNodes() const
void addNodeMapping(QSGNode *node, QSGSoftwareRenderableNode *renderableNode)
QRegion renderNodes(QPainter *painter)
void appendRenderableNode(QSGSoftwareRenderableNode *node)
void setBackgroundColor(const QColor &color)
QSGSoftwareRenderableNode * renderableNode(QSGNode *node) const
void nodeChanged(QSGNode *node, QSGNode::DirtyState state) override
void setBackgroundRect(const QRect &rect, qreal devicePixelRatio)
virtual ~QSGAbstractSoftwareRenderer()
QRegion optimizeRenderList()
void visitChildren(QSGNode *node)
\group qtquick-scenegraph-nodes \title Qt Quick Scene Graph Node classes
QSGNode * firstChild() const
Returns the first child of this node.
The renderer class is the abstract baseclass used for rendering the QML scene graph.
void nodeChanged(QSGNode *node, QSGNode::DirtyState state) override
Updates internal data structures and emits the sceneGraphChanged() signal.
qreal devicePixelRatio() const
The QSGSimpleRectNode class is a convenience class for drawing solid filled rectangles using scenegra...
QRectF rect() const
Returns the rectangle that this rect node covers.
void setColor(const QColor &color)
Sets the color of this rectangle to color.
void setRect(const QRectF &rect)
Sets the rectangle of this rect node to rect.
QColor color() const
Returns the color of this rectangle.
void updateNodes(QSGNode *node, bool isNodeRemoved=false)
qDeleteAll(list.begin(), list.end())
Combined button and popup list for selecting options.
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)