From c0b6db56a7402127743964ae36c2824446e4cf4a Mon Sep 17 00:00:00 2001
From: namark <namark@disroot.org>
Date: Sun, 15 Aug 2021 19:43:19 +0400
Subject: [PATCH] Palettes are now reused through format objects,

only makes sense, and seem to covers all use cases for palettes.
---
 source/simple/graphical/pixel_format.h |  1 +
 source/simple/graphical/surface.cpp    | 22 +++++++++++++++++-----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/source/simple/graphical/pixel_format.h b/source/simple/graphical/pixel_format.h
index 27f0090..4ce5182 100644
--- a/source/simple/graphical/pixel_format.h
+++ b/source/simple/graphical/pixel_format.h
@@ -104,6 +104,7 @@ namespace simple::graphical
 		private:
 		static void free_pixel_format(const SDL_PixelFormat* one) noexcept;
 
+		friend class surface;
 		friend surface convert(const surface& source, const pixel_format& format);
 	};
 
diff --git a/source/simple/graphical/surface.cpp b/source/simple/graphical/surface.cpp
index b9c9a8e..cf5d205 100644
--- a/source/simple/graphical/surface.cpp
+++ b/source/simple/graphical/surface.cpp
@@ -39,7 +39,10 @@ namespace simple::graphical
 		SDL_FreeSurface
 	),
 	_format(this->guts()->format)
-	{}
+	{
+		if(format.palette())
+			SDL_SetSurfacePalette(guts().get(), format.guts().get()->palette);
+	}
 
 	surface::surface(byte* pixels, int2 size, const pixel_format& format, int pitch)
 	: sdl_surface_wrapper
@@ -55,7 +58,10 @@ namespace simple::graphical
 		SDL_FreeSurface
 	),
 	_format(this->guts()->format)
-	{}
+	{
+		if(format.palette())
+			SDL_SetSurfacePalette(guts().get(), format.guts().get()->palette);
+	}
 
 	surface::surface(std::unique_ptr<byte[]> pixels, int2 size, const pixel_format& format, int pitch)
 	: sdl_surface_wrapper
@@ -71,8 +77,11 @@ namespace simple::graphical
 		SDL_FreeSurface
 	),
 	_format(this->guts()->format),
-	pixels_owner(pixels.release(), [](byte* x){ delete [] x; })
-	{}
+	pixels_owner(pixels.release(), [](byte* x){ delete [] x; }) // hmmm... weird... but true
+	{
+		if(format.palette())
+			SDL_SetSurfacePalette(guts().get(), format.guts().get()->palette);
+	}
 
 	surface::surface(std::unique_ptr<byte[], void(*)(byte*)> pixels, int2 size, const pixel_format& format, int pitch)
 	: sdl_surface_wrapper
@@ -89,7 +98,10 @@ namespace simple::graphical
 	),
 	_format(this->guts()->format),
 	pixels_owner(std::move(pixels))
-	{}
+	{
+		if(format.palette())
+			SDL_SetSurfacePalette(guts().get(), format.guts().get()->palette);
+	}
 
 #if SDL_VERSION_ATLEAST(2,0,5)
 
-- 
GitLab