Fixed bug 4264 - SDL_CreateTextureFromSurface generates error message but returns ok Anthony @ POW Games SDL_CreateTextureFromSurface makes an internal call to SDL_GetColorKey which can return an error and spams the error log with "Surface doesn't have a colorkey" even though the original function didn't return an error.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
diff --git a/include/SDL_surface.h b/include/SDL_surface.h
index 45e5366..730d49f 100644
--- a/include/SDL_surface.h
+++ b/include/SDL_surface.h
@@ -249,6 +249,13 @@ extern DECLSPEC int SDLCALL SDL_SetColorKey(SDL_Surface * surface,
int flag, Uint32 key);
/**
+ * \brief Returns whether the surface has a color key
+ *
+ * \return SDL_TRUE if the surface has a color key, or SDL_FALSE if the surface is NULL or has no color key
+ */
+extern DECLSPEC SDL_bool SDLCALL SDL_HasColorKey(SDL_Surface * surface);
+
+/**
* \brief Gets the color key (transparent pixel) in a blittable surface.
*
* \param surface The surface to update
diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h
index b1f029f..9ef18c5 100644
--- a/src/dynapi/SDL_dynapi_overrides.h
+++ b/src/dynapi/SDL_dynapi_overrides.h
@@ -696,3 +696,4 @@
#define SDL_SensorUpdate SDL_SensorUpdate_REAL
#define SDL_IsTablet SDL_IsTablet_REAL
#define SDL_GetDisplayOrientation SDL_GetDisplayOrientation_REAL
+#define SDL_HasColorKey SDL_HasColorKey_REAL
diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h
index 6619f88..02f6170 100644
--- a/src/dynapi/SDL_dynapi_procs.h
+++ b/src/dynapi/SDL_dynapi_procs.h
@@ -738,3 +738,4 @@ SDL_DYNAPI_PROC(void,SDL_SensorClose,(SDL_Sensor *a),(a),)
SDL_DYNAPI_PROC(void,SDL_SensorUpdate,(void),(),)
SDL_DYNAPI_PROC(SDL_bool,SDL_IsTablet,(void),(),return)
SDL_DYNAPI_PROC(SDL_DisplayOrientation,SDL_GetDisplayOrientation,(int a),(a),return)
+SDL_DYNAPI_PROC(SDL_bool,SDL_HasColorKey,(SDL_Surface *a),(a),return)
diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index b1bcc46..f8b29d9 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -649,7 +649,7 @@ SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface)
/* See what the best texture format is */
fmt = surface->format;
- if (fmt->Amask || SDL_GetColorKey(surface, NULL) == 0) {
+ if (fmt->Amask || (SDL_HasColorKey(surface) && SDL_GetColorKey(surface, NULL) == 0)) {
needAlpha = SDL_TRUE;
} else {
needAlpha = SDL_FALSE;
diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c
index 719f831..c6fd3b5 100644
--- a/src/video/SDL_surface.c
+++ b/src/video/SDL_surface.c
@@ -292,6 +292,20 @@ SDL_SetColorKey(SDL_Surface * surface, int flag, Uint32 key)
return 0;
}
+SDL_bool
+SDL_HasColorKey(SDL_Surface * surface)
+{
+ if (!surface) {
+ return SDL_FALSE;
+ }
+
+ if (!(surface->map->info.flags & SDL_COPY_COLORKEY)) {
+ return SDL_FALSE;
+ }
+
+ return SDL_TRUE;
+}
+
int
SDL_GetColorKey(SDL_Surface * surface, Uint32 * key)
{