summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2022-03-03 14:36:57 +0000
committerEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2022-03-03 16:05:52 +0100
commit588076d16676b7231d6c61ab89a8fbc7be9a782d (patch)
tree988c34325f90892e2ac05e019b5310138ed07a0a
parent3a98b28ab7f9eead21dcfef2d07a6af4fd8c33ce (diff)
downloadgtk+-588076d16676b7231d6c61ab89a8fbc7be9a782d.tar.gz
gdk: Add a rgb8 → rgba8 conversion macro
This one can be used for both premultiplied and non-premultiplied alpha formats, since alpha is always 255. It is useful for opaque PNG upload on both cairo and GL renderers.
-rw-r--r--gdk/gdkmemoryformat.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/gdk/gdkmemoryformat.c b/gdk/gdkmemoryformat.c
index adfa26610b..5bd7b228d4 100644
--- a/gdk/gdkmemoryformat.c
+++ b/gdk/gdkmemoryformat.c
@@ -192,6 +192,28 @@ PREMULTIPLY_FUNC(r8g8b8a8_to_b8g8r8a8_premultiplied, 0, 1, 2, 3, 2, 1, 0, 3)
PREMULTIPLY_FUNC(r8g8b8a8_to_a8r8g8b8_premultiplied, 0, 1, 2, 3, 1, 2, 3, 0)
PREMULTIPLY_FUNC(r8g8b8a8_to_a8b8g8r8_premultiplied, 0, 1, 2, 3, 3, 2, 1, 0)
+#define ADD_ALPHA_FUNC(name, R1, G1, B1, R2, G2, B2, A2) \
+static void \
+name (guchar *dest, \
+ const guchar *src, \
+ gsize n) \
+{ \
+ for (; n > 0; n--) \
+ { \
+ dest[R2] = src[R1]; \
+ dest[G2] = src[G1]; \
+ dest[B2] = src[B1]; \
+ dest[A2] = 255; \
+ dest += 4; \
+ src += 3; \
+ } \
+}
+
+ADD_ALPHA_FUNC(r8g8b8_to_r8g8b8a8, 0, 1, 2, 0, 1, 2, 3)
+ADD_ALPHA_FUNC(r8g8b8_to_b8g8r8a8, 0, 1, 2, 2, 1, 0, 3)
+ADD_ALPHA_FUNC(r8g8b8_to_a8r8g8b8, 0, 1, 2, 1, 2, 3, 0)
+ADD_ALPHA_FUNC(r8g8b8_to_a8b8g8r8, 0, 1, 2, 3, 2, 1, 0)
+
struct _GdkMemoryFormatDescription
{
GdkMemoryAlpha alpha;
@@ -518,6 +540,30 @@ gdk_memory_convert (guchar *dest_data,
func = r8g8b8a8_to_a8r8g8b8_premultiplied;
else if (src_format == GDK_MEMORY_B8G8R8A8 && dest_format == GDK_MEMORY_A8R8G8B8_PREMULTIPLIED)
func = r8g8b8a8_to_a8b8g8r8_premultiplied;
+ else if (src_format == GDK_MEMORY_R8G8B8 && dest_format == GDK_MEMORY_R8G8B8A8_PREMULTIPLIED)
+ func = r8g8b8_to_r8g8b8a8;
+ else if (src_format == GDK_MEMORY_B8G8R8 && dest_format == GDK_MEMORY_R8G8B8A8_PREMULTIPLIED)
+ func = r8g8b8_to_b8g8r8a8;
+ else if (src_format == GDK_MEMORY_R8G8B8 && dest_format == GDK_MEMORY_B8G8R8A8_PREMULTIPLIED)
+ func = r8g8b8_to_b8g8r8a8;
+ else if (src_format == GDK_MEMORY_B8G8R8 && dest_format == GDK_MEMORY_B8G8R8A8_PREMULTIPLIED)
+ func = r8g8b8_to_r8g8b8a8;
+ else if (src_format == GDK_MEMORY_R8G8B8 && dest_format == GDK_MEMORY_A8R8G8B8_PREMULTIPLIED)
+ func = r8g8b8_to_a8r8g8b8;
+ else if (src_format == GDK_MEMORY_B8G8R8 && dest_format == GDK_MEMORY_A8R8G8B8_PREMULTIPLIED)
+ func = r8g8b8_to_a8b8g8r8;
+ else if (src_format == GDK_MEMORY_R8G8B8 && dest_format == GDK_MEMORY_R8G8B8A8)
+ func = r8g8b8_to_r8g8b8a8;
+ else if (src_format == GDK_MEMORY_B8G8R8 && dest_format == GDK_MEMORY_R8G8B8A8)
+ func = r8g8b8_to_b8g8r8a8;
+ else if (src_format == GDK_MEMORY_R8G8B8 && dest_format == GDK_MEMORY_B8G8R8A8)
+ func = r8g8b8_to_b8g8r8a8;
+ else if (src_format == GDK_MEMORY_B8G8R8 && dest_format == GDK_MEMORY_B8G8R8A8)
+ func = r8g8b8_to_r8g8b8a8;
+ else if (src_format == GDK_MEMORY_R8G8B8 && dest_format == GDK_MEMORY_A8R8G8B8)
+ func = r8g8b8_to_a8r8g8b8;
+ else if (src_format == GDK_MEMORY_B8G8R8 && dest_format == GDK_MEMORY_A8R8G8B8)
+ func = r8g8b8_to_a8b8g8r8;
if (func != NULL)
{