diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 4a0860a8d..204875e6d 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -4665,6 +4665,7 @@ void OBSBasic::ResizePreview(uint32_t cx, uint32_t cy) obs_get_video_info(&ovi); if (isFixedScaling) { + ui->preview->ClampScrollingOffsets(); previewScale = ui->preview->GetScalingAmount(); GetCenterPosFromFixedScale( int(cx), int(cy), diff --git a/UI/window-basic-preview.cpp b/UI/window-basic-preview.cpp index 852d7d013..091bf8c3f 100644 --- a/UI/window-basic-preview.cpp +++ b/UI/window-basic-preview.cpp @@ -9,6 +9,7 @@ #include "window-basic-main.hpp" #include "obs-app.hpp" #include "platform.hpp" +#include "display-helpers.hpp" #define HANDLE_RADIUS 4.0f #define HANDLE_SEL_RADIUS (HANDLE_RADIUS * 1.5f) @@ -2606,3 +2607,26 @@ void OBSBasicPreview::DrawSpacingHelpers() vec3_set(&end, 1.0f, right.y, 1.0f); RenderSpacingHelper(3, start, end, viewport, pixelRatio); } + +void OBSBasicPreview::ClampScrollingOffsets() +{ + obs_video_info ovi; + obs_get_video_info(&ovi); + + QSize targetSize = GetPixelSize(this); + + vec3 target, offset; + vec3_set(&target, (float)targetSize.width(), (float)targetSize.height(), + 1.0f); + + vec3_set(&offset, (float)ovi.base_width, (float)ovi.base_height, 1.0f); + vec3_mulf(&offset, &offset, scalingAmount); + + vec3_sub(&offset, &offset, &target); + + vec3_mulf(&offset, &offset, 0.5f); + vec3_maxf(&offset, &offset, 0.0f); + + scrollingOffset.x = std::clamp(scrollingOffset.x, -offset.x, offset.x); + scrollingOffset.y = std::clamp(scrollingOffset.y, -offset.y, offset.y); +} diff --git a/UI/window-basic-preview.hpp b/UI/window-basic-preview.hpp index 51c0f851b..132df402a 100644 --- a/UI/window-basic-preview.hpp +++ b/UI/window-basic-preview.hpp @@ -197,4 +197,5 @@ public: int spacerPx[4] = {0}; void DrawSpacingHelpers(); + void ClampScrollingOffsets(); };