From 59592cf03033cc1a73a3dd55cc581c96ce92c0db Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sun, 16 Aug 2015 14:38:56 -0700 Subject: [PATCH] UI: When setting base res, use closest output res When settings the base resolution, try to find the closest output resolution to the old output resolution, and use that for its value. If the aspect ratio is about the same, then don't modify the value. If the aspect ratio is significantly different, then find the closest approximation while keeping with the new aspect ratio. This particular issue has been an annoyance for quite some time. --- obs/window-basic-settings.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/obs/window-basic-settings.cpp b/obs/window-basic-settings.cpp index 957bd5bf7..3814e13c4 100644 --- a/obs/window-basic-settings.cpp +++ b/obs/window-basic-settings.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -788,16 +789,25 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, QString advRescale; QString advRecRescale; QString advFFRescale; + QString oldOutputRes; + string bestScale; + int bestPixelDiff = 0x7FFFFFFF; advRescale = ui->advOutRescale->lineEdit()->text(); advRecRescale = ui->advOutRecRescale->lineEdit()->text(); advFFRescale = ui->advOutFFRescale->lineEdit()->text(); + oldOutputRes = ui->outputResolution->lineEdit()->text(); ui->outputResolution->clear(); ui->advOutRescale->clear(); ui->advOutRecRescale->clear(); ui->advOutFFRescale->clear(); + if (!out_cx || !out_cy) { + out_cx = cx; + out_cy = cy; + } + for (size_t idx = 0; idx < numVals; idx++) { uint32_t downscaleCX = uint32_t(double(cx) / vals[idx]); uint32_t downscaleCY = uint32_t(double(cy) / vals[idx]); @@ -815,11 +825,28 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, ui->advOutRescale->addItem(outRes.c_str()); ui->advOutRecRescale->addItem(outRes.c_str()); ui->advOutFFRescale->addItem(outRes.c_str()); + + /* always try to find the closest output resolution to the + * previously set output resolution */ + int newPixelCount = int(downscaleCX * downscaleCY); + int oldPixelCount = int(out_cx * out_cy); + int diff = abs(newPixelCount - oldPixelCount); + + if (diff < bestPixelDiff) { + bestScale = res; + bestPixelDiff = diff; + } } string res = ResString(cx, cy); - ui->outputResolution->lineEdit()->setText(res.c_str()); + float baseAspect = float(cx) / float(cy); + float outputAspect = float(out_cx) / float(out_cy); + + if (close_float(baseAspect, outputAspect, 0.01f)) + ui->outputResolution->lineEdit()->setText(oldOutputRes); + else + ui->outputResolution->lineEdit()->setText(bestScale.c_str()); if (advRescale.isEmpty()) advRescale = res.c_str();