void QWindowCompositor::paintChildren(QWaylandSurface *surface, QWaylandSurface *window, const QSize &windowSize) { if (surface->subSurfaces().size() == 0) return; QLinkedListIterator<QWaylandSurface *> i(surface->subSurfaces()); while (i.hasNext()) { QWaylandSurface *subSurface = i.next(); QPointF p = subSurface->mapTo(window,QPointF(0,0)); QSize subSize = subSurface->size(); subSurface->advanceBufferQueue(); if (subSize.isValid()) { GLuint texture = 0; if (subSurface->type() == QWaylandSurface::Texture) { texture = subSurface->texture(QOpenGLContext::currentContext()); } else if (surface->type() == QWaylandSurface::Shm ) { texture = m_textureCache->bindTexture(QOpenGLContext::currentContext(),surface->image()); } QRect geo(p.toPoint(),subSize); if (texture > 0) m_textureBlitter->drawTexture(texture,geo,windowSize,0,window->isYInverted(),subSurface->isYInverted()); if (surface->type() == QWaylandSurface::Shm) glDeleteTextures(1, &texture); } paintChildren(subSurface,window,windowSize); } }
void QtwaylandSurfaceNode::paintChildren(QWaylandSurface *surface, QWaylandSurface *window, OpenGLData *glData) { if (surface->subSurfaces().size() == 0) return; QLinkedListIterator<QWaylandSurface *> i(surface->subSurfaces()); while (i.hasNext()) { QWaylandSurface *subSurface = i.next(); QPointF p = subSurface->mapTo(window,QPointF(0,0)); if (subSurface->size().isValid()) { GLuint texture = 0; if (subSurface->type() == QWaylandSurface::Texture) { texture = subSurface->texture(QOpenGLContext::currentContext()); } else if (surface->type() == QWaylandSurface::Shm ) { texture = glData->m_textureCache->bindTexture(QOpenGLContext::currentContext(),surface->image()); } QRect geo(p.toPoint(),subSurface->size()); glData->m_textureBlitter->drawTexture(texture,geo,window->size(),0,window->isYInverted(),subSurface->isYInverted()); } paintChildren(subSurface,window, glData); } }