[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kwayland] src/server: [server] Query whether BufferInterface's format has an alpha channel
From: Martin_Gräßlin <mgraesslin () kde ! org>
Date: 2015-06-01 0:42:11
Message-ID: E1YzDnv-0006Uj-B2 () scm ! kde ! org
[Download RAW message or body]
Git commit 6a44f3c40aa50ad9aeb1233a7ffc399cd62c2ee0 by Martin Gräßlin.
Committed on 01/06/2015 at 00:37.
Pushed by graesslin into branch 'master'.
[server] Query whether BufferInterface's format has an alpha channel
Reviewed-By: Sebastian Kügler
M +30 -0 src/server/buffer_interface.cpp
M +14 -0 src/server/buffer_interface.h
http://commits.kde.org/kwayland/6a44f3c40aa50ad9aeb1233a7ffc399cd62c2ee0
diff --git a/src/server/buffer_interface.cpp b/src/server/buffer_interface.cpp
index 4a62dcb..75f3d03 100644
--- a/src/server/buffer_interface.cpp
+++ b/src/server/buffer_interface.cpp
@@ -49,6 +49,7 @@ public:
SurfaceInterface *surface;
int refCount;
QSize size;
+ bool alpha;
static BufferInterface *get(wl_resource *r);
@@ -103,6 +104,7 @@ BufferInterface::Private::Private(BufferInterface *q, wl_resource *resource, Sur
, shmBuffer(wl_shm_buffer_get(resource))
, surface(parent)
, refCount(0)
+ , alpha(false)
, q(q)
{
s_buffers << this;
@@ -112,6 +114,16 @@ BufferInterface::Private::Private(BufferInterface *q, wl_resource *resource, Sur
wl_resource_add_destroy_listener(resource, &listener);
if (shmBuffer) {
size = QSize(wl_shm_buffer_get_width(shmBuffer), wl_shm_buffer_get_height(shmBuffer));
+ // check alpha
+ switch (wl_shm_buffer_get_format(shmBuffer)) {
+ case WL_SHM_FORMAT_ARGB8888:
+ alpha = true;
+ break;
+ case WL_SHM_FORMAT_XRGB8888:
+ default:
+ alpha = false;
+ break;
+ }
} else if (parent) {
EGLDisplay eglDisplay = parent->global()->display()->eglDisplay();
static bool resolved = false;
@@ -128,6 +140,19 @@ BufferInterface::Private::Private(BufferInterface *q, wl_resource *resource, Sur
if (valid) {
size = QSize(width, height);
}
+ // check alpha
+ EGLint format;
+ if (eglQueryWaylandBufferWL(eglDisplay, buffer, EGL_TEXTURE_FORMAT, &format)) {
+ switch (format) {
+ case EGL_TEXTURE_RGBA:
+ alpha = true;
+ break;
+ case EGL_TEXTURE_RGB:
+ default:
+ alpha = false;
+ break;
+ }
+ }
}
}
}
@@ -266,5 +291,10 @@ void BufferInterface::setSize(const QSize &size)
emit sizeChanged();
}
+bool BufferInterface::hasAlphaChannel() const
+{
+ return d->alpha;
+}
+
}
}
diff --git a/src/server/buffer_interface.h b/src/server/buffer_interface.h
index ad9a54b..f363879 100644
--- a/src/server/buffer_interface.h
+++ b/src/server/buffer_interface.h
@@ -89,6 +89,20 @@ public:
**/
void setSize(const QSize &size);
+ /**
+ * Returns whether the format of the BufferInterface has an alpha channel.
+ * For shared memory buffers returns @c true for format @c WL_SHM_FORMAT_ARGB8888,
+ * for all other formats returns @c false.
+ *
+ * For EGL buffers returns @c true for format @c EGL_TEXTURE_RGBA, for all other formats
+ * returns @c false.
+ *
+ * If the format cannot be queried the default value (@c false) is returned.
+ *
+ * @since 5.4
+ **/
+ bool hasAlphaChannel() const;
+
static BufferInterface *get(wl_resource *r);
Q_SIGNALS:
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic