chore: make yuzu REUSE compliant
[REUSE] is a specification that aims at making file copyright
information consistent, so that it can be both human and machine
readable. It basically requires that all files have a header containing
copyright and licensing information. When this isn't possible, like
when dealing with binary assets, generated files or embedded third-party
dependencies, it is permitted to insert copyright information in the
`.reuse/dep5` file.
Oh, and it also requires that all the licenses used in the project are
present in the `LICENSES` folder, that's why the diff is so huge.
This can be done automatically with `reuse download --all`.
The `reuse` tool also contains a handy subcommand that analyzes the
project and tells whether or not the project is (still) compliant,
`reuse lint`.
Following REUSE has a few advantages over the current approach:
- Copyright information is easy to access for users / downstream
- Files like `dist/license.md` do not need to exist anymore, as
`.reuse/dep5` is used instead
- `reuse lint` makes it easy to ensure that copyright information of
files like binary assets / images is always accurate and up to date
To add copyright information of files that didn't have it I looked up
who committed what and when, for each file. As yuzu contributors do not
have to sign a CLA or similar I couldn't assume that copyright ownership
was of the "yuzu Emulator Project", so I used the name and/or email of
the commit author instead.
[REUSE]: https://reuse.software
Follow-up to 01cf05bc75b1e47beb08937439f3ed9339e7b254
2022-05-15 00:06:02 +00:00
// SPDX-FileCopyrightText: 2016 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2016-01-24 17:34:05 +00:00
2016-01-24 20:54:04 +00:00
# pragma once
2016-01-24 17:34:05 +00:00
2017-06-24 00:35:17 +00:00
# include <array>
2018-11-04 00:38:39 +00:00
# include <atomic>
2016-09-20 15:21:23 +00:00
# include <vector>
2016-01-24 20:23:55 +00:00
# include <QByteArray>
2019-05-01 21:21:04 +00:00
# include <QMetaType>
2016-01-24 20:23:55 +00:00
# include <QString>
2016-09-18 00:38:01 +00:00
# include <QStringList>
2019-06-07 22:51:58 +00:00
# include <QVector>
2018-08-31 06:16:16 +00:00
# include "common/common_types.h"
2021-06-28 21:32:24 +00:00
# include "common/settings.h"
2023-08-16 02:42:28 +00:00
# include "common/settings_enums.h"
2023-11-12 07:03:01 +00:00
# include "configuration/qt_config.h"
2016-01-24 20:23:55 +00:00
2023-06-06 01:05:22 +00:00
using Settings : : Category ;
2023-08-26 19:23:02 +00:00
using Settings : : ConfirmStop ;
2023-06-06 00:45:33 +00:00
using Settings : : Setting ;
2023-08-26 19:23:02 +00:00
using Settings : : SwitchableSetting ;
2023-06-06 00:45:33 +00:00
2023-06-20 23:26:12 +00:00
# ifndef CANNOT_EXPLICITLY_INSTANTIATE
2023-06-11 03:40:39 +00:00
namespace Settings {
extern template class Setting < bool > ;
extern template class Setting < std : : string > ;
extern template class Setting < u16 , true > ;
extern template class Setting < u32 > ;
extern template class Setting < u8 , true > ;
extern template class Setting < u8 > ;
extern template class Setting < unsigned long long > ;
} // namespace Settings
2023-06-18 23:57:14 +00:00
# endif
2023-06-11 03:40:39 +00:00
2016-01-24 17:34:05 +00:00
namespace UISettings {
2022-04-10 21:04:50 +00:00
bool IsDarkTheme ( ) ;
2021-11-15 23:57:41 +00:00
struct ContextualShortcut {
2023-11-12 07:03:01 +00:00
std : : string keyseq ;
std : : string controller_keyseq ;
2021-11-15 23:57:41 +00:00
int context ;
2023-01-17 23:39:31 +00:00
bool repeat ;
2021-11-15 23:57:41 +00:00
} ;
2019-02-16 15:19:29 +00:00
struct Shortcut {
2023-11-12 07:03:01 +00:00
std : : string name ;
std : : string group ;
2019-02-16 15:19:29 +00:00
ContextualShortcut shortcut ;
} ;
2016-01-24 20:23:55 +00:00
2022-01-17 07:46:30 +00:00
enum class Theme {
Default ,
DefaultColorful ,
Dark ,
DarkColorful ,
MidnightBlue ,
MidnightBlueColorful ,
} ;
2023-11-12 07:03:01 +00:00
static constexpr Theme default_theme {
# ifdef _WIN32
Theme : : DarkColorful
# else
Theme : : DefaultColorful
# endif
} ;
2020-07-18 13:23:20 +00:00
using Themes = std : : array < std : : pair < const char * , const char * > , 6 > ;
2018-10-04 10:33:17 +00:00
extern const Themes themes ;
2018-03-30 09:50:10 +00:00
2019-05-01 21:21:04 +00:00
struct GameDir {
2023-11-12 07:03:01 +00:00
std : : string path ;
2020-08-15 15:14:09 +00:00
bool deep_scan = false ;
bool expanded = false ;
2019-05-01 21:21:04 +00:00
bool operator = = ( const GameDir & rhs ) const {
return path = = rhs . path ;
2020-08-15 15:14:09 +00:00
}
2019-05-01 21:21:04 +00:00
bool operator ! = ( const GameDir & rhs ) const {
return ! operator = = ( rhs ) ;
2020-08-15 15:14:09 +00:00
}
2019-05-01 21:21:04 +00:00
} ;
2016-01-24 17:34:05 +00:00
struct Values {
2023-06-09 20:53:01 +00:00
Settings : : Linkage linkage { 1000 } ;
2023-06-06 01:05:22 +00:00
2016-01-24 20:23:55 +00:00
QByteArray geometry ;
QByteArray state ;
QByteArray renderwindow_geometry ;
QByteArray gamelist_header_state ;
QByteArray microprofile_geometry ;
2023-06-06 01:05:22 +00:00
Setting < bool > microprofile_visible { linkage , false , " microProfileDialogVisible " ,
Category : : UiLayout } ;
Setting < bool > single_window_mode { linkage , true , " singleWindowMode " , Category : : Ui } ;
Setting < bool > fullscreen { linkage , false , " fullscreen " , Category : : Ui } ;
Setting < bool > display_titlebar { linkage , true , " displayTitleBars " , Category : : Ui } ;
Setting < bool > show_filter_bar { linkage , true , " showFilterBar " , Category : : Ui } ;
Setting < bool > show_status_bar { linkage , true , " showStatusBar " , Category : : Ui } ;
2023-08-26 19:23:02 +00:00
SwitchableSetting < ConfirmStop > confirm_before_stopping { linkage ,
ConfirmStop : : Ask_Always ,
" confirmStop " ,
Category : : UiGeneral ,
Settings : : Specialization : : Default ,
true ,
true } ;
2023-06-06 01:05:22 +00:00
Setting < bool > first_start { linkage , true , " firstStart " , Category : : Ui } ;
2023-07-26 03:13:54 +00:00
Setting < bool > pause_when_in_background { linkage ,
false ,
" pauseWhenInBackground " ,
Category : : UiGeneral ,
Settings : : Specialization : : Default ,
true ,
true } ;
2023-11-10 02:11:13 +00:00
Setting < bool > mute_when_in_background { linkage ,
false ,
" muteWhenInBackground " ,
Category : : UiAudio ,
Settings : : Specialization : : Default ,
true ,
true } ;
2023-07-26 03:13:54 +00:00
Setting < bool > hide_mouse {
linkage , true , " hideInactiveMouse " , Category : : UiGeneral , Settings : : Specialization : : Default ,
true , true } ;
2023-06-06 01:05:22 +00:00
Setting < bool > controller_applet_disabled { linkage , false , " disableControllerApplet " ,
2023-05-09 05:35:25 +00:00
Category : : UiGeneral } ;
2022-05-30 02:26:27 +00:00
// Set when Vulkan is known to crash the application
2022-07-10 20:10:35 +00:00
bool has_broken_vulkan = false ;
2016-01-24 20:23:55 +00:00
2023-07-26 03:13:54 +00:00
Setting < bool > select_user_on_boot { linkage ,
false ,
" select_user_on_boot " ,
Category : : UiGeneral ,
Settings : : Specialization : : Default ,
true ,
true } ;
2023-06-06 01:05:22 +00:00
Setting < bool > disable_web_applet { linkage , true , " disable_web_applet " , Category : : Ui } ;
2018-12-25 15:42:02 +00:00
2018-09-16 18:05:51 +00:00
// Discord RPC
2023-06-06 01:05:22 +00:00
Setting < bool > enable_discord_presence { linkage , true , " enable_discord_presence " , Category : : Ui } ;
2018-09-16 18:05:51 +00:00
2023-06-06 00:45:33 +00:00
// logging
2023-06-06 01:05:22 +00:00
Setting < bool > show_console { linkage , false , " showConsole " , Category : : Ui } ;
2023-06-06 00:45:33 +00:00
2023-08-16 02:42:28 +00:00
// Screenshots
2023-06-06 01:05:22 +00:00
Setting < bool > enable_screenshot_save_as { linkage , true , " enable_screenshot_save_as " ,
Category : : Screenshots } ;
2023-08-16 02:42:28 +00:00
Setting < u32 > screenshot_height { linkage , 0 , " screenshot_height " , Category : : Screenshots } ;
2018-08-31 06:16:16 +00:00
2023-11-12 07:03:01 +00:00
std : : string roms_path ;
std : : string symbols_path ;
std : : string game_dir_deprecated ;
2019-05-01 21:21:04 +00:00
bool game_dir_deprecated_deepscan ;
2023-11-12 07:03:01 +00:00
QVector < GameDir > game_dirs ;
2016-01-24 20:23:55 +00:00
QStringList recent_files ;
2023-11-12 07:03:01 +00:00
std : : string language ;
2016-01-24 20:23:55 +00:00
2023-11-12 07:03:01 +00:00
std : : string theme ;
2017-06-24 00:35:17 +00:00
2016-01-24 20:23:55 +00:00
// Shortcut name <Shortcut, context>
std : : vector < Shortcut > shortcuts ;
2017-08-09 00:06:25 +00:00
2023-06-06 01:05:22 +00:00
Setting < u32 > callout_flags { linkage , 0 , " calloutFlags " , Category : : Ui } ;
2018-07-02 17:10:41 +00:00
2021-12-25 19:27:52 +00:00
// multiplayer settings
2023-06-06 01:05:22 +00:00
Setting < std : : string > multiplayer_nickname { linkage , { } , " nickname " , Category : : Multiplayer } ;
Setting < std : : string > multiplayer_ip { linkage , { } , " ip " , Category : : Multiplayer } ;
Setting < u16 , true > multiplayer_port { linkage , 24872 , 0 ,
UINT16_MAX , " port " , Category : : Multiplayer } ;
Setting < std : : string > multiplayer_room_nickname {
linkage , { } , " room_nickname " , Category : : Multiplayer } ;
Setting < std : : string > multiplayer_room_name { linkage , { } , " room_name " , Category : : Multiplayer } ;
Setting < u8 , true > multiplayer_max_player { linkage , 8 , 0 , 8 , " max_player " , Category : : Multiplayer } ;
Setting < u16 , true > multiplayer_room_port { linkage , 24872 , 0 ,
UINT16_MAX , " room_port " , Category : : Multiplayer } ;
Setting < u8 , true > multiplayer_host_type { linkage , 0 , 0 , 1 , " host_type " , Category : : Multiplayer } ;
Setting < unsigned long long > multiplayer_game_id { linkage , { } , " game_id " , Category : : Multiplayer } ;
Setting < std : : string > multiplayer_room_description {
linkage , { } , " room_description " , Category : : Multiplayer } ;
2022-07-15 17:45:35 +00:00
std : : pair < std : : vector < std : : string > , std : : vector < std : : string > > multiplayer_ban_list ;
2021-12-25 19:27:52 +00:00
2018-07-28 16:32:16 +00:00
// Game List
2023-06-06 01:05:22 +00:00
Setting < bool > show_add_ons { linkage , true , " show_add_ons " , Category : : UiGameList } ;
Setting < u32 > game_icon_size { linkage , 64 , " game_icon_size " , Category : : UiGameList } ;
Setting < u32 > folder_icon_size { linkage , 48 , " folder_icon_size " , Category : : UiGameList } ;
Setting < u8 > row_1_text_id { linkage , 3 , " row_1_text_id " , Category : : UiGameList } ;
Setting < u8 > row_2_text_id { linkage , 2 , " row_2_text_id " , Category : : UiGameList } ;
2018-11-04 00:38:39 +00:00
std : : atomic_bool is_game_list_reload_pending { false } ;
2023-06-06 01:05:22 +00:00
Setting < bool > cache_game_list { linkage , true , " cache_game_list " , Category : : UiGameList } ;
Setting < bool > favorites_expanded { linkage , true , " favorites_expanded " , Category : : UiGameList } ;
2021-12-12 20:46:42 +00:00
QVector < u64 > favorited_ids ;
2021-05-17 20:13:39 +00:00
2022-10-19 10:51:51 +00:00
// Compatibility List
2023-06-06 01:05:22 +00:00
Setting < bool > show_compat { linkage , false , " show_compat " , Category : : UiGameList } ;
2022-10-19 10:51:51 +00:00
2022-11-04 06:30:39 +00:00
// Size & File Types Column
2023-06-06 01:05:22 +00:00
Setting < bool > show_size { linkage , true , " show_size " , Category : : UiGameList } ;
Setting < bool > show_types { linkage , true , " show_types " , Category : : UiGameList } ;
2022-11-04 06:30:39 +00:00
2023-08-27 01:19:00 +00:00
// Play time
Setting < bool > show_play_time { linkage , true , " show_play_time " , Category : : UiGameList } ;
2021-05-17 20:13:39 +00:00
bool configuration_applied ;
2021-05-26 00:49:42 +00:00
bool reset_to_defaults ;
2021-07-29 03:02:29 +00:00
bool shortcut_already_warned { false } ;
2016-01-24 20:54:04 +00:00
} ;
2016-01-24 17:34:05 +00:00
2016-01-24 20:54:04 +00:00
extern Values values ;
2020-07-22 14:39:53 +00:00
2023-08-16 02:42:28 +00:00
u32 CalculateWidth ( u32 height , Settings : : AspectRatio ratio ) ;
2023-11-12 07:03:01 +00:00
void SaveWindowState ( ) ;
void RestoreWindowState ( std : : unique_ptr < QtConfig > & qtConfig ) ;
// This shouldn't have anything except static initializers (no functions). So
// QKeySequence(...).toString() is NOT ALLOWED HERE.
// This must be in alphabetical order according to action name as it must have the same order as
// UISetting::values.shortcuts, which is alphabetically ordered.
// clang-format off
const std : : array < Shortcut , 23 > default_hotkeys { {
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Audio Mute/Unmute " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+M " ) , std : : string ( " Home+Dpad_Right " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Audio Volume Down " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " - " ) , std : : string ( " Home+Dpad_Down " ) , Qt : : ApplicationShortcut , true } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Audio Volume Up " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " = " ) , std : : string ( " Home+Dpad_Up " ) , Qt : : ApplicationShortcut , true } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Capture Screenshot " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+P " ) , std : : string ( " Screenshot " ) , Qt : : WidgetWithChildrenShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Change Adapting Filter " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " F8 " ) , std : : string ( " Home+L " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Change Docked Mode " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " F10 " ) , std : : string ( " Home+X " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Change GPU Accuracy " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " F9 " ) , std : : string ( " Home+R " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Continue/Pause Emulation " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " F4 " ) , std : : string ( " Home+Plus " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Exit Fullscreen " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Esc " ) , std : : string ( " " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Exit yuzu " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+Q " ) , std : : string ( " Home+Minus " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Fullscreen " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " F11 " ) , std : : string ( " Home+B " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Load File " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+O " ) , std : : string ( " " ) , Qt : : WidgetWithChildrenShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Load/Remove Amiibo " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " F2 " ) , std : : string ( " Home+A " ) , Qt : : WidgetWithChildrenShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Restart Emulation " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " F6 " ) , std : : string ( " R+Plus+Minus " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Stop Emulation " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " F5 " ) , std : : string ( " L+Plus+Minus " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " TAS Record " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+F7 " ) , std : : string ( " " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " TAS Reset " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+F6 " ) , std : : string ( " " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " TAS Start/Stop " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+F5 " ) , std : : string ( " " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Toggle Filter Bar " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+F " ) , std : : string ( " " ) , Qt : : WindowShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Toggle Framerate Limit " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+U " ) , std : : string ( " Home+Y " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Toggle Mouse Panning " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+F9 " ) , std : : string ( " " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Toggle Renderdoc Capture " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " " ) , std : : string ( " " ) , Qt : : ApplicationShortcut , false } } ,
{ QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Toggle Status Bar " ) ) . toStdString ( ) , QStringLiteral ( QT_TRANSLATE_NOOP ( " Hotkeys " , " Main Window " ) ) . toStdString ( ) , { std : : string ( " Ctrl+S " ) , std : : string ( " " ) , Qt : : WindowShortcut , false } } ,
} } ;
// clang-format on
2018-01-20 07:48:02 +00:00
} // namespace UISettings
2019-05-01 21:21:04 +00:00
Q_DECLARE_METATYPE ( UISettings : : GameDir * ) ;
2023-11-12 07:03:01 +00:00
// These metatype declarations cannot be in common/settings.h because core is devoid of QT
Q_DECLARE_METATYPE ( Settings : : CpuAccuracy ) ;
Q_DECLARE_METATYPE ( Settings : : GpuAccuracy ) ;
Q_DECLARE_METATYPE ( Settings : : FullscreenMode ) ;
Q_DECLARE_METATYPE ( Settings : : NvdecEmulation ) ;
Q_DECLARE_METATYPE ( Settings : : ResolutionSetup ) ;
Q_DECLARE_METATYPE ( Settings : : ScalingFilter ) ;
Q_DECLARE_METATYPE ( Settings : : AntiAliasing ) ;
Q_DECLARE_METATYPE ( Settings : : RendererBackend ) ;
Q_DECLARE_METATYPE ( Settings : : ShaderBackend ) ;
Q_DECLARE_METATYPE ( Settings : : AstcRecompression ) ;
Q_DECLARE_METATYPE ( Settings : : AstcDecodeMode ) ;