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 @@ + + + OpenGL input stretch mode + + + + + + + + + + OpenGL input scale + + + + + + + + + + + + @@ -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) {