diff --git a/src/86box.c b/src/86box.c
index 7b67e3ba9..ceb492b7d 100644
--- a/src/86box.c
+++ b/src/86box.c
@@ -234,6 +234,9 @@ int portable_mode = 0; /* We are runn
int monitor_edid = 0; /* (C) Which EDID to use. 0=default, 1=custom. */
char monitor_edid_path[1024] = { 0 }; /* (C) Path to custom EDID */
+double video_gl_input_scale = 1.0; /* (C) OpenGL 3.x input scale */
+int video_gl_input_scale_mode = FULLSCR_SCALE_FULL; /* (C) OpenGL 3.x input stretch mode */
+
// Accelerator key array
struct accelKey acc_keys[NUM_ACCELS];
diff --git a/src/config.c b/src/config.c
index a4c3be03a..a3c2dc0ec 100644
--- a/src/config.c
+++ b/src/config.c
@@ -227,6 +227,9 @@ load_general(void)
video_framerate = ini_section_get_int(cat, "video_gl_framerate", -1);
video_vsync = ini_section_get_int(cat, "video_gl_vsync", 0);
+ video_gl_input_scale = ini_section_get_double(cat, "video_gl_input_scale", 1.0);
+ video_gl_input_scale_mode = ini_section_get_int(cat, "video_gl_input_scale_mode", FULLSCR_SCALE_FULL);
+
window_remember = ini_section_get_int(cat, "window_remember", 0);
if (window_remember) {
p = ini_section_get_string(cat, "window_coordinates", NULL);
@@ -2398,6 +2401,18 @@ save_general(void)
else
ini_section_delete_var(cat, "do_auto_pause");
+ if (video_gl_input_scale != 1.0) {
+ ini_section_set_double(cat, "video_gl_input_scale", video_gl_input_scale);
+ } else {
+ ini_section_delete_var(cat, "video_gl_input_scale");
+ }
+
+ if (video_gl_input_scale_mode != FULLSCR_SCALE_FULL) {
+ ini_section_set_int(cat, "video_gl_input_scale_mode", video_gl_input_scale_mode);
+ } else {
+ ini_section_delete_var(cat, "video_gl_input_scale_mode");
+ }
+
if (force_constant_mouse)
ini_section_set_int(cat, "force_constant_mouse", force_constant_mouse);
else
diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h
index 8696cbabd..08def802b 100644
--- a/src/include/86box/86box.h
+++ b/src/include/86box/86box.h
@@ -140,6 +140,8 @@ extern int force_43; /* (C) video */
extern int video_filter_method; /* (C) video */
extern int video_vsync; /* (C) video */
extern int video_framerate; /* (C) video */
+extern double video_gl_input_scale; /* (C) OpenGL 3.x input scale */
+extern int video_gl_input_scale_mode; /* (C) OpenGL 3.x input stretch mode */
extern int gfxcard[GFXCARD_MAX]; /* (C) graphics/video card */
extern int bugger_enabled; /* (C) enable ISAbugger */
extern int novell_keycard_enabled; /* (C) enable Novell NetWare 2.x key card emulation. */
diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot
index 3ff75e6e4..311823406 100644
--- a/src/qt/languages/86box.pot
+++ b/src/qt/languages/86box.pot
@@ -2966,3 +2966,9 @@ msgstr ""
msgid "EDID file \"%ls\" is too large."
msgstr ""
+
+msgid "OpenGL input scale"
+msgstr ""
+
+msgid "OpenGL input stretch mode"
+msgstr ""
diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po
index 662c11e96..73b411bc3 100644
--- a/src/qt/languages/cs-CZ.po
+++ b/src/qt/languages/cs-CZ.po
@@ -2966,3 +2966,9 @@ msgstr "Exportovat EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "Soubor EDID \"%ls\" je příliš velký."
+
+msgid "OpenGL input scale"
+msgstr "Vstupní měřítko OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "režim roztažení vstupu OpenGL"
diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po
index b790c0c46..a6ee1e4bf 100644
--- a/src/qt/languages/de-DE.po
+++ b/src/qt/languages/de-DE.po
@@ -2966,3 +2966,9 @@ msgstr "EDID exportieren"
msgid "EDID file \"%ls\" is too large."
msgstr "Die EDID-Datei \"%ls\" ist zu groß."
+
+msgid "OpenGL input scale"
+msgstr "Eingabeskala von OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Eingabestreckungsmodus von OpenGL"
diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po
index 712128dd3..30de73b5f 100644
--- a/src/qt/languages/es-ES.po
+++ b/src/qt/languages/es-ES.po
@@ -2966,3 +2966,9 @@ msgstr "EDID exportieren"
msgid "EDID file \"%ls\" is too large."
msgstr "El archivo EDID \"%ls\" es demasiado grande."
+
+msgid "OpenGL input scale"
+msgstr "Escala de entrada de OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Modo de estiramiento de entrada de OpenGL"
diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po
index 225acf8b8..c60d7ed1b 100644
--- a/src/qt/languages/fi-FI.po
+++ b/src/qt/languages/fi-FI.po
@@ -2966,3 +2966,9 @@ msgstr "Vie EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "EDID-tiedosto \"%ls\" on liian suuri."
+
+msgid "OpenGL input scale"
+msgstr "OpenGL:n syöttöasteikko"
+
+msgid "OpenGL input stretch mode"
+msgstr "OpenGL:n syötteen venytystila"
diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po
index c1e6b832d..3cd813abc 100644
--- a/src/qt/languages/fr-FR.po
+++ b/src/qt/languages/fr-FR.po
@@ -2966,3 +2966,9 @@ msgstr "Exporter l'EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "Le fichier EDID \"%ls\" est trop volumineux."
+
+msgid "OpenGL input scale"
+msgstr "Échelle d'entrée d'OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Mode d'étirement des données d'entrée d'OpenGL"
diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po
index 0a76f5a82..eb710d6c0 100644
--- a/src/qt/languages/hr-HR.po
+++ b/src/qt/languages/hr-HR.po
@@ -2966,3 +2966,9 @@ msgstr "Izvoz EDID-a"
msgid "EDID file \"%ls\" is too large."
msgstr "EDID datoteka \"%ls\" je prevelika."
+
+msgid "OpenGL input scale"
+msgstr "Ulazna skala OpenGL-a"
+
+msgid "OpenGL input stretch mode"
+msgstr "Način rastezanja ulaza u OpenGL-u"
diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po
index 506047165..dff108c9a 100644
--- a/src/qt/languages/it-IT.po
+++ b/src/qt/languages/it-IT.po
@@ -2966,3 +2966,9 @@ msgstr "Esporta EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "Il file EDID \"%ls\" è troppo grande."
+
+msgid "OpenGL input scale"
+msgstr "Scala di input di OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Modalità di allungamento dell'input di OpenGL"
diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po
index f33a9e968..7baf689b4 100644
--- a/src/qt/languages/ja-JP.po
+++ b/src/qt/languages/ja-JP.po
@@ -2966,3 +2966,9 @@ msgstr "EDIDのエクスポート"
msgid "EDID file \"%ls\" is too large."
msgstr "EDIDファイル \"%ls\" が大きすぎます。"
+
+msgid "OpenGL input scale"
+msgstr "OpenGLの入力スケール"
+
+msgid "OpenGL input stretch mode"
+msgstr "OpenGLの入力ストレッチモード"
diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po
index f55243c48..fc4e504b6 100644
--- a/src/qt/languages/ko-KR.po
+++ b/src/qt/languages/ko-KR.po
@@ -2966,3 +2966,9 @@ msgstr "EDID 내보내기"
msgid "EDID file \"%ls\" is too large."
msgstr "EDID 파일 \"%ls\"가 너무 큽니다."
+
+msgid "OpenGL input scale"
+msgstr "OpenGL 입력 스케일"
+
+msgid "OpenGL input stretch mode"
+msgstr "OpenGL 입력 스트레치 모드"
diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po
index b7af957a6..cb9a49d4d 100644
--- a/src/qt/languages/nb-NO.po
+++ b/src/qt/languages/nb-NO.po
@@ -2966,3 +2966,9 @@ msgstr "Eksporter EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "EDID-filen \"%ls\" er for stor."
+
+msgid "OpenGL input scale"
+msgstr "Inngangsskala for OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Inngangsstrekkmodus for OpenGL"
diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po
index 345323e38..4a037b4fa 100644
--- a/src/qt/languages/nl-NL.po
+++ b/src/qt/languages/nl-NL.po
@@ -2966,3 +2966,9 @@ msgstr "EDID exporteren"
msgid "EDID file \"%ls\" is too large."
msgstr "Het EDID-bestand \"%ls\" is te groot."
+
+msgid "OpenGL input scale"
+msgstr "Invoerschaal van OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Input stretch-modus van OpenGL"
diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po
index a6e7fc8a5..c1a6de758 100644
--- a/src/qt/languages/pl-PL.po
+++ b/src/qt/languages/pl-PL.po
@@ -2966,3 +2966,9 @@ msgstr "Eksportuj EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "Plik EDID \"%ls\" jest zbyt duży."
+
+msgid "OpenGL input scale"
+msgstr "Skala wejściowa OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Tryb rozciągania wejściowego OpenGL"
diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po
index 10b079a09..ff7bfd061 100644
--- a/src/qt/languages/pt-BR.po
+++ b/src/qt/languages/pt-BR.po
@@ -2966,3 +2966,9 @@ msgstr "Exportar EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "O arquivo EDID \"%ls\" é muito grande."
+
+msgid "OpenGL input scale"
+msgstr "Escala de entrada do OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Modo de expansão de entrada do OpenGL"
diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po
index d9abb9ac6..1c5777441 100644
--- a/src/qt/languages/pt-PT.po
+++ b/src/qt/languages/pt-PT.po
@@ -2966,3 +2966,9 @@ msgstr "Exportar EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "O ficheiro EDID \"%ls\" é demasiado grande."
+
+msgid "OpenGL input scale"
+msgstr "Escala de entrada do OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Modo de expansão de entrada do OpenGL"
diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po
index b9eb7d25c..d7628f368 100644
--- a/src/qt/languages/ru-RU.po
+++ b/src/qt/languages/ru-RU.po
@@ -2966,3 +2966,9 @@ msgstr "Экспорт EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "Файл EDID \"%ls\" слишком велик."
+
+msgid "OpenGL input scale"
+msgstr "Масштаб ввода OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Режим растяжения ввода OpenGL"
diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po
index cac5cc081..65a5c0eae 100644
--- a/src/qt/languages/sk-SK.po
+++ b/src/qt/languages/sk-SK.po
@@ -2966,3 +2966,9 @@ msgstr "Exportovať EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "Súbor EDID \"%ls\" je príliš veľký."
+
+msgid "OpenGL input scale"
+msgstr "Vstupná stupnica OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Režim rozťahovania vstupu OpenGL"
diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po
index 0f85bb3ce..ed9b96d75 100644
--- a/src/qt/languages/sl-SI.po
+++ b/src/qt/languages/sl-SI.po
@@ -2966,3 +2966,9 @@ msgstr "Izvoz EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "Datoteka EDID \"%ls\" je prevelika."
+
+msgid "OpenGL input scale"
+msgstr "Vhodna lestvica OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Način raztezanja vhoda OpenGL"
diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po
index 10655e430..4d5ee20d1 100644
--- a/src/qt/languages/sv-SE.po
+++ b/src/qt/languages/sv-SE.po
@@ -2966,3 +2966,9 @@ msgstr "Exportera EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "EDID-filen \"%ls\" är för stor."
+
+msgid "OpenGL input scale"
+msgstr "Inmatningsskala för OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Inmatningssträckningsläge för OpenGL"
diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po
index 8a52346db..fa262213a 100644
--- a/src/qt/languages/tr-TR.po
+++ b/src/qt/languages/tr-TR.po
@@ -2966,3 +2966,9 @@ msgstr "EDID'i dışa aktar"
msgid "EDID file \"%ls\" is too large."
msgstr "EDID dosyası \"%ls\" çok büyük."
+
+msgid "OpenGL input scale"
+msgstr "OpenGL'nin giriş ölçeği"
+
+msgid "OpenGL input stretch mode"
+msgstr "OpenGL'nin giriş germe modu"
diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po
index 70307d446..e0ddeb6b4 100644
--- a/src/qt/languages/uk-UA.po
+++ b/src/qt/languages/uk-UA.po
@@ -2966,3 +2966,9 @@ msgstr "Експорт EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "Файл EDID \"%ls\" занадто великий."
+
+msgid "OpenGL input scale"
+msgstr "Шкала введення OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Режим розтягування вхідних даних OpenGL"
diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po
index 97043bbc1..abd8725c3 100644
--- a/src/qt/languages/vi-VN.po
+++ b/src/qt/languages/vi-VN.po
@@ -2966,3 +2966,9 @@ msgstr "Xuất khẩu EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "Tệp EDID \"%ls\" quá lớn."
+
+msgid "OpenGL input scale"
+msgstr "Độ phân giải đầu vào của OpenGL"
+
+msgid "OpenGL input stretch mode"
+msgstr "Chế độ kéo giãn đầu vào của OpenGL"
diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po
index 1b36b9850..fccf2416f 100644
--- a/src/qt/languages/zh-CN.po
+++ b/src/qt/languages/zh-CN.po
@@ -2966,3 +2966,9 @@ msgstr "导出EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "EDID文件 \"%ls\" 过大。"
+
+msgid "OpenGL input scale"
+msgstr "OpenGL的输入比例"
+
+msgid "OpenGL input stretch mode"
+msgstr "OpenGL的输入拉伸模式"
diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po
index 8294be218..52448c269 100644
--- a/src/qt/languages/zh-TW.po
+++ b/src/qt/languages/zh-TW.po
@@ -2966,3 +2966,9 @@ msgstr "匯出 EDID"
msgid "EDID file \"%ls\" is too large."
msgstr "EDID 檔案 \"%ls\" 太大。"
+
+msgid "OpenGL input scale"
+msgstr "OpenGL 的輸入比例"
+
+msgid "OpenGL input stretch mode"
+msgstr "OpenGL 的輸入拉伸模式"
diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp
index f345a15c4..2f644a8ce 100644
--- a/src/qt/qt_mainwindow.cpp
+++ b/src/qt/qt_mainwindow.cpp
@@ -530,6 +530,8 @@ MainWindow::MainWindow(QWidget *parent)
#endif
}
ui->stackedWidget->switchRenderer(newVidApi);
+ ui->menuOpenGL_input_scale->setEnabled(newVidApi == RendererStack::Renderer::OpenGL3);
+ ui->menuOpenGL_input_stretch_mode->setEnabled(newVidApi == RendererStack::Renderer::OpenGL3);
if (!show_second_monitors)
return;
for (int i = 1; i < MONITORS_NUM; i++) {
@@ -550,6 +552,41 @@ MainWindow::MainWindow(QWidget *parent)
break;
}
+ ui->action_0_5x_2->setChecked(video_gl_input_scale < 1.0);
+ ui->action_1x_2->setChecked(video_gl_input_scale >= 1.0 && video_gl_input_scale < 1.5);
+ ui->action1_5x_2->setChecked(video_gl_input_scale >= 1.5 && video_gl_input_scale < 2.0);
+ ui->action_2x_2->setChecked(video_gl_input_scale >= 2.0 && video_gl_input_scale < 3.0);
+ ui->action_3x_2->setChecked(video_gl_input_scale >= 3.0 && video_gl_input_scale < 4.0);
+ ui->action_4x_2->setChecked(video_gl_input_scale >= 4.0 && video_gl_input_scale < 5.0);
+ ui->action_5x_2->setChecked(video_gl_input_scale >= 5.0 && video_gl_input_scale < 6.0);
+ ui->action_6x_2->setChecked(video_gl_input_scale >= 6.0 && video_gl_input_scale < 7.0);
+ ui->action_7x_2->setChecked(video_gl_input_scale >= 7.0 && video_gl_input_scale < 8.0);
+ ui->action_8x_2->setChecked(video_gl_input_scale >= 8.0);
+
+ actGroup = new QActionGroup(this);
+ actGroup->addAction(ui->action_0_5x_2);
+ actGroup->addAction(ui->action_1x_2);
+ actGroup->addAction(ui->action1_5x_2);
+ actGroup->addAction(ui->action_2x_2);
+ actGroup->addAction(ui->action_3x_2);
+ actGroup->addAction(ui->action_4x_2);
+ actGroup->addAction(ui->action_5x_2);
+ actGroup->addAction(ui->action_6x_2);
+ actGroup->addAction(ui->action_7x_2);
+ actGroup->addAction(ui->action_8x_2);
+ connect(actGroup, &QActionGroup::triggered, this, [this](QAction* action) {
+ if (action == ui->action_0_5x_2) video_gl_input_scale = 0.5;
+ if (action == ui->action_1x_2) video_gl_input_scale = 1;
+ if (action == ui->action1_5x_2) video_gl_input_scale = 1.5;
+ if (action == ui->action_2x_2) video_gl_input_scale = 2;
+ if (action == ui->action_3x_2) video_gl_input_scale = 3;
+ if (action == ui->action_4x_2) video_gl_input_scale = 4;
+ if (action == ui->action_5x_2) video_gl_input_scale = 5;
+ if (action == ui->action_6x_2) video_gl_input_scale = 6;
+ if (action == ui->action_7x_2) video_gl_input_scale = 7;
+ if (action == ui->action_8x_2) video_gl_input_scale = 8;
+ });
+
switch (scale) {
default:
break;
@@ -633,6 +670,38 @@ MainWindow::MainWindow(QWidget *parent)
actGroup->addAction(ui->actionFullScreen_keepRatio);
actGroup->addAction(ui->actionFullScreen_int);
actGroup->addAction(ui->actionFullScreen_int43);
+ switch (video_gl_input_scale_mode) {
+ default:
+ break;
+ case FULLSCR_SCALE_FULL:
+ ui->action_Full_screen_stretch_gl->setChecked(true);
+ break;
+ case FULLSCR_SCALE_43:
+ ui->action_4_3_gl->setChecked(true);
+ break;
+ case FULLSCR_SCALE_KEEPRATIO:
+ ui->action_Square_pixels_keep_ratio_gl->setChecked(true);
+ break;
+ case FULLSCR_SCALE_INT:
+ ui->action_Integer_scale_gl->setChecked(true);
+ break;
+ case FULLSCR_SCALE_INT43:
+ ui->action4_3_Integer_scale_gl->setChecked(true);
+ break;
+ }
+ actGroup = new QActionGroup(this);
+ actGroup->addAction(ui->action_Full_screen_stretch_gl);
+ actGroup->addAction(ui->action_4_3_gl);
+ actGroup->addAction(ui->action_Square_pixels_keep_ratio_gl);
+ actGroup->addAction(ui->action_Integer_scale_gl);
+ actGroup->addAction(ui->action4_3_Integer_scale_gl);
+ connect(actGroup, &QActionGroup::triggered, this, [this](QAction* action) {
+ if (action == ui->action_Full_screen_stretch_gl) video_gl_input_scale_mode = FULLSCR_SCALE_FULL;
+ if (action == ui->action_4_3_gl) video_gl_input_scale_mode = FULLSCR_SCALE_43;
+ if (action == ui->action_Square_pixels_keep_ratio_gl) video_gl_input_scale_mode = FULLSCR_SCALE_KEEPRATIO;
+ if (action == ui->action_Integer_scale_gl) video_gl_input_scale_mode = FULLSCR_SCALE_INT;
+ if (action == ui->action4_3_Integer_scale_gl) video_gl_input_scale_mode = FULLSCR_SCALE_INT43;
+ });
switch (video_grayscale) {
default:
break;
@@ -1714,6 +1783,21 @@ MainWindow::on_actionInverted_VGA_monitor_triggered()
video_toggle_option(ui->actionInverted_VGA_monitor, &invert_display);
}
+static void
+update_scaled_checkboxes_gl(Ui::MainWindow *ui, QAction *selected)
+{
+ ui->action_0_5x_2->setChecked(ui->action_0_5x_2 == selected);
+ ui->action_1x_2->setChecked(ui->action_1x_2 == selected);
+ ui->action1_5x_2->setChecked(ui->action1_5x_2 == selected);
+ ui->action_2x_2->setChecked(ui->action_2x_2 == selected);
+ ui->action_3x_2->setChecked(ui->action_3x_2 == selected);
+ ui->action_4x_2->setChecked(ui->action_4x_2 == selected);
+ ui->action_5x_2->setChecked(ui->action_5x_2 == selected);
+ ui->action_6x_2->setChecked(ui->action_6x_2 == selected);
+ ui->action_7x_2->setChecked(ui->action_7x_2 == selected);
+ ui->action_8x_2->setChecked(ui->action_8x_2 == selected);
+}
+
static void
update_scaled_checkboxes(Ui::MainWindow *ui, QAction *selected)
{
diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui
index 5ad597459..9c719cba6 100644
--- a/src/qt/qt_mainwindow.ui
+++ b/src/qt/qt_mainwindow.ui
@@ -186,6 +186,31 @@
+
+
@@ -195,6 +220,8 @@
+
+
@@ -894,6 +921,134 @@
&CGA composite settings...
+
+
+ true
+
+
+ &Full screen stretch
+
+
+
+
+ true
+
+
+ &4:3
+
+
+
+
+ true
+
+
+ &Square pixels (keep ratio)
+
+
+
+
+ true
+
+
+ &Integer scale
+
+
+
+
+ true
+
+
+ 4:&3 Integer scale
+
+
+
+
+ true
+
+
+ &1x
+
+
+
+
+ true
+
+
+ &0.5x
+
+
+
+
+ true
+
+
+ &1x
+
+
+
+
+ true
+
+
+ 1.&5x
+
+
+
+
+ true
+
+
+ &2x
+
+
+
+
+ true
+
+
+ &3x
+
+
+
+
+ true
+
+
+ &4x
+
+
+
+
+ true
+
+
+ &5x
+
+
+
+
+ true
+
+
+ &6x
+
+
+
+
+ true
+
+
+ &7x
+
+
+
+
+ true
+
+
+ &8x
+
+
diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp
index 4ec091eb2..cecc8ea9c 100644
--- a/src/qt/qt_openglrenderer.cpp
+++ b/src/qt/qt_openglrenderer.cpp
@@ -1386,6 +1386,8 @@ OpenGLRenderer::getOptions(QWidget *parent)
return new OpenGLShaderManagerDialog(parent);
}
+extern void standalone_scale(QRect &destination, int width, int height, QRect source, int scalemode);
+
void
OpenGLRenderer::render()
{
@@ -1428,19 +1430,16 @@ OpenGLRenderer::render()
{
struct shader_pass *pass = &active_shader->scene;
- struct {
- uint32_t x;
- uint32_t y;
- uint32_t w;
- uint32_t h;
- } rect;
- rect.x = 0;
- rect.y = 0;
- rect.w = source.width();
- rect.h = source.height();
+ QRect rect;
+ rect.setX(0);
+ rect.setY(0);
+ rect.setWidth(source.width() * video_gl_input_scale);
+ rect.setHeight(source.height() * video_gl_input_scale);
- pass->state.input_size[0] = pass->state.output_size[0] = rect.w;
- pass->state.input_size[1] = pass->state.output_size[1] = rect.h;
+ standalone_scale(rect, source.width(), source.height(), rect, video_gl_input_scale_mode);
+
+ pass->state.input_size[0] = pass->state.output_size[0] = rect.width();
+ pass->state.input_size[1] = pass->state.output_size[1] = rect.height();
pass->state.input_texture_size[0] = pass->state.output_texture_size[0] = next_pow2(pass->state.output_size[0]);
pass->state.input_texture_size[1] = pass->state.output_texture_size[1] = next_pow2(pass->state.output_size[1]);
diff --git a/src/qt/qt_renderercommon.cpp b/src/qt/qt_renderercommon.cpp
index 56217b611..b71e19e75 100644
--- a/src/qt/qt_renderercommon.cpp
+++ b/src/qt/qt_renderercommon.cpp
@@ -49,6 +49,73 @@ integer_scale(double *d, double *g)
}
}
+void
+standalone_scale(QRect &destination, int width, int height, QRect source, int scalemode)
+{
+ double dx;
+ double dy;
+ double dw;
+ double dh;
+ double gsr;
+
+ double hw = width;
+ double hh = height;
+ double gw = source.width();
+ double gh = source.height();
+ double hsr = hw / hh;
+ double r43 = 4.0 / 3.0;
+
+ switch (scalemode) {
+ case FULLSCR_SCALE_INT:
+ case FULLSCR_SCALE_INT43:
+ gsr = gw / gh;
+
+ if (scalemode == FULLSCR_SCALE_INT43) {
+ gh = gw / r43;
+
+ gsr = r43;
+ }
+
+ if (gsr <= hsr) {
+ dw = hh * gsr;
+ dh = hh;
+ } else {
+ dw = hw;
+ dh = hw / gsr;
+ }
+
+ integer_scale(&dw, &gw);
+ integer_scale(&dh, &gh);
+
+ dx = (hw - dw) / 2.0;
+ dy = (hh - dh) / 2.0;
+ destination.setRect((int) dx, (int) dy, (int) dw, (int) dh);
+ break;
+ case FULLSCR_SCALE_43:
+ case FULLSCR_SCALE_KEEPRATIO:
+ if (scalemode == FULLSCR_SCALE_43)
+ gsr = r43;
+ else
+ gsr = gw / gh;
+
+ if (gsr <= hsr) {
+ dw = hh * gsr;
+ dh = hh;
+ } else {
+ dw = hw;
+ dh = hw / gsr;
+ }
+ dx = (hw - dw) / 2.0;
+ dy = (hh - dh) / 2.0;
+ destination.setRect((int) dx, (int) dy, (int) dw, (int) dh);
+ break;
+ case FULLSCR_SCALE_FULL:
+ default:
+ destination.setRect(0, 0, (int) hw, (int) hh);
+ break;
+ }
+}
+
void
RendererCommon::onResize(int width, int height)
{