Procházet zdrojové kódy

Added SDL_SetRenderDrawColorspace() and SDL_GetRenderDrawColorspace()

Sam Lantinga před 1 rokem
rodič
revize
dd28ab0489

+ 34 - 1
include/SDL3/SDL_render.h

@@ -1361,7 +1361,40 @@ extern DECLSPEC int SDLCALL SDL_SetRenderScale(SDL_Renderer *renderer, float sca
 extern DECLSPEC int SDLCALL SDL_GetRenderScale(SDL_Renderer *renderer, float *scaleX, float *scaleY);
 
 /**
- * Set the color used for drawing operations (Rect, Line and Clear).
+ * Set the colorspace used for drawing operations
+ *
+ * The default colorspace for drawing operations is SDL_COLORSPACE_SRGB, but you can change it to other colorspaces such as SDL_COLORSPACE_SCRGB for HDR rendering.
+ *
+ * This does not affect the colorspace of textures, which is specified via properties when the texture is created and does not change.
+ *
+ * \param renderer the rendering context
+ * \param colorspace an SDL_ColorSpace value describing the colorspace for drawing operations
+ * \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_GetRenderDrawColorspace
+ */
+extern DECLSPEC int SDLCALL SDL_SetRenderDrawColorspace(SDL_Renderer *renderer, SDL_Colorspace colorspace);
+
+/**
+ * Get the colorspace used for drawing operations
+ *
+ * \param renderer the rendering context
+ * \param colorspace a pointer filled in with an SDL_ColorSpace value describing the colorspace for drawing operations
+ * \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_SetRenderDrawColorspace
+ */
+extern DECLSPEC int SDLCALL SDL_GetRenderDrawColorspace(SDL_Renderer *renderer, SDL_Colorspace *colorspace);
+
+
+/**
+ * Set the color used for drawing operations.
  *
  * Set the color for drawing or filling rectangles, lines, and points, and for
  * SDL_RenderClear().

+ 2 - 0
src/dynapi/SDL_dynapi.sym

@@ -969,6 +969,8 @@ SDL3_0.0.0 {
     SDL_SetSurfaceColorspace;
     SDL_GetSurfaceColorspace;
     SDL_ConvertSurfaceFormatAndColorspace;
+    SDL_SetRenderDrawColorspace;
+    SDL_GetRenderDrawColorspace;
     # extra symbols go here (don't modify this line)
   local: *;
 };

+ 2 - 0
src/dynapi/SDL_dynapi_overrides.h

@@ -994,3 +994,5 @@
 #define SDL_SetSurfaceColorspace SDL_SetSurfaceColorspace_REAL
 #define SDL_GetSurfaceColorspace SDL_GetSurfaceColorspace_REAL
 #define SDL_ConvertSurfaceFormatAndColorspace SDL_ConvertSurfaceFormatAndColorspace_REAL
+#define SDL_SetRenderDrawColorspace SDL_SetRenderDrawColorspace_REAL
+#define SDL_GetRenderDrawColorspace SDL_GetRenderDrawColorspace_REAL

+ 2 - 0
src/dynapi/SDL_dynapi_procs.h

@@ -1019,3 +1019,5 @@ SDL_DYNAPI_PROC(int,SDL_ConvertPixelsAndColorspace,(int a, int b, Uint32 c, SDL_
 SDL_DYNAPI_PROC(int,SDL_SetSurfaceColorspace,(SDL_Surface *a, SDL_Colorspace b),(a,b),return)
 SDL_DYNAPI_PROC(int,SDL_GetSurfaceColorspace,(SDL_Surface *a, SDL_Colorspace *b),(a,b),return)
 SDL_DYNAPI_PROC(SDL_Surface*,SDL_ConvertSurfaceFormatAndColorspace,(SDL_Surface *a, Uint32 b, SDL_Colorspace c),(a,b,c),return)
+SDL_DYNAPI_PROC(int,SDL_SetRenderDrawColorspace,(SDL_Renderer *a, SDL_Colorspace b),(a,b),return)
+SDL_DYNAPI_PROC(int,SDL_GetRenderDrawColorspace,(SDL_Renderer *a, SDL_Colorspace *b),(a,b),return)

+ 24 - 0
src/render/SDL_render.c

@@ -2757,6 +2757,30 @@ int SDL_GetRenderScale(SDL_Renderer *renderer, float *scaleX, float *scaleY)
     return 0;
 }
 
+int SDL_SetRenderDrawColorspace(SDL_Renderer *renderer, SDL_Colorspace colorspace)
+{
+    CHECK_RENDERER_MAGIC(renderer, -1);
+
+    if (colorspace != SDL_COLORSPACE_SRGB &&
+        colorspace != SDL_COLORSPACE_SCRGB) {
+        return SDL_SetError("Unsupported colorspace");
+    }
+
+    renderer->input_colorspace = colorspace;
+    return 0;
+}
+
+int SDL_GetRenderDrawColorspace(SDL_Renderer *renderer, SDL_Colorspace *colorspace)
+{
+    CHECK_RENDERER_MAGIC(renderer, -1);
+
+    if (colorspace) {
+        *colorspace = renderer->input_colorspace;
+    }
+    return 0;
+}
+
+
 int SDL_SetRenderDrawColor(SDL_Renderer *renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
 {
     const float fR = (float)r / 255.0f;