bool SurfaceBuffer::isYInverted() const { bool ret = false; static bool negateReturn = qgetenv("QT_COMPOSITOR_NEGATE_INVERTED_Y").toInt(); ClientBufferIntegration *clientBufferIntegration = m_compositor->clientBufferIntegration(); #ifdef QT_COMPOSITOR_WAYLAND_GL if (clientBufferIntegration && waylandBufferHandle() && !isShmBuffer()) { ret = clientBufferIntegration->isYInverted(waylandBufferHandle()); } else #endif ret = true; return ret != negateReturn; }
QSize SurfaceBuffer::size() const { if (!m_isSizeResolved) { if (isShmBuffer()) { m_size = QSize(wl_shm_buffer_get_width(m_shmBuffer), wl_shm_buffer_get_height(m_shmBuffer)); #ifdef QT_COMPOSITOR_WAYLAND_GL } else { QWaylandClientBufferIntegration *hwIntegration = m_compositor->clientBufferIntegration(); m_size = hwIntegration->bufferSize(m_buffer); #endif } } return m_size; }
QImage SurfaceBuffer::image() { /* This api may be available on non-shm buffer. But be sure about it's format. */ if (!m_buffer || !isShmBuffer()) return QImage(); if (m_image.isNull()) { const uchar *data = static_cast<const uchar *>(wl_shm_buffer_get_data(m_shmBuffer)); int stride = wl_shm_buffer_get_stride(m_shmBuffer); int width = wl_shm_buffer_get_width(m_shmBuffer); int height = wl_shm_buffer_get_height(m_shmBuffer); m_image = QImage(data, width, height, stride, QImage::Format_ARGB32_Premultiplied); } return m_image; }
QImage SurfaceBuffer::image() { /* This api may be available on non-shm buffer. But be sure about it's format. */ if (!m_buffer || !isShmBuffer()) return QImage(); if (m_image.isNull()) { const uchar *data = static_cast<const uchar *>(wl_shm_buffer_get_data(m_shmBuffer)); int stride = wl_shm_buffer_get_stride(m_shmBuffer); int width = wl_shm_buffer_get_width(m_shmBuffer); int height = wl_shm_buffer_get_height(m_shmBuffer); QImage::Format format = QWaylandShmFormatHelper::fromWaylandShmFormat(wl_shm_format(wl_shm_buffer_get_format(m_shmBuffer))); m_image = QImage(data, width, height, stride, format); } return m_image; }
void *SurfaceBuffer::handle() const { if (!m_buffer) return 0; if (!m_handle) { SurfaceBuffer *that = const_cast<SurfaceBuffer *>(this); if (isShmBuffer()) { const uchar *data = static_cast<const uchar *>(wl_shm_buffer_get_data(m_shmBuffer)); int stride = wl_shm_buffer_get_stride(m_shmBuffer); int width = wl_shm_buffer_get_width(m_shmBuffer); int height = wl_shm_buffer_get_height(m_shmBuffer); QImage *image = new QImage(data,width,height,stride, QImage::Format_ARGB32_Premultiplied); that->m_handle = image; #ifdef QT_COMPOSITOR_WAYLAND_GL } else { QWaylandClientBufferIntegration *clientBufferIntegration = m_compositor->clientBufferIntegration(); that->m_handle = clientBufferIntegration->lockNativeBuffer(m_buffer, 0); #endif } } return m_handle; }