diff --git a/src_c/_pygame.h b/src_c/_pygame.h index 2c701c0edb..bce92dac3b 100644 --- a/src_c/_pygame.h +++ b/src_c/_pygame.h @@ -77,9 +77,17 @@ #define PG_CreateSurface SDL_CreateSurface #define PG_CreateSurfaceFrom SDL_CreateSurfaceFrom -#define PG_ConvertSurface SDL_ConvertSurface #define PG_ConvertSurfaceFormat SDL_ConvertSurface +/* Convert surface using palette and format of dst */ +static inline SDL_Surface * +PG_ConvertSurface(SDL_Surface *surface, SDL_Surface *dst) +{ + return SDL_ConvertSurfaceAndColorspace(surface, dst->format, + SDL_GetSurfacePalette(dst), + SDL_GetSurfaceColorspace(dst), 0); +} + #define PG_PixelFormatEnum SDL_PixelFormat #define PG_SurfaceHasRLE SDL_SurfaceHasRLE @@ -144,11 +152,23 @@ PG_SURF_BitsPerPixel(SDL_Surface *surf) #define PG_PixelFormat const SDL_PixelFormatDetails +static inline SDL_Palette * +PG_GetSurfacePalette(SDL_Surface *surf) +{ + SDL_Palette *ret = SDL_GetSurfacePalette(surf); + if (!ret && SDL_ISPIXELFORMAT_INDEXED(surf->format)) { + /* Palette doesn't exist but is expected, so create it. + * SDL will associate the newly created palette with the surface */ + ret = SDL_CreateSurfacePalette(surf); + } + return ret; +} + static inline bool PG_GetSurfaceDetails(SDL_Surface *surf, PG_PixelFormat **format_p, SDL_Palette **palette_p) { - *palette_p = SDL_GetSurfacePalette(surf); + *palette_p = PG_GetSurfacePalette(surf); *format_p = SDL_GetPixelFormatDetails(surf->format); return *format_p != NULL; } @@ -159,7 +179,6 @@ PG_GetSurfaceFormat(SDL_Surface *surf) return SDL_GetPixelFormatDetails(surf->format); } -#define PG_GetSurfacePalette SDL_GetSurfacePalette #define PG_SetPaletteColors SDL_SetPaletteColors #define PG_SetSurfacePalette SDL_SetSurfacePalette #define PG_SetSurfaceColorKey SDL_SetSurfaceColorKey @@ -215,10 +234,15 @@ PG_GetSurfaceFormat(SDL_Surface *surf) SDL_CreateRGBSurfaceWithFormat(0, width, height, 0, format) #define PG_CreateSurfaceFrom(width, height, format, pixels, pitch) \ SDL_CreateRGBSurfaceWithFormatFrom(pixels, width, height, 0, pitch, format) -#define PG_ConvertSurface(src, fmt) SDL_ConvertSurface(src, fmt, 0) #define PG_ConvertSurfaceFormat(src, pixel_format) \ SDL_ConvertSurfaceFormat(src, pixel_format, 0) +static inline SDL_Surface * +PG_ConvertSurface(SDL_Surface *surface, SDL_Surface *dst) +{ + return SDL_ConvertSurface(surface, dst->format, 0); +} + #define PG_PixelFormatEnum SDL_PixelFormatEnum #define PG_SoftStretchNearest(src, srcrect, dst, dstrect) \ diff --git a/src_c/draw.c b/src_c/draw.c index 7684d19493..5c682bcc4c 100644 --- a/src_c/draw.c +++ b/src_c/draw.c @@ -1334,7 +1334,7 @@ flood_fill(PyObject *self, PyObject *arg, PyObject *kwargs) if (pgSurface_Check(colorobj)) { pat_surfobj = ((pgSurfaceObject *)colorobj); - pattern = PG_ConvertSurface(pat_surfobj->surf, surf->format); + pattern = PG_ConvertSurface(pat_surfobj->surf, surf); if (pattern == NULL) { return RAISE(PyExc_RuntimeError, "error converting pattern surf"); diff --git a/src_c/pixelarray_methods.c b/src_c/pixelarray_methods.c index 3663ab30ae..56ba27025e 100644 --- a/src_c/pixelarray_methods.c +++ b/src_c/pixelarray_methods.c @@ -137,7 +137,7 @@ _make_surface(pgPixelArrayObject *array, PyObject *args) } /* Ensure the new surface has the same format as the original */ - new_surf = PG_ConvertSurface(temp_surf, surf->format); + new_surf = PG_ConvertSurface(temp_surf, surf); if (temp_surf != surf) { SDL_FreeSurface(temp_surf); } diff --git a/src_c/surface.c b/src_c/surface.c index 59bb6b9a9f..d108a3bee5 100644 --- a/src_c/surface.c +++ b/src_c/surface.c @@ -1620,7 +1620,7 @@ surf_copy(pgSurfaceObject *self, PyObject *_null) SURF_INIT_CHECK(surf) pgSurface_Prep(self); - newsurf = PG_ConvertSurface(surf, surf->format); + newsurf = PG_ConvertSurface(surf, surf); pgSurface_Unprep(self); final = surf_subtype_new(Py_TYPE(self), newsurf, 1); @@ -1680,7 +1680,7 @@ surf_convert(pgSurfaceObject *self, PyObject *args) if (argobject) { if (pgSurface_Check(argobject)) { src = pgSurface_AsSurface(argobject); - newsurf = PG_ConvertSurface(surf, src->format); + newsurf = PG_ConvertSurface(surf, src); } else { /* will be updated later, initialize to make static analyzer happy @@ -1834,7 +1834,7 @@ surf_convert(pgSurfaceObject *self, PyObject *args) if (argobject) { if (pgSurface_Check(argobject)) { src = pgSurface_AsSurface(argobject); - newsurf = PG_ConvertSurface(surf, src->format); + newsurf = PG_ConvertSurface(surf, src); } else { /* will be updated later, initialize to make static analyzer happy @@ -1951,7 +1951,7 @@ surf_convert(pgSurfaceObject *self, PyObject *args) SDL_SetPixelFormatPalette(format, palette); } } - newsurf = PG_ConvertSurface(surf, format); + newsurf = SDL_ConvertSurface(surf, format, 0); SDL_SetSurfaceBlendMode(newsurf, SDL_BLENDMODE_NONE); SDL_FreeFormat(format); SDL_FreePalette(palette); @@ -3753,7 +3753,7 @@ surf_premul_alpha(pgSurfaceObject *self, PyObject *_null) pgSurface_Prep(self); // Make a copy of the surface first - newsurf = PG_ConvertSurface(surf, surf->format); + newsurf = PG_ConvertSurface(surf, surf); if ((surf->w > 0 && surf->h > 0)) { // If the surface has no pixels we don't need to premul