[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