From 6f199eabb872466c0a38c4ecd88aa18885895b24 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 28 Jun 2024 23:55:23 -0700 Subject: [PATCH] Removed SDL_RenderGeometryRawFloat() After discussion with @ocornut, SDL_RenderGeometryRaw() will take floating point colors and conversion from 8-bit color can happen on the application side. We can always add an 8-bit color fast path in the future if we need it on handheld platforms. If you need code to do this in your application, you can use the following: int SDL_RenderGeometryRaw8BitColor(SDL_Renderer *renderer, SDL_Texture *texture, const float *xy, int xy_stride, const SDL_Color *color, int color_stride, const float *uv, int uv_stride, int num_vertices, const void *indices, int num_indices, int size_indices) { int i, retval, isstack; const Uint8 *color2 = (const Uint8 *)color; SDL_FColor *color3; if (num_vertices <= 0) { return SDL_InvalidParamError("num_vertices"); } if (!color) { return SDL_InvalidParamError("color"); } color3 = (SDL_FColor *)SDL_small_alloc(SDL_FColor, num_vertices, &isstack); if (!color3) { return -1; } for (i = 0; i < num_vertices; ++i) { color3[i].r = color->r / 255.0f; color3[i].g = color->g / 255.0f; color3[i].b = color->b / 255.0f; color3[i].a = color->a / 255.0f; color2 += color_stride; color = (const SDL_Color *)color2; } retval = SDL_RenderGeometryRaw(renderer, texture, xy, xy_stride, color3, sizeof(*color3), uv, uv_stride, num_vertices, indices, num_indices, size_indices); SDL_small_free(color3, isstack); return retval; } Fixes https://github.com/libsdl-org/SDL/issues/9009 --- include/SDL3/SDL_render.h | 36 +---------------------------- src/dynapi/SDL_dynapi.sym | 1 - src/dynapi/SDL_dynapi_overrides.h | 1 - src/dynapi/SDL_dynapi_procs.h | 3 +-- src/render/SDL_render.c | 38 ++----------------------------- test/testcolorspace.c | 2 +- 6 files changed, 5 insertions(+), 76 deletions(-) diff --git a/include/SDL3/SDL_render.h b/include/SDL3/SDL_render.h index 063945365d..ee94ee9bbb 100644 --- a/include/SDL3/SDL_render.h +++ b/include/SDL3/SDL_render.h @@ -1886,7 +1886,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, * \param texture (optional) The SDL texture to use. * \param xy vertex positions. * \param xy_stride byte size to move from one element to the next element. - * \param color vertex colors (as SDL_Color). + * \param color vertex colors (as SDL_FColor). * \param color_stride byte size to move from one element to the next element. * \param uv vertex normalized texture coordinates. * \param uv_stride byte size to move from one element to the next element. @@ -1903,40 +1903,6 @@ extern SDL_DECLSPEC int SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, * \sa SDL_RenderGeometry */ extern SDL_DECLSPEC int SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, - SDL_Texture *texture, - const float *xy, int xy_stride, - const SDL_Color *color, int color_stride, - const float *uv, int uv_stride, - int num_vertices, - const void *indices, int num_indices, int size_indices); - -/** - * Render a list of triangles, optionally using a texture and indices into the - * vertex arrays Color and alpha modulation is done per vertex - * (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored). - * - * \param renderer the rendering context. - * \param texture (optional) The SDL texture to use. - * \param xy vertex positions. - * \param xy_stride byte size to move from one element to the next element. - * \param color vertex colors (as SDL_FColor). - * \param color_stride byte size to move from one element to the next element. - * \param uv vertex normalized texture coordinates. - * \param uv_stride byte size to move from one element to the next element. - * \param num_vertices number of vertices. - * \param indices (optional) An array of indices into the 'vertices' arrays, - * if NULL all vertices will be rendered in sequential order. - * \param num_indices number of indices. - * \param size_indices index size: 1 (byte), 2 (short), 4 (int). - * \returns 0 on success or a negative error code on failure; call - * SDL_GetError() for more information. - * - * \since This function is available since SDL 3.0.0. - * - * \sa SDL_RenderGeometry - * \sa SDL_RenderGeometryRaw - */ -extern SDL_DECLSPEC int SDLCALL SDL_RenderGeometryRawFloat(SDL_Renderer *renderer, SDL_Texture *texture, const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, diff --git a/src/dynapi/SDL_dynapi.sym b/src/dynapi/SDL_dynapi.sym index b81b894f45..8ca96c833d 100644 --- a/src/dynapi/SDL_dynapi.sym +++ b/src/dynapi/SDL_dynapi.sym @@ -645,7 +645,6 @@ SDL3_0.0.0 { SDL_RenderFillRects; SDL_RenderGeometry; SDL_RenderGeometryRaw; - SDL_RenderGeometryRawFloat; SDL_RenderLine; SDL_RenderLines; SDL_RenderPoint; diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h index 4cfcd09b63..d809adcd72 100644 --- a/src/dynapi/SDL_dynapi_overrides.h +++ b/src/dynapi/SDL_dynapi_overrides.h @@ -670,7 +670,6 @@ #define SDL_RenderFillRects SDL_RenderFillRects_REAL #define SDL_RenderGeometry SDL_RenderGeometry_REAL #define SDL_RenderGeometryRaw SDL_RenderGeometryRaw_REAL -#define SDL_RenderGeometryRawFloat SDL_RenderGeometryRawFloat_REAL #define SDL_RenderLine SDL_RenderLine_REAL #define SDL_RenderLines SDL_RenderLines_REAL #define SDL_RenderPoint SDL_RenderPoint_REAL diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 4c43f04070..43b8574392 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -680,8 +680,7 @@ SDL_DYNAPI_PROC(int,SDL_RenderCoordinatesToWindow,(SDL_Renderer *a, float b, flo SDL_DYNAPI_PROC(int,SDL_RenderFillRect,(SDL_Renderer *a, const SDL_FRect *b),(a,b),return) SDL_DYNAPI_PROC(int,SDL_RenderFillRects,(SDL_Renderer *a, const SDL_FRect *b, int c),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_RenderGeometry,(SDL_Renderer *a, SDL_Texture *b, const SDL_Vertex *c, int d, const int *e, int f),(a,b,c,d,e,f),return) -SDL_DYNAPI_PROC(int,SDL_RenderGeometryRaw,(SDL_Renderer *a, SDL_Texture *b, const float *c, int d, const SDL_Color *e, int f, const float *g, int h, int i, const void *j, int k, int l),(a,b,c,d,e,f,g,h,i,j,k,l),return) -SDL_DYNAPI_PROC(int,SDL_RenderGeometryRawFloat,(SDL_Renderer *a, SDL_Texture *b, const float *c, int d, const SDL_FColor *e, int f, const float *g, int h, int i, const void *j, int k, int l),(a,b,c,d,e,f,g,h,i,j,k,l),return) +SDL_DYNAPI_PROC(int,SDL_RenderGeometryRaw,(SDL_Renderer *a, SDL_Texture *b, const float *c, int d, const SDL_FColor *e, int f, const float *g, int h, int i, const void *j, int k, int l),(a,b,c,d,e,f,g,h,i,j,k,l),return) SDL_DYNAPI_PROC(int,SDL_RenderLine,(SDL_Renderer *a, float b, float c, float d, float e),(a,b,c,d,e),return) SDL_DYNAPI_PROC(int,SDL_RenderLines,(SDL_Renderer *a, const SDL_FPoint *b, int c),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_RenderPoint,(SDL_Renderer *a, float b, float c),(a,b,c),return) diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 83f6302899..0b504ca1d9 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -3849,7 +3849,7 @@ int SDL_RenderGeometry(SDL_Renderer *renderer, const float *uv = &vertices->tex_coord.x; int uv_stride = sizeof(SDL_Vertex); int size_indices = 4; - return SDL_RenderGeometryRawFloat(renderer, texture, xy, xy_stride, color, color_stride, uv, uv_stride, num_vertices, indices, num_indices, size_indices); + return SDL_RenderGeometryRaw(renderer, texture, xy, xy_stride, color, color_stride, uv, uv_stride, num_vertices, indices, num_indices, size_indices); } else { return SDL_InvalidParamError("vertices"); } @@ -4226,7 +4226,7 @@ end: } #endif /* SDL_VIDEO_RENDER_SW */ -int SDL_RenderGeometryRawFloat(SDL_Renderer *renderer, +int SDL_RenderGeometryRaw(SDL_Renderer *renderer, SDL_Texture *texture, const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, @@ -4338,40 +4338,6 @@ int SDL_RenderGeometryRawFloat(SDL_Renderer *renderer, renderer->view->scale.y); } -int SDL_RenderGeometryRaw(SDL_Renderer *renderer, SDL_Texture *texture, const float *xy, int xy_stride, const SDL_Color *color, int color_stride, const float *uv, int uv_stride, int num_vertices, const void *indices, int num_indices, int size_indices) -{ - int i, retval, isstack; - const Uint8 *color2 = (const Uint8 *)color; - SDL_FColor *color3; - - if (num_vertices <= 0) { - return SDL_InvalidParamError("num_vertices"); - } - if (!color) { - return SDL_InvalidParamError("color"); - } - - color3 = (SDL_FColor *)SDL_small_alloc(SDL_FColor, num_vertices, &isstack); - if (!color3) { - return -1; - } - - for (i = 0; i < num_vertices; ++i) { - color3[i].r = color->r / 255.0f; - color3[i].g = color->g / 255.0f; - color3[i].b = color->b / 255.0f; - color3[i].a = color->a / 255.0f; - color2 += color_stride; - color = (const SDL_Color *)color2; - } - - retval = SDL_RenderGeometryRawFloat(renderer, texture, xy, xy_stride, color3, sizeof(*color3), uv, uv_stride, num_vertices, indices, num_indices, size_indices); - - SDL_small_free(color3, isstack); - - return retval; -} - SDL_Surface *SDL_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect) { SDL_Rect real_rect; diff --git a/test/testcolorspace.c b/test/testcolorspace.c index 577b7d70d9..6afa0d748c 100644 --- a/test/testcolorspace.c +++ b/test/testcolorspace.c @@ -388,7 +388,7 @@ static void DrawGradient(float x, float y, float width, float height, float star color[2] = max_color; color[3] = min_color; - SDL_RenderGeometryRawFloat(renderer, NULL, xy, xy_stride, color, color_stride, NULL, 0, num_vertices, indices, num_indices, size_indices); + SDL_RenderGeometryRaw(renderer, NULL, xy, xy_stride, color, color_stride, NULL, 0, num_vertices, indices, num_indices, size_indices); } static void RenderGradientDrawing(void)