SDL: DirectFB: fixed creation of palette textures

From 77acd44f2862d1b46161d579886d2cc203b6f0fb Mon Sep 17 00:00:00 2001
From: Sylvain <[EMAIL REDACTED]>
Date: Fri, 1 Oct 2021 22:30:51 +0200
Subject: [PATCH] DirectFB: fixed creation of palette textures

---
 src/render/SDL_render.c                  | 18 ++++++++++++++++--
 src/video/directfb/SDL_DirectFB_render.c | 16 ++++++++++++++++
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index 7db35dd7b6..6a59bb783b 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -1146,8 +1146,10 @@ SDL_CreateTexture(SDL_Renderer * renderer, Uint32 format, int access, int w, int
         return NULL;
     }
     if (SDL_ISPIXELFORMAT_INDEXED(format)) {
-        SDL_SetError("Palettized textures are not supported");
-        return NULL;
+        if (!IsSupportedFormat(renderer, format)) {
+            SDL_SetError("Palettized textures are not supported");
+            return NULL;
+        }
     }
     if (w <= 0 || h <= 0) {
         SDL_SetError("Texture dimensions can't be 0");
@@ -1341,6 +1343,18 @@ SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface)
         } else {
             SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);
         }
+
+#if SDL_VIDEO_RENDER_DIRECTFB
+        /* DirectFB allows palette format for textures.
+         * Copy SDL_Surface palette to the texture */
+        if (SDL_ISPIXELFORMAT_INDEXED(format)) {
+            if (SDL_strcasecmp(renderer->info.name, "directfb") == 0) {
+                extern void DirectFB_SetTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture, SDL_Palette *pal);
+                DirectFB_SetTexturePalette(renderer, texture, surface->format->palette);
+            }
+        }
+#endif
+
     } else {
         SDL_PixelFormat *dst_fmt;
         SDL_Surface *temp = NULL;
diff --git a/src/video/directfb/SDL_DirectFB_render.c b/src/video/directfb/SDL_DirectFB_render.c
index 90adccb385..5f5e0b8521 100644
--- a/src/video/directfb/SDL_DirectFB_render.c
+++ b/src/video/directfb/SDL_DirectFB_render.c
@@ -324,6 +324,22 @@ DirectFB_AcquireVidLayer(SDL_Renderer * renderer, SDL_Texture * texture)
     return 1;
 }
 
+
+/* Copy the SDL_Surface palette to the DirectFB texture palette */
+void DirectFB_SetTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture, SDL_Palette *pal)
+{
+    int i;
+    DFBColor dfbpal[256];
+    DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata;
+    for (i = 0; i < pal->ncolors; i++) {
+            dfbpal[i].a = pal->colors[i].a;
+            dfbpal[i].r = pal->colors[i].r;
+            dfbpal[i].g = pal->colors[i].g;
+            dfbpal[i].b = pal->colors[i].b;
+    }
+    data->palette->SetEntries(data->palette, dfbpal, pal->ncolors, 0);
+}
+
 static int
 DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
 {