4172
4172
QImage QQuickContext2D::toImage(const QRectF& bounds)
4175
if (m_texture->thread() == QThread::currentThread())
4176
m_texture->grabImage(bounds);
4177
else if (m_renderStrategy == QQuickCanvasItem::Cooperative) {
4174
if (m_texture->thread() == QThread::currentThread()) {
4175
// if we're either not rendering to an fbo or we have a separate opengl context we can just
4176
// flush. Otherwise we have to make sure the shared opengl context is current before we do
4177
// so. It may or may not be current already, depending on how this method is called.
4178
if (m_renderTarget != QQuickCanvasItem::FramebufferObject || m_glContext) {
4180
m_texture->grabImage(bounds);
4182
QQuickWindow *window = m_canvas->window();
4183
QOpenGLContext *ctx = window ? window->openglContext() : 0;
4184
if (ctx && ctx->isValid()) {
4185
if (ctx == QOpenGLContext::currentContext()) {
4188
ctx->makeCurrent(window);
4192
m_texture->grabImage(bounds);
4194
qWarning() << "Cannot read pixels from canvas before opengl context is valid";
4198
} else if (m_renderStrategy == QQuickCanvasItem::Cooperative) {
4178
4199
qWarning() << "Pixel readback is not supported in Cooperative mode, please try Threaded or Immediate mode";
4179
4200
return QImage();
4181
4203
QCoreApplication::postEvent(m_texture, new QEvent(QEvent::Type(QEvent::User + 10)));
4182
4204
QMetaObject::invokeMethod(m_texture,