GraphicsBufferView provides a way to map the contents of a graphics buffer as an image.remotes/origin/work/zzag/cursor-shape-v1
parent
592948e5ab
commit
f1d6366d4a
5 changed files with 136 additions and 0 deletions
@ -0,0 +1,91 @@ |
||||
/*
|
||||
SPDX-FileCopyrightText: 2023 Vlad Zahorodnii <vlad.zahorodnii@kde.org> |
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later |
||||
*/ |
||||
|
||||
#include "core/graphicsbufferview.h" |
||||
#include "core/graphicsbuffer.h" |
||||
#include "utils/common.h" |
||||
|
||||
#include <drm_fourcc.h> |
||||
|
||||
namespace KWin |
||||
{ |
||||
|
||||
static QImage::Format drmFormatToQImageFormat(uint32_t drmFormat) |
||||
{ |
||||
switch (drmFormat) { |
||||
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN |
||||
case DRM_FORMAT_ABGR16161616: |
||||
return QImage::Format_RGBA64_Premultiplied; |
||||
case DRM_FORMAT_XBGR16161616: |
||||
return QImage::Format_RGBX64; |
||||
case DRM_FORMAT_ARGB2101010: |
||||
return QImage::Format_A2RGB30_Premultiplied; |
||||
case DRM_FORMAT_XRGB2101010: |
||||
return QImage::Format_RGB30; |
||||
case DRM_FORMAT_ABGR2101010: |
||||
return QImage::Format_A2BGR30_Premultiplied; |
||||
case DRM_FORMAT_XBGR2101010: |
||||
return QImage::Format_BGR30; |
||||
#endif |
||||
case DRM_FORMAT_ARGB8888: |
||||
return QImage::Format_ARGB32_Premultiplied; |
||||
case DRM_FORMAT_XRGB8888: |
||||
return QImage::Format_RGB32; |
||||
default: |
||||
return QImage::Format_Invalid; |
||||
} |
||||
} |
||||
|
||||
GraphicsBufferView::GraphicsBufferView(GraphicsBuffer *buffer) |
||||
: m_buffer(buffer) |
||||
{ |
||||
int width; |
||||
int height; |
||||
int stride; |
||||
int format; |
||||
|
||||
if (auto dmabuf = buffer->dmabufAttributes()) { |
||||
if (dmabuf->planeCount != 1) { |
||||
return; |
||||
} |
||||
width = dmabuf->width; |
||||
height = dmabuf->height; |
||||
stride = dmabuf->pitch[0]; |
||||
format = dmabuf->format; |
||||
} else if (auto shm = buffer->shmAttributes()) { |
||||
width = shm->size.width(); |
||||
height = shm->size.height(); |
||||
stride = shm->stride; |
||||
format = shm->format; |
||||
} else { |
||||
qCWarning(KWIN_CORE) << "Cannot create a graphics buffer view for unknown buffer type" << buffer; |
||||
return; |
||||
} |
||||
|
||||
void *data = buffer->map(); |
||||
if (data) { |
||||
m_image = QImage(static_cast<uchar *>(data), width, height, stride, drmFormatToQImageFormat(format)); |
||||
} |
||||
} |
||||
|
||||
GraphicsBufferView::~GraphicsBufferView() |
||||
{ |
||||
if (!m_image.isNull()) { |
||||
m_buffer->unmap(); |
||||
} |
||||
} |
||||
|
||||
QImage *GraphicsBufferView::image() |
||||
{ |
||||
return &m_image; |
||||
} |
||||
|
||||
const QImage *GraphicsBufferView::image() const |
||||
{ |
||||
return &m_image; |
||||
} |
||||
|
||||
} // namespace KWin
|
||||
@ -0,0 +1,32 @@ |
||||
/*
|
||||
SPDX-FileCopyrightText: 2023 Vlad Zahorodnii <vlad.zahorodnii@kde.org> |
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later |
||||
*/ |
||||
|
||||
#pragma once |
||||
|
||||
#include "kwin_export.h" |
||||
|
||||
#include <QImage> |
||||
|
||||
namespace KWin |
||||
{ |
||||
|
||||
class GraphicsBuffer; |
||||
|
||||
class KWIN_EXPORT GraphicsBufferView |
||||
{ |
||||
public: |
||||
explicit GraphicsBufferView(GraphicsBuffer *buffer); |
||||
~GraphicsBufferView(); |
||||
|
||||
QImage *image(); |
||||
const QImage *image() const; |
||||
|
||||
private: |
||||
GraphicsBuffer *m_buffer; |
||||
QImage m_image; |
||||
}; |
||||
|
||||
} // namespace KWin
|
||||
Loading…
Reference in new issue