11 :
QSGLayer(*(
new QSGTexturePrivate(
this)))
14 , m_device_pixel_ratio(1)
15 , m_mirrorHorizontal(
false)
16 , m_mirrorVertical(
false)
20 , m_dirtyTexture(
true)
21 , m_offscreenSurface(
nullptr)
22 , m_secondaryOffscreenSurface(
nullptr)
24 m_context =
static_cast<QSGOpenVGRenderContext*>(renderContext);
34 if (m_offscreenSurface)
35 return static_cast<
int>(m_offscreenSurface->image());
42 if (m_offscreenSurface) {
43 return m_offscreenSurface->size();
61 bool doGrab = (m_live || m_grab) && m_dirtyTexture;
65 emit scheduledUpdateCompleted();
76 if (m_live && !m_item) {
77 delete m_offscreenSurface;
78 delete m_secondaryOffscreenSurface;
79 m_offscreenSurface =
nullptr;
80 m_secondaryOffscreenSurface =
nullptr;
100 if (m_live && m_size.isNull()) {
101 delete m_offscreenSurface;
102 delete m_secondaryOffscreenSurface;
103 m_offscreenSurface =
nullptr;
104 m_secondaryOffscreenSurface =
nullptr;
115 if (m_dirtyTexture) {
116 emit updateRequested();
122 return m_offscreenSurface->readbackQImage();
131 if (m_live && (!m_item || m_size.isNull())) {
132 delete m_offscreenSurface;
133 delete m_secondaryOffscreenSurface;
134 m_offscreenSurface =
nullptr;
135 m_secondaryOffscreenSurface =
nullptr;
143 m_recursive = recursive;
158 m_device_pixel_ratio = ratio;
163 if (m_mirrorHorizontal == mirror)
165 m_mirrorHorizontal = mirror;
171 if (m_mirrorVertical == mirror)
173 m_mirrorVertical = mirror;
179 m_dirtyTexture =
true;
180 if (m_live || m_grab) {
181 emit updateRequested();
187 delete m_offscreenSurface;
188 delete m_secondaryOffscreenSurface;
190 m_renderer =
nullptr;
191 m_offscreenSurface =
nullptr;
192 m_secondaryOffscreenSurface =
nullptr;
197 if (!m_item || m_size.isNull()) {
198 delete m_offscreenSurface;
199 delete m_secondaryOffscreenSurface;
200 m_offscreenSurface =
nullptr;
201 m_secondaryOffscreenSurface =
nullptr;
202 m_dirtyTexture =
false;
205 QSGNode *root = m_item;
206 while (root->firstChild() && root->type() != QSGNode::RootNodeType)
207 root = root->firstChild();
208 if (root->type() != QSGNode::RootNodeType)
212 m_renderer =
new QSGOpenVGRenderer(m_context);
213 connect(m_renderer, SIGNAL(sceneGraphChanged()),
this, SLOT(markDirtyTexture()));
215 m_renderer->setDevicePixelRatio(m_device_pixel_ratio);
216 m_renderer->setRootNode(
static_cast<QSGRootNode *>(root));
218 bool deleteOffscreenSurfaceLater =
false;
219 if (m_offscreenSurface ==
nullptr || m_offscreenSurface->size() != m_size ) {
221 deleteOffscreenSurfaceLater =
true;
222 delete m_secondaryOffscreenSurface;
223 m_secondaryOffscreenSurface =
new QOpenVGOffscreenSurface(m_size);
225 delete m_offscreenSurface;
226 delete m_secondaryOffscreenSurface;
227 m_offscreenSurface =
new QOpenVGOffscreenSurface(m_size);
228 m_secondaryOffscreenSurface =
nullptr;
232 if (m_recursive && !m_secondaryOffscreenSurface)
233 m_secondaryOffscreenSurface =
new QOpenVGOffscreenSurface(m_size);
236 root->markDirty(QSGNode::DirtyForceUpdate);
237 m_renderer->nodeChanged(root, QSGNode::DirtyForceUpdate);
239 m_dirtyTexture =
false;
241 m_renderer->setDeviceRect(m_size);
242 m_renderer->setViewportRect(m_size);
243 QRect mirrored(m_mirrorHorizontal ? m_rect.right() * m_device_pixel_ratio : m_rect.left() * m_device_pixel_ratio,
244 m_mirrorVertical ? m_rect.top() * m_device_pixel_ratio : m_rect.bottom() * m_device_pixel_ratio,
245 m_mirrorHorizontal ? -m_rect.width() * m_device_pixel_ratio : m_rect.width() * m_device_pixel_ratio,
246 m_mirrorVertical ? m_rect.height() * m_device_pixel_ratio : -m_rect.height() * m_device_pixel_ratio);
247 m_renderer->setProjectionMatrixToRect(mirrored);
248 m_renderer->setClearColor(Qt::transparent);
256 m_renderer->renderScene();
260 if (deleteOffscreenSurfaceLater) {
261 delete m_offscreenSurface;
262 m_offscreenSurface =
new QOpenVGOffscreenSurface(m_size);
265 qSwap(m_offscreenSurface, m_secondaryOffscreenSurface);
270 root->markDirty(QSGNode::DirtyForceUpdate);
void setDevicePixelRatio(qreal ratio) override
void setLive(bool live) override
bool hasMipmaps() const override
Returns true if the texture data contains mipmap levels.
QImage toImage() const override
void setMirrorVertical(bool mirror) override
bool updateTexture() override
Call this function to explicitly update the dynamic texture.
void invalidated() override
void setRecursive(bool recursive) override
void setFormat(uint format) override
void setRect(const QRectF &rect) override
QSize textureSize() const override
Returns the size of the texture in pixels.
void scheduleUpdate() override
void setMirrorHorizontal(bool mirror) override
void setItem(QSGNode *item) override
bool hasAlphaChannel() const override
Returns true if the texture data contains an alpha channel.
void setHasMipmaps(bool mipmap) override
qint64 comparisonKey() const override
Returns a key suitable for comparing textures.
void setSize(const QSize &size) override