[gtk: 2/7] Add GDK_MEMORY_R8G8B8A8_PREMULTIPLIED




commit 8e59cdabac9596acd2d2bc502ae583f321f4f4d1
Author: Alexander Larsson <alexl redhat com>
Date:   Thu Sep 24 15:01:51 2020 +0200

    Add GDK_MEMORY_R8G8B8A8_PREMULTIPLIED
    
    This is the default OpenGL format, and in fact the only pixel format
    that GLES supports uploading as. Actually, the premultiplied part is
    really just about how we use the textures, but all textures in GTK
    are premultiplied.

 gdk/gdkmemorytexture.c        | 29 +++++++++++++++++++----------
 gdk/gdkmemorytexture.h        |  3 +++
 testsuite/gdk/memorytexture.c |  1 +
 3 files changed, 23 insertions(+), 10 deletions(-)
---
diff --git a/gdk/gdkmemorytexture.c b/gdk/gdkmemorytexture.c
index 08215820b5..5ed0b988dc 100644
--- a/gdk/gdkmemorytexture.c
+++ b/gdk/gdkmemorytexture.c
@@ -45,6 +45,7 @@ gdk_memory_format_bytes_per_pixel (GdkMemoryFormat format)
     {
     case GDK_MEMORY_B8G8R8A8_PREMULTIPLIED:
     case GDK_MEMORY_A8R8G8B8_PREMULTIPLIED:
+    case GDK_MEMORY_R8G8B8A8_PREMULTIPLIED:
     case GDK_MEMORY_B8G8R8A8:
     case GDK_MEMORY_A8R8G8B8:
     case GDK_MEMORY_R8G8B8A8:
@@ -199,6 +200,9 @@ convert_swizzle ## A ## R ## G ## B (guchar       *dest_data, \
 }
 
 SWIZZLE(3,2,1,0)
+SWIZZLE(2,1,0,3)
+SWIZZLE(3,0,1,2)
+SWIZZLE(1,2,3,0)
 
 #define SWIZZLE_OPAQUE(A,R,G,B) \
 static void \
@@ -267,6 +271,10 @@ SWIZZLE_PREMULTIPLY (3,2,1,0, 3,0,1,2)
 SWIZZLE_PREMULTIPLY (0,1,2,3, 3,0,1,2)
 SWIZZLE_PREMULTIPLY (3,2,1,0, 0,3,2,1)
 SWIZZLE_PREMULTIPLY (0,1,2,3, 0,3,2,1)
+SWIZZLE_PREMULTIPLY (3,0,1,2, 3,2,1,0)
+SWIZZLE_PREMULTIPLY (3,0,1,2, 0,1,2,3)
+SWIZZLE_PREMULTIPLY (3,0,1,2, 3,0,1,2)
+SWIZZLE_PREMULTIPLY (3,0,1,2, 0,3,2,1)
 
 typedef void (* ConversionFunc) (guchar       *dest_data,
                                  gsize         dest_stride,
@@ -275,16 +283,17 @@ typedef void (* ConversionFunc) (guchar       *dest_data,
                                  gsize         width,
                                  gsize         height);
 
-static ConversionFunc converters[GDK_MEMORY_N_FORMATS][2] =
+static ConversionFunc converters[GDK_MEMORY_N_FORMATS][3] =
 {
-  { convert_memcpy, convert_swizzle3210 },
-  { convert_swizzle3210, convert_memcpy },
-  { convert_swizzle_premultiply_3210_3210, convert_swizzle_premultiply_0123_3210 },
-  { convert_swizzle_premultiply_3210_0123, convert_swizzle_premultiply_0123_0123 },
-  { convert_swizzle_premultiply_3210_3012, convert_swizzle_premultiply_0123_3012 },
-  { convert_swizzle_premultiply_3210_0321, convert_swizzle_premultiply_0123_0321 },
-  { convert_swizzle_opaque_3210, convert_swizzle_opaque_0123 },
-  { convert_swizzle_opaque_3012, convert_swizzle_opaque_0321 }
+  { convert_memcpy, convert_swizzle3210, convert_swizzle2103 },
+  { convert_swizzle3210, convert_memcpy, convert_swizzle3012 },
+  { convert_swizzle2103, convert_swizzle1230, convert_memcpy },
+  { convert_swizzle_premultiply_3210_3210, convert_swizzle_premultiply_0123_3210, 
convert_swizzle_premultiply_3012_3210,  },
+  { convert_swizzle_premultiply_3210_0123, convert_swizzle_premultiply_0123_0123, 
convert_swizzle_premultiply_3012_0123 },
+  { convert_swizzle_premultiply_3210_3012, convert_swizzle_premultiply_0123_3012, 
convert_swizzle_premultiply_3012_3012 },
+  { convert_swizzle_premultiply_3210_0321, convert_swizzle_premultiply_0123_0321, 
convert_swizzle_premultiply_3012_0321 },
+  { convert_swizzle_opaque_3210, convert_swizzle_opaque_0123, convert_swizzle_opaque_3012 },
+  { convert_swizzle_opaque_3012, convert_swizzle_opaque_0321, convert_swizzle_opaque_3210 }
 };
 
 void
@@ -297,7 +306,7 @@ gdk_memory_convert (guchar          *dest_data,
                     gsize            width,
                     gsize            height)
 {
-  g_assert (dest_format < 2);
+  g_assert (dest_format < 3);
   g_assert (src_format < GDK_MEMORY_N_FORMATS);
 
   converters[src_format][dest_format] (dest_data, dest_stride, src_data, src_stride, width, height);
diff --git a/gdk/gdkmemorytexture.h b/gdk/gdkmemorytexture.h
index eea2fda324..b24e8c6796 100644
--- a/gdk/gdkmemorytexture.h
+++ b/gdk/gdkmemorytexture.h
@@ -34,6 +34,8 @@ G_BEGIN_DECLS
  *     The color values are premultiplied with the alpha value.
  * @GDK_MEMORY_A8R8G8B8_PREMULTIPLIED: 4 bytes; for alpha, red, green, blue.
  *     The color values are premultiplied with the alpha value.
+ * @GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: 4 bytes; for red, green, blue, alpha
+ *     The color values are premultiplied with the alpha value.
  * @GDK_MEMORY_B8G8R8A8: 4 bytes; for blue, green, red, alpha.
  * @GDK_MEMORY_A8R8G8B8: 4 bytes; for alpha, red, green, blue.
  * @GDK_MEMORY_R8G8B8A8: 4 bytes; for red, green, blue, alpha.
@@ -58,6 +60,7 @@ G_BEGIN_DECLS
 typedef enum {
   GDK_MEMORY_B8G8R8A8_PREMULTIPLIED,
   GDK_MEMORY_A8R8G8B8_PREMULTIPLIED,
+  GDK_MEMORY_R8G8B8A8_PREMULTIPLIED,
   GDK_MEMORY_B8G8R8A8,
   GDK_MEMORY_A8R8G8B8,
   GDK_MEMORY_R8G8B8A8,
diff --git a/testsuite/gdk/memorytexture.c b/testsuite/gdk/memorytexture.c
index 381d61aac7..950de41b0a 100644
--- a/testsuite/gdk/memorytexture.c
+++ b/testsuite/gdk/memorytexture.c
@@ -37,6 +37,7 @@ typedef struct _TestData {
 static MemoryData tests[GDK_MEMORY_N_FORMATS] = {
   { 4, FALSE, { RGBA(FF,00,00,FF), RGBA(00,FF,00,FF), RGBA(00,00,FF,FF), RGBA(00,00,00,00), 
RGBA(66,22,44,AA) } },
   { 4, FALSE, { RGBA(FF,00,00,FF), RGBA(FF,00,FF,00), RGBA(FF,FF,00,00), RGBA(00,00,00,00), 
RGBA(AA,44,22,66) } },
+  { 4, FALSE, { RGBA(00,00,FF,FF), RGBA(00,FF,00,FF), RGBA(FF,00,00,FF), RGBA(00,00,00,00), 
RGBA(44,22,66,AA) } },
   { 4, FALSE, { RGBA(FF,00,00,FF), RGBA(00,FF,00,FF), RGBA(00,00,FF,FF), RGBA(00,00,00,00), 
RGBA(99,33,66,AA) } },
   { 4, FALSE, { RGBA(FF,00,00,FF), RGBA(FF,00,FF,00), RGBA(FF,FF,00,00), RGBA(00,00,00,00), 
RGBA(AA,66,33,99) } },
   { 4, FALSE, { RGBA(00,00,FF,FF), RGBA(00,FF,00,FF), RGBA(FF,00,00,FF), RGBA(00,00,00,00), 
RGBA(66,33,99,AA) } },


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]