From 77acd44f2862d1b46161d579886d2cc203b6f0fb Mon Sep 17 00:00:00 2001 From: Sylvain 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 7db35dd7b..6a59bb783 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 90adccb38..5f5e0b852 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) {