mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-05 10:58:14 +00:00
Leave letterbox borders set to the frame clear color
Fixes https://github.com/libsdl-org/sdl2-compat/issues/483
This commit is contained in:
@@ -2797,94 +2797,6 @@ bool SDL_GetRenderLogicalPresentationRect(SDL_Renderer *renderer, SDL_FRect *rec
|
||||
return true;
|
||||
}
|
||||
|
||||
static void SDL_RenderLogicalBorders(SDL_Renderer *renderer, const SDL_FRect *dst)
|
||||
{
|
||||
const SDL_RenderViewState *view = renderer->view;
|
||||
|
||||
if (dst->x > 0.0f || dst->y > 0.0f) {
|
||||
SDL_BlendMode saved_blend_mode = renderer->blendMode;
|
||||
SDL_FColor saved_color = renderer->color;
|
||||
|
||||
SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE);
|
||||
SDL_SetRenderDrawColorFloat(renderer, 0.0f, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
if (dst->x > 0.0f) {
|
||||
SDL_FRect rect;
|
||||
|
||||
rect.x = 0.0f;
|
||||
rect.y = 0.0f;
|
||||
rect.w = dst->x;
|
||||
rect.h = (float)view->pixel_h;
|
||||
SDL_RenderFillRect(renderer, &rect);
|
||||
|
||||
rect.x = dst->x + dst->w;
|
||||
rect.w = (float)view->pixel_w - rect.x;
|
||||
SDL_RenderFillRect(renderer, &rect);
|
||||
}
|
||||
|
||||
if (dst->y > 0.0f) {
|
||||
SDL_FRect rect;
|
||||
|
||||
rect.x = 0.0f;
|
||||
rect.y = 0.0f;
|
||||
rect.w = (float)view->pixel_w;
|
||||
rect.h = dst->y;
|
||||
SDL_RenderFillRect(renderer, &rect);
|
||||
|
||||
rect.y = dst->y + dst->h;
|
||||
rect.h = (float)view->pixel_h - rect.y;
|
||||
SDL_RenderFillRect(renderer, &rect);
|
||||
}
|
||||
|
||||
SDL_SetRenderDrawBlendMode(renderer, saved_blend_mode);
|
||||
SDL_SetRenderDrawColorFloat(renderer, saved_color.r, saved_color.g, saved_color.b, saved_color.a);
|
||||
}
|
||||
}
|
||||
|
||||
static void SDL_RenderLogicalPresentation(SDL_Renderer *renderer)
|
||||
{
|
||||
SDL_assert(renderer->view == &renderer->main_view);
|
||||
|
||||
SDL_RenderViewState *view = &renderer->main_view;
|
||||
const SDL_RendererLogicalPresentation mode = view->logical_presentation_mode;
|
||||
if (mode == SDL_LOGICAL_PRESENTATION_LETTERBOX) {
|
||||
// save off some state we're going to trample.
|
||||
const int logical_w = view->logical_w;
|
||||
const int logical_h = view->logical_h;
|
||||
const float scale_x = view->scale.x;
|
||||
const float scale_y = view->scale.y;
|
||||
const bool clipping_enabled = view->clipping_enabled;
|
||||
SDL_Rect orig_viewport, orig_cliprect;
|
||||
const SDL_FRect logical_dst_rect = view->logical_dst_rect;
|
||||
|
||||
SDL_copyp(&orig_viewport, &view->viewport);
|
||||
if (clipping_enabled) {
|
||||
SDL_copyp(&orig_cliprect, &view->clip_rect);
|
||||
}
|
||||
|
||||
// trample some state.
|
||||
SDL_SetRenderLogicalPresentation(renderer, logical_w, logical_h, SDL_LOGICAL_PRESENTATION_DISABLED);
|
||||
SDL_SetRenderViewport(renderer, NULL);
|
||||
if (clipping_enabled) {
|
||||
SDL_SetRenderClipRect(renderer, NULL);
|
||||
}
|
||||
SDL_SetRenderScale(renderer, 1.0f, 1.0f);
|
||||
|
||||
// draw the borders.
|
||||
SDL_RenderLogicalBorders(renderer, &logical_dst_rect);
|
||||
|
||||
// now set everything back.
|
||||
view->logical_presentation_mode = mode;
|
||||
SDL_SetRenderViewport(renderer, &orig_viewport);
|
||||
if (clipping_enabled) {
|
||||
SDL_SetRenderClipRect(renderer, &orig_cliprect);
|
||||
}
|
||||
SDL_SetRenderScale(renderer, scale_x, scale_y);
|
||||
|
||||
SDL_SetRenderLogicalPresentation(renderer, logical_w, logical_h, mode);
|
||||
}
|
||||
}
|
||||
|
||||
static bool SDL_RenderVectorFromWindow(SDL_Renderer *renderer, float window_dx, float window_dy, float *dx, float *dy)
|
||||
{
|
||||
// Convert from window coordinates to pixels within the window
|
||||
@@ -5401,8 +5313,6 @@ bool SDL_RenderPresent(SDL_Renderer *renderer)
|
||||
return SDL_SetError("You can't present on a render target");
|
||||
}
|
||||
|
||||
SDL_RenderLogicalPresentation(renderer);
|
||||
|
||||
if (renderer->transparent_window) {
|
||||
SDL_RenderApplyWindowShape(renderer);
|
||||
}
|
||||
|
Reference in New Issue
Block a user