Added SDL_GetRenderSafeArea()

This commit is contained in:
Sam Lantinga
2024-07-24 17:14:00 -07:00
parent eb09264076
commit cf8b158ccb
7 changed files with 81 additions and 4 deletions

View File

@@ -401,6 +401,7 @@ SDL3_0.0.0 {
SDL_GetRenderMetalCommandEncoder;
SDL_GetRenderMetalLayer;
SDL_GetRenderOutputSize;
SDL_GetRenderSafeArea;
SDL_GetRenderScale;
SDL_GetRenderTarget;
SDL_GetRenderVSync;

View File

@@ -426,6 +426,7 @@
#define SDL_GetRenderMetalCommandEncoder SDL_GetRenderMetalCommandEncoder_REAL
#define SDL_GetRenderMetalLayer SDL_GetRenderMetalLayer_REAL
#define SDL_GetRenderOutputSize SDL_GetRenderOutputSize_REAL
#define SDL_GetRenderSafeArea SDL_GetRenderSafeArea_REAL
#define SDL_GetRenderScale SDL_GetRenderScale_REAL
#define SDL_GetRenderTarget SDL_GetRenderTarget_REAL
#define SDL_GetRenderVSync SDL_GetRenderVSync_REAL

View File

@@ -446,6 +446,7 @@ SDL_DYNAPI_PROC(int,SDL_GetRenderLogicalPresentationRect,(SDL_Renderer *a, SDL_F
SDL_DYNAPI_PROC(void*,SDL_GetRenderMetalCommandEncoder,(SDL_Renderer *a),(a),return)
SDL_DYNAPI_PROC(void*,SDL_GetRenderMetalLayer,(SDL_Renderer *a),(a),return)
SDL_DYNAPI_PROC(int,SDL_GetRenderOutputSize,(SDL_Renderer *a, int *b, int *c),(a,b,c),return)
SDL_DYNAPI_PROC(int,SDL_GetRenderSafeArea,(SDL_Renderer *a, SDL_Rect *b),(a,b),return)
SDL_DYNAPI_PROC(int,SDL_GetRenderScale,(SDL_Renderer *a, float *b, float *c),(a,b,c),return)
SDL_DYNAPI_PROC(SDL_Texture*,SDL_GetRenderTarget,(SDL_Renderer *a),(a),return)
SDL_DYNAPI_PROC(int,SDL_GetRenderVSync,(SDL_Renderer *a, int *b),(a,b),return)

View File

@@ -2999,6 +2999,53 @@ static void GetRenderViewportSize(SDL_Renderer *renderer, SDL_FRect *rect)
}
}
int SDL_GetRenderSafeArea(SDL_Renderer *renderer, SDL_Rect *rect)
{
if (rect) {
SDL_zerop(rect);
}
CHECK_RENDERER_MAGIC(renderer, -1);
if (renderer->target || !renderer->window) {
// The entire viewport is safe for rendering
return SDL_GetRenderViewport(renderer, rect);
}
if (rect) {
// Get the window safe rect
SDL_Rect safe;
if (SDL_GetWindowSafeArea(renderer->window, &safe) < 0) {
return -1;
}
// Convert the coordinates into the render space
float minx = (float)safe.x;
float miny = (float)safe.y;
float maxx = (float)safe.x + safe.w;
float maxy = (float)safe.y + safe.h;
if (SDL_RenderCoordinatesFromWindow(renderer, minx, miny, &minx, &miny) < 0 ||
SDL_RenderCoordinatesFromWindow(renderer, maxx, maxy, &maxx, &maxy) < 0) {
return -1;
}
rect->x = (int)SDL_ceilf(minx);
rect->y = (int)SDL_ceilf(miny);
rect->w = (int)SDL_ceilf(maxx - minx);
rect->h = (int)SDL_ceilf(maxy - miny);
// Clip with the viewport
SDL_Rect viewport;
if (SDL_GetRenderViewport(renderer, &viewport) < 0) {
return -1;
}
if (!SDL_GetRectIntersection(rect, &viewport, rect)) {
return SDL_SetError("No safe area within viewport");
}
}
return 0;
}
int SDL_SetRenderClipRect(SDL_Renderer *renderer, const SDL_Rect *rect)
{
CHECK_RENDERER_MAGIC(renderer, -1)