summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2020-09-24 15:01:51 +0200
committerAlexander Larsson <alexl@redhat.com>2020-09-25 09:31:43 +0200
commit8e59cdabac9596acd2d2bc502ae583f321f4f4d1 (patch)
treef516d9d064559e5431b56213f59bea8131a0bc91
parent88b709d5ec6012c1e877a497551e52543297c2f0 (diff)
downloadgtk+-8e59cdabac9596acd2d2bc502ae583f321f4f4d1.tar.gz
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.
-rw-r--r--gdk/gdkmemorytexture.c29
-rw-r--r--gdk/gdkmemorytexture.h3
-rw-r--r--testsuite/gdk/memorytexture.c1
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) } },