Browse Source

wayland: Pre-multiply custom cursor image alpha

Since the Wayland SHM buffer format is implicitly premultiplied and the
GLFWimage pixels are defined to be non-premultiplied, we need to
convert the non-premultiplied pixels to premultiplied when filling the
buffer.

Related to #707.
Jonas Ådahl 9 years ago
parent
commit
71c72db1e3
2 changed files with 13 additions and 4 deletions
  1. 7 0
      src/internal.h
  2. 6 4
      src/wl_window.c

+ 7 - 0
src/internal.h

@@ -233,6 +233,13 @@ typedef VkResult (APIENTRY * PFN_vkEnumerateInstanceExtensionProperties)(const c
         y = t;                    \
     }
 
+// Helper for non-premultiplied alpha to premultiplied alpha conversion
+static inline unsigned char _glfwMultiplyAlpha(unsigned char alpha,
+					       unsigned char value)
+{
+    return (unsigned char) ((value * (unsigned int) alpha) / 255);
+}
+
 
 //========================================================================
 // Platform-independent structures

+ 6 - 4
src/wl_window.c

@@ -588,10 +588,12 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
     unsigned char* target = data;
     for (i = 0;  i < image->width * image->height;  i++, source += 4)
     {
-        *target++ = source[2];
-        *target++ = source[1];
-        *target++ = source[0];
-        *target++ = source[3];
+        unsigned char alpha = source[3];
+
+        *target++ = _glfwMultiplyAlpha(alpha, source[2]);
+        *target++ = _glfwMultiplyAlpha(alpha, source[1]);
+        *target++ = _glfwMultiplyAlpha(alpha, source[0]);
+        *target++ = alpha;
     }
 
     cursor->wl.buffer =