12 :
QSGLayer(*(
new QSGTexturePrivate(
this)))
14 , m_context(renderContext)
16 , m_device_pixel_ratio(1)
17 , m_mirrorHorizontal(
false)
18 , m_mirrorVertical(
true)
22 , m_dirtyTexture(
true)
27QSGSoftwareLayer::~QSGSoftwareLayer()
32qint64 QSGSoftwareLayer::comparisonKey()
const
37QSize QSGSoftwareLayer::textureSize()
const
39 return m_pixmap.size();
42bool QSGSoftwareLayer::hasAlphaChannel()
const
44 return m_pixmap.hasAlphaChannel();
47bool QSGSoftwareLayer::hasMipmaps()
const
52bool QSGSoftwareLayer::updateTexture()
54 bool doGrab = (m_live || m_grab) && m_dirtyTexture;
58 emit scheduledUpdateCompleted();
63void QSGSoftwareLayer::setItem(QSGNode *item)
69 if (m_live && !m_item)
75void QSGSoftwareLayer::setRect(
const QRectF &rect)
83void QSGSoftwareLayer::setSize(
const QSize &size)
89 if (m_live && m_size.isNull())
95void QSGSoftwareLayer::scheduleUpdate()
100 if (m_dirtyTexture) {
101 emit updateRequested();
105QImage QSGSoftwareLayer::toImage()
const
107 return m_pixmap.toImage();
110void QSGSoftwareLayer::setLive(
bool live)
116 if (m_live && (!m_item || m_size.isNull()))
117 m_pixmap = QPixmap();
122void QSGSoftwareLayer::setRecursive(
bool recursive)
124 m_recursive = recursive;
127void QSGSoftwareLayer::setFormat(Format)
131void QSGSoftwareLayer::setHasMipmaps(
bool)
135void QSGSoftwareLayer::setDevicePixelRatio(qreal ratio)
137 m_device_pixel_ratio = ratio;
140void QSGSoftwareLayer::setMirrorHorizontal(
bool mirror)
142 if (m_mirrorHorizontal == mirror)
144 m_mirrorHorizontal = mirror;
148void QSGSoftwareLayer::setMirrorVertical(
bool mirror)
150 if (m_mirrorVertical == mirror)
152 m_mirrorVertical = mirror;
156void QSGSoftwareLayer::markDirtyTexture()
158 m_dirtyTexture =
true;
159 if (m_live || m_grab) {
160 emit updateRequested();
164void QSGSoftwareLayer::invalidated()
167 m_renderer =
nullptr;
170void QSGSoftwareLayer::grab()
172 if (!m_item || m_size.isNull()) {
173 m_pixmap = QPixmap();
174 m_dirtyTexture =
false;
177 QSGNode *root = m_item;
178 while (root->firstChild() && root->type() != QSGNode::RootNodeType)
179 root = root->firstChild();
180 if (root->type() != QSGNode::RootNodeType)
184 m_renderer =
new QSGSoftwarePixmapRenderer(m_context);
185 connect(m_renderer, SIGNAL(sceneGraphChanged()),
this, SLOT(markDirtyTexture()));
187 m_renderer->setDevicePixelRatio(m_device_pixel_ratio);
188 m_renderer->setRootNode(
static_cast<QSGRootNode *>(root));
190 if (m_pixmap.size() != m_size) {
191 m_pixmap = QPixmap(m_size);
192 m_pixmap.setDevicePixelRatio(m_device_pixel_ratio);
196 root->markDirty(QSGNode::DirtyForceUpdate);
197 m_renderer->nodeChanged(root, QSGNode::DirtyForceUpdate);
199 m_dirtyTexture =
false;
201 m_renderer->setDeviceRect(m_size);
202 m_renderer->setViewportRect(m_size);
203 QRect mirrored(m_mirrorHorizontal ? m_rect.right() * m_device_pixel_ratio : m_rect.left() * m_device_pixel_ratio,
204 m_mirrorVertical ? m_rect.bottom() * m_device_pixel_ratio : m_rect.top() * m_device_pixel_ratio,
205 m_mirrorHorizontal ? -m_rect.width() * m_device_pixel_ratio : m_rect.width() * m_device_pixel_ratio,
206 m_mirrorVertical ? -m_rect.height() * m_device_pixel_ratio : m_rect.height() * m_device_pixel_ratio);
207 m_renderer->setProjectionRect(mirrored);
208 m_renderer->setClearColor(Qt::transparent);
211 m_renderer->render(&m_pixmap);
213 root->markDirty(QSGNode::DirtyForceUpdate);
221#include "moc_qsgsoftwarelayer_p.cpp"
void renderScene() final
Renders the scene.