From 454cf75b8737fc331837f757cff41582207dcfcd Mon Sep 17 00:00:00 2001 From: djonker Date: Tue, 5 Mar 2024 04:20:25 +0100 Subject: [PATCH] save --- CMakeLists.txt | 732 + CMakeModules/CopyYuzuFFmpegDeps.cmake | 10 + CMakeModules/CopyYuzuQt5Deps.cmake | 125 + CMakeModules/CopyYuzuSDLDeps.cmake | 8 + CMakeModules/DownloadExternals.cmake | 56 + CMakeModules/FindDiscordRPC.cmake | 27 + CMakeModules/FindFFmpeg.cmake | 195 + CMakeModules/FindLLVM.cmake | 26 + CMakeModules/FindOpus.cmake | 15 + CMakeModules/FindRenderDoc.cmake | 19 + CMakeModules/FindSimpleIni.cmake | 21 + CMakeModules/Findenet.cmake | 16 + CMakeModules/Findgamemode.cmake | 15 + CMakeModules/Findhttplib.cmake | 31 + CMakeModules/Findlibusb.cmake | 16 + CMakeModules/Findlz4.cmake | 26 + CMakeModules/Findstb.cmake | 31 + CMakeModules/Findzstd.cmake | 26 + CMakeModules/GenerateSCMRev.cmake | 56 + CMakeModules/MSVCCache.cmake | 15 + CMakeModules/MinGWClangCross.cmake | 58 + CMakeModules/MinGWCross.cmake | 57 + CMakeModules/WindowsCopyFiles.cmake | 27 + CONTRIBUTING.md | 6 + Doxyfile | 2372 ++ LICENSE.txt | 674 + LICENSES/Apache-2.0.txt | 73 + LICENSES/BSD-2-Clause.txt | 9 + LICENSES/BSD-3-Clause.txt | 11 + LICENSES/BSL-1.0.txt | 7 + LICENSES/CC-BY-4.0.txt | 156 + LICENSES/CC-BY-SA-3.0.txt | 359 + LICENSES/CC0-1.0.txt | 121 + LICENSES/GPL-2.0-or-later.txt | 117 + LICENSES/GPL-3.0-or-later.txt | 232 + LICENSES/LGPL-3.0-or-later.txt | 304 + LICENSES/LLVM-exception.txt | 15 + LICENSES/MIT.txt | 9 + LICENSES/MPL-2.0.txt | 373 + LICENSES/Unlicense.txt | 10 + LICENSES/WTFPL.txt | 11 + LICENSES/Zlib.txt | 11 + README.md | 88 + dist/72-yuzu-input.rules | 19 + .../compatibility_list/compatibility_list.qrc | 10 + dist/english_plurals/README.md | 19 + dist/english_plurals/en.ts | 67 + dist/icons/controller/applet_dual_joycon.png | Bin 0 -> 3554 bytes .../controller/applet_dual_joycon_dark.png | Bin 0 -> 3554 bytes .../applet_dual_joycon_dark_disabled.png | Bin 0 -> 3527 bytes .../applet_dual_joycon_disabled.png | Bin 0 -> 3314 bytes .../applet_dual_joycon_midnight.png | Bin 0 -> 3549 bytes .../applet_dual_joycon_midnight_disabled.png | Bin 0 -> 3584 bytes dist/icons/controller/applet_handheld.png | Bin 0 -> 1671 bytes .../icons/controller/applet_handheld_dark.png | Bin 0 -> 1637 bytes .../applet_handheld_dark_disabled.png | Bin 0 -> 2642 bytes .../controller/applet_handheld_disabled.png | Bin 0 -> 2221 bytes .../controller/applet_handheld_midnight.png | Bin 0 -> 1644 bytes .../applet_handheld_midnight_disabled.png | Bin 0 -> 2634 bytes .../controller/applet_pro_controller.png | Bin 0 -> 4382 bytes .../controller/applet_pro_controller_dark.png | Bin 0 -> 4236 bytes .../applet_pro_controller_dark_disabled.png | Bin 0 -> 2712 bytes .../applet_pro_controller_disabled.png | Bin 0 -> 2630 bytes .../applet_pro_controller_midnight.png | Bin 0 -> 4376 bytes ...pplet_pro_controller_midnight_disabled.png | Bin 0 -> 2774 bytes .../controller/applet_single_joycon_left.png | Bin 0 -> 2083 bytes .../applet_single_joycon_left_dark.png | Bin 0 -> 2067 bytes ...pplet_single_joycon_left_dark_disabled.png | Bin 0 -> 2520 bytes .../applet_single_joycon_left_disabled.png | Bin 0 -> 2179 bytes .../applet_single_joycon_left_midnight.png | Bin 0 -> 2065 bytes ...t_single_joycon_left_midnight_disabled.png | Bin 0 -> 2529 bytes .../controller/applet_single_joycon_right.png | Bin 0 -> 2150 bytes .../applet_single_joycon_right_dark.png | Bin 0 -> 2146 bytes ...plet_single_joycon_right_dark_disabled.png | Bin 0 -> 2556 bytes .../applet_single_joycon_right_disabled.png | Bin 0 -> 2212 bytes .../applet_single_joycon_right_midnight.png | Bin 0 -> 2150 bytes ..._single_joycon_right_midnight_disabled.png | Bin 0 -> 2611 bytes dist/icons/controller/controller.qrc | 39 + dist/icons/overlay/arrow_left.png | Bin 0 -> 1490 bytes dist/icons/overlay/arrow_left_dark.png | Bin 0 -> 712 bytes dist/icons/overlay/arrow_right.png | Bin 0 -> 1394 bytes dist/icons/overlay/arrow_right_dark.png | Bin 0 -> 683 bytes dist/icons/overlay/button_A.png | Bin 0 -> 1647 bytes dist/icons/overlay/button_A_dark.png | Bin 0 -> 3167 bytes dist/icons/overlay/button_B.png | Bin 0 -> 1534 bytes dist/icons/overlay/button_B_dark.png | Bin 0 -> 2975 bytes dist/icons/overlay/button_L.png | Bin 0 -> 796 bytes dist/icons/overlay/button_L_dark.png | Bin 0 -> 745 bytes dist/icons/overlay/button_R.png | Bin 0 -> 1841 bytes dist/icons/overlay/button_R_dark.png | Bin 0 -> 1835 bytes dist/icons/overlay/button_X.png | Bin 0 -> 1748 bytes dist/icons/overlay/button_X_dark.png | Bin 0 -> 3530 bytes dist/icons/overlay/button_Y.png | Bin 0 -> 1504 bytes dist/icons/overlay/button_Y_dark.png | Bin 0 -> 2883 bytes dist/icons/overlay/button_minus.png | Bin 0 -> 2401 bytes dist/icons/overlay/button_minus_dark.png | Bin 0 -> 1969 bytes dist/icons/overlay/button_plus.png | Bin 0 -> 2497 bytes dist/icons/overlay/button_plus_dark.png | Bin 0 -> 2066 bytes dist/icons/overlay/button_press_stick.png | Bin 0 -> 2477 bytes .../icons/overlay/button_press_stick_dark.png | Bin 0 -> 3636 bytes dist/icons/overlay/controller_dual_joycon.png | Bin 0 -> 3475 bytes .../overlay/controller_dual_joycon_dark.png | Bin 0 -> 3107 bytes dist/icons/overlay/controller_handheld.png | Bin 0 -> 2250 bytes .../overlay/controller_handheld_dark.png | Bin 0 -> 2000 bytes dist/icons/overlay/controller_pro.png | Bin 0 -> 4531 bytes dist/icons/overlay/controller_pro_dark.png | Bin 0 -> 4531 bytes .../overlay/controller_single_joycon_left.png | Bin 0 -> 3605 bytes .../controller_single_joycon_left_a.png | Bin 0 -> 2609 bytes .../controller_single_joycon_left_a_dark.png | Bin 0 -> 2564 bytes .../controller_single_joycon_left_b.png | Bin 0 -> 2559 bytes .../controller_single_joycon_left_b_dark.png | Bin 0 -> 2383 bytes .../controller_single_joycon_left_dark.png | Bin 0 -> 3447 bytes .../controller_single_joycon_left_x.png | Bin 0 -> 2541 bytes .../controller_single_joycon_left_x_dark.png | Bin 0 -> 2392 bytes .../controller_single_joycon_left_y.png | Bin 0 -> 2641 bytes .../controller_single_joycon_left_y_dark.png | Bin 0 -> 1035 bytes .../controller_single_joycon_right.png | Bin 0 -> 3603 bytes .../controller_single_joycon_right_dark.png | Bin 0 -> 3406 bytes dist/icons/overlay/osk_button_B.png | Bin 0 -> 2653 bytes dist/icons/overlay/osk_button_B_dark.png | Bin 0 -> 2721 bytes .../overlay/osk_button_B_dark_disabled.png | Bin 0 -> 2689 bytes dist/icons/overlay/osk_button_B_disabled.png | Bin 0 -> 2694 bytes dist/icons/overlay/osk_button_Y.png | Bin 0 -> 2695 bytes dist/icons/overlay/osk_button_Y_dark.png | Bin 0 -> 2073 bytes .../overlay/osk_button_Y_dark_disabled.png | Bin 0 -> 2631 bytes dist/icons/overlay/osk_button_Y_disabled.png | Bin 0 -> 2647 bytes dist/icons/overlay/osk_button_backspace.png | Bin 0 -> 1272 bytes .../overlay/osk_button_backspace_dark.png | Bin 0 -> 1262 bytes dist/icons/overlay/osk_button_plus.png | Bin 0 -> 2226 bytes dist/icons/overlay/osk_button_plus_dark.png | Bin 0 -> 2288 bytes .../overlay/osk_button_plus_dark_disabled.png | Bin 0 -> 2233 bytes .../overlay/osk_button_plus_disabled.png | Bin 0 -> 2254 bytes dist/icons/overlay/osk_button_shift.png | Bin 0 -> 1876 bytes dist/icons/overlay/osk_button_shift_dark.png | Bin 0 -> 2003 bytes .../overlay/osk_button_shift_lock_off.png | Bin 0 -> 936 bytes .../overlay/osk_button_shift_lock_on.png | Bin 0 -> 894 bytes dist/icons/overlay/osk_button_shift_on.png | Bin 0 -> 1573 bytes .../overlay/osk_button_shift_on_dark.png | Bin 0 -> 1937 bytes dist/icons/overlay/overlay.qrc | 69 + dist/languages/.gitignore | 2 + dist/languages/.tx/config | 14 + dist/languages/README.md | 3 + dist/languages/ar.ts | 8769 ++++++++ dist/languages/ca.ts | 8803 ++++++++ dist/languages/cs.ts | 8787 ++++++++ dist/languages/da.ts | 8776 ++++++++ dist/languages/de.ts | 8818 ++++++++ dist/languages/el.ts | 8779 ++++++++ dist/languages/es.ts | 8864 ++++++++ dist/languages/fi.ts | 6235 ++++++ dist/languages/fr.ts | 8857 ++++++++ dist/languages/hu.ts | 8831 ++++++++ dist/languages/id.ts | 8829 ++++++++ dist/languages/it.ts | 8827 ++++++++ dist/languages/ja_JP.ts | 8812 ++++++++ dist/languages/ko_KR.ts | 8812 ++++++++ dist/languages/nb.ts | 8817 ++++++++ dist/languages/nl.ts | 8805 ++++++++ dist/languages/pl.ts | 8808 ++++++++ dist/languages/pt_BR.ts | 8866 ++++++++ dist/languages/pt_PT.ts | 8848 ++++++++ dist/languages/ru_RU.ts | 8862 ++++++++ dist/languages/sv.ts | 8773 ++++++++ dist/languages/tr_TR.ts | 8808 ++++++++ dist/languages/uk.ts | 8821 ++++++++ dist/languages/vi.ts | 8814 ++++++++ dist/languages/vi_VN.ts | 8813 ++++++++ dist/languages/zh_CN.ts | 8862 ++++++++ dist/languages/zh_TW.ts | 8857 ++++++++ dist/org.yuzu_emu.yuzu.desktop | 16 + dist/org.yuzu_emu.yuzu.metainfo.xml | 62 + dist/org.yuzu_emu.yuzu.xml | 39 + .../colorful/icons/16x16/checked.png | Bin 0 -> 414 bytes .../colorful/icons/16x16/connected.png | Bin 0 -> 575 bytes .../icons/16x16/connected_notification.png | Bin 0 -> 760 bytes .../colorful/icons/16x16/disconnected.png | Bin 0 -> 648 bytes .../qt_themes/colorful/icons/16x16/failed.png | Bin 0 -> 431 bytes dist/qt_themes/colorful/icons/16x16/info.png | Bin 0 -> 428 bytes dist/qt_themes/colorful/icons/16x16/lock.png | Bin 0 -> 330 bytes dist/qt_themes/colorful/icons/16x16/sync.png | Bin 0 -> 548 bytes .../colorful/icons/16x16/view-refresh.png | Bin 0 -> 349 bytes .../colorful/icons/256x256/plus_folder.png | Bin 0 -> 4643 bytes .../colorful/icons/48x48/bad_folder.png | Bin 0 -> 528 bytes dist/qt_themes/colorful/icons/48x48/chip.png | Bin 0 -> 582 bytes .../qt_themes/colorful/icons/48x48/folder.png | Bin 0 -> 460 bytes .../colorful/icons/48x48/list-add.png | Bin 0 -> 204 bytes .../colorful/icons/48x48/no_avatar.png | Bin 0 -> 678 bytes .../colorful/icons/48x48/sd_card.png | Bin 0 -> 228 bytes dist/qt_themes/colorful/icons/48x48/star.png | Bin 0 -> 1108 bytes dist/qt_themes/colorful/icons/index.theme | 13 + dist/qt_themes/colorful/style.qrc | 30 + .../colorful_dark/icons/16x16/lock.png | Bin 0 -> 401 bytes .../icons/16x16/view-refresh.png | Bin 0 -> 362 bytes .../qt_themes/colorful_dark/icons/index.theme | 8 + dist/qt_themes/colorful_dark/style.qrc | 57 + .../colorful_midnight_blue/icons/index.theme | 8 + .../colorful_midnight_blue/style.qrc | 63 + dist/qt_themes/default/default.qrc | 26 + .../default/icons/16x16/connected.png | Bin 0 -> 575 bytes .../icons/16x16/connected_notification.png | Bin 0 -> 760 bytes .../default/icons/16x16/disconnected.png | Bin 0 -> 648 bytes dist/qt_themes/default/icons/16x16/lock.png | Bin 0 -> 318 bytes .../default/icons/256x256/plus_folder.png | Bin 0 -> 1948 bytes dist/qt_themes/default/icons/256x256/yuzu.png | Bin 0 -> 4425 bytes .../default/icons/48x48/bad_folder.png | Bin 0 -> 1007 bytes dist/qt_themes/default/icons/48x48/chip.png | Bin 0 -> 511 bytes dist/qt_themes/default/icons/48x48/folder.png | Bin 0 -> 535 bytes .../default/icons/48x48/list-add.png | Bin 0 -> 204 bytes .../qt_themes/default/icons/48x48/sd_card.png | Bin 0 -> 198 bytes dist/qt_themes/default/icons/48x48/star.png | Bin 0 -> 1029 bytes dist/qt_themes/default/icons/index.theme | 14 + dist/qt_themes/default/style.qss | 692 + dist/qt_themes/default_dark/icons/index.theme | 8 + dist/qt_themes/default_dark/style.qrc | 25 + dist/qt_themes/default_dark/style.qss | 687 + dist/qt_themes/qdarkstyle/LICENSE.md | 183 + .../qdarkstyle/icons/16x16/connected.png | Bin 0 -> 575 bytes .../icons/16x16/connected_notification.png | Bin 0 -> 760 bytes .../qdarkstyle/icons/16x16/disconnected.png | Bin 0 -> 648 bytes .../qt_themes/qdarkstyle/icons/16x16/lock.png | Bin 0 -> 343 bytes .../qdarkstyle/icons/16x16/view-refresh.png | Bin 0 -> 362 bytes .../qdarkstyle/icons/256x256/plus_folder.png | Bin 0 -> 1924 bytes .../qdarkstyle/icons/48x48/bad_folder.png | Bin 0 -> 1061 bytes .../qt_themes/qdarkstyle/icons/48x48/chip.png | Bin 0 -> 551 bytes .../qdarkstyle/icons/48x48/folder.png | Bin 0 -> 594 bytes .../qdarkstyle/icons/48x48/list-add.png | Bin 0 -> 204 bytes .../qdarkstyle/icons/48x48/no_avatar.png | Bin 0 -> 763 bytes .../qdarkstyle/icons/48x48/sd_card.png | Bin 0 -> 214 bytes .../qt_themes/qdarkstyle/icons/48x48/star.png | Bin 0 -> 1055 bytes dist/qt_themes/qdarkstyle/icons/index.theme | 14 + dist/qt_themes/qdarkstyle/rc/Hmovetoolbar.png | Bin 0 -> 220 bytes .../qt_themes/qdarkstyle/rc/Hsepartoolbar.png | Bin 0 -> 172 bytes dist/qt_themes/qdarkstyle/rc/Vmovetoolbar.png | Bin 0 -> 228 bytes .../qt_themes/qdarkstyle/rc/Vsepartoolbar.png | Bin 0 -> 187 bytes .../qdarkstyle/rc/branch_closed-on.png | Bin 0 -> 147 bytes .../qt_themes/qdarkstyle/rc/branch_closed.png | Bin 0 -> 160 bytes .../qdarkstyle/rc/branch_open-on.png | Bin 0 -> 150 bytes dist/qt_themes/qdarkstyle/rc/branch_open.png | Bin 0 -> 166 bytes .../qdarkstyle/rc/checkbox_checked.png | Bin 0 -> 1935 bytes .../rc/checkbox_checked_disabled.png | Bin 0 -> 1960 bytes .../qdarkstyle/rc/checkbox_checked_focus.png | Bin 0 -> 1813 bytes .../qdarkstyle/rc/checkbox_indeterminate.png | Bin 0 -> 492 bytes .../rc/checkbox_indeterminate_disabled.png | Bin 0 -> 491 bytes .../rc/checkbox_indeterminate_focus.png | Bin 0 -> 252 bytes .../qdarkstyle/rc/checkbox_unchecked.png | Bin 0 -> 464 bytes .../rc/checkbox_unchecked_disabled.png | Bin 0 -> 464 bytes .../rc/checkbox_unchecked_focus.png | Bin 0 -> 240 bytes dist/qt_themes/qdarkstyle/rc/close-hover.png | Bin 0 -> 598 bytes .../qt_themes/qdarkstyle/rc/close-pressed.png | Bin 0 -> 598 bytes dist/qt_themes/qdarkstyle/rc/close.png | Bin 0 -> 586 bytes dist/qt_themes/qdarkstyle/rc/down_arrow.png | Bin 0 -> 165 bytes .../qdarkstyle/rc/down_arrow_disabled.png | Bin 0 -> 166 bytes dist/qt_themes/qdarkstyle/rc/left_arrow.png | Bin 0 -> 166 bytes .../qdarkstyle/rc/left_arrow_disabled.png | Bin 0 -> 166 bytes .../qt_themes/qdarkstyle/rc/radio_checked.png | Bin 0 -> 940 bytes .../qdarkstyle/rc/radio_checked_disabled.png | Bin 0 -> 972 bytes .../qdarkstyle/rc/radio_checked_focus.png | Bin 0 -> 846 bytes .../qdarkstyle/rc/radio_unchecked.png | Bin 0 -> 728 bytes .../rc/radio_unchecked_disabled.png | Bin 0 -> 760 bytes .../qdarkstyle/rc/radio_unchecked_focus.png | Bin 0 -> 646 bytes dist/qt_themes/qdarkstyle/rc/right_arrow.png | Bin 0 -> 160 bytes .../qdarkstyle/rc/right_arrow_disabled.png | Bin 0 -> 160 bytes dist/qt_themes/qdarkstyle/rc/sizegrip.png | Bin 0 -> 129 bytes .../qdarkstyle/rc/stylesheet-branch-end.png | Bin 0 -> 224 bytes .../qdarkstyle/rc/stylesheet-branch-more.png | Bin 0 -> 182 bytes .../qdarkstyle/rc/stylesheet-vline.png | Bin 0 -> 239 bytes dist/qt_themes/qdarkstyle/rc/transparent.png | Bin 0 -> 195 bytes dist/qt_themes/qdarkstyle/rc/undock.png | Bin 0 -> 578 bytes dist/qt_themes/qdarkstyle/rc/up_arrow.png | Bin 0 -> 158 bytes .../qdarkstyle/rc/up_arrow_disabled.png | Bin 0 -> 159 bytes dist/qt_themes/qdarkstyle/style.qrc | 62 + dist/qt_themes/qdarkstyle/style.qss | 1987 ++ .../qdarkstyle_midnight_blue/LICENSE.rst | 405 + .../icons/index.theme | 14 + .../rc/Hmovetoolbar.png | Bin 0 -> 220 bytes .../rc/Hsepartoolbar.png | Bin 0 -> 172 bytes .../rc/Vmovetoolbar.png | Bin 0 -> 228 bytes .../rc/Vsepartoolbar.png | Bin 0 -> 187 bytes .../rc/arrow_down.png | Bin 0 -> 525 bytes .../rc/arrow_down@2x.png | Bin 0 -> 977 bytes .../rc/arrow_down_disabled.png | Bin 0 -> 547 bytes .../rc/arrow_down_disabled@2x.png | Bin 0 -> 1040 bytes .../rc/arrow_down_focus.png | Bin 0 -> 530 bytes .../rc/arrow_down_focus@2x.png | Bin 0 -> 1025 bytes .../rc/arrow_down_pressed.png | Bin 0 -> 518 bytes .../rc/arrow_down_pressed@2x.png | Bin 0 -> 1007 bytes .../rc/arrow_left.png | Bin 0 -> 546 bytes .../rc/arrow_left@2x.png | Bin 0 -> 1072 bytes .../rc/arrow_left_disabled.png | Bin 0 -> 569 bytes .../rc/arrow_left_disabled@2x.png | Bin 0 -> 1126 bytes .../rc/arrow_left_focus.png | Bin 0 -> 565 bytes .../rc/arrow_left_focus@2x.png | Bin 0 -> 1143 bytes .../rc/arrow_left_pressed.png | Bin 0 -> 541 bytes .../rc/arrow_left_pressed@2x.png | Bin 0 -> 1120 bytes .../rc/arrow_right.png | Bin 0 -> 518 bytes .../rc/arrow_right@2x.png | Bin 0 -> 1062 bytes .../rc/arrow_right_disabled.png | Bin 0 -> 553 bytes .../rc/arrow_right_disabled@2x.png | Bin 0 -> 1143 bytes .../rc/arrow_right_focus.png | Bin 0 -> 543 bytes .../rc/arrow_right_focus@2x.png | Bin 0 -> 1139 bytes .../rc/arrow_right_pressed.png | Bin 0 -> 544 bytes .../rc/arrow_right_pressed@2x.png | Bin 0 -> 1121 bytes .../qdarkstyle_midnight_blue/rc/arrow_up.png | Bin 0 -> 512 bytes .../rc/arrow_up@2x.png | Bin 0 -> 969 bytes .../rc/arrow_up_disabled.png | Bin 0 -> 538 bytes .../rc/arrow_up_disabled@2x.png | Bin 0 -> 1046 bytes .../rc/arrow_up_focus.png | Bin 0 -> 530 bytes .../rc/arrow_up_focus@2x.png | Bin 0 -> 1017 bytes .../rc/arrow_up_pressed.png | Bin 0 -> 518 bytes .../rc/arrow_up_pressed@2x.png | Bin 0 -> 998 bytes .../qdarkstyle_midnight_blue/rc/base_icon.png | Bin 0 -> 1256 bytes .../rc/base_icon@2x.png | Bin 0 -> 3286 bytes .../rc/base_icon_disabled.png | Bin 0 -> 1256 bytes .../rc/base_icon_disabled@2x.png | Bin 0 -> 3286 bytes .../rc/base_icon_focus.png | Bin 0 -> 1256 bytes .../rc/base_icon_focus@2x.png | Bin 0 -> 3286 bytes .../rc/base_icon_pressed.png | Bin 0 -> 1256 bytes .../rc/base_icon_pressed@2x.png | Bin 0 -> 3286 bytes .../rc/branch_closed-on.png | Bin 0 -> 147 bytes .../rc/branch_closed.png | Bin 0 -> 350 bytes .../rc/branch_closed@2x.png | Bin 0 -> 704 bytes .../rc/branch_closed_disabled.png | Bin 0 -> 373 bytes .../rc/branch_closed_disabled@2x.png | Bin 0 -> 729 bytes .../rc/branch_closed_focus.png | Bin 0 -> 380 bytes .../rc/branch_closed_focus@2x.png | Bin 0 -> 717 bytes .../rc/branch_closed_pressed.png | Bin 0 -> 372 bytes .../rc/branch_closed_pressed@2x.png | Bin 0 -> 725 bytes .../rc/branch_end.png | Bin 0 -> 142 bytes .../rc/branch_end@2x.png | Bin 0 -> 220 bytes .../rc/branch_end_disabled.png | Bin 0 -> 146 bytes .../rc/branch_end_disabled@2x.png | Bin 0 -> 225 bytes .../rc/branch_end_focus.png | Bin 0 -> 146 bytes .../rc/branch_end_focus@2x.png | Bin 0 -> 226 bytes .../rc/branch_end_pressed.png | Bin 0 -> 146 bytes .../rc/branch_end_pressed@2x.png | Bin 0 -> 225 bytes .../rc/branch_line.png | Bin 0 -> 130 bytes .../rc/branch_line@2x.png | Bin 0 -> 242 bytes .../rc/branch_line_disabled.png | Bin 0 -> 134 bytes .../rc/branch_line_disabled@2x.png | Bin 0 -> 248 bytes .../rc/branch_line_focus.png | Bin 0 -> 134 bytes .../rc/branch_line_focus@2x.png | Bin 0 -> 249 bytes .../rc/branch_line_pressed.png | Bin 0 -> 134 bytes .../rc/branch_line_pressed@2x.png | Bin 0 -> 248 bytes .../rc/branch_more.png | Bin 0 -> 155 bytes .../rc/branch_more@2x.png | Bin 0 -> 257 bytes .../rc/branch_more_disabled.png | Bin 0 -> 162 bytes .../rc/branch_more_disabled@2x.png | Bin 0 -> 265 bytes .../rc/branch_more_focus.png | Bin 0 -> 162 bytes .../rc/branch_more_focus@2x.png | Bin 0 -> 266 bytes .../rc/branch_more_pressed.png | Bin 0 -> 162 bytes .../rc/branch_more_pressed@2x.png | Bin 0 -> 265 bytes .../rc/branch_open-on.png | Bin 0 -> 150 bytes .../rc/branch_open.png | Bin 0 -> 354 bytes .../rc/branch_open@2x.png | Bin 0 -> 657 bytes .../rc/branch_open_disabled.png | Bin 0 -> 375 bytes .../rc/branch_open_disabled@2x.png | Bin 0 -> 682 bytes .../rc/branch_open_focus.png | Bin 0 -> 367 bytes .../rc/branch_open_focus@2x.png | Bin 0 -> 665 bytes .../rc/branch_open_pressed.png | Bin 0 -> 369 bytes .../rc/branch_open_pressed@2x.png | Bin 0 -> 661 bytes .../rc/checkbox_checked.png | Bin 0 -> 452 bytes .../rc/checkbox_checked@2x.png | Bin 0 -> 825 bytes .../rc/checkbox_checked_disabled.png | Bin 0 -> 467 bytes .../rc/checkbox_checked_disabled@2x.png | Bin 0 -> 845 bytes .../rc/checkbox_checked_focus.png | Bin 0 -> 441 bytes .../rc/checkbox_checked_focus@2x.png | Bin 0 -> 823 bytes .../rc/checkbox_checked_pressed.png | Bin 0 -> 418 bytes .../rc/checkbox_checked_pressed@2x.png | Bin 0 -> 829 bytes .../rc/checkbox_indeterminate.png | Bin 0 -> 581 bytes .../rc/checkbox_indeterminate@2x.png | Bin 0 -> 1081 bytes .../rc/checkbox_indeterminate_disabled.png | Bin 0 -> 614 bytes .../rc/checkbox_indeterminate_disabled@2x.png | Bin 0 -> 1105 bytes .../rc/checkbox_indeterminate_focus.png | Bin 0 -> 576 bytes .../rc/checkbox_indeterminate_focus@2x.png | Bin 0 -> 1066 bytes .../rc/checkbox_indeterminate_pressed.png | Bin 0 -> 563 bytes .../rc/checkbox_indeterminate_pressed@2x.png | Bin 0 -> 1087 bytes .../rc/checkbox_unchecked.png | Bin 0 -> 397 bytes .../rc/checkbox_unchecked@2x.png | Bin 0 -> 828 bytes .../rc/checkbox_unchecked_disabled.png | Bin 0 -> 386 bytes .../rc/checkbox_unchecked_disabled@2x.png | Bin 0 -> 875 bytes .../rc/checkbox_unchecked_focus.png | Bin 0 -> 394 bytes .../rc/checkbox_unchecked_focus@2x.png | Bin 0 -> 866 bytes .../rc/checkbox_unchecked_pressed.png | Bin 0 -> 403 bytes .../rc/checkbox_unchecked_pressed@2x.png | Bin 0 -> 861 bytes .../rc/close-hover.png | Bin 0 -> 598 bytes .../rc/close-pressed.png | Bin 0 -> 598 bytes .../qdarkstyle_midnight_blue/rc/close.png | Bin 0 -> 586 bytes .../rc/down_arrow.png | Bin 0 -> 165 bytes .../rc/down_arrow_disabled.png | Bin 0 -> 166 bytes .../rc/left_arrow.png | Bin 0 -> 166 bytes .../rc/left_arrow_disabled.png | Bin 0 -> 166 bytes .../rc/line_horizontal.png | Bin 0 -> 117 bytes .../rc/line_horizontal@2x.png | Bin 0 -> 135 bytes .../rc/line_horizontal_disabled.png | Bin 0 -> 121 bytes .../rc/line_horizontal_disabled@2x.png | Bin 0 -> 139 bytes .../rc/line_horizontal_focus.png | Bin 0 -> 120 bytes .../rc/line_horizontal_focus@2x.png | Bin 0 -> 138 bytes .../rc/line_horizontal_pressed.png | Bin 0 -> 120 bytes .../rc/line_horizontal_pressed@2x.png | Bin 0 -> 138 bytes .../rc/line_vertical.png | Bin 0 -> 130 bytes .../rc/line_vertical@2x.png | Bin 0 -> 242 bytes .../rc/line_vertical_disabled.png | Bin 0 -> 134 bytes .../rc/line_vertical_disabled@2x.png | Bin 0 -> 248 bytes .../rc/line_vertical_focus.png | Bin 0 -> 134 bytes .../rc/line_vertical_focus@2x.png | Bin 0 -> 249 bytes .../rc/line_vertical_pressed.png | Bin 0 -> 134 bytes .../rc/line_vertical_pressed@2x.png | Bin 0 -> 248 bytes .../rc/radio_checked.png | Bin 0 -> 1224 bytes .../rc/radio_checked@2x.png | Bin 0 -> 2714 bytes .../rc/radio_checked_disabled.png | Bin 0 -> 1325 bytes .../rc/radio_checked_disabled@2x.png | Bin 0 -> 2893 bytes .../rc/radio_checked_focus.png | Bin 0 -> 1293 bytes .../rc/radio_checked_focus@2x.png | Bin 0 -> 2736 bytes .../rc/radio_checked_pressed.png | Bin 0 -> 1276 bytes .../rc/radio_checked_pressed@2x.png | Bin 0 -> 2765 bytes .../rc/radio_unchecked.png | Bin 0 -> 963 bytes .../rc/radio_unchecked@2x.png | Bin 0 -> 2195 bytes .../rc/radio_unchecked_disabled.png | Bin 0 -> 1040 bytes .../rc/radio_unchecked_disabled@2x.png | Bin 0 -> 2294 bytes .../rc/radio_unchecked_focus.png | Bin 0 -> 1032 bytes .../rc/radio_unchecked_focus@2x.png | Bin 0 -> 2186 bytes .../rc/radio_unchecked_pressed.png | Bin 0 -> 1022 bytes .../rc/radio_unchecked_pressed@2x.png | Bin 0 -> 2197 bytes .../rc/right_arrow.png | Bin 0 -> 160 bytes .../rc/right_arrow_disabled.png | Bin 0 -> 160 bytes .../qdarkstyle_midnight_blue/rc/sizegrip.png | Bin 0 -> 129 bytes .../rc/stylesheet-branch-end.png | Bin 0 -> 224 bytes .../rc/stylesheet-branch-more.png | Bin 0 -> 182 bytes .../rc/stylesheet-vline.png | Bin 0 -> 239 bytes .../rc/toolbar_move_horizontal.png | Bin 0 -> 150 bytes .../rc/toolbar_move_horizontal@2x.png | Bin 0 -> 304 bytes .../rc/toolbar_move_horizontal_disabled.png | Bin 0 -> 155 bytes .../toolbar_move_horizontal_disabled@2x.png | Bin 0 -> 308 bytes .../rc/toolbar_move_horizontal_focus.png | Bin 0 -> 154 bytes .../rc/toolbar_move_horizontal_focus@2x.png | Bin 0 -> 311 bytes .../rc/toolbar_move_horizontal_pressed.png | Bin 0 -> 154 bytes .../rc/toolbar_move_horizontal_pressed@2x.png | Bin 0 -> 307 bytes .../rc/toolbar_move_vertical.png | Bin 0 -> 137 bytes .../rc/toolbar_move_vertical@2x.png | Bin 0 -> 201 bytes .../rc/toolbar_move_vertical_disabled.png | Bin 0 -> 140 bytes .../rc/toolbar_move_vertical_disabled@2x.png | Bin 0 -> 212 bytes .../rc/toolbar_move_vertical_focus.png | Bin 0 -> 144 bytes .../rc/toolbar_move_vertical_focus@2x.png | Bin 0 -> 211 bytes .../rc/toolbar_move_vertical_pressed.png | Bin 0 -> 143 bytes .../rc/toolbar_move_vertical_pressed@2x.png | Bin 0 -> 204 bytes .../rc/toolbar_separator_horizontal.png | Bin 0 -> 145 bytes .../rc/toolbar_separator_horizontal@2x.png | Bin 0 -> 286 bytes .../toolbar_separator_horizontal_disabled.png | Bin 0 -> 151 bytes ...olbar_separator_horizontal_disabled@2x.png | Bin 0 -> 292 bytes .../rc/toolbar_separator_horizontal_focus.png | Bin 0 -> 149 bytes .../toolbar_separator_horizontal_focus@2x.png | Bin 0 -> 294 bytes .../toolbar_separator_horizontal_pressed.png | Bin 0 -> 149 bytes ...oolbar_separator_horizontal_pressed@2x.png | Bin 0 -> 289 bytes .../rc/toolbar_separator_vertical.png | Bin 0 -> 133 bytes .../rc/toolbar_separator_vertical@2x.png | Bin 0 -> 191 bytes .../toolbar_separator_vertical_disabled.png | Bin 0 -> 135 bytes ...toolbar_separator_vertical_disabled@2x.png | Bin 0 -> 199 bytes .../rc/toolbar_separator_vertical_focus.png | Bin 0 -> 139 bytes .../toolbar_separator_vertical_focus@2x.png | Bin 0 -> 196 bytes .../rc/toolbar_separator_vertical_pressed.png | Bin 0 -> 138 bytes .../toolbar_separator_vertical_pressed@2x.png | Bin 0 -> 193 bytes .../rc/transparent.png | Bin 0 -> 104 bytes .../rc/transparent@2x.png | Bin 0 -> 117 bytes .../rc/transparent_disabled.png | Bin 0 -> 104 bytes .../rc/transparent_disabled@2x.png | Bin 0 -> 117 bytes .../rc/transparent_focus.png | Bin 0 -> 104 bytes .../rc/transparent_focus@2x.png | Bin 0 -> 117 bytes .../rc/transparent_pressed.png | Bin 0 -> 104 bytes .../rc/transparent_pressed@2x.png | Bin 0 -> 117 bytes .../qdarkstyle_midnight_blue/rc/undock.png | Bin 0 -> 578 bytes .../qdarkstyle_midnight_blue/rc/up_arrow.png | Bin 0 -> 158 bytes .../rc/up_arrow_disabled.png | Bin 0 -> 159 bytes .../rc/window_close.png | Bin 0 -> 766 bytes .../rc/window_close@2x.png | Bin 0 -> 1690 bytes .../rc/window_close_disabled.png | Bin 0 -> 838 bytes .../rc/window_close_disabled@2x.png | Bin 0 -> 1724 bytes .../rc/window_close_focus.png | Bin 0 -> 756 bytes .../rc/window_close_focus@2x.png | Bin 0 -> 1704 bytes .../rc/window_close_pressed.png | Bin 0 -> 745 bytes .../rc/window_close_pressed@2x.png | Bin 0 -> 1679 bytes .../rc/window_grip.png | Bin 0 -> 426 bytes .../rc/window_grip@2x.png | Bin 0 -> 735 bytes .../rc/window_grip_disabled.png | Bin 0 -> 447 bytes .../rc/window_grip_disabled@2x.png | Bin 0 -> 768 bytes .../rc/window_grip_focus.png | Bin 0 -> 435 bytes .../rc/window_grip_focus@2x.png | Bin 0 -> 738 bytes .../rc/window_grip_pressed.png | Bin 0 -> 444 bytes .../rc/window_grip_pressed@2x.png | Bin 0 -> 729 bytes .../rc/window_minimize.png | Bin 0 -> 193 bytes .../rc/window_minimize@2x.png | Bin 0 -> 316 bytes .../rc/window_minimize_disabled.png | Bin 0 -> 206 bytes .../rc/window_minimize_disabled@2x.png | Bin 0 -> 332 bytes .../rc/window_minimize_focus.png | Bin 0 -> 208 bytes .../rc/window_minimize_focus@2x.png | Bin 0 -> 339 bytes .../rc/window_minimize_pressed.png | Bin 0 -> 202 bytes .../rc/window_minimize_pressed@2x.png | Bin 0 -> 336 bytes .../rc/window_undock.png | Bin 0 -> 510 bytes .../rc/window_undock@2x.png | Bin 0 -> 875 bytes .../rc/window_undock_disabled.png | Bin 0 -> 541 bytes .../rc/window_undock_disabled@2x.png | Bin 0 -> 910 bytes .../rc/window_undock_focus.png | Bin 0 -> 519 bytes .../rc/window_undock_focus@2x.png | Bin 0 -> 877 bytes .../rc/window_undock_pressed.png | Bin 0 -> 523 bytes .../rc/window_undock_pressed@2x.png | Bin 0 -> 880 bytes .../qdarkstyle_midnight_blue/style.qrc | 228 + .../qdarkstyle_midnight_blue/style.qss | 2918 +++ dist/yuzu.bmp | Bin 0 -> 262282 bytes dist/yuzu.icns | Bin 0 -> 30200 bytes dist/yuzu.ico | Bin 0 -> 23159 bytes dist/yuzu.manifest | 58 + dist/yuzu.svg | 1 + externals/CMakeLists.txt | 316 + externals/FidelityFX-FSR/ffx-fsr/ffx_a.h | 2656 +++ externals/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h | 1199 + externals/FidelityFX-FSR/license.txt | 19 + externals/bc_decoder/bc_decoder.cpp | 1522 ++ externals/bc_decoder/bc_decoder.h | 43 + .../GetGitRevisionDescription.cmake | 162 + .../GetGitRevisionDescription.cmake.in | 45 + externals/demangle/ItaniumDemangle.cpp | 597 + externals/demangle/llvm/Demangle/Demangle.h | 131 + .../demangle/llvm/Demangle/DemangleConfig.h | 93 + .../demangle/llvm/Demangle/ItaniumDemangle.h | 5512 +++++ .../demangle/llvm/Demangle/ItaniumNodes.def | 96 + externals/demangle/llvm/Demangle/StringView.h | 123 + .../demangle/llvm/Demangle/StringViewExtras.h | 39 + externals/demangle/llvm/Demangle/Utility.h | 206 + externals/ffmpeg/CMakeLists.txt | 277 + externals/gamemode/gamemode_client.h | 376 + externals/getopt/CMakeLists.txt | 12 + externals/getopt/getopt.c | 962 + externals/getopt/getopt.h | 136 + externals/glad/CMakeLists.txt | 15 + externals/glad/Readme.md | 10 + externals/glad/include/KHR/khrplatform.h | 290 + externals/glad/include/glad/glad.h | 17164 +++++++++++++++ externals/glad/src/glad.c | 9965 +++++++++ externals/libusb/CMakeLists.txt | 270 + externals/libusb/config.h.in | 95 + externals/microprofile/README.md | 7 + externals/microprofile/microprofile.h | 3603 +++ externals/microprofile/microprofile_html.h | 3868 ++++ externals/microprofile/microprofileui.h | 3349 +++ externals/nx_tzdb/CMakeLists.txt | 101 + externals/nx_tzdb/ListFilesInDirectory.cmake | 8 + externals/nx_tzdb/NxTzdbCreateHeader.cmake | 50 + externals/nx_tzdb/include/nx_tzdb.h | 27 + externals/nx_tzdb/tzdb_template.h.in | 18 + externals/renderdoc/renderdoc_app.h | 744 + externals/stb/stb_dxt.cpp | 765 + externals/stb/stb_dxt.h | 36 + externals/stb/stb_image.h | 7987 +++++++ externals/stb/stb_image_resize.h | 2634 +++ externals/stb/stb_image_write.h | 1724 ++ externals/tz/tz/tz.cpp | 1636 ++ externals/tz/tz/tz.h | 81 + hooks/pre-commit | 29 + src/.clang-format | 91 + src/CMakeLists.txt | 218 + src/android/.gitignore | 68 + src/android/app/build.gradle.kts | 282 + src/android/app/debug.keystore | Bin 0 -> 2105 bytes src/android/app/proguard-rules.pro | 24 + .../app/src/ea/res/drawable/ic_yuzu.xml | 22 + .../app/src/ea/res/drawable/ic_yuzu_full.xml | 12 + .../app/src/ea/res/drawable/ic_yuzu_title.xml | 24 + src/android/app/src/main/AndroidManifest.xml | 95 + .../java/org/yuzu/yuzu_emu/NativeLibrary.kt | 462 + .../java/org/yuzu/yuzu_emu/YuzuApplication.kt | 55 + .../yuzu_emu/activities/EmulationActivity.kt | 509 + .../yuzu_emu/adapters/AbstractDiffAdapter.kt | 38 + .../yuzu_emu/adapters/AbstractListAdapter.kt | 98 + .../adapters/AbstractSingleSelectionList.kt | 105 + .../yuzu/yuzu_emu/adapters/AddonAdapter.kt | 37 + .../yuzu/yuzu_emu/adapters/AppletAdapter.kt | 74 + .../adapters/CabinetLauncherDialogAdapter.kt | 59 + .../yuzu/yuzu_emu/adapters/DriverAdapter.kt | 59 + .../yuzu/yuzu_emu/adapters/FolderAdapter.kt | 48 + .../org/yuzu/yuzu_emu/adapters/GameAdapter.kt | 99 + .../adapters/GamePropertiesAdapter.kt | 115 + .../yuzu_emu/adapters/HomeSettingAdapter.kt | 84 + .../yuzu_emu/adapters/InstallableAdapter.kt | 35 + .../yuzu/yuzu_emu/adapters/LicenseAdapter.kt | 39 + .../yuzu/yuzu_emu/adapters/SetupAdapter.kt | 75 + .../applets/keyboard/SoftwareKeyboard.kt | 124 + .../keyboard/ui/KeyboardDialogFragment.kt | 100 + .../DiskShaderCacheProgress.kt | 51 + .../yuzu_emu/features/DocumentProvider.kt | 341 + .../yuzu_emu/features/input/NativeInput.kt | 416 + .../features/input/YuzuInputDevice.kt | 93 + .../yuzu_emu/features/input/YuzuVibrator.kt | 76 + .../features/input/model/AnalogDirection.kt | 11 + .../features/input/model/ButtonName.kt | 19 + .../features/input/model/InputType.kt | 13 + .../features/input/model/NativeAnalog.kt | 14 + .../features/input/model/NativeButton.kt | 38 + .../features/input/model/NativeTrigger.kt | 10 + .../features/input/model/NpadStyleIndex.kt | 30 + .../features/input/model/PlayerInput.kt | 83 + .../settings/model/AbstractBooleanSetting.kt | 9 + .../settings/model/AbstractByteSetting.kt | 9 + .../settings/model/AbstractFloatSetting.kt | 9 + .../settings/model/AbstractIntSetting.kt | 9 + .../settings/model/AbstractLongSetting.kt | 9 + .../settings/model/AbstractSetting.kt | 31 + .../settings/model/AbstractShortSetting.kt | 9 + .../settings/model/AbstractStringSetting.kt | 9 + .../features/settings/model/BooleanSetting.kt | 46 + .../features/settings/model/ByteSetting.kt | 25 + .../features/settings/model/FloatSetting.kt | 26 + .../features/settings/model/IntSetting.kt | 45 + .../features/settings/model/LongSetting.kt | 25 + .../features/settings/model/Settings.kt | 120 + .../features/settings/model/ShortSetting.kt | 25 + .../features/settings/model/StringSetting.kt | 26 + .../settings/model/view/AnalogInputSetting.kt | 31 + .../settings/model/view/ButtonInputSetting.kt | 29 + .../settings/model/view/DateTimeSetting.kt | 20 + .../settings/model/view/HeaderSetting.kt | 13 + .../model/view/InputProfileSetting.kt | 32 + .../settings/model/view/InputSetting.kt | 134 + .../model/view/IntSingleChoiceSetting.kt | 38 + .../model/view/ModifierInputSetting.kt | 31 + .../settings/model/view/RunnableSetting.kt | 19 + .../settings/model/view/SettingsItem.kt | 391 + .../model/view/SingleChoiceSetting.kt | 29 + .../settings/model/view/SliderSetting.kt | 42 + .../settings/model/view/StringInputSetting.kt | 22 + .../model/view/StringSingleChoiceSetting.kt | 35 + .../settings/model/view/SubmenuSetting.kt | 19 + .../settings/model/view/SwitchSetting.kt | 34 + .../settings/ui/InputDialogFragment.kt | 300 + .../settings/ui/InputProfileAdapter.kt | 68 + .../settings/ui/InputProfileDialogFragment.kt | 148 + .../ui/NewInputProfileDialogFragment.kt | 79 + .../features/settings/ui/SettingsActivity.kt | 171 + .../features/settings/ui/SettingsAdapter.kt | 434 + .../settings/ui/SettingsDialogFragment.kt | 301 + .../features/settings/ui/SettingsFragment.kt | 182 + .../settings/ui/SettingsFragmentPresenter.kt | 975 + .../settings/ui/SettingsSearchFragment.kt | 183 + .../features/settings/ui/SettingsViewModel.kt | 112 + .../ui/viewholder/DateTimeViewHolder.kt | 54 + .../ui/viewholder/HeaderViewHolder.kt | 30 + .../ui/viewholder/InputProfileViewHolder.kt | 34 + .../settings/ui/viewholder/InputViewHolder.kt | 60 + .../ui/viewholder/RunnableViewHolder.kt | 50 + .../ui/viewholder/SettingViewHolder.kt | 54 + .../ui/viewholder/SingleChoiceViewHolder.kt | 91 + .../ui/viewholder/SliderViewHolder.kt | 50 + .../ui/viewholder/StringInputViewHolder.kt | 45 + .../ui/viewholder/SubmenuViewHolder.kt | 46 + .../ui/viewholder/SwitchSettingViewHolder.kt | 51 + .../features/settings/utils/SettingsFile.kt | 29 + .../yuzu/yuzu_emu/fragments/AboutFragment.kt | 124 + .../fragments/AddGameFolderDialogFragment.kt | 56 + .../yuzu/yuzu_emu/fragments/AddonsFragment.kt | 205 + .../fragments/AppletLauncherFragment.kt | 106 + .../CabinetLauncherDialogFragment.kt | 41 + .../ContentTypeSelectionDialogFragment.kt | 68 + .../fragments/CoreErrorDialogFragment.kt | 47 + .../fragments/DriverManagerFragment.kt | 199 + .../fragments/DriversLoadingDialogFragment.kt | 50 + .../yuzu_emu/fragments/EarlyAccessFragment.kt | 87 + .../yuzu_emu/fragments/EmulationFragment.kt | 1048 + .../GameFolderPropertiesDialogFragment.kt | 78 + .../yuzu_emu/fragments/GameFoldersFragment.kt | 116 + .../yuzu_emu/fragments/GameInfoFragment.kt | 179 + .../fragments/GamePropertiesFragment.kt | 424 + .../fragments/HomeSettingsFragment.kt | 437 + .../yuzu_emu/fragments/InstallableFragment.kt | 323 + .../fragments/LaunchGameDialogFragment.kt | 61 + .../LicenseBottomSheetDialogFragment.kt | 59 + .../yuzu_emu/fragments/LicensesFragment.kt | 132 + .../fragments/MessageDialogFragment.kt | 195 + .../PermissionDeniedDialogFragment.kt | 38 + .../fragments/ProgressDialogFragment.kt | 148 + .../fragments/ResetSettingsDialogFragment.kt | 30 + .../yuzu/yuzu_emu/fragments/SearchFragment.kt | 218 + .../yuzu/yuzu_emu/fragments/SetupFragment.kt | 396 + .../fragments/SetupWarningDialogFragment.kt | 86 + .../layout/AutofitGridLayoutManager.kt | 63 + .../org/yuzu/yuzu_emu/model/AddonViewModel.kt | 97 + .../java/org/yuzu/yuzu_emu/model/Applet.kt | 55 + .../java/org/yuzu/yuzu_emu/model/Driver.kt | 27 + .../yuzu/yuzu_emu/model/DriverViewModel.kt | 196 + .../yuzu/yuzu_emu/model/EmulationViewModel.kt | 76 + .../main/java/org/yuzu/yuzu_emu/model/Game.kt | 103 + .../java/org/yuzu/yuzu_emu/model/GameDir.kt | 13 + .../org/yuzu/yuzu_emu/model/GameProperties.kt | 36 + .../yuzu_emu/model/GameVerificationResult.kt | 15 + .../org/yuzu/yuzu_emu/model/GamesViewModel.kt | 186 + .../org/yuzu/yuzu_emu/model/HomeSetting.kt | 18 + .../org/yuzu/yuzu_emu/model/HomeViewModel.kt | 76 + .../org/yuzu/yuzu_emu/model/InstallResult.kt | 15 + .../org/yuzu/yuzu_emu/model/Installable.kt | 13 + .../java/org/yuzu/yuzu_emu/model/License.kt | 16 + .../yuzu_emu/model/MessageDialogViewModel.kt | 16 + .../yuzu_emu/model/MinimalDocumentFile.kt | 11 + .../java/org/yuzu/yuzu_emu/model/Patch.kt | 16 + .../java/org/yuzu/yuzu_emu/model/PatchType.kt | 14 + .../org/yuzu/yuzu_emu/model/SelectableItem.kt | 9 + .../java/org/yuzu/yuzu_emu/model/SetupPage.kt | 29 + .../org/yuzu/yuzu_emu/model/TaskViewModel.kt | 83 + .../org/yuzu/yuzu_emu/overlay/InputOverlay.kt | 1049 + .../overlay/InputOverlayDrawableButton.kt | 151 + .../overlay/InputOverlayDrawableDpad.kt | 266 + .../overlay/InputOverlayDrawableJoystick.kt | 292 + .../yuzu_emu/overlay/model/OverlayControl.kt | 188 + .../overlay/model/OverlayControlData.kt | 19 + .../overlay/model/OverlayControlDefault.kt | 13 + .../yuzu_emu/overlay/model/OverlayLayout.kt | 10 + .../org/yuzu/yuzu_emu/ui/GamesFragment.kt | 160 + .../org/yuzu/yuzu_emu/ui/main/MainActivity.kt | 692 + .../yuzu/yuzu_emu/ui/main/ThemeProvider.kt | 11 + .../java/org/yuzu/yuzu_emu/utils/AddonUtil.kt | 8 + .../yuzu_emu/utils/DirectoryInitialization.kt | 213 + .../org/yuzu/yuzu_emu/utils/DocumentsTree.kt | 137 + .../java/org/yuzu/yuzu_emu/utils/FileUtil.kt | 503 + .../org/yuzu/yuzu_emu/utils/GameHelper.kt | 152 + .../org/yuzu/yuzu_emu/utils/GameIconUtils.kt | 109 + .../org/yuzu/yuzu_emu/utils/GameMetadata.kt | 22 + .../yuzu/yuzu_emu/utils/GpuDriverHelper.kt | 229 + .../yuzu/yuzu_emu/utils/GpuDriverMetadata.kt | 119 + .../org/yuzu/yuzu_emu/utils/InputHandler.kt | 94 + .../org/yuzu/yuzu_emu/utils/InsetsHelper.kt | 25 + .../org/yuzu/yuzu_emu/utils/LifecycleUtils.kt | 38 + .../main/java/org/yuzu/yuzu_emu/utils/Log.kt | 31 + .../org/yuzu/yuzu_emu/utils/MemoryUtil.kt | 111 + .../org/yuzu/yuzu_emu/utils/NativeConfig.kt | 186 + .../java/org/yuzu/yuzu_emu/utils/NfcReader.kt | 171 + .../org/yuzu/yuzu_emu/utils/ParamPackage.kt | 141 + .../org/yuzu/yuzu_emu/utils/PreferenceUtil.kt | 37 + .../yuzu/yuzu_emu/utils/SerializableHelper.kt | 44 + .../org/yuzu/yuzu_emu/utils/ThemeHelper.kt | 105 + .../java/org/yuzu/yuzu_emu/utils/ViewUtils.kt | 93 + .../yuzu_emu/viewholder/AbstractViewHolder.kt | 18 + .../yuzu_emu/views/FixedRatioSurfaceView.kt | 64 + src/android/app/src/main/jni/CMakeLists.txt | 26 + .../app/src/main/jni/android_config.cpp | 337 + src/android/app/src/main/jni/android_config.h | 51 + .../app/src/main/jni/android_settings.cpp | 10 + .../app/src/main/jni/android_settings.h | 80 + .../src/main/jni/emu_window/emu_window.cpp | 62 + .../app/src/main/jni/emu_window/emu_window.h | 59 + .../app/src/main/jni/game_metadata.cpp | 147 + src/android/app/src/main/jni/native.cpp | 873 + src/android/app/src/main/jni/native.h | 92 + .../app/src/main/jni/native_config.cpp | 543 + src/android/app/src/main/jni/native_input.cpp | 645 + src/android/app/src/main/jni/native_log.cpp | 30 + .../ic_stat_notification_logo.png | Bin 0 -> 46179 bytes .../ic_stat_notification_logo.png | Bin 0 -> 48264 bytes .../src/main/res/drawable-xhdpi/tv_banner.png | Bin 0 -> 7764 bytes .../ic_stat_notification_logo.png | Bin 0 -> 56651 bytes .../app/src/main/res/drawable/button_anim.xml | 142 + .../app/src/main/res/drawable/button_l3.xml | 128 + .../main/res/drawable/button_l3_depressed.xml | 75 + .../app/src/main/res/drawable/button_r3.xml | 128 + .../main/res/drawable/button_r3_depressed.xml | 75 + .../src/main/res/drawable/default_icon.jpg | Bin 0 -> 6285 bytes .../src/main/res/drawable/dpad_standard.xml | 24 + .../dpad_standard_cardinal_depressed.xml | 24 + .../dpad_standard_diagonal_depressed.xml | 24 + .../src/main/res/drawable/facebutton_a.xml | 22 + .../res/drawable/facebutton_a_depressed.xml | 8 + .../src/main/res/drawable/facebutton_b.xml | 22 + .../res/drawable/facebutton_b_depressed.xml | 8 + .../src/main/res/drawable/facebutton_home.xml | 21 + .../drawable/facebutton_home_depressed.xml | 8 + .../main/res/drawable/facebutton_minus.xml | 22 + .../drawable/facebutton_minus_depressed.xml | 9 + .../src/main/res/drawable/facebutton_plus.xml | 22 + .../drawable/facebutton_plus_depressed.xml | 9 + .../res/drawable/facebutton_screenshot.xml | 21 + .../facebutton_screenshot_depressed.xml | 8 + .../src/main/res/drawable/facebutton_x.xml | 22 + .../res/drawable/facebutton_x_depressed.xml | 8 + .../src/main/res/drawable/facebutton_y.xml | 22 + .../res/drawable/facebutton_y_depressed.xml | 8 + .../app/src/main/res/drawable/ic_add.xml | 9 + .../app/src/main/res/drawable/ic_album.xml | 9 + .../app/src/main/res/drawable/ic_applet.xml | 9 + .../main/res/drawable/ic_arrow_forward.xml | 10 + .../app/src/main/res/drawable/ic_audio.xml | 9 + .../app/src/main/res/drawable/ic_back.xml | 10 + .../app/src/main/res/drawable/ic_build.xml | 9 + .../src/main/res/drawable/ic_cartridge.xml | 12 + .../res/drawable/ic_cartridge_outline.xml | 12 + .../app/src/main/res/drawable/ic_check.xml | 9 + .../src/main/res/drawable/ic_check_circle.xml | 9 + .../app/src/main/res/drawable/ic_clear.xml | 9 + .../app/src/main/res/drawable/ic_code.xml | 9 + .../src/main/res/drawable/ic_controller.xml | 9 + .../drawable/ic_controller_disconnected.xml | 9 + .../app/src/main/res/drawable/ic_delete.xml | 9 + .../app/src/main/res/drawable/ic_diamond.xml | 9 + .../app/src/main/res/drawable/ic_discord.xml | 10 + .../app/src/main/res/drawable/ic_edit.xml | 9 + .../app/src/main/res/drawable/ic_exit.xml | 10 + .../app/src/main/res/drawable/ic_export.xml | 9 + .../app/src/main/res/drawable/ic_firmware.xml | 10 + .../src/main/res/drawable/ic_folder_open.xml | 9 + .../app/src/main/res/drawable/ic_github.xml | 10 + .../app/src/main/res/drawable/ic_graphics.xml | 9 + .../app/src/main/res/drawable/ic_icon_bg.xml | 751 + .../app/src/main/res/drawable/ic_import.xml | 9 + .../src/main/res/drawable/ic_info_outline.xml | 9 + .../app/src/main/res/drawable/ic_install.xml | 9 + .../app/src/main/res/drawable/ic_key.xml | 9 + .../app/src/main/res/drawable/ic_launcher.xml | 6 + .../app/src/main/res/drawable/ic_lock.xml | 9 + .../app/src/main/res/drawable/ic_log.xml | 10 + .../app/src/main/res/drawable/ic_mii.xml | 18 + .../src/main/res/drawable/ic_more_vert.xml | 9 + .../src/main/res/drawable/ic_new_label.xml | 9 + .../app/src/main/res/drawable/ic_nfc.xml | 9 + .../src/main/res/drawable/ic_notification.xml | 9 + .../app/src/main/res/drawable/ic_options.xml | 9 + .../app/src/main/res/drawable/ic_overlay.xml | 21 + .../app/src/main/res/drawable/ic_palette.xml | 9 + .../app/src/main/res/drawable/ic_pause.xml | 9 + .../app/src/main/res/drawable/ic_pip_mute.xml | 9 + .../src/main/res/drawable/ic_pip_pause.xml | 9 + .../app/src/main/res/drawable/ic_pip_play.xml | 9 + .../src/main/res/drawable/ic_pip_unmute.xml | 9 + .../app/src/main/res/drawable/ic_play.xml | 9 + .../app/src/main/res/drawable/ic_refresh.xml | 9 + .../app/src/main/res/drawable/ic_restore.xml | 9 + .../app/src/main/res/drawable/ic_save.xml | 9 + .../app/src/main/res/drawable/ic_search.xml | 9 + .../app/src/main/res/drawable/ic_settings.xml | 9 + .../main/res/drawable/ic_settings_outline.xml | 9 + .../app/src/main/res/drawable/ic_share.xml | 9 + .../app/src/main/res/drawable/ic_shortcut.xml | 9 + .../main/res/drawable/ic_system_settings.xml | 9 + .../res/drawable/ic_system_update_alt.xml | 9 + .../app/src/main/res/drawable/ic_unlock.xml | 9 + .../app/src/main/res/drawable/ic_website.xml | 9 + .../app/src/main/res/drawable/ic_yuzu.xml | 22 + .../src/main/res/drawable/ic_yuzu_full.xml | 12 + .../src/main/res/drawable/ic_yuzu_title.xml | 24 + .../app/src/main/res/drawable/joystick.xml | 45 + .../main/res/drawable/joystick_depressed.xml | 10 + .../src/main/res/drawable/joystick_range.xml | 38 + .../app/src/main/res/drawable/l_shoulder.xml | 23 + .../res/drawable/l_shoulder_depressed.xml | 8 + .../main/res/drawable/premium_background.xml | 9 + .../app/src/main/res/drawable/r_shoulder.xml | 23 + .../res/drawable/r_shoulder_depressed.xml | 8 + .../main/res/drawable/selector_cartridge.xml | 5 + .../main/res/drawable/selector_settings.xml | 5 + .../app/src/main/res/drawable/shortcut.xml | 11 + .../res/drawable/stick_one_direction_anim.xml | 118 + .../res/drawable/stick_two_direction_anim.xml | 173 + .../app/src/main/res/drawable/zl_trigger.xml | 25 + .../res/drawable/zl_trigger_depressed.xml | 10 + .../app/src/main/res/drawable/zr_trigger.xml | 25 + .../res/drawable/zr_trigger_depressed.xml | 10 + .../layout-ldrtl/list_item_setting_input.xml | 63 + .../layout-w1000dp/card_installable_icon.xml | 82 + .../main/res/layout-w600dp/activity_main.xml | 58 + .../main/res/layout-w600dp/fragment_about.xml | 236 + .../res/layout-w600dp/fragment_game_info.xml | 155 + .../fragment_game_properties.xml | 119 + .../main/res/layout-w600dp/fragment_setup.xml | 46 + .../src/main/res/layout-w600dp/page_setup.xml | 96 + .../main/res/layout/activity_emulation.xml | 9 + .../app/src/main/res/layout/activity_main.xml | 58 + .../src/main/res/layout/activity_settings.xml | 34 + .../main/res/layout/card_driver_option.xml | 81 + .../app/src/main/res/layout/card_folder.xml | 65 + .../app/src/main/res/layout/card_game.xml | 55 + .../src/main/res/layout/card_home_option.xml | 78 + .../src/main/res/layout/card_installable.xml | 72 + .../main/res/layout/card_installable_icon.xml | 89 + .../main/res/layout/card_simple_outlined.xml | 72 + .../src/main/res/layout/dialog_add_folder.xml | 45 + .../src/main/res/layout/dialog_edit_text.xml | 23 + .../res/layout/dialog_folder_properties.xml | 30 + .../main/res/layout/dialog_input_profiles.xml | 6 + .../src/main/res/layout/dialog_license.xml | 64 + .../app/src/main/res/layout/dialog_list.xml | 15 + .../src/main/res/layout/dialog_list_item.xml | 30 + .../src/main/res/layout/dialog_mapping.xml | 26 + .../main/res/layout/dialog_overlay_adjust.xml | 67 + .../main/res/layout/dialog_progress_bar.xml | 30 + .../app/src/main/res/layout/dialog_slider.xml | 30 + .../src/main/res/layout/fragment_about.xml | 235 + .../src/main/res/layout/fragment_addons.xml | 51 + .../res/layout/fragment_applet_launcher.xml | 33 + .../res/layout/fragment_driver_manager.xml | 50 + .../main/res/layout/fragment_early_access.xml | 245 + .../main/res/layout/fragment_emulation.xml | 186 + .../src/main/res/layout/fragment_folders.xml | 51 + .../main/res/layout/fragment_game_info.xml | 136 + .../res/layout/fragment_game_properties.xml | 102 + .../src/main/res/layout/fragment_games.xml | 35 + .../res/layout/fragment_home_settings.xml | 36 + .../main/res/layout/fragment_installables.xml | 33 + .../src/main/res/layout/fragment_licenses.xml | 32 + .../src/main/res/layout/fragment_search.xml | 184 + .../src/main/res/layout/fragment_settings.xml | 43 + .../res/layout/fragment_settings_search.xml | 120 + .../src/main/res/layout/fragment_setup.xml | 46 + .../src/main/res/layout/header_in_game.xml | 14 + .../src/main/res/layout/list_item_addon.xml | 69 + .../res/layout/list_item_input_profile.xml | 74 + .../src/main/res/layout/list_item_setting.xml | 79 + .../res/layout/list_item_setting_input.xml | 63 + .../res/layout/list_item_setting_switch.xml | 72 + .../res/layout/list_item_settings_header.xml | 16 + .../app/src/main/res/layout/page_setup.xml | 92 + .../main/res/menu-w600dp/menu_navigation.xml | 19 + .../src/main/res/menu/menu_driver_manager.xml | 8 + .../app/src/main/res/menu/menu_in_game.xml | 39 + .../src/main/res/menu/menu_input_options.xml | 34 + .../app/src/main/res/menu/menu_navigation.xml | 19 + .../main/res/menu/menu_overlay_options.xml | 55 + .../app/src/main/res/menu/menu_settings.xml | 11 + .../res/navigation/emulation_navigation.xml | 41 + .../main/res/navigation/home_navigation.xml | 174 + .../res/navigation/settings_navigation.xml | 32 + .../app/src/main/res/resources.properties | 1 + .../app/src/main/res/values-ar/strings.xml | 467 + .../app/src/main/res/values-ckb/strings.xml | 385 + .../app/src/main/res/values-cs/strings.xml | 264 + .../app/src/main/res/values-de/strings.xml | 474 + .../app/src/main/res/values-es/strings.xml | 595 + .../app/src/main/res/values-fa/strings.xml | 595 + .../app/src/main/res/values-fr/strings.xml | 645 + .../app/src/main/res/values-he/strings.xml | 493 + .../app/src/main/res/values-hu/strings.xml | 627 + .../app/src/main/res/values-id/strings.xml | 587 + .../app/src/main/res/values-it/strings.xml | 528 + .../app/src/main/res/values-ja/strings.xml | 468 + .../app/src/main/res/values-ko/strings.xml | 581 + .../app/src/main/res/values-nb/strings.xml | 399 + .../src/main/res/values-night-v31/themes.xml | 31 + .../app/src/main/res/values-night/themes.xml | 9 + .../src/main/res/values-night/yuzu_colors.xml | 37 + .../app/src/main/res/values-pl/strings.xml | 394 + .../src/main/res/values-pt-rBR/strings.xml | 646 + .../src/main/res/values-pt-rPT/strings.xml | 646 + .../app/src/main/res/values-ru/strings.xml | 648 + .../app/src/main/res/values-uk/strings.xml | 321 + .../app/src/main/res/values-v31/themes.xml | 31 + .../app/src/main/res/values-vi/strings.xml | 401 + .../app/src/main/res/values-w600dp/bools.xml | 4 + .../app/src/main/res/values-w600dp/dimens.xml | 7 + .../src/main/res/values-w600dp/integers.xml | 6 + .../src/main/res/values-zh-rCN/strings.xml | 641 + .../src/main/res/values-zh-rTW/strings.xml | 641 + .../app/src/main/res/values/arrays.xml | 306 + src/android/app/src/main/res/values/bools.xml | 4 + .../app/src/main/res/values/dimens.xml | 23 + .../app/src/main/res/values/integers.xml | 113 + .../app/src/main/res/values/strings.xml | 1170 + .../app/src/main/res/values/styles.xml | 36 + .../app/src/main/res/values/themes.xml | 51 + .../app/src/main/res/values/yuzu_colors.xml | 37 + .../main/res/xml/data_extraction_rules.xml | 20 + .../res/xml/data_extraction_rules_api_31.xml | 43 + .../app/src/main/res/xml/game_mode_config.xml | 7 + .../app/src/main/res/xml/nfc_tech_filter.xml | 6 + src/android/build.gradle.kts | 22 + src/android/gradle.properties | 20 + src/android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54708 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + src/android/gradlew | 175 + src/android/gradlew.bat | 87 + src/android/settings.gradle.kts | 21 + src/audio_core/CMakeLists.txt | 269 + src/audio_core/adsp/adsp.cpp | 27 + src/audio_core/adsp/adsp.h | 53 + .../apps/audio_renderer/audio_renderer.cpp | 230 + .../adsp/apps/audio_renderer/audio_renderer.h | 116 + .../adsp/apps/audio_renderer/command_buffer.h | 28 + .../audio_renderer/command_list_processor.cpp | 104 + .../audio_renderer/command_list_processor.h | 117 + .../adsp/apps/opus/opus_decode_object.cpp | 107 + .../adsp/apps/opus/opus_decode_object.h | 38 + .../adsp/apps/opus/opus_decoder.cpp | 269 + src/audio_core/adsp/apps/opus/opus_decoder.h | 92 + .../opus/opus_multistream_decode_object.cpp | 111 + .../opus/opus_multistream_decode_object.h | 39 + src/audio_core/adsp/apps/opus/shared_memory.h | 17 + src/audio_core/adsp/mailbox.h | 60 + src/audio_core/audio_core.cpp | 50 + src/audio_core/audio_core.h | 76 + src/audio_core/audio_event.cpp | 61 + src/audio_core/audio_event.h | 92 + src/audio_core/audio_in_manager.cpp | 90 + src/audio_core/audio_in_manager.h | 91 + src/audio_core/audio_manager.cpp | 81 + src/audio_core/audio_manager.h | 88 + src/audio_core/audio_out_manager.cpp | 81 + src/audio_core/audio_out_manager.h | 88 + src/audio_core/audio_render_manager.cpp | 70 + src/audio_core/audio_render_manager.h | 105 + .../common/audio_renderer_parameter.h | 60 + src/audio_core/common/common.h | 138 + src/audio_core/common/feature_support.h | 106 + src/audio_core/common/wave_buffer.h | 35 + src/audio_core/common/workbuffer_allocator.h | 100 + src/audio_core/device/audio_buffer.h | 25 + src/audio_core/device/audio_buffers.h | 325 + src/audio_core/device/device_session.cpp | 144 + src/audio_core/device/device_session.h | 158 + src/audio_core/in/audio_in.cpp | 100 + src/audio_core/in/audio_in.h | 147 + src/audio_core/in/audio_in_system.cpp | 225 + src/audio_core/in/audio_in_system.h | 276 + src/audio_core/opus/decoder.cpp | 179 + src/audio_core/opus/decoder.h | 53 + src/audio_core/opus/decoder_manager.cpp | 102 + src/audio_core/opus/decoder_manager.h | 40 + src/audio_core/opus/hardware_opus.cpp | 242 + src/audio_core/opus/hardware_opus.h | 45 + src/audio_core/opus/parameters.h | 54 + src/audio_core/out/audio_out.cpp | 100 + src/audio_core/out/audio_out.h | 147 + src/audio_core/out/audio_out_system.cpp | 219 + src/audio_core/out/audio_out_system.h | 258 + src/audio_core/precompiled_headers.h | 6 + src/audio_core/renderer/audio_device.cpp | 72 + src/audio_core/renderer/audio_device.h | 78 + src/audio_core/renderer/audio_renderer.cpp | 68 + src/audio_core/renderer/audio_renderer.h | 99 + .../renderer/behavior/behavior_info.cpp | 193 + .../renderer/behavior/behavior_info.h | 376 + .../renderer/behavior/info_updater.cpp | 539 + .../renderer/behavior/info_updater.h | 209 + .../renderer/command/command_buffer.cpp | 716 + .../renderer/command/command_buffer.h | 468 + .../renderer/command/command_generator.cpp | 796 + .../renderer/command/command_generator.h | 349 + .../renderer/command/command_list_header.h | 22 + .../command_processing_time_estimator.cpp | 3620 +++ .../command_processing_time_estimator.h | 254 + src/audio_core/renderer/command/commands.h | 32 + .../renderer/command/data_source/adpcm.cpp | 90 + .../renderer/command/data_source/adpcm.h | 120 + .../renderer/command/data_source/decode.cpp | 429 + .../renderer/command/data_source/decode.h | 59 + .../command/data_source/pcm_float.cpp | 96 + .../renderer/command/data_source/pcm_float.h | 114 + .../command/data_source/pcm_int16.cpp | 97 + .../renderer/command/data_source/pcm_int16.h | 111 + .../renderer/command/effect/aux_.cpp | 215 + src/audio_core/renderer/command/effect/aux_.h | 67 + .../renderer/command/effect/biquad_filter.cpp | 110 + .../renderer/command/effect/biquad_filter.h | 75 + .../renderer/command/effect/capture.cpp | 142 + .../renderer/command/effect/capture.h | 63 + .../renderer/command/effect/compressor.cpp | 155 + .../renderer/command/effect/compressor.h | 61 + .../renderer/command/effect/delay.cpp | 238 + .../renderer/command/effect/delay.h | 61 + .../renderer/command/effect/i3dl2_reverb.cpp | 438 + .../renderer/command/effect/i3dl2_reverb.h | 61 + .../renderer/command/effect/light_limiter.cpp | 222 + .../renderer/command/effect/light_limiter.h | 104 + .../effect/multi_tap_biquad_filter.cpp | 45 + .../command/effect/multi_tap_biquad_filter.h | 60 + .../renderer/command/effect/reverb.cpp | 442 + .../renderer/command/effect/reverb.h | 63 + src/audio_core/renderer/command/icommand.h | 98 + .../renderer/command/mix/clear_mix.cpp | 24 + .../renderer/command/mix/clear_mix.h | 46 + .../renderer/command/mix/copy_mix.cpp | 27 + .../renderer/command/mix/copy_mix.h | 50 + .../command/mix/depop_for_mix_buffers.cpp | 64 + .../command/mix/depop_for_mix_buffers.h | 56 + .../renderer/command/mix/depop_prepare.cpp | 36 + .../renderer/command/mix/depop_prepare.h | 55 + src/audio_core/renderer/command/mix/mix.cpp | 70 + src/audio_core/renderer/command/mix/mix.h | 55 + .../renderer/command/mix/mix_ramp.cpp | 83 + .../renderer/command/mix/mix_ramp.h | 74 + .../renderer/command/mix/mix_ramp_grouped.cpp | 66 + .../renderer/command/mix/mix_ramp_grouped.h | 62 + .../renderer/command/mix/volume.cpp | 72 + src/audio_core/renderer/command/mix/volume.h | 54 + .../renderer/command/mix/volume_ramp.cpp | 85 + .../renderer/command/mix/volume_ramp.h | 57 + .../command/performance/performance.cpp | 40 + .../command/performance/performance.h | 52 + .../command/resample/downmix_6ch_to_2ch.cpp | 74 + .../command/resample/downmix_6ch_to_2ch.h | 60 + .../renderer/command/resample/resample.cpp | 883 + .../renderer/command/resample/resample.h | 29 + .../renderer/command/resample/upsample.cpp | 241 + .../renderer/command/resample/upsample.h | 61 + .../renderer/command/sink/circular_buffer.cpp | 48 + .../renderer/command/sink/circular_buffer.h | 56 + .../renderer/command/sink/device.cpp | 58 + src/audio_core/renderer/command/sink/device.h | 58 + src/audio_core/renderer/effect/aux_.cpp | 93 + src/audio_core/renderer/effect/aux_.h | 123 + .../renderer/effect/biquad_filter.cpp | 52 + .../renderer/effect/biquad_filter.h | 79 + .../renderer/effect/buffer_mixer.cpp | 49 + src/audio_core/renderer/effect/buffer_mixer.h | 75 + src/audio_core/renderer/effect/capture.cpp | 82 + src/audio_core/renderer/effect/capture.h | 65 + src/audio_core/renderer/effect/compressor.cpp | 40 + src/audio_core/renderer/effect/compressor.h | 106 + src/audio_core/renderer/effect/delay.cpp | 93 + src/audio_core/renderer/effect/delay.h | 135 + .../renderer/effect/effect_context.cpp | 41 + .../renderer/effect/effect_context.h | 75 + .../renderer/effect/effect_info_base.h | 435 + src/audio_core/renderer/effect/effect_reset.h | 71 + .../renderer/effect/effect_result_state.h | 16 + src/audio_core/renderer/effect/i3dl2.cpp | 94 + src/audio_core/renderer/effect/i3dl2.h | 201 + .../renderer/effect/light_limiter.cpp | 81 + .../renderer/effect/light_limiter.h | 138 + src/audio_core/renderer/effect/reverb.cpp | 93 + src/audio_core/renderer/effect/reverb.h | 190 + src/audio_core/renderer/memory/address_info.h | 124 + .../renderer/memory/memory_pool_info.cpp | 61 + .../renderer/memory/memory_pool_info.h | 170 + .../renderer/memory/pool_mapper.cpp | 245 + src/audio_core/renderer/memory/pool_mapper.h | 183 + src/audio_core/renderer/mix/mix_context.cpp | 142 + src/audio_core/renderer/mix/mix_context.h | 124 + src/audio_core/renderer/mix/mix_info.cpp | 120 + src/audio_core/renderer/mix/mix_info.h | 124 + src/audio_core/renderer/nodes/bit_array.h | 25 + src/audio_core/renderer/nodes/edge_matrix.cpp | 38 + src/audio_core/renderer/nodes/edge_matrix.h | 82 + src/audio_core/renderer/nodes/node_states.cpp | 141 + src/audio_core/renderer/nodes/node_states.h | 195 + .../renderer/performance/detail_aspect.cpp | 25 + .../renderer/performance/detail_aspect.h | 32 + .../renderer/performance/entry_aspect.cpp | 23 + .../renderer/performance/entry_aspect.h | 31 + .../renderer/performance/performance_detail.h | 50 + .../renderer/performance/performance_entry.h | 37 + .../performance/performance_entry_addresses.h | 17 + .../performance/performance_frame_header.h | 36 + .../performance/performance_manager.cpp | 646 + .../performance/performance_manager.h | 275 + .../sink/circular_buffer_sink_info.cpp | 76 + .../renderer/sink/circular_buffer_sink_info.h | 41 + .../renderer/sink/device_sink_info.cpp | 57 + .../renderer/sink/device_sink_info.h | 40 + src/audio_core/renderer/sink/sink_context.cpp | 21 + src/audio_core/renderer/sink/sink_context.h | 47 + .../renderer/sink/sink_info_base.cpp | 51 + src/audio_core/renderer/sink/sink_info_base.h | 177 + .../renderer/splitter/splitter_context.cpp | 217 + .../renderer/splitter/splitter_context.h | 189 + .../splitter/splitter_destinations_data.cpp | 87 + .../splitter/splitter_destinations_data.h | 135 + .../renderer/splitter/splitter_info.cpp | 79 + .../renderer/splitter/splitter_info.h | 107 + src/audio_core/renderer/system.cpp | 822 + src/audio_core/renderer/system.h | 329 + src/audio_core/renderer/system_manager.cpp | 102 + src/audio_core/renderer/system_manager.h | 90 + .../renderer/upsampler/upsampler_info.cpp | 6 + .../renderer/upsampler/upsampler_info.h | 35 + .../renderer/upsampler/upsampler_manager.cpp | 44 + .../renderer/upsampler/upsampler_manager.h | 45 + .../renderer/upsampler/upsampler_state.h | 40 + .../renderer/voice/voice_channel_resource.h | 38 + .../renderer/voice/voice_context.cpp | 87 + src/audio_core/renderer/voice/voice_context.h | 126 + src/audio_core/renderer/voice/voice_info.cpp | 408 + src/audio_core/renderer/voice/voice_info.h | 380 + src/audio_core/renderer/voice/voice_state.h | 70 + src/audio_core/sink/cubeb_sink.cpp | 404 + src/audio_core/sink/cubeb_sink.h | 107 + src/audio_core/sink/null_sink.h | 57 + src/audio_core/sink/oboe_sink.cpp | 227 + src/audio_core/sink/oboe_sink.h | 75 + src/audio_core/sink/sdl2_sink.cpp | 271 + src/audio_core/sink/sdl2_sink.h | 98 + src/audio_core/sink/sink.h | 107 + src/audio_core/sink/sink_details.cpp | 135 + src/audio_core/sink/sink_details.h | 45 + src/audio_core/sink/sink_stream.cpp | 307 + src/audio_core/sink/sink_stream.h | 268 + src/common/CMakeLists.txt | 269 + src/common/address_space.cpp | 10 + src/common/address_space.h | 151 + src/common/address_space.inc | 366 + src/common/algorithm.h | 35 + src/common/alignment.h | 123 + src/common/android/android_common.cpp | 65 + src/common/android/android_common.h | 26 + .../android/applets/software_keyboard.cpp | 277 + .../android/applets/software_keyboard.h | 78 + src/common/android/id_cache.cpp | 591 + src/common/android/id_cache.h | 112 + src/common/announce_multiplayer_room.h | 140 + src/common/arm64/native_clock.cpp | 87 + src/common/arm64/native_clock.h | 45 + src/common/assert.cpp | 21 + src/common/assert.h | 84 + src/common/atomic_helpers.h | 776 + src/common/atomic_ops.h | 149 + src/common/bit_cast.h | 23 + src/common/bit_field.h | 195 + src/common/bit_set.h | 86 + src/common/bit_util.h | 66 + src/common/bounded_threadsafe_queue.h | 249 + src/common/cityhash.cpp | 321 + src/common/cityhash.h | 85 + src/common/common_funcs.h | 147 + src/common/common_precompiled_headers.h | 14 + src/common/common_types.h | 53 + src/common/concepts.h | 35 + src/common/container_hash.h | 92 + src/common/demangle.cpp | 37 + src/common/demangle.h | 12 + src/common/detached_tasks.cpp | 41 + src/common/detached_tasks.h | 39 + src/common/div_ceil.h | 25 + src/common/dynamic_library.cpp | 106 + src/common/dynamic_library.h | 78 + src/common/elf.h | 341 + src/common/error.cpp | 57 + src/common/error.h | 21 + src/common/expected.h | 986 + src/common/fiber.cpp | 135 + src/common/fiber.h | 65 + src/common/fixed_point.h | 652 + src/common/free_region_manager.h | 55 + src/common/fs/file.cpp | 455 + src/common/fs/file.h | 459 + src/common/fs/fs.cpp | 660 + src/common/fs/fs.h | 583 + src/common/fs/fs_android.cpp | 122 + src/common/fs/fs_android.h | 46 + src/common/fs/fs_paths.h | 31 + src/common/fs/fs_types.h | 71 + src/common/fs/fs_util.cpp | 39 + src/common/fs/fs_util.h | 85 + src/common/fs/path_util.cpp | 482 + src/common/fs/path_util.h | 316 + src/common/hash.h | 28 + src/common/heap_tracker.cpp | 281 + src/common/heap_tracker.h | 98 + src/common/hex_util.cpp | 21 + src/common/hex_util.h | 74 + src/common/host_memory.cpp | 730 + src/common/host_memory.h | 87 + src/common/input.h | 525 + src/common/intrusive_list.h | 631 + src/common/intrusive_red_black_tree.h | 621 + src/common/linux/gamemode.cpp | 40 + src/common/linux/gamemode.h | 24 + src/common/literals.h | 30 + src/common/logging/backend.cpp | 353 + src/common/logging/backend.h | 28 + src/common/logging/filter.cpp | 242 + src/common/logging/filter.h | 64 + src/common/logging/formatter.h | 22 + src/common/logging/log.h | 67 + src/common/logging/log_entry.h | 26 + src/common/logging/text_formatter.cpp | 144 + src/common/logging/text_formatter.h | 20 + src/common/logging/types.h | 135 + src/common/lru_cache.h | 139 + src/common/lz4_compression.cpp | 80 + src/common/lz4_compression.h | 61 + src/common/make_unique_for_overwrite.h | 27 + src/common/math_util.h | 99 + src/common/memory_detect.cpp | 72 + src/common/memory_detect.h | 21 + src/common/microprofile.cpp | 6 + src/common/microprofile.h | 24 + src/common/microprofileui.h | 18 + src/common/multi_level_page_table.cpp | 9 + src/common/multi_level_page_table.h | 78 + src/common/multi_level_page_table.inc | 84 + src/common/nvidia_flags.cpp | 32 + src/common/nvidia_flags.h | 11 + src/common/overflow.h | 40 + src/common/page_table.cpp | 60 + src/common/page_table.h | 147 + src/common/param_package.cpp | 139 + src/common/param_package.h | 41 + src/common/parent_of_member.h | 190 + src/common/point.h | 56 + src/common/polyfill_ranges.h | 530 + src/common/polyfill_thread.h | 375 + src/common/precompiled_headers.h | 6 + src/common/quaternion.h | 79 + src/common/range_map.h | 139 + src/common/range_mutex.h | 93 + src/common/range_sets.h | 73 + src/common/range_sets.inc | 304 + src/common/reader_writer_queue.h | 940 + src/common/ring_buffer.h | 118 + src/common/scm_rev.cpp.in | 31 + src/common/scm_rev.h | 20 + src/common/scope_exit.h | 82 + src/common/scratch_buffer.h | 133 + src/common/settings.cpp | 345 + src/common/settings.h | 650 + src/common/settings_common.cpp | 61 + src/common/settings_common.h | 274 + src/common/settings_enums.h | 223 + src/common/settings_input.cpp | 47 + src/common/settings_input.h | 413 + src/common/settings_setting.h | 422 + src/common/signal_chain.cpp | 42 + src/common/signal_chain.h | 19 + src/common/slot_vector.h | 227 + src/common/socket_types.h | 66 + src/common/spin_lock.cpp | 53 + src/common/spin_lock.h | 33 + src/common/stb.cpp | 8 + src/common/stb.h | 8 + src/common/steady_clock.cpp | 80 + src/common/steady_clock.h | 34 + src/common/stream.cpp | 46 + src/common/stream.h | 55 + src/common/string_util.cpp | 223 + src/common/string_util.h | 82 + src/common/swap.h | 665 + src/common/telemetry.cpp | 119 + src/common/telemetry.h | 209 + src/common/thread.cpp | 123 + src/common/thread.h | 109 + src/common/thread_queue_list.h | 177 + src/common/thread_worker.h | 117 + src/common/threadsafe_queue.h | 196 + src/common/time_zone.cpp | 104 + src/common/time_zone.h | 23 + src/common/tiny_mt.h | 249 + src/common/tree.h | 720 + src/common/typed_address.h | 315 + src/common/uint128.h | 119 + src/common/unique_function.h | 61 + src/common/uuid.cpp | 212 + src/common/uuid.h | 131 + src/common/vector_math.h | 734 + src/common/virtual_buffer.cpp | 42 + src/common/virtual_buffer.h | 82 + src/common/wall_clock.cpp | 80 + src/common/wall_clock.h | 91 + src/common/windows/timer_resolution.cpp | 109 + src/common/windows/timer_resolution.h | 38 + src/common/x64/cpu_detect.cpp | 253 + src/common/x64/cpu_detect.h | 83 + src/common/x64/cpu_wait.cpp | 75 + src/common/x64/cpu_wait.h | 10 + src/common/x64/native_clock.cpp | 46 + src/common/x64/native_clock.h | 38 + src/common/x64/rdtsc.cpp | 39 + src/common/x64/rdtsc.h | 37 + src/common/x64/xbyak_abi.h | 228 + src/common/x64/xbyak_util.h | 46 + src/common/zstd_compression.cpp | 49 + src/common/zstd_compression.h | 45 + src/core/CMakeLists.txt | 1234 ++ src/core/arm/arm_interface.cpp | 55 + src/core/arm/arm_interface.h | 113 + src/core/arm/debug.cpp | 354 + src/core/arm/debug.h | 35 + src/core/arm/dynarmic/arm_dynarmic.cpp | 49 + src/core/arm/dynarmic/arm_dynarmic.h | 49 + src/core/arm/dynarmic/arm_dynarmic_32.cpp | 447 + src/core/arm/dynarmic/arm_dynarmic_32.h | 76 + src/core/arm/dynarmic/arm_dynarmic_64.cpp | 477 + src/core/arm/dynarmic/arm_dynarmic_64.h | 77 + src/core/arm/dynarmic/dynarmic_cp15.cpp | 161 + src/core/arm/dynarmic/dynarmic_cp15.h | 42 + .../dynarmic/dynarmic_exclusive_monitor.cpp | 73 + .../arm/dynarmic/dynarmic_exclusive_monitor.h | 45 + src/core/arm/exclusive_monitor.cpp | 24 + src/core/arm/exclusive_monitor.h | 37 + src/core/arm/nce/arm_nce.cpp | 380 + src/core/arm/nce/arm_nce.h | 95 + src/core/arm/nce/arm_nce.s | 268 + src/core/arm/nce/arm_nce_asm_definitions.h | 30 + src/core/arm/nce/guest_context.h | 52 + src/core/arm/nce/instructions.h | 147 + src/core/arm/nce/interpreter_visitor.cpp | 824 + src/core/arm/nce/interpreter_visitor.h | 103 + src/core/arm/nce/patcher.cpp | 503 + src/core/arm/nce/patcher.h | 105 + src/core/arm/nce/visitor_base.h | 2783 +++ src/core/arm/symbols.cpp | 130 + src/core/arm/symbols.h | 26 + src/core/constants.cpp | 27 + src/core/constants.h | 17 + src/core/core.cpp | 1080 + src/core/core.h | 471 + src/core/core_timing.cpp | 336 + src/core/core_timing.h | 192 + src/core/cpu_manager.cpp | 224 + src/core/cpu_manager.h | 107 + src/core/crypto/aes_util.cpp | 129 + src/core/crypto/aes_util.h | 62 + src/core/crypto/ctr_encryption_layer.cpp | 52 + src/core/crypto/ctr_encryption_layer.h | 35 + src/core/crypto/encryption_layer.cpp | 41 + src/core/crypto/encryption_layer.h | 32 + src/core/crypto/key_manager.cpp | 1379 ++ src/core/crypto/key_manager.h | 344 + src/core/crypto/partition_data_manager.cpp | 509 + src/core/crypto/partition_data_manager.h | 109 + src/core/crypto/sha_util.cpp | 4 + src/core/crypto/sha_util.h | 19 + src/core/crypto/xts_encryption_layer.cpp | 56 + src/core/crypto/xts_encryption_layer.h | 24 + src/core/debugger/debugger.cpp | 366 + src/core/debugger/debugger.h | 52 + src/core/debugger/debugger_interface.h | 90 + src/core/debugger/gdbstub.cpp | 790 + src/core/debugger/gdbstub.h | 66 + src/core/debugger/gdbstub_arch.cpp | 473 + src/core/debugger/gdbstub_arch.h | 69 + src/core/device_memory.cpp | 21 + src/core/device_memory.h | 65 + src/core/device_memory_manager.h | 217 + src/core/device_memory_manager.inc | 589 + src/core/file_sys/bis_factory.cpp | 144 + src/core/file_sys/bis_factory.h | 78 + src/core/file_sys/card_image.cpp | 356 + src/core/file_sys/card_image.h | 149 + src/core/file_sys/common_funcs.h | 55 + src/core/file_sys/content_archive.cpp | 199 + src/core/file_sys/content_archive.h | 108 + src/core/file_sys/control_metadata.cpp | 142 + src/core/file_sys/control_metadata.h | 123 + src/core/file_sys/errors.h | 97 + src/core/file_sys/fs_directory.h | 37 + src/core/file_sys/fs_file.h | 65 + src/core/file_sys/fs_filesystem.h | 66 + src/core/file_sys/fs_memory_management.h | 40 + src/core/file_sys/fs_operate_range.h | 22 + src/core/file_sys/fs_path.h | 566 + src/core/file_sys/fs_path_utility.h | 1240 ++ src/core/file_sys/fs_save_data_types.h | 188 + src/core/file_sys/fs_string_util.h | 241 + src/core/file_sys/fsa/fs_i_directory.h | 91 + src/core/file_sys/fsa/fs_i_file.h | 167 + src/core/file_sys/fsa/fs_i_filesystem.h | 206 + src/core/file_sys/fsmitm_romfsbuild.cpp | 354 + src/core/file_sys/fsmitm_romfsbuild.h | 50 + src/core/file_sys/fssrv/fssrv_sf_path.h | 36 + src/core/file_sys/fssystem/fs_i_storage.h | 58 + src/core/file_sys/fssystem/fs_types.h | 46 + ...ystem_aes_ctr_counter_extended_storage.cpp | 251 + ...ssystem_aes_ctr_counter_extended_storage.h | 114 + .../fssystem/fssystem_aes_ctr_storage.cpp | 129 + .../fssystem/fssystem_aes_ctr_storage.h | 43 + .../fssystem/fssystem_aes_xts_storage.cpp | 112 + .../fssystem/fssystem_aes_xts_storage.h | 43 + .../fssystem_alignment_matching_storage.h | 146 + ...system_alignment_matching_storage_impl.cpp | 204 + ...fssystem_alignment_matching_storage_impl.h | 21 + .../fssystem/fssystem_bucket_tree.cpp | 598 + .../file_sys/fssystem/fssystem_bucket_tree.h | 416 + .../fssystem_bucket_tree_template_impl.h | 170 + .../fssystem/fssystem_bucket_tree_utils.h | 110 + .../fssystem/fssystem_compressed_storage.h | 963 + .../fssystem/fssystem_compression_common.h | 43 + .../fssystem_compression_configuration.cpp | 36 + .../fssystem_compression_configuration.h | 12 + .../fssystem_crypto_configuration.cpp | 65 + .../fssystem/fssystem_crypto_configuration.h | 12 + ...rchical_integrity_verification_storage.cpp | 127 + ...rarchical_integrity_verification_storage.h | 164 + .../fssystem_hierarchical_sha256_storage.cpp | 82 + .../fssystem_hierarchical_sha256_storage.h | 44 + .../fssystem/fssystem_indirect_storage.cpp | 119 + .../fssystem/fssystem_indirect_storage.h | 294 + .../fssystem_integrity_romfs_storage.cpp | 30 + .../fssystem_integrity_romfs_storage.h | 42 + ...ssystem_integrity_verification_storage.cpp | 91 + .../fssystem_integrity_verification_storage.h | 65 + ...stem_memory_resource_buffer_hold_storage.h | 61 + .../fssystem_nca_file_system_driver.cpp | 1351 ++ .../fssystem_nca_file_system_driver.h | 364 + .../file_sys/fssystem/fssystem_nca_header.cpp | 20 + .../file_sys/fssystem/fssystem_nca_header.h | 338 + .../file_sys/fssystem/fssystem_nca_reader.cpp | 531 + .../fssystem/fssystem_pooled_buffer.cpp | 61 + .../fssystem/fssystem_pooled_buffer.h | 95 + .../fssystem/fssystem_sparse_storage.cpp | 39 + .../fssystem/fssystem_sparse_storage.h | 72 + .../fssystem/fssystem_switch_storage.h | 80 + .../file_sys/fssystem/fssystem_utility.cpp | 27 + src/core/file_sys/fssystem/fssystem_utility.h | 12 + src/core/file_sys/ips_layer.cpp | 344 + src/core/file_sys/ips_layer.h | 43 + src/core/file_sys/kernel_executable.cpp | 230 + src/core/file_sys/kernel_executable.h | 106 + src/core/file_sys/nca_metadata.cpp | 128 + src/core/file_sys/nca_metadata.h | 113 + src/core/file_sys/partition_filesystem.cpp | 116 + src/core/file_sys/partition_filesystem.h | 91 + src/core/file_sys/patch_manager.cpp | 696 + src/core/file_sys/patch_manager.h | 103 + src/core/file_sys/program_metadata.cpp | 220 + src/core/file_sys/program_metadata.h | 189 + src/core/file_sys/registered_cache.cpp | 1036 + src/core/file_sys/registered_cache.h | 265 + src/core/file_sys/romfs.cpp | 167 + src/core/file_sys/romfs.h | 18 + src/core/file_sys/romfs_factory.cpp | 96 + src/core/file_sys/romfs_factory.h | 64 + src/core/file_sys/savedata_factory.cpp | 194 + src/core/file_sys/savedata_factory.h | 56 + src/core/file_sys/sdmc_factory.cpp | 62 + src/core/file_sys/sdmc_factory.h | 42 + src/core/file_sys/submission_package.cpp | 289 + src/core/file_sys/submission_package.h | 90 + .../data/font_chinese_simplified.cpp | 13591 ++++++++++++ .../data/font_chinese_simplified.h | 12 + .../data/font_chinese_traditional.cpp | 13901 ++++++++++++ .../data/font_chinese_traditional.h | 12 + .../data/font_extended_chinese_simplified.cpp | 18356 ++++++++++++++++ .../data/font_extended_chinese_simplified.h | 12 + .../system_archive/data/font_korean.cpp | 13591 ++++++++++++ .../system_archive/data/font_korean.h | 12 + .../data/font_nintendo_extended.cpp | 388 + .../data/font_nintendo_extended.h | 12 + .../system_archive/data/font_standard.cpp | 13591 ++++++++++++ .../system_archive/data/font_standard.h | 12 + .../file_sys/system_archive/mii_model.cpp | 39 + src/core/file_sys/system_archive/mii_model.h | 12 + src/core/file_sys/system_archive/ng_word.cpp | 74 + src/core/file_sys/system_archive/ng_word.h | 13 + .../file_sys/system_archive/shared_font.cpp | 77 + .../file_sys/system_archive/shared_font.h | 16 + .../system_archive/system_archive.cpp | 97 + .../file_sys/system_archive/system_archive.h | 13 + .../system_archive/system_version.cpp | 37 + .../file_sys/system_archive/system_version.h | 15 + .../system_archive/time_zone_binary.cpp | 86 + .../system_archive/time_zone_binary.h | 12 + src/core/file_sys/vfs/vfs.cpp | 551 + src/core/file_sys/vfs/vfs.h | 326 + src/core/file_sys/vfs/vfs_cached.cpp | 63 + src/core/file_sys/vfs/vfs_cached.h | 31 + src/core/file_sys/vfs/vfs_concat.cpp | 192 + src/core/file_sys/vfs/vfs_concat.h | 57 + src/core/file_sys/vfs/vfs_layered.cpp | 132 + src/core/file_sys/vfs/vfs_layered.h | 46 + src/core/file_sys/vfs/vfs_offset.cpp | 98 + src/core/file_sys/vfs/vfs_offset.h | 50 + src/core/file_sys/vfs/vfs_real.cpp | 536 + src/core/file_sys/vfs/vfs_real.h | 148 + src/core/file_sys/vfs/vfs_static.h | 80 + src/core/file_sys/vfs/vfs_types.h | 29 + src/core/file_sys/vfs/vfs_vector.cpp | 133 + src/core/file_sys/vfs/vfs_vector.h | 131 + src/core/file_sys/xts_archive.cpp | 170 + src/core/file_sys/xts_archive.h | 70 + src/core/frontend/applets/applet.h | 14 + src/core/frontend/applets/cabinet.cpp | 22 + src/core/frontend/applets/cabinet.h | 39 + src/core/frontend/applets/controller.cpp | 79 + src/core/frontend/applets/controller.h | 61 + src/core/frontend/applets/error.cpp | 36 + src/core/frontend/applets/error.h | 40 + src/core/frontend/applets/general.cpp | 59 + src/core/frontend/applets/general.h | 63 + src/core/frontend/applets/mii_edit.cpp | 19 + src/core/frontend/applets/mii_edit.h | 27 + src/core/frontend/applets/profile_select.cpp | 21 + src/core/frontend/applets/profile_select.h | 39 + .../frontend/applets/software_keyboard.cpp | 148 + src/core/frontend/applets/software_keyboard.h | 117 + src/core/frontend/applets/web_browser.cpp | 32 + src/core/frontend/applets/web_browser.h | 42 + src/core/frontend/emu_window.cpp | 44 + src/core/frontend/emu_window.h | 199 + src/core/frontend/framebuffer_layout.cpp | 80 + src/core/frontend/framebuffer_layout.h | 64 + src/core/frontend/graphics_context.h | 62 + src/core/gpu_dirty_memory_manager.h | 122 + src/core/guest_memory.h | 214 + src/core/hardware_properties.h | 51 + src/core/hle/api_version.h | 46 + src/core/hle/ipc.h | 196 + .../arm64/k_memory_region_device_types.inc | 19 + .../board/nintendo/nx/k_memory_layout.cpp | 203 + .../board/nintendo/nx/k_memory_layout.h | 12 + .../nx/k_memory_region_device_types.inc | 51 + .../board/nintendo/nx/k_system_control.cpp | 254 + .../board/nintendo/nx/k_system_control.h | 50 + .../kernel/board/nintendo/nx/secure_monitor.h | 23 + src/core/hle/kernel/code_set.cpp | 11 + src/core/hle/kernel/code_set.h | 102 + .../hle/kernel/global_scheduler_context.cpp | 73 + .../hle/kernel/global_scheduler_context.h | 89 + src/core/hle/kernel/init/init_slab_setup.cpp | 298 + src/core/hle/kernel/init/init_slab_setup.h | 43 + src/core/hle/kernel/initial_process.h | 26 + src/core/hle/kernel/k_address_arbiter.cpp | 350 + src/core/hle/kernel/k_address_arbiter.h | 67 + src/core/hle/kernel/k_address_space_info.cpp | 60 + src/core/hle/kernel/k_address_space_info.h | 30 + src/core/hle/kernel/k_affinity_mask.h | 52 + src/core/hle/kernel/k_auto_object.cpp | 22 + src/core/hle/kernel/k_auto_object.h | 303 + .../hle/kernel/k_auto_object_container.cpp | 32 + src/core/hle/kernel/k_auto_object_container.h | 38 + src/core/hle/kernel/k_capabilities.cpp | 356 + src/core/hle/kernel/k_capabilities.h | 296 + src/core/hle/kernel/k_class_token.cpp | 125 + src/core/hle/kernel/k_class_token.h | 131 + src/core/hle/kernel/k_client_port.cpp | 190 + src/core/hle/kernel/k_client_port.h | 64 + src/core/hle/kernel/k_client_session.cpp | 53 + src/core/hle/kernel/k_client_session.h | 44 + src/core/hle/kernel/k_code_memory.cpp | 155 + src/core/hle/kernel/k_code_memory.h | 67 + src/core/hle/kernel/k_condition_variable.cpp | 337 + src/core/hle/kernel/k_condition_variable.h | 59 + src/core/hle/kernel/k_debug.h | 20 + .../hle/kernel/k_device_address_space.cpp | 150 + src/core/hle/kernel/k_device_address_space.h | 61 + src/core/hle/kernel/k_dynamic_page_manager.h | 170 + .../hle/kernel/k_dynamic_resource_manager.h | 61 + src/core/hle/kernel/k_dynamic_slab_heap.h | 122 + src/core/hle/kernel/k_event.cpp | 64 + src/core/hle/kernel/k_event.h | 58 + src/core/hle/kernel/k_event_info.h | 65 + src/core/hle/kernel/k_handle_table.cpp | 155 + src/core/hle/kernel/k_handle_table.h | 313 + src/core/hle/kernel/k_hardware_timer.cpp | 77 + src/core/hle/kernel/k_hardware_timer.h | 47 + src/core/hle/kernel/k_hardware_timer_base.h | 92 + src/core/hle/kernel/k_interrupt_manager.cpp | 44 + src/core/hle/kernel/k_interrupt_manager.h | 18 + .../hle/kernel/k_light_client_session.cpp | 31 + src/core/hle/kernel/k_light_client_session.h | 39 + .../hle/kernel/k_light_condition_variable.cpp | 80 + .../hle/kernel/k_light_condition_variable.h | 25 + src/core/hle/kernel/k_light_lock.cpp | 126 + src/core/hle/kernel/k_light_lock.h | 39 + .../hle/kernel/k_light_server_session.cpp | 247 + src/core/hle/kernel/k_light_server_session.h | 49 + src/core/hle/kernel/k_light_session.cpp | 81 + src/core/hle/kernel/k_light_session.h | 86 + src/core/hle/kernel/k_memory_block.h | 684 + .../hle/kernel/k_memory_block_manager.cpp | 403 + src/core/hle/kernel/k_memory_block_manager.h | 160 + src/core/hle/kernel/k_memory_layout.cpp | 165 + src/core/hle/kernel/k_memory_layout.h | 426 + src/core/hle/kernel/k_memory_manager.cpp | 548 + src/core/hle/kernel/k_memory_manager.h | 372 + src/core/hle/kernel/k_memory_region.h | 355 + src/core/hle/kernel/k_memory_region_type.h | 383 + src/core/hle/kernel/k_object_name.cpp | 102 + src/core/hle/kernel/k_object_name.h | 88 + src/core/hle/kernel/k_page_bitmap.h | 345 + src/core/hle/kernel/k_page_buffer.cpp | 18 + src/core/hle/kernel/k_page_buffer.h | 36 + src/core/hle/kernel/k_page_group.cpp | 121 + src/core/hle/kernel/k_page_group.h | 211 + src/core/hle/kernel/k_page_heap.cpp | 212 + src/core/hle/kernel/k_page_heap.h | 227 + src/core/hle/kernel/k_page_table.h | 16 + src/core/hle/kernel/k_page_table_base.cpp | 5798 +++++ src/core/hle/kernel/k_page_table_base.h | 764 + src/core/hle/kernel/k_page_table_manager.h | 55 + src/core/hle/kernel/k_page_table_slab_heap.h | 94 + src/core/hle/kernel/k_port.cpp | 70 + src/core/hle/kernel/k_port.h | 72 + src/core/hle/kernel/k_priority_queue.h | 480 + src/core/hle/kernel/k_process.cpp | 1338 ++ src/core/hle/kernel/k_process.h | 567 + src/core/hle/kernel/k_process_page_table.h | 477 + src/core/hle/kernel/k_readable_event.cpp | 69 + src/core/hle/kernel/k_readable_event.h | 42 + src/core/hle/kernel/k_resource_limit.cpp | 173 + src/core/hle/kernel/k_resource_limit.h | 64 + src/core/hle/kernel/k_scheduler.cpp | 897 + src/core/hle/kernel/k_scheduler.h | 173 + src/core/hle/kernel/k_scheduler_lock.h | 80 + src/core/hle/kernel/k_scoped_lock.h | 42 + .../kernel/k_scoped_resource_reservation.h | 61 + .../k_scoped_scheduler_lock_and_sleep.h | 49 + src/core/hle/kernel/k_server_port.cpp | 149 + src/core/hle/kernel/k_server_port.h | 58 + src/core/hle/kernel/k_server_session.cpp | 1542 ++ src/core/hle/kernel/k_server_session.h | 84 + src/core/hle/kernel/k_session.cpp | 77 + src/core/hle/kernel/k_session.h | 98 + src/core/hle/kernel/k_session_request.cpp | 62 + src/core/hle/kernel/k_session_request.h | 315 + src/core/hle/kernel/k_shared_memory.cpp | 106 + src/core/hle/kernel/k_shared_memory.h | 88 + src/core/hle/kernel/k_shared_memory_info.h | 45 + src/core/hle/kernel/k_slab_heap.h | 212 + src/core/hle/kernel/k_spin_lock.cpp | 20 + src/core/hle/kernel/k_spin_lock.h | 36 + .../hle/kernel/k_synchronization_object.cpp | 179 + .../hle/kernel/k_synchronization_object.h | 84 + src/core/hle/kernel/k_system_control.h | 22 + src/core/hle/kernel/k_system_resource.cpp | 100 + src/core/hle/kernel/k_system_resource.h | 137 + src/core/hle/kernel/k_thread.cpp | 1448 ++ src/core/hle/kernel/k_thread.h | 986 + src/core/hle/kernel/k_thread_local_page.cpp | 69 + src/core/hle/kernel/k_thread_local_page.h | 110 + src/core/hle/kernel/k_thread_queue.cpp | 51 + src/core/hle/kernel/k_thread_queue.h | 39 + src/core/hle/kernel/k_timer_task.h | 40 + src/core/hle/kernel/k_trace.h | 13 + src/core/hle/kernel/k_transfer_memory.cpp | 116 + src/core/hle/kernel/k_transfer_memory.h | 70 + src/core/hle/kernel/k_typed_address.h | 12 + src/core/hle/kernel/k_worker_task.h | 17 + src/core/hle/kernel/k_worker_task_manager.cpp | 41 + src/core/hle/kernel/k_worker_task_manager.h | 32 + src/core/hle/kernel/kernel.cpp | 1418 ++ src/core/hle/kernel/kernel.h | 338 + src/core/hle/kernel/memory_types.h | 18 + src/core/hle/kernel/message_buffer.h | 612 + src/core/hle/kernel/physical_core.cpp | 243 + src/core/hle/kernel/physical_core.h | 77 + src/core/hle/kernel/physical_memory.h | 23 + src/core/hle/kernel/slab_helpers.h | 211 + src/core/hle/kernel/svc.cpp | 4443 ++++ src/core/hle/kernel/svc.h | 538 + src/core/hle/kernel/svc/svc_activity.cpp | 66 + .../hle/kernel/svc/svc_address_arbiter.cpp | 106 + .../kernel/svc/svc_address_translation.cpp | 50 + src/core/hle/kernel/svc/svc_cache.cpp | 98 + src/core/hle/kernel/svc/svc_code_memory.cpp | 173 + .../hle/kernel/svc/svc_condition_variable.cpp | 73 + src/core/hle/kernel/svc/svc_debug.cpp | 194 + src/core/hle/kernel/svc/svc_debug_string.cpp | 30 + .../kernel/svc/svc_device_address_space.cpp | 260 + src/core/hle/kernel/svc/svc_event.cpp | 120 + src/core/hle/kernel/svc/svc_exception.cpp | 139 + src/core/hle/kernel/svc/svc_info.cpp | 284 + .../hle/kernel/svc/svc_insecure_memory.cpp | 35 + .../hle/kernel/svc/svc_interrupt_event.cpp | 25 + src/core/hle/kernel/svc/svc_io_pool.cpp | 71 + src/core/hle/kernel/svc/svc_ipc.cpp | 329 + src/core/hle/kernel/svc/svc_kernel_debug.cpp | 35 + src/core/hle/kernel/svc/svc_light_ipc.cpp | 91 + src/core/hle/kernel/svc/svc_lock.cpp | 51 + src/core/hle/kernel/svc/svc_memory.cpp | 201 + .../hle/kernel/svc/svc_physical_memory.cpp | 190 + src/core/hle/kernel/svc/svc_port.cpp | 220 + .../hle/kernel/svc/svc_power_management.cpp | 21 + src/core/hle/kernel/svc/svc_process.cpp | 196 + .../hle/kernel/svc/svc_process_memory.cpp | 303 + src/core/hle/kernel/svc/svc_processor.cpp | 25 + src/core/hle/kernel/svc/svc_query_memory.cpp | 65 + src/core/hle/kernel/svc/svc_register.cpp | 27 + .../hle/kernel/svc/svc_resource_limit.cpp | 147 + .../kernel/svc/svc_secure_monitor_call.cpp | 51 + src/core/hle/kernel/svc/svc_session.cpp | 155 + src/core/hle/kernel/svc/svc_shared_memory.cpp | 130 + .../hle/kernel/svc/svc_synchronization.cpp | 181 + src/core/hle/kernel/svc/svc_thread.cpp | 390 + .../hle/kernel/svc/svc_thread_profiler.cpp | 60 + src/core/hle/kernel/svc/svc_tick.cpp | 27 + .../hle/kernel/svc/svc_transfer_memory.cpp | 161 + src/core/hle/kernel/svc_common.h | 36 + src/core/hle/kernel/svc_generator.py | 723 + src/core/hle/kernel/svc_results.h | 46 + src/core/hle/kernel/svc_types.h | 671 + src/core/hle/kernel/svc_version.h | 58 + src/core/hle/result.h | 466 + src/core/hle/service/acc/acc.cpp | 1052 + src/core/hle/service/acc/acc.h | 75 + src/core/hle/service/acc/acc_aa.cpp | 25 + src/core/hle/service/acc/acc_aa.h | 17 + src/core/hle/service/acc/acc_su.cpp | 73 + src/core/hle/service/acc/acc_su.h | 17 + src/core/hle/service/acc/acc_u0.cpp | 45 + src/core/hle/service/acc/acc_u0.h | 17 + src/core/hle/service/acc/acc_u1.cpp | 54 + src/core/hle/service/acc/acc_u1.h | 17 + src/core/hle/service/acc/async_context.cpp | 70 + src/core/hle/service/acc/async_context.h | 39 + src/core/hle/service/acc/errors.h | 19 + src/core/hle/service/acc/profile_manager.cpp | 458 + src/core/hle/service/acc/profile_manager.h | 114 + src/core/hle/service/am/am.cpp | 21 + src/core/hle/service/am/am.h | 14 + src/core/hle/service/am/am_results.h | 16 + src/core/hle/service/am/am_types.h | 248 + src/core/hle/service/am/applet.cpp | 27 + src/core/hle/service/am/applet.h | 129 + .../hle/service/am/applet_data_broker.cpp | 67 + src/core/hle/service/am/applet_data_broker.h | 80 + src/core/hle/service/am/applet_manager.cpp | 380 + src/core/hle/service/am/applet_manager.h | 59 + .../hle/service/am/applet_message_queue.cpp | 73 + .../hle/service/am/applet_message_queue.h | 43 + .../hle/service/am/display_layer_manager.cpp | 151 + .../hle/service/am/display_layer_manager.h | 62 + .../service/am/frontend/applet_cabinet.cpp | 184 + .../hle/service/am/frontend/applet_cabinet.h | 113 + .../service/am/frontend/applet_controller.cpp | 271 + .../service/am/frontend/applet_controller.h | 156 + .../hle/service/am/frontend/applet_error.cpp | 219 + .../hle/service/am/frontend/applet_error.h | 51 + .../service/am/frontend/applet_general.cpp | 250 + .../hle/service/am/frontend/applet_general.h | 89 + .../service/am/frontend/applet_mii_edit.cpp | 177 + .../hle/service/am/frontend/applet_mii_edit.h | 51 + .../am/frontend/applet_mii_edit_types.h | 83 + .../am/frontend/applet_profile_select.cpp | 123 + .../am/frontend/applet_profile_select.h | 142 + .../am/frontend/applet_software_keyboard.cpp | 1274 ++ .../am/frontend/applet_software_keyboard.h | 186 + .../frontend/applet_software_keyboard_types.h | 354 + .../am/frontend/applet_web_browser.cpp | 505 + .../service/am/frontend/applet_web_browser.h | 84 + .../am/frontend/applet_web_browser_types.h | 177 + src/core/hle/service/am/frontend/applets.cpp | 237 + src/core/hle/service/am/frontend/applets.h | 146 + src/core/hle/service/am/hid_registration.cpp | 35 + src/core/hle/service/am/hid_registration.h | 32 + .../hle/service/am/library_applet_storage.cpp | 140 + .../hle/service/am/library_applet_storage.h | 36 + src/core/hle/service/am/process.cpp | 153 + src/core/hle/service/am/process.h | 50 + .../all_system_applet_proxies_service.cpp | 79 + .../all_system_applet_proxies_service.h | 41 + .../am/service/applet_common_functions.cpp | 63 + .../am/service/applet_common_functions.h | 26 + .../am/service/application_accessor.cpp | 138 + .../service/am/service/application_accessor.h | 40 + .../am/service/application_creator.cpp | 35 + .../service/am/service/application_creator.h | 23 + .../am/service/application_functions.cpp | 485 + .../am/service/application_functions.h | 84 + .../service/am/service/application_proxy.cpp | 105 + .../service/am/service/application_proxy.h | 47 + .../am/service/application_proxy_service.cpp | 42 + .../am/service/application_proxy_service.h | 30 + .../service/am/service/audio_controller.cpp | 69 + .../hle/service/am/service/audio_controller.h | 37 + .../am/service/common_state_getter.cpp | 278 + .../service/am/service/common_state_getter.h | 62 + .../am/service/cradle_firmware_updater.cpp | 52 + .../am/service/cradle_firmware_updater.h | 37 + .../service/am/service/debug_functions.cpp | 43 + .../hle/service/am/service/debug_functions.h | 16 + .../service/am/service/display_controller.cpp | 105 + .../service/am/service/display_controller.h | 36 + .../am/service/global_state_controller.cpp | 61 + .../am/service/global_state_controller.h | 31 + .../am/service/home_menu_functions.cpp | 74 + .../service/am/service/home_menu_functions.h | 34 + .../am/service/library_applet_accessor.cpp | 157 + .../am/service/library_applet_accessor.h | 45 + .../am/service/library_applet_creator.cpp | 268 + .../am/service/library_applet_creator.h | 35 + .../am/service/library_applet_proxy.cpp | 132 + .../service/am/service/library_applet_proxy.h | 54 + .../service/library_applet_self_accessor.cpp | 325 + .../am/service/library_applet_self_accessor.h | 83 + .../hle/service/am/service/lock_accessor.cpp | 75 + .../hle/service/am/service/lock_accessor.h | 32 + .../am/service/process_winding_controller.cpp | 54 + .../am/service/process_winding_controller.h | 28 + .../service/am/service/self_controller.cpp | 394 + .../hle/service/am/service/self_controller.h | 71 + src/core/hle/service/am/service/storage.cpp | 48 + src/core/hle/service/am/service/storage.h | 35 + .../service/am/service/storage_accessor.cpp | 68 + .../hle/service/am/service/storage_accessor.h | 38 + .../am/service/system_applet_proxy.cpp | 131 + .../service/am/service/system_applet_proxy.h | 53 + .../service/am/service/window_controller.cpp | 86 + .../service/am/service/window_controller.h | 30 + .../hle/service/aoc/addon_content_manager.cpp | 223 + .../hle/service/aoc/addon_content_manager.h | 51 + .../service/aoc/purchase_event_manager.cpp | 67 + .../hle/service/aoc/purchase_event_manager.h | 30 + src/core/hle/service/apm/apm.cpp | 27 + src/core/hle/service/apm/apm.h | 20 + src/core/hle/service/apm/apm_controller.cpp | 88 + src/core/hle/service/apm/apm_controller.h | 72 + src/core/hle/service/apm/apm_interface.cpp | 149 + src/core/hle/service/apm/apm_interface.h | 42 + src/core/hle/service/audio/audio.cpp | 35 + src/core/hle/service/audio/audio.h | 18 + .../hle/service/audio/audio_controller.cpp | 179 + src/core/hle/service/audio/audio_controller.h | 59 + src/core/hle/service/audio/audio_device.cpp | 163 + src/core/hle/service/audio/audio_device.h | 58 + src/core/hle/service/audio/audio_in.cpp | 146 + src/core/hle/service/audio/audio_in.h | 53 + .../hle/service/audio/audio_in_manager.cpp | 125 + src/core/hle/service/audio/audio_in_manager.h | 57 + src/core/hle/service/audio/audio_out.cpp | 146 + src/core/hle/service/audio/audio_out.h | 58 + .../hle/service/audio/audio_out_manager.cpp | 101 + .../hle/service/audio/audio_out_manager.h | 44 + src/core/hle/service/audio/audio_renderer.cpp | 139 + src/core/hle/service/audio/audio_renderer.h | 54 + .../service/audio/audio_renderer_manager.cpp | 104 + .../service/audio/audio_renderer_manager.h | 37 + src/core/hle/service/audio/errors.h | 35 + .../audio/final_output_recorder_manager.cpp | 43 + .../audio/final_output_recorder_manager.h | 20 + ...nal_output_recorder_manager_for_applet.cpp | 22 + ...final_output_recorder_manager_for_applet.h | 21 + .../service/audio/hardware_opus_decoder.cpp | 145 + .../hle/service/audio/hardware_opus_decoder.h | 63 + .../audio/hardware_opus_decoder_manager.cpp | 156 + .../audio/hardware_opus_decoder_manager.h | 53 + src/core/hle/service/bcat/backend/backend.cpp | 130 + src/core/hle/service/bcat/backend/backend.h | 120 + src/core/hle/service/bcat/bcat.cpp | 38 + src/core/hle/service/bcat/bcat.h | 16 + src/core/hle/service/bcat/bcat_result.h | 15 + src/core/hle/service/bcat/bcat_service.cpp | 132 + src/core/hle/service/bcat/bcat_service.h | 45 + src/core/hle/service/bcat/bcat_types.h | 66 + src/core/hle/service/bcat/bcat_util.h | 39 + .../bcat/delivery_cache_directory_service.cpp | 80 + .../bcat/delivery_cache_directory_service.h | 33 + .../bcat/delivery_cache_file_service.cpp | 82 + .../bcat/delivery_cache_file_service.h | 33 + .../bcat/delivery_cache_progress_service.cpp | 41 + .../bcat/delivery_cache_progress_service.h | 35 + .../bcat/delivery_cache_storage_service.cpp | 57 + .../bcat/delivery_cache_storage_service.h | 36 + .../bcat/news/newly_arrived_event_holder.cpp | 34 + .../bcat/news/newly_arrived_event_holder.h | 33 + .../service/bcat/news/news_data_service.cpp | 25 + .../hle/service/bcat/news/news_data_service.h | 20 + .../bcat/news/news_database_service.cpp | 53 + .../service/bcat/news/news_database_service.h | 32 + .../hle/service/bcat/news/news_service.cpp | 57 + src/core/hle/service/bcat/news/news_service.h | 28 + .../bcat/news/overwrite_event_holder.cpp | 33 + .../bcat/news/overwrite_event_holder.h | 33 + .../hle/service/bcat/news/service_creator.cpp | 64 + .../hle/service/bcat/news/service_creator.h | 35 + src/core/hle/service/bcat/service_creator.cpp | 62 + src/core/hle/service/bcat/service_creator.h | 40 + src/core/hle/service/bpc/bpc.cpp | 65 + src/core/hle/service/bpc/bpc.h | 18 + src/core/hle/service/btdrv/btdrv.cpp | 214 + src/core/hle/service/btdrv/btdrv.h | 18 + src/core/hle/service/btm/btm.cpp | 122 + src/core/hle/service/btm/btm.h | 14 + src/core/hle/service/btm/btm_debug.cpp | 33 + src/core/hle/service/btm/btm_debug.h | 21 + src/core/hle/service/btm/btm_system.cpp | 31 + src/core/hle/service/btm/btm_system.h | 25 + src/core/hle/service/btm/btm_system_core.cpp | 127 + src/core/hle/service/btm/btm_system_core.h | 60 + src/core/hle/service/btm/btm_user.cpp | 30 + src/core/hle/service/btm/btm_user.h | 25 + src/core/hle/service/btm/btm_user_core.cpp | 103 + src/core/hle/service/btm/btm_user_core.h | 47 + src/core/hle/service/caps/caps.cpp | 38 + src/core/hle/service/caps/caps.h | 14 + src/core/hle/service/caps/caps_a.cpp | 200 + src/core/hle/service/caps/caps_a.h | 58 + src/core/hle/service/caps/caps_c.cpp | 53 + src/core/hle/service/caps/caps_c.h | 30 + src/core/hle/service/caps/caps_manager.cpp | 495 + src/core/hle/service/caps/caps_manager.h | 93 + src/core/hle/service/caps/caps_result.h | 35 + src/core/hle/service/caps/caps_sc.cpp | 40 + src/core/hle/service/caps/caps_sc.h | 20 + src/core/hle/service/caps/caps_ss.cpp | 66 + src/core/hle/service/caps/caps_ss.h | 40 + src/core/hle/service/caps/caps_su.cpp | 99 + src/core/hle/service/caps/caps_su.h | 50 + src/core/hle/service/caps/caps_types.h | 196 + src/core/hle/service/caps/caps_u.cpp | 76 + src/core/hle/service/caps/caps_u.h | 39 + src/core/hle/service/cmif_serialization.h | 475 + src/core/hle/service/cmif_types.h | 302 + src/core/hle/service/erpt/erpt.cpp | 103 + src/core/hle/service/erpt/erpt.h | 14 + src/core/hle/service/es/es.cpp | 316 + src/core/hle/service/es/es.h | 14 + src/core/hle/service/eupld/eupld.cpp | 55 + src/core/hle/service/eupld/eupld.h | 14 + src/core/hle/service/fatal/fatal.cpp | 176 + src/core/hle/service/fatal/fatal.h | 33 + src/core/hle/service/fatal/fatal_p.cpp | 19 + src/core/hle/service/fatal/fatal_p.h | 16 + src/core/hle/service/fatal/fatal_u.cpp | 20 + src/core/hle/service/fatal/fatal_u.h | 16 + src/core/hle/service/fgm/fgm.cpp | 77 + src/core/hle/service/fgm/fgm.h | 14 + .../hle/service/filesystem/filesystem.cpp | 734 + src/core/hle/service/filesystem/filesystem.h | 261 + .../service/filesystem/fsp/fs_i_directory.cpp | 36 + .../service/filesystem/fsp/fs_i_directory.h | 31 + .../hle/service/filesystem/fsp/fs_i_file.cpp | 65 + .../hle/service/filesystem/fsp/fs_i_file.h | 32 + .../filesystem/fsp/fs_i_filesystem.cpp | 173 + .../service/filesystem/fsp/fs_i_filesystem.h | 60 + .../fsp/fs_i_multi_commit_manager.cpp | 33 + .../fsp/fs_i_multi_commit_manager.h | 23 + .../fsp/fs_i_save_data_info_reader.cpp | 161 + .../fsp/fs_i_save_data_info_reader.h | 50 + .../service/filesystem/fsp/fs_i_storage.cpp | 45 + .../hle/service/filesystem/fsp/fs_i_storage.h | 26 + .../hle/service/filesystem/fsp/fsp_ldr.cpp | 22 + src/core/hle/service/filesystem/fsp/fsp_ldr.h | 20 + .../hle/service/filesystem/fsp/fsp_pr.cpp | 23 + src/core/hle/service/filesystem/fsp/fsp_pr.h | 20 + .../hle/service/filesystem/fsp/fsp_srv.cpp | 552 + src/core/hle/service/filesystem/fsp/fsp_srv.h | 123 + .../hle/service/filesystem/fsp/fsp_types.h | 34 + .../fsp/save_data_transfer_prohibiter.cpp | 13 + .../fsp/save_data_transfer_prohibiter.h | 16 + .../service/filesystem/romfs_controller.cpp | 37 + .../hle/service/filesystem/romfs_controller.h | 31 + .../filesystem/save_data_controller.cpp | 99 + .../service/filesystem/save_data_controller.h | 35 + src/core/hle/service/friend/friend.cpp | 407 + src/core/hle/service/friend/friend.h | 32 + .../hle/service/friend/friend_interface.cpp | 20 + .../hle/service/friend/friend_interface.h | 16 + src/core/hle/service/glue/arp.cpp | 308 + src/core/hle/service/glue/arp.h | 40 + src/core/hle/service/glue/bgtc.cpp | 74 + src/core/hle/service/glue/bgtc.h | 34 + src/core/hle/service/glue/ectx.cpp | 62 + src/core/hle/service/glue/ectx.h | 23 + src/core/hle/service/glue/errors.h | 14 + src/core/hle/service/glue/glue.cpp | 59 + src/core/hle/service/glue/glue.h | 14 + src/core/hle/service/glue/glue_manager.cpp | 80 + src/core/hle/service/glue/glue_manager.h | 61 + src/core/hle/service/glue/notif.cpp | 294 + src/core/hle/service/glue/notif.h | 132 + .../hle/service/glue/time/alarm_worker.cpp | 83 + src/core/hle/service/glue/time/alarm_worker.h | 53 + .../glue/time/file_timestamp_worker.cpp | 23 + .../service/glue/time/file_timestamp_worker.h | 28 + src/core/hle/service/glue/time/manager.cpp | 273 + src/core/hle/service/glue/time/manager.h | 43 + .../glue/time/pm_state_change_handler.cpp | 13 + .../glue/time/pm_state_change_handler.h | 18 + .../time/standard_steady_clock_resource.cpp | 123 + .../time/standard_steady_clock_resource.h | 41 + src/core/hle/service/glue/time/static.cpp | 248 + src/core/hle/service/glue/time/static.h | 84 + src/core/hle/service/glue/time/time_zone.cpp | 232 + src/core/hle/service/glue/time/time_zone.h | 90 + .../service/glue/time/time_zone_binary.cpp | 221 + .../hle/service/glue/time/time_zone_binary.h | 32 + src/core/hle/service/glue/time/worker.cpp | 299 + src/core/hle/service/glue/time/worker.h | 64 + src/core/hle/service/grc/grc.cpp | 36 + src/core/hle/service/grc/grc.h | 14 + .../hid/active_vibration_device_list.cpp | 53 + .../hid/active_vibration_device_list.h | 39 + src/core/hle/service/hid/applet_resource.cpp | 34 + src/core/hle/service/hid/applet_resource.h | 36 + src/core/hle/service/hid/hid.cpp | 49 + src/core/hle/service/hid/hid.h | 14 + src/core/hle/service/hid/hid_debug_server.cpp | 286 + src/core/hle/service/hid/hid_debug_server.h | 45 + src/core/hle/service/hid/hid_server.cpp | 1439 ++ src/core/hle/service/hid/hid_server.h | 266 + .../hle/service/hid/hid_system_server.cpp | 944 + src/core/hle/service/hid/hid_system_server.h | 93 + src/core/hle/service/hid/hidbus.cpp | 357 + src/core/hle/service/hid/hidbus.h | 154 + src/core/hle/service/hid/irs.cpp | 382 + src/core/hle/service/hid/irs.h | 168 + src/core/hle/service/hid/xcd.cpp | 40 + src/core/hle/service/hid/xcd.h | 20 + src/core/hle/service/hle_ipc.cpp | 575 + src/core/hle/service/hle_ipc.h | 436 + src/core/hle/service/ipc_helpers.h | 506 + src/core/hle/service/jit/jit.cpp | 310 + src/core/hle/service/jit/jit.h | 14 + src/core/hle/service/jit/jit_code_memory.cpp | 54 + src/core/hle/service/jit/jit_code_memory.h | 49 + src/core/hle/service/jit/jit_context.cpp | 458 + src/core/hle/service/jit/jit_context.h | 65 + src/core/hle/service/kernel_helpers.cpp | 75 + src/core/hle/service/kernel_helpers.h | 35 + src/core/hle/service/lbl/lbl.cpp | 353 + src/core/hle/service/lbl/lbl.h | 14 + src/core/hle/service/ldn/lan_discovery.cpp | 625 + src/core/hle/service/ldn/lan_discovery.h | 133 + src/core/hle/service/ldn/ldn.cpp | 154 + src/core/hle/service/ldn/ldn.h | 14 + src/core/hle/service/ldn/ldn_results.h | 27 + src/core/hle/service/ldn/ldn_types.h | 352 + src/core/hle/service/ldn/monitor_service.cpp | 46 + src/core/hle/service/ldn/monitor_service.h | 29 + .../hle/service/ldn/sf_monitor_service.cpp | 40 + src/core/hle/service/ldn/sf_monitor_service.h | 26 + src/core/hle/service/ldn/sf_service.cpp | 37 + src/core/hle/service/ldn/sf_service.h | 21 + .../hle/service/ldn/sf_service_monitor.cpp | 50 + src/core/hle/service/ldn/sf_service_monitor.h | 26 + .../system_local_communication_service.cpp | 56 + .../ldn/system_local_communication_service.h | 25 + .../ldn/user_local_communication_service.cpp | 320 + .../ldn/user_local_communication_service.h | 103 + src/core/hle/service/ldr/ldr.cpp | 66 + src/core/hle/service/ldr/ldr.h | 14 + src/core/hle/service/lm/lm.cpp | 362 + src/core/hle/service/lm/lm.h | 14 + src/core/hle/service/mig/mig.cpp | 42 + src/core/hle/service/mig/mig.h | 14 + src/core/hle/service/mii/mii.cpp | 375 + src/core/hle/service/mii/mii.h | 33 + src/core/hle/service/mii/mii_database.cpp | 142 + src/core/hle/service/mii/mii_database.h | 66 + .../hle/service/mii/mii_database_manager.cpp | 420 + .../hle/service/mii/mii_database_manager.h | 58 + src/core/hle/service/mii/mii_manager.cpp | 486 + src/core/hle/service/mii/mii_manager.h | 87 + src/core/hle/service/mii/mii_result.h | 27 + src/core/hle/service/mii/mii_types.h | 692 + src/core/hle/service/mii/mii_util.h | 85 + src/core/hle/service/mii/types/char_info.cpp | 482 + src/core/hle/service/mii/types/char_info.h | 137 + src/core/hle/service/mii/types/core_data.cpp | 806 + src/core/hle/service/mii/types/core_data.h | 219 + src/core/hle/service/mii/types/raw_data.cpp | 1778 ++ src/core/hle/service/mii/types/raw_data.h | 73 + src/core/hle/service/mii/types/store_data.cpp | 676 + src/core/hle/service/mii/types/store_data.h | 150 + .../hle/service/mii/types/ver3_store_data.cpp | 241 + .../hle/service/mii/types/ver3_store_data.h | 160 + src/core/hle/service/mm/mm_u.cpp | 114 + src/core/hle/service/mm/mm_u.h | 14 + src/core/hle/service/mnpp/mnpp_app.cpp | 48 + src/core/hle/service/mnpp/mnpp_app.h | 14 + src/core/hle/service/ncm/ncm.cpp | 143 + src/core/hle/service/ncm/ncm.h | 14 + .../hle/service/nfc/common/amiibo_crypto.cpp | 392 + .../hle/service/nfc/common/amiibo_crypto.h | 101 + src/core/hle/service/nfc/common/device.cpp | 1523 ++ src/core/hle/service/nfc/common/device.h | 144 + .../hle/service/nfc/common/device_manager.cpp | 805 + .../hle/service/nfc/common/device_manager.h | 108 + src/core/hle/service/nfc/mifare_result.h | 17 + src/core/hle/service/nfc/mifare_types.h | 64 + src/core/hle/service/nfc/nfc.cpp | 232 + src/core/hle/service/nfc/nfc.h | 14 + src/core/hle/service/nfc/nfc_interface.cpp | 417 + src/core/hle/service/nfc/nfc_interface.h | 55 + src/core/hle/service/nfc/nfc_result.h | 34 + src/core/hle/service/nfc/nfc_types.h | 91 + src/core/hle/service/nfp/nfp.cpp | 214 + src/core/hle/service/nfp/nfp.h | 12 + src/core/hle/service/nfp/nfp_interface.cpp | 438 + src/core/hle/service/nfp/nfp_interface.h | 50 + src/core/hle/service/nfp/nfp_result.h | 27 + src/core/hle/service/nfp/nfp_types.h | 381 + src/core/hle/service/ngc/ngc.cpp | 150 + src/core/hle/service/ngc/ngc.h | 14 + src/core/hle/service/nifm/nifm.cpp | 663 + src/core/hle/service/nifm/nifm.h | 43 + src/core/hle/service/nim/nim.cpp | 431 + src/core/hle/service/nim/nim.h | 14 + src/core/hle/service/npns/npns.cpp | 131 + src/core/hle/service/npns/npns.h | 14 + .../service/ns/account_proxy_interface.cpp | 21 + .../hle/service/ns/account_proxy_interface.h | 16 + .../ns/application_manager_interface.cpp | 519 + .../ns/application_manager_interface.h | 62 + .../ns/application_version_interface.cpp | 33 + .../ns/application_version_interface.h | 16 + .../ns/content_management_interface.cpp | 72 + .../service/ns/content_management_interface.h | 25 + src/core/hle/service/ns/develop_interface.cpp | 38 + src/core/hle/service/ns/develop_interface.h | 16 + .../hle/service/ns/document_interface.cpp | 38 + src/core/hle/service/ns/document_interface.h | 22 + .../service/ns/download_task_interface.cpp | 39 + .../hle/service/ns/download_task_interface.h | 20 + .../service/ns/dynamic_rights_interface.cpp | 62 + .../hle/service/ns/dynamic_rights_interface.h | 22 + .../hle/service/ns/ecommerce_interface.cpp | 27 + src/core/hle/service/ns/ecommerce_interface.h | 16 + .../service/ns/factory_reset_interface.cpp | 27 + .../hle/service/ns/factory_reset_interface.h | 16 + src/core/hle/service/ns/language.cpp | 418 + src/core/hle/service/ns/language.h | 41 + src/core/hle/service/ns/ns.cpp | 44 + src/core/hle/service/ns/ns.h | 14 + src/core/hle/service/ns/ns_results.h | 12 + src/core/hle/service/ns/ns_types.h | 116 + .../service/ns/platform_service_manager.cpp | 273 + .../hle/service/ns/platform_service_manager.h | 79 + src/core/hle/service/ns/query_service.cpp | 56 + src/core/hle/service/ns/query_service.h | 36 + ...nly_application_control_data_interface.cpp | 122 + ..._only_application_control_data_interface.h | 30 + ...read_only_application_record_interface.cpp | 38 + .../read_only_application_record_interface.h | 22 + .../service/ns/service_getter_interface.cpp | 120 + .../hle/service/ns/service_getter_interface.h | 47 + .../hle/service/ns/system_update_control.cpp | 44 + .../hle/service/ns/system_update_control.h | 16 + .../service/ns/system_update_interface.cpp | 61 + .../hle/service/ns/system_update_interface.h | 38 + .../ns/vulnerability_manager_interface.cpp | 31 + .../ns/vulnerability_manager_interface.h | 21 + src/core/hle/service/nvdrv/core/container.cpp | 166 + src/core/hle/service/nvdrv/core/container.h | 85 + .../hle/service/nvdrv/core/heap_mapper.cpp | 74 + src/core/hle/service/nvdrv/core/heap_mapper.h | 49 + src/core/hle/service/nvdrv/core/nvmap.cpp | 346 + src/core/hle/service/nvdrv/core/nvmap.h | 187 + .../service/nvdrv/core/syncpoint_manager.cpp | 135 + .../service/nvdrv/core/syncpoint_manager.h | 134 + .../nvdrv/devices/ioctl_serialization.h | 159 + src/core/hle/service/nvdrv/devices/nvdevice.h | 82 + .../service/nvdrv/devices/nvdisp_disp0.cpp | 94 + .../hle/service/nvdrv/devices/nvdisp_disp0.h | 47 + .../service/nvdrv/devices/nvhost_as_gpu.cpp | 517 + .../hle/service/nvdrv/devices/nvhost_as_gpu.h | 219 + .../hle/service/nvdrv/devices/nvhost_ctrl.cpp | 383 + .../hle/service/nvdrv/devices/nvhost_ctrl.h | 203 + .../service/nvdrv/devices/nvhost_ctrl_gpu.cpp | 259 + .../service/nvdrv/devices/nvhost_ctrl_gpu.h | 176 + .../hle/service/nvdrv/devices/nvhost_gpu.cpp | 353 + .../hle/service/nvdrv/devices/nvhost_gpu.h | 223 + .../service/nvdrv/devices/nvhost_nvdec.cpp | 91 + .../hle/service/nvdrv/devices/nvhost_nvdec.h | 27 + .../nvdrv/devices/nvhost_nvdec_common.cpp | 172 + .../nvdrv/devices/nvhost_nvdec_common.h | 133 + .../service/nvdrv/devices/nvhost_nvjpg.cpp | 57 + .../hle/service/nvdrv/devices/nvhost_nvjpg.h | 39 + .../hle/service/nvdrv/devices/nvhost_vic.cpp | 84 + .../hle/service/nvdrv/devices/nvhost_vic.h | 25 + src/core/hle/service/nvdrv/devices/nvmap.cpp | 260 + src/core/hle/service/nvdrv/devices/nvmap.h | 121 + src/core/hle/service/nvdrv/nvdata.h | 102 + src/core/hle/service/nvdrv/nvdrv.cpp | 231 + src/core/hle/service/nvdrv/nvdrv.h | 116 + .../hle/service/nvdrv/nvdrv_interface.cpp | 272 + src/core/hle/service/nvdrv/nvdrv_interface.h | 47 + src/core/hle/service/nvdrv/nvmemp.cpp | 28 + src/core/hle/service/nvdrv/nvmemp.h | 24 + src/core/hle/service/nvnflinger/binder.h | 31 + src/core/hle/service/nvnflinger/buffer_item.h | 46 + .../nvnflinger/buffer_item_consumer.cpp | 59 + .../service/nvnflinger/buffer_item_consumer.h | 28 + .../nvnflinger/buffer_queue_consumer.cpp | 331 + .../nvnflinger/buffer_queue_consumer.h | 44 + .../service/nvnflinger/buffer_queue_core.cpp | 107 + .../service/nvnflinger/buffer_queue_core.h | 77 + .../service/nvnflinger/buffer_queue_defs.h | 21 + .../nvnflinger/buffer_queue_producer.cpp | 944 + .../nvnflinger/buffer_queue_producer.h | 92 + src/core/hle/service/nvnflinger/buffer_slot.h | 39 + .../nvnflinger/buffer_transform_flags.h | 27 + .../hle/service/nvnflinger/consumer_base.cpp | 153 + .../hle/service/nvnflinger/consumer_base.h | 62 + .../service/nvnflinger/consumer_listener.h | 26 + src/core/hle/service/nvnflinger/display.h | 53 + .../nvnflinger/graphic_buffer_producer.cpp | 18 + .../nvnflinger/graphic_buffer_producer.h | 76 + .../service/nvnflinger/hardware_composer.cpp | 215 + .../service/nvnflinger/hardware_composer.h | 53 + .../service/nvnflinger/hos_binder_driver.cpp | 66 + .../service/nvnflinger/hos_binder_driver.h | 46 + .../nvnflinger/hos_binder_driver_server.cpp | 40 + .../nvnflinger/hos_binder_driver_server.h | 35 + src/core/hle/service/nvnflinger/hwc_layer.h | 40 + .../hle/service/nvnflinger/nvnflinger.cpp | 24 + src/core/hle/service/nvnflinger/nvnflinger.h | 14 + src/core/hle/service/nvnflinger/parcel.h | 186 + .../hle/service/nvnflinger/pixel_format.h | 21 + .../service/nvnflinger/producer_listener.h | 17 + src/core/hle/service/nvnflinger/status.h | 28 + .../service/nvnflinger/surface_flinger.cpp | 139 + .../hle/service/nvnflinger/surface_flinger.h | 69 + src/core/hle/service/nvnflinger/ui/fence.h | 35 + .../service/nvnflinger/ui/graphic_buffer.cpp | 36 + .../service/nvnflinger/ui/graphic_buffer.h | 115 + src/core/hle/service/nvnflinger/window.h | 54 + .../hle/service/olsc/daemon_controller.cpp | 40 + src/core/hle/service/olsc/daemon_controller.h | 20 + .../hle/service/olsc/native_handle_holder.cpp | 28 + .../hle/service/olsc/native_handle_holder.h | 22 + src/core/hle/service/olsc/olsc.cpp | 29 + src/core/hle/service/olsc/olsc.h | 14 + .../olsc/olsc_service_for_application.cpp | 63 + .../olsc/olsc_service_for_application.h | 23 + .../olsc/olsc_service_for_system_service.cpp | 117 + .../olsc/olsc_service_for_system_service.h | 27 + .../olsc/remote_storage_controller.cpp | 54 + .../service/olsc/remote_storage_controller.h | 19 + .../olsc/transfer_task_list_controller.cpp | 55 + .../olsc/transfer_task_list_controller.h | 20 + src/core/hle/service/omm/omm.cpp | 22 + src/core/hle/service/omm/omm.h | 14 + .../service/omm/operation_mode_manager.cpp | 49 + .../hle/service/omm/operation_mode_manager.h | 20 + .../hle/service/omm/policy_manager_system.cpp | 26 + .../hle/service/omm/policy_manager_system.h | 20 + .../hle/service/omm/power_state_interface.cpp | 32 + .../hle/service/omm/power_state_interface.h | 20 + src/core/hle/service/os/event.cpp | 31 + src/core/hle/service/os/event.h | 31 + src/core/hle/service/os/multi_wait.cpp | 59 + src/core/hle/service/os/multi_wait.h | 36 + src/core/hle/service/os/multi_wait_holder.cpp | 25 + src/core/hle/service/os/multi_wait_holder.h | 44 + src/core/hle/service/os/multi_wait_utils.h | 109 + src/core/hle/service/os/mutex.cpp | 46 + src/core/hle/service/os/mutex.h | 31 + src/core/hle/service/pcie/pcie.cpp | 69 + src/core/hle/service/pcie/pcie.h | 14 + .../service/pctl/parental_control_service.cpp | 434 + .../service/pctl/parental_control_service.h | 86 + .../pctl/parental_control_service_factory.cpp | 40 + .../pctl/parental_control_service_factory.h | 31 + src/core/hle/service/pctl/pctl.cpp | 28 + src/core/hle/service/pctl/pctl.h | 14 + src/core/hle/service/pctl/pctl_results.h | 15 + src/core/hle/service/pctl/pctl_types.h | 43 + src/core/hle/service/pcv/pcv.cpp | 154 + src/core/hle/service/pcv/pcv.h | 105 + src/core/hle/service/pm/pm.cpp | 266 + src/core/hle/service/pm/pm.h | 19 + src/core/hle/service/prepo/prepo.cpp | 179 + src/core/hle/service/prepo/prepo.h | 14 + src/core/hle/service/psc/ovln/ovln_types.h | 21 + src/core/hle/service/psc/ovln/receiver.cpp | 24 + src/core/hle/service/psc/ovln/receiver.h | 16 + .../hle/service/psc/ovln/receiver_service.cpp | 28 + .../hle/service/psc/ovln/receiver_service.h | 22 + src/core/hle/service/psc/ovln/sender.cpp | 32 + src/core/hle/service/psc/ovln/sender.h | 21 + .../hle/service/psc/ovln/sender_service.cpp | 30 + .../hle/service/psc/ovln/sender_service.h | 23 + src/core/hle/service/psc/pm_control.cpp | 28 + src/core/hle/service/psc/pm_control.h | 16 + src/core/hle/service/psc/pm_module.cpp | 24 + src/core/hle/service/psc/pm_module.h | 16 + src/core/hle/service/psc/pm_service.cpp | 28 + src/core/hle/service/psc/pm_service.h | 22 + src/core/hle/service/psc/psc.cpp | 38 + src/core/hle/service/psc/psc.h | 14 + src/core/hle/service/psc/time/alarms.cpp | 209 + src/core/hle/service/psc/time/alarms.h | 139 + .../psc/time/clocks/context_writers.cpp | 83 + .../service/psc/time/clocks/context_writers.h | 79 + .../ephemeral_network_system_clock_core.h | 21 + .../standard_local_system_clock_core.cpp | 20 + .../clocks/standard_local_system_clock_core.h | 23 + .../standard_network_system_clock_core.cpp | 42 + .../standard_network_system_clock_core.h | 30 + .../clocks/standard_steady_clock_core.cpp | 101 + .../time/clocks/standard_steady_clock_core.h | 54 + .../standard_user_system_clock_core.cpp | 63 + .../clocks/standard_user_system_clock_core.h | 55 + .../psc/time/clocks/steady_clock_core.h | 81 + .../psc/time/clocks/system_clock_core.cpp | 75 + .../psc/time/clocks/system_clock_core.h | 55 + .../clocks/tick_based_steady_clock_core.cpp | 43 + .../clocks/tick_based_steady_clock_core.h | 41 + src/core/hle/service/psc/time/common.cpp | 16 + src/core/hle/service/psc/time/common.h | 273 + src/core/hle/service/psc/time/errors.h | 24 + src/core/hle/service/psc/time/manager.h | 56 + .../psc/time/power_state_request_manager.cpp | 50 + .../psc/time/power_state_request_manager.h | 42 + .../service/psc/time/power_state_service.cpp | 45 + .../service/psc/time/power_state_service.h | 33 + .../hle/service/psc/time/service_manager.cpp | 290 + .../hle/service/psc/time/service_manager.h | 86 + .../hle/service/psc/time/shared_memory.cpp | 84 + src/core/hle/service/psc/time/shared_memory.h | 70 + src/core/hle/service/psc/time/static.cpp | 342 + src/core/hle/service/psc/time/static.h | 83 + .../hle/service/psc/time/steady_clock.cpp | 112 + src/core/hle/service/psc/time/steady_clock.h | 42 + .../hle/service/psc/time/system_clock.cpp | 85 + src/core/hle/service/psc/time/system_clock.h | 41 + src/core/hle/service/psc/time/time_zone.cpp | 283 + src/core/hle/service/psc/time/time_zone.h | 63 + .../service/psc/time/time_zone_service.cpp | 171 + .../hle/service/psc/time/time_zone_service.h | 66 + src/core/hle/service/ptm/psm.cpp | 172 + src/core/hle/service/ptm/psm.h | 31 + src/core/hle/service/ptm/ptm.cpp | 22 + src/core/hle/service/ptm/ptm.h | 14 + src/core/hle/service/ptm/ts.cpp | 88 + src/core/hle/service/ptm/ts.h | 22 + src/core/hle/service/ro/ro.cpp | 594 + src/core/hle/service/ro/ro.h | 14 + src/core/hle/service/ro/ro_nro_utils.cpp | 185 + src/core/hle/service/ro/ro_nro_utils.h | 26 + src/core/hle/service/ro/ro_results.h | 24 + src/core/hle/service/ro/ro_types.h | 181 + src/core/hle/service/server_manager.cpp | 434 + src/core/hle/service/server_manager.h | 97 + src/core/hle/service/service.cpp | 154 + src/core/hle/service/service.h | 234 + src/core/hle/service/services.cpp | 136 + src/core/hle/service/services.h | 22 + .../service/set/factory_settings_server.cpp | 63 + .../hle/service/set/factory_settings_server.h | 20 + .../set/firmware_debug_settings_server.cpp | 29 + .../set/firmware_debug_settings_server.h | 20 + src/core/hle/service/set/key_code_map.h | 973 + .../set/setting_formats/appln_settings.cpp | 16 + .../set/setting_formats/appln_settings.h | 35 + .../set/setting_formats/device_settings.cpp | 12 + .../set/setting_formats/device_settings.h | 54 + .../set/setting_formats/private_settings.cpp | 12 + .../set/setting_formats/private_settings.h | 38 + .../set/setting_formats/system_settings.cpp | 74 + .../set/setting_formats/system_settings.h | 391 + src/core/hle/service/set/settings.cpp | 26 + src/core/hle/service/set/settings.h | 14 + src/core/hle/service/set/settings_server.cpp | 242 + src/core/hle/service/set/settings_server.h | 51 + src/core/hle/service/set/settings_types.h | 504 + .../service/set/system_settings_server.cpp | 1391 ++ .../hle/service/set/system_settings_server.h | 177 + src/core/hle/service/sm/sm.cpp | 288 + src/core/hle/service/sm/sm.h | 108 + src/core/hle/service/sm/sm_controller.cpp | 92 + src/core/hle/service/sm/sm_controller.h | 26 + src/core/hle/service/sockets/bsd.cpp | 1061 + src/core/hle/service/sockets/bsd.h | 200 + src/core/hle/service/sockets/nsd.cpp | 126 + src/core/hle/service/sockets/nsd.h | 26 + src/core/hle/service/sockets/sfdnsres.cpp | 360 + src/core/hle/service/sockets/sfdnsres.h | 28 + src/core/hle/service/sockets/sockets.cpp | 25 + src/core/hle/service/sockets/sockets.h | 134 + .../hle/service/sockets/sockets_translate.cpp | 297 + .../hle/service/sockets/sockets_translate.h | 59 + src/core/hle/service/spl/csrng.cpp | 18 + src/core/hle/service/spl/csrng.h | 20 + src/core/hle/service/spl/spl.cpp | 185 + src/core/hle/service/spl/spl.h | 50 + src/core/hle/service/spl/spl_module.cpp | 187 + src/core/hle/service/spl/spl_module.h | 46 + src/core/hle/service/spl/spl_results.h | 30 + src/core/hle/service/spl/spl_types.h | 231 + src/core/hle/service/ssl/cert_store.cpp | 156 + src/core/hle/service/ssl/cert_store.h | 42 + src/core/hle/service/ssl/ssl.cpp | 571 + src/core/hle/service/ssl/ssl.h | 14 + src/core/hle/service/ssl/ssl_backend.h | 45 + src/core/hle/service/ssl/ssl_backend_none.cpp | 16 + .../hle/service/ssl/ssl_backend_openssl.cpp | 349 + .../hle/service/ssl/ssl_backend_schannel.cpp | 548 + .../ssl/ssl_backend_securetransport.cpp | 217 + src/core/hle/service/ssl/ssl_types.h | 107 + src/core/hle/service/usb/usb.cpp | 232 + src/core/hle/service/usb/usb.h | 14 + .../vi/application_display_service.cpp | 302 + .../service/vi/application_display_service.h | 81 + .../service/vi/application_root_service.cpp | 33 + .../hle/service/vi/application_root_service.h | 33 + src/core/hle/service/vi/conductor.cpp | 114 + src/core/hle/service/vi/conductor.h | 58 + src/core/hle/service/vi/container.cpp | 226 + src/core/hle/service/vi/container.h | 89 + src/core/hle/service/vi/display.h | 44 + src/core/hle/service/vi/display_list.h | 83 + src/core/hle/service/vi/layer.h | 81 + src/core/hle/service/vi/layer_list.h | 71 + .../service/vi/manager_display_service.cpp | 140 + .../hle/service/vi/manager_display_service.h | 37 + .../hle/service/vi/manager_root_service.cpp | 38 + .../hle/service/vi/manager_root_service.h | 32 + src/core/hle/service/vi/service_creator.cpp | 38 + src/core/hle/service/vi/service_creator.h | 28 + .../hle/service/vi/shared_buffer_manager.cpp | 431 + .../hle/service/vi/shared_buffer_manager.h | 92 + .../hle/service/vi/system_display_service.cpp | 169 + .../hle/service/vi/system_display_service.h | 47 + .../hle/service/vi/system_root_service.cpp | 32 + src/core/hle/service/vi/system_root_service.h | 32 + src/core/hle/service/vi/vi.cpp | 31 + src/core/hle/service/vi/vi.h | 16 + src/core/hle/service/vi/vi_results.h | 15 + src/core/hle/service/vi/vi_types.h | 92 + src/core/hle/service/vi/vsync_manager.cpp | 26 + src/core/hle/service/vi/vsync_manager.h | 29 + src/core/internal_network/network.cpp | 933 + src/core/internal_network/network.h | 126 + .../internal_network/network_interface.cpp | 227 + src/core/internal_network/network_interface.h | 29 + src/core/internal_network/socket_proxy.cpp | 301 + src/core/internal_network/socket_proxy.h | 99 + src/core/internal_network/sockets.h | 176 + .../loader/deconstructed_rom_directory.cpp | 308 + src/core/loader/deconstructed_rom_directory.h | 71 + src/core/loader/kip.cpp | 111 + src/core/loader/kip.h | 40 + src/core/loader/loader.cpp | 270 + src/core/loader/loader.h | 342 + src/core/loader/nax.cpp | 95 + src/core/loader/nax.h | 54 + src/core/loader/nca.cpp | 219 + src/core/loader/nca.h | 57 + src/core/loader/nro.cpp | 339 + src/core/loader/nro.h | 64 + src/core/loader/nso.cpp | 235 + src/core/loader/nso.h | 107 + src/core/loader/nsp.cpp | 254 + src/core/loader/nsp.h | 72 + src/core/loader/xci.cpp | 209 + src/core/loader/xci.h | 72 + src/core/memory.cpp | 1113 + src/core/memory.h | 507 + src/core/memory/cheat_engine.cpp | 288 + src/core/memory/cheat_engine.h | 88 + src/core/memory/dmnt_cheat_types.h | 37 + src/core/memory/dmnt_cheat_vm.cpp | 1268 ++ src/core/memory/dmnt_cheat_vm.h | 325 + src/core/perf_stats.cpp | 162 + src/core/perf_stats.h | 103 + src/core/precompiled_headers.h | 11 + src/core/reporter.cpp | 369 + src/core/reporter.h | 83 + src/core/telemetry_session.cpp | 294 + src/core/telemetry_session.h | 101 + src/core/tools/freezer.cpp | 189 + src/core/tools/freezer.h | 93 + src/core/tools/renderdoc.cpp | 55 + src/core/tools/renderdoc.h | 22 + src/dedicated_room/CMakeLists.txt | 30 + src/dedicated_room/precompiled_headers.h | 6 + src/dedicated_room/yuzu_room.cpp | 403 + src/dedicated_room/yuzu_room.rc | 20 + src/frontend_common/CMakeLists.txt | 11 + src/frontend_common/config.cpp | 1092 + src/frontend_common/config.h | 239 + src/frontend_common/content_manager.h | 380 + src/hid_core/CMakeLists.txt | 166 + src/hid_core/frontend/emulated_console.cpp | 324 + src/hid_core/frontend/emulated_console.h | 192 + src/hid_core/frontend/emulated_controller.cpp | 2062 ++ src/hid_core/frontend/emulated_controller.h | 640 + src/hid_core/frontend/emulated_devices.cpp | 483 + src/hid_core/frontend/emulated_devices.h | 212 + src/hid_core/frontend/input_converter.cpp | 436 + src/hid_core/frontend/input_converter.h | 119 + src/hid_core/frontend/input_interpreter.cpp | 64 + src/hid_core/frontend/input_interpreter.h | 111 + src/hid_core/frontend/motion_input.cpp | 357 + src/hid_core/frontend/motion_input.h | 119 + src/hid_core/hid_core.cpp | 222 + src/hid_core/hid_core.h | 89 + src/hid_core/hid_result.h | 67 + src/hid_core/hid_types.h | 747 + src/hid_core/hid_util.h | 146 + src/hid_core/hidbus/hidbus_base.cpp | 73 + src/hid_core/hidbus/hidbus_base.h | 183 + src/hid_core/hidbus/ringcon.cpp | 291 + src/hid_core/hidbus/ringcon.h | 253 + src/hid_core/hidbus/starlink.cpp | 50 + src/hid_core/hidbus/starlink.h | 37 + src/hid_core/hidbus/stubbed.cpp | 50 + src/hid_core/hidbus/stubbed.h | 37 + .../irsensor/clustering_processor.cpp | 267 + src/hid_core/irsensor/clustering_processor.h | 115 + .../irsensor/image_transfer_processor.cpp | 154 + .../irsensor/image_transfer_processor.h | 79 + src/hid_core/irsensor/ir_led_processor.cpp | 27 + src/hid_core/irsensor/ir_led_processor.h | 47 + src/hid_core/irsensor/irs_types.h | 301 + src/hid_core/irsensor/moment_processor.cpp | 149 + src/hid_core/irsensor/moment_processor.h | 91 + src/hid_core/irsensor/pointing_processor.cpp | 26 + src/hid_core/irsensor/pointing_processor.h | 61 + src/hid_core/irsensor/processor_base.cpp | 67 + src/hid_core/irsensor/processor_base.h | 33 + .../irsensor/tera_plugin_processor.cpp | 29 + src/hid_core/irsensor/tera_plugin_processor.h | 53 + src/hid_core/precompiled_headers.h | 6 + src/hid_core/resource_manager.cpp | 503 + src/hid_core/resource_manager.h | 177 + .../abstract_battery_handler.cpp | 197 + .../abstracted_pad/abstract_battery_handler.h | 49 + .../abstract_button_handler.cpp | 199 + .../abstracted_pad/abstract_button_handler.h | 75 + .../abstract_ir_sensor_handler.cpp | 126 + .../abstract_ir_sensor_handler.h | 60 + .../abstracted_pad/abstract_led_handler.cpp | 123 + .../abstracted_pad/abstract_led_handler.h | 43 + .../abstracted_pad/abstract_mcu_handler.cpp | 108 + .../abstracted_pad/abstract_mcu_handler.h | 52 + .../abstracted_pad/abstract_nfc_handler.cpp | 140 + .../abstracted_pad/abstract_nfc_handler.h | 57 + .../resources/abstracted_pad/abstract_pad.cpp | 291 + .../resources/abstracted_pad/abstract_pad.h | 121 + .../abstracted_pad/abstract_pad_holder.cpp | 99 + .../abstracted_pad/abstract_pad_holder.h | 47 + .../abstracted_pad/abstract_palma_handler.cpp | 47 + .../abstracted_pad/abstract_palma_handler.h | 37 + .../abstract_properties_handler.cpp | 322 + .../abstract_properties_handler.h | 86 + .../abstract_sixaxis_handler.cpp | 154 + .../abstracted_pad/abstract_sixaxis_handler.h | 61 + .../abstract_vibration_handler.cpp | 107 + .../abstract_vibration_handler.h | 59 + src/hid_core/resources/applet_resource.cpp | 349 + src/hid_core/resources/applet_resource.h | 126 + src/hid_core/resources/controller_base.cpp | 41 + src/hid_core/resources/controller_base.h | 55 + .../resources/debug_pad/debug_pad.cpp | 59 + src/hid_core/resources/debug_pad/debug_pad.h | 37 + .../resources/debug_pad/debug_pad_types.h | 31 + .../resources/digitizer/digitizer.cpp | 35 + src/hid_core/resources/digitizer/digitizer.h | 24 + .../resources/hid_firmware_settings.cpp | 120 + .../resources/hid_firmware_settings.h | 67 + src/hid_core/resources/irs_ring_lifo.h | 47 + src/hid_core/resources/keyboard/keyboard.cpp | 56 + src/hid_core/resources/keyboard/keyboard.h | 33 + .../resources/keyboard/keyboard_types.h | 20 + src/hid_core/resources/mouse/debug_mouse.cpp | 64 + src/hid_core/resources/mouse/debug_mouse.h | 34 + src/hid_core/resources/mouse/mouse.cpp | 64 + src/hid_core/resources/mouse/mouse.h | 34 + src/hid_core/resources/mouse/mouse_types.h | 8 + src/hid_core/resources/npad/npad.cpp | 1346 ++ src/hid_core/resources/npad/npad.h | 215 + src/hid_core/resources/npad/npad_data.cpp | 228 + src/hid_core/resources/npad/npad_data.h | 88 + src/hid_core/resources/npad/npad_resource.cpp | 697 + src/hid_core/resources/npad/npad_resource.h | 132 + src/hid_core/resources/npad/npad_types.h | 358 + .../resources/npad/npad_vibration.cpp | 94 + src/hid_core/resources/npad/npad_vibration.h | 43 + src/hid_core/resources/palma/palma.cpp | 227 + src/hid_core/resources/palma/palma.h | 185 + src/hid_core/resources/ring_lifo.h | 53 + src/hid_core/resources/shared_memory_format.h | 241 + .../resources/shared_memory_holder.cpp | 54 + src/hid_core/resources/shared_memory_holder.h | 44 + .../resources/six_axis/console_six_axis.cpp | 45 + .../resources/six_axis/console_six_axis.h | 30 + .../resources/six_axis/seven_six_axis.cpp | 66 + .../resources/six_axis/seven_six_axis.h | 65 + src/hid_core/resources/six_axis/six_axis.cpp | 427 + src/hid_core/resources/six_axis/six_axis.h | 111 + .../system_buttons/capture_button.cpp | 47 + .../resources/system_buttons/capture_button.h | 28 + .../resources/system_buttons/home_button.cpp | 47 + .../resources/system_buttons/home_button.h | 28 + .../resources/system_buttons/sleep_button.cpp | 44 + .../resources/system_buttons/sleep_button.h | 28 + .../system_buttons/system_button_types.h | 31 + .../resources/touch_screen/gesture.cpp | 53 + src/hid_core/resources/touch_screen/gesture.h | 32 + .../touch_screen/gesture_handler.cpp | 260 + .../resources/touch_screen/gesture_handler.h | 55 + .../resources/touch_screen/touch_screen.cpp | 119 + .../resources/touch_screen/touch_screen.h | 64 + .../touch_screen/touch_screen_driver.cpp | 114 + .../touch_screen/touch_screen_driver.h | 47 + .../touch_screen/touch_screen_resource.cpp | 579 + .../touch_screen/touch_screen_resource.h | 126 + .../resources/touch_screen/touch_types.h | 143 + .../resources/unique_pad/unique_pad.cpp | 34 + .../resources/unique_pad/unique_pad.h | 24 + .../vibration/gc_vibration_device.cpp | 150 + .../resources/vibration/gc_vibration_device.h | 37 + .../vibration/n64_vibration_device.cpp | 111 + .../vibration/n64_vibration_device.h | 33 + .../resources/vibration/vibration_base.cpp | 34 + .../resources/vibration/vibration_base.h | 33 + .../resources/vibration/vibration_device.cpp | 142 + .../resources/vibration/vibration_device.h | 43 + src/input_common/CMakeLists.txt | 102 + src/input_common/drivers/android.cpp | 367 + src/input_common/drivers/android.h | 148 + src/input_common/drivers/camera.cpp | 82 + src/input_common/drivers/camera.h | 32 + src/input_common/drivers/gc_adapter.cpp | 548 + src/input_common/drivers/gc_adapter.h | 137 + src/input_common/drivers/joycon.cpp | 843 + src/input_common/drivers/joycon.h | 124 + src/input_common/drivers/keyboard.cpp | 111 + src/input_common/drivers/keyboard.h | 55 + src/input_common/drivers/mouse.cpp | 316 + src/input_common/drivers/mouse.h | 115 + src/input_common/drivers/sdl_driver.cpp | 1123 + src/input_common/drivers/sdl_driver.h | 127 + src/input_common/drivers/tas_input.cpp | 344 + src/input_common/drivers/tas_input.h | 200 + src/input_common/drivers/touch_screen.cpp | 107 + src/input_common/drivers/touch_screen.h | 67 + src/input_common/drivers/udp_client.cpp | 653 + src/input_common/drivers/udp_client.h | 192 + src/input_common/drivers/virtual_amiibo.cpp | 257 + src/input_common/drivers/virtual_amiibo.h | 78 + src/input_common/drivers/virtual_gamepad.cpp | 94 + src/input_common/drivers/virtual_gamepad.h | 83 + src/input_common/helpers/joycon_driver.cpp | 725 + src/input_common/helpers/joycon_driver.h | 167 + .../helpers/joycon_protocol/calibration.cpp | 221 + .../helpers/joycon_protocol/calibration.h | 85 + .../joycon_protocol/common_protocol.cpp | 321 + .../helpers/joycon_protocol/common_protocol.h | 203 + .../joycon_protocol/generic_functions.cpp | 138 + .../joycon_protocol/generic_functions.h | 119 + .../helpers/joycon_protocol/irs.cpp | 299 + .../helpers/joycon_protocol/irs.h | 67 + .../helpers/joycon_protocol/joycon_types.h | 791 + .../helpers/joycon_protocol/nfc.cpp | 992 + .../helpers/joycon_protocol/nfc.h | 122 + .../helpers/joycon_protocol/poller.cpp | 374 + .../helpers/joycon_protocol/poller.h | 84 + .../helpers/joycon_protocol/ringcon.cpp | 118 + .../helpers/joycon_protocol/ringcon.h | 42 + .../helpers/joycon_protocol/rumble.cpp | 300 + .../helpers/joycon_protocol/rumble.h | 37 + .../helpers/stick_from_buttons.cpp | 332 + src/input_common/helpers/stick_from_buttons.h | 29 + .../helpers/touch_from_buttons.cpp | 86 + src/input_common/helpers/touch_from_buttons.h | 21 + src/input_common/helpers/udp_protocol.cpp | 77 + src/input_common/helpers/udp_protocol.h | 302 + src/input_common/input_engine.cpp | 483 + src/input_common/input_engine.h | 306 + src/input_common/input_mapping.cpp | 219 + src/input_common/input_mapping.h | 88 + src/input_common/input_poller.cpp | 1200 + src/input_common/input_poller.h | 248 + src/input_common/main.cpp | 512 + src/input_common/main.h | 178 + src/input_common/precompiled_headers.h | 6 + src/network/CMakeLists.txt | 30 + src/network/announce_multiplayer_session.cpp | 164 + src/network/announce_multiplayer_session.h | 98 + src/network/network.cpp | 50 + src/network/network.h | 33 + src/network/packet.cpp | 262 + src/network/packet.h | 165 + src/network/precompiled_headers.h | 6 + src/network/room.cpp | 1143 + src/network/room.h | 148 + src/network/room_member.cpp | 766 + src/network/room_member.h | 337 + src/network/verify_user.cpp | 17 + src/network/verify_user.h | 45 + src/shader_recompiler/CMakeLists.txt | 268 + src/shader_recompiler/backend/bindings.h | 20 + .../backend/glasm/emit_glasm.cpp | 500 + .../backend/glasm/emit_glasm.h | 26 + .../backend/glasm/emit_glasm_barriers.cpp | 21 + .../glasm/emit_glasm_bitwise_conversion.cpp | 90 + .../backend/glasm/emit_glasm_composite.cpp | 243 + .../glasm/emit_glasm_context_get_set.cpp | 444 + .../backend/glasm/emit_glasm_control_flow.cpp | 17 + .../backend/glasm/emit_glasm_convert.cpp | 228 + .../glasm/emit_glasm_floating_point.cpp | 411 + .../backend/glasm/emit_glasm_image.cpp | 893 + .../backend/glasm/emit_glasm_instructions.h | 663 + .../backend/glasm/emit_glasm_integer.cpp | 301 + .../backend/glasm/emit_glasm_logical.cpp | 25 + .../backend/glasm/emit_glasm_memory.cpp | 675 + .../glasm/emit_glasm_not_implemented.cpp | 100 + .../backend/glasm/emit_glasm_select.cpp | 66 + .../glasm/emit_glasm_shared_memory.cpp | 57 + .../backend/glasm/emit_glasm_special.cpp | 94 + .../backend/glasm/emit_glasm_undefined.cpp | 29 + .../backend/glasm/emit_glasm_warp.cpp | 149 + .../backend/glasm/glasm_emit_context.cpp | 157 + .../backend/glasm/glasm_emit_context.h | 79 + .../backend/glasm/reg_alloc.cpp | 182 + .../backend/glasm/reg_alloc.h | 302 + .../backend/glsl/emit_glsl.cpp | 252 + .../backend/glsl/emit_glsl.h | 23 + .../backend/glsl/emit_glsl_atomic.cpp | 559 + .../backend/glsl/emit_glsl_barriers.cpp | 19 + .../glsl/emit_glsl_bitwise_conversion.cpp | 95 + .../backend/glsl/emit_glsl_composite.cpp | 218 + .../glsl/emit_glsl_context_get_set.cpp | 464 + .../backend/glsl/emit_glsl_control_flow.cpp | 18 + .../backend/glsl/emit_glsl_convert.cpp | 229 + .../backend/glsl/emit_glsl_floating_point.cpp | 455 + .../backend/glsl/emit_glsl_image.cpp | 869 + .../backend/glsl/emit_glsl_instructions.h | 741 + .../backend/glsl/emit_glsl_integer.cpp | 258 + .../backend/glsl/emit_glsl_logical.cpp | 25 + .../backend/glsl/emit_glsl_memory.cpp | 201 + .../glsl/emit_glsl_not_implemented.cpp | 100 + .../backend/glsl/emit_glsl_select.cpp | 54 + .../backend/glsl/emit_glsl_shared_memory.cpp | 76 + .../backend/glsl/emit_glsl_special.cpp | 110 + .../backend/glsl/emit_glsl_undefined.cpp | 29 + .../backend/glsl/emit_glsl_warp.cpp | 246 + .../backend/glsl/glsl_emit_context.cpp | 709 + .../backend/glsl/glsl_emit_context.h | 174 + .../backend/glsl/var_alloc.cpp | 306 + .../backend/glsl/var_alloc.h | 104 + .../backend/spirv/emit_spirv.cpp | 559 + .../backend/spirv/emit_spirv.h | 41 + .../backend/spirv/emit_spirv_atomic.cpp | 577 + .../backend/spirv/emit_spirv_barriers.cpp | 36 + .../spirv/emit_spirv_bitwise_conversion.cpp | 65 + .../backend/spirv/emit_spirv_composite.cpp | 153 + .../spirv/emit_spirv_context_get_set.cpp | 603 + .../backend/spirv/emit_spirv_control_flow.cpp | 27 + .../backend/spirv/emit_spirv_convert.cpp | 268 + .../spirv/emit_spirv_floating_point.cpp | 395 + .../backend/spirv/emit_spirv_image.cpp | 650 + .../backend/spirv/emit_spirv_image_atomic.cpp | 183 + .../backend/spirv/emit_spirv_instructions.h | 619 + .../backend/spirv/emit_spirv_integer.cpp | 277 + .../backend/spirv/emit_spirv_logical.cpp | 25 + .../backend/spirv/emit_spirv_memory.cpp | 299 + .../backend/spirv/emit_spirv_select.cpp | 41 + .../spirv/emit_spirv_shared_memory.cpp | 173 + .../backend/spirv/emit_spirv_special.cpp | 155 + .../backend/spirv/emit_spirv_undefined.cpp | 29 + .../backend/spirv/emit_spirv_warp.cpp | 255 + .../backend/spirv/spirv_emit_context.cpp | 1677 ++ .../backend/spirv/spirv_emit_context.h | 388 + src/shader_recompiler/environment.h | 74 + src/shader_recompiler/exception.h | 64 + .../frontend/ir/abstract_syntax_list.h | 57 + .../frontend/ir/attribute.cpp | 459 + src/shader_recompiler/frontend/ir/attribute.h | 256 + .../frontend/ir/basic_block.cpp | 151 + .../frontend/ir/basic_block.h | 201 + .../frontend/ir/breadth_first_search.h | 55 + .../frontend/ir/condition.cpp | 28 + src/shader_recompiler/frontend/ir/condition.h | 58 + .../frontend/ir/flow_test.cpp | 82 + src/shader_recompiler/frontend/ir/flow_test.h | 61 + .../frontend/ir/ir_emitter.cpp | 2058 ++ .../frontend/ir/ir_emitter.h | 429 + .../frontend/ir/microinstruction.cpp | 455 + src/shader_recompiler/frontend/ir/modifiers.h | 49 + src/shader_recompiler/frontend/ir/opcodes.cpp | 12 + src/shader_recompiler/frontend/ir/opcodes.h | 109 + src/shader_recompiler/frontend/ir/opcodes.inc | 577 + src/shader_recompiler/frontend/ir/patch.cpp | 27 + src/shader_recompiler/frontend/ir/patch.h | 146 + .../frontend/ir/post_order.cpp | 45 + .../frontend/ir/post_order.h | 13 + src/shader_recompiler/frontend/ir/pred.h | 43 + src/shader_recompiler/frontend/ir/program.cpp | 31 + src/shader_recompiler/frontend/ir/program.h | 34 + src/shader_recompiler/frontend/ir/reg.h | 331 + src/shader_recompiler/frontend/ir/type.cpp | 37 + src/shader_recompiler/frontend/ir/type.h | 60 + src/shader_recompiler/frontend/ir/value.cpp | 97 + src/shader_recompiler/frontend/ir/value.h | 406 + .../frontend/maxwell/control_flow.cpp | 642 + .../frontend/maxwell/control_flow.h | 168 + .../frontend/maxwell/decode.cpp | 148 + .../frontend/maxwell/decode.h | 13 + .../maxwell/indirect_branch_table_track.cpp | 107 + .../maxwell/indirect_branch_table_track.h | 26 + .../frontend/maxwell/instruction.h | 61 + .../frontend/maxwell/location.h | 108 + .../frontend/maxwell/maxwell.inc | 285 + .../frontend/maxwell/opcodes.cpp | 25 + .../frontend/maxwell/opcodes.h | 29 + .../maxwell/structured_control_flow.cpp | 994 + .../maxwell/structured_control_flow.h | 22 + .../impl/atomic_operations_global_memory.cpp | 213 + .../impl/atomic_operations_shared_memory.cpp | 109 + .../impl/attribute_memory_to_physical.cpp | 33 + .../translate/impl/barrier_operations.cpp | 93 + .../translate/impl/bitfield_extract.cpp | 73 + .../translate/impl/bitfield_insert.cpp | 61 + .../translate/impl/branch_indirect.cpp | 35 + .../maxwell/translate/impl/common_encoding.h | 56 + .../maxwell/translate/impl/common_funcs.cpp | 152 + .../maxwell/translate/impl/common_funcs.h | 26 + .../translate/impl/condition_code_set.cpp | 65 + .../maxwell/translate/impl/double_add.cpp | 54 + .../translate/impl/double_compare_and_set.cpp | 71 + .../impl/double_fused_multiply_add.cpp | 57 + .../maxwell/translate/impl/double_min_max.cpp | 54 + .../translate/impl/double_multiply.cpp | 49 + .../translate/impl/double_set_predicate.cpp | 53 + .../maxwell/translate/impl/exit_program.cpp | 45 + .../translate/impl/find_leading_one.cpp | 46 + .../translate/impl/floating_point_add.cpp | 81 + .../translate/impl/floating_point_compare.cpp | 54 + .../impl/floating_point_compare_and_set.cpp | 77 + ...oating_point_conversion_floating_point.cpp | 213 + .../floating_point_conversion_integer.cpp | 253 + .../floating_point_fused_multiply_add.cpp | 93 + .../translate/impl/floating_point_min_max.cpp | 61 + .../impl/floating_point_multi_function.cpp | 69 + .../impl/floating_point_multiply.cpp | 126 + .../impl/floating_point_range_reduction.cpp | 40 + .../impl/floating_point_set_predicate.cpp | 59 + .../impl/floating_point_swizzled_add.cpp | 43 + .../impl/half_floating_point_add.cpp | 124 + ...half_floating_point_fused_multiply_add.cpp | 168 + .../impl/half_floating_point_helper.cpp | 61 + .../impl/half_floating_point_helper.h | 39 + .../impl/half_floating_point_multiply.cpp | 142 + .../impl/half_floating_point_set.cpp | 117 + .../half_floating_point_set_predicate.cpp | 118 + .../frontend/maxwell/translate/impl/impl.cpp | 271 + .../frontend/maxwell/translate/impl/impl.h | 386 + .../maxwell/translate/impl/integer_add.cpp | 104 + .../impl/integer_add_three_input.cpp | 121 + .../translate/impl/integer_compare.cpp | 47 + .../impl/integer_compare_and_set.cpp | 79 + .../integer_floating_point_conversion.cpp | 181 + .../translate/impl/integer_funnel_shift.cpp | 81 + .../impl/integer_minimum_maximum.cpp | 63 + .../translate/impl/integer_popcount.cpp | 35 + .../translate/impl/integer_scaled_add.cpp | 85 + .../translate/impl/integer_set_predicate.cpp | 57 + .../translate/impl/integer_shift_left.cpp | 70 + .../translate/impl/integer_shift_right.cpp | 65 + .../impl/integer_short_multiply_add.cpp | 134 + .../impl/integer_to_integer_conversion.cpp | 125 + .../impl/internal_stage_buffer_entry_read.cpp | 52 + .../maxwell/translate/impl/load_constant.cpp | 71 + .../maxwell/translate/impl/load_constant.h | 38 + .../translate/impl/load_effective_address.cpp | 107 + .../translate/impl/load_store_attribute.cpp | 194 + .../impl/load_store_local_shared.cpp | 217 + .../translate/impl/load_store_memory.cpp | 182 + .../translate/impl/logic_operation.cpp | 115 + .../impl/logic_operation_three_input.cpp | 597 + .../impl/logic_operation_three_input_lut3.py | 90 + .../impl/move_predicate_to_register.cpp | 65 + .../maxwell/translate/impl/move_register.cpp | 44 + .../impl/move_register_to_predicate.cpp | 70 + .../translate/impl/move_special_register.cpp | 180 + .../translate/impl/not_implemented.cpp | 282 + .../translate/impl/output_geometry.cpp | 44 + .../maxwell/translate/impl/pixel_load.cpp | 45 + .../impl/predicate_set_predicate.cpp | 37 + .../translate/impl/predicate_set_register.cpp | 52 + .../impl/select_source_with_predicate.cpp | 43 + .../impl/surface_atomic_operations.cpp | 201 + .../translate/impl/surface_load_store.cpp | 280 + .../maxwell/translate/impl/texture_fetch.cpp | 236 + .../translate/impl/texture_fetch_swizzled.cpp | 263 + .../maxwell/translate/impl/texture_gather.cpp | 205 + .../impl/texture_gather_swizzled.cpp | 131 + .../translate/impl/texture_gradient.cpp | 180 + .../maxwell/translate/impl/texture_load.cpp | 162 + .../translate/impl/texture_load_swizzled.cpp | 241 + .../translate/impl/texture_mipmap_level.cpp | 123 + .../maxwell/translate/impl/texture_query.cpp | 76 + .../maxwell/translate/impl/video_helper.cpp | 29 + .../maxwell/translate/impl/video_helper.h | 22 + .../translate/impl/video_minimum_maximum.cpp | 85 + .../translate/impl/video_multiply_add.cpp | 63 + .../translate/impl/video_set_predicate.cpp | 91 + .../frontend/maxwell/translate/impl/vote.cpp | 53 + .../maxwell/translate/impl/warp_shuffle.cpp | 66 + .../frontend/maxwell/translate/translate.cpp | 51 + .../frontend/maxwell/translate/translate.h | 13 + .../frontend/maxwell/translate_program.cpp | 454 + .../frontend/maxwell/translate_program.h | 37 + src/shader_recompiler/host_translate_info.h | 26 + .../ir_opt/collect_shader_info_pass.cpp | 975 + .../ir_opt/conditional_barrier_pass.cpp | 44 + .../ir_opt/constant_propagation_pass.cpp | 1113 + .../ir_opt/dead_code_elimination_pass.cpp | 25 + .../ir_opt/dual_vertex_pass.cpp | 29 + .../global_memory_to_storage_buffer_pass.cpp | 579 + .../ir_opt/identity_removal_pass.cpp | 37 + src/shader_recompiler/ir_opt/layer_pass.cpp | 68 + .../ir_opt/lower_fp16_to_fp32.cpp | 139 + .../ir_opt/lower_fp64_to_fp32.cpp | 185 + .../ir_opt/lower_int64_to_int32.cpp | 237 + src/shader_recompiler/ir_opt/passes.h | 38 + .../ir_opt/position_pass.cpp | 77 + .../ir_opt/rescaling_pass.cpp | 355 + .../ir_opt/ssa_rewrite_pass.cpp | 411 + src/shader_recompiler/ir_opt/texture_pass.cpp | 712 + .../ir_opt/vendor_workaround_pass.cpp | 79 + .../ir_opt/verification_pass.cpp | 97 + src/shader_recompiler/object_pool.h | 106 + src/shader_recompiler/precompiled_headers.h | 7 + src/shader_recompiler/profile.h | 95 + src/shader_recompiler/program_header.h | 223 + src/shader_recompiler/runtime_info.h | 91 + src/shader_recompiler/shader_info.h | 347 + src/shader_recompiler/stage.h | 27 + src/shader_recompiler/varying_state.h | 69 + src/tests/CMakeLists.txt | 31 + src/tests/common/bit_field.cpp | 89 + src/tests/common/cityhash.cpp | 21 + src/tests/common/container_hash.cpp | 44 + src/tests/common/fibers.cpp | 313 + src/tests/common/host_memory.cpp | 186 + src/tests/common/param_package.cpp | 28 + src/tests/common/range_map.cpp | 70 + src/tests/common/ring_buffer.cpp | 129 + src/tests/common/scratch_buffer.cpp | 200 + src/tests/common/unique_function.cpp | 109 + src/tests/core/core_timing.cpp | 141 + src/tests/core/internal_network/network.cpp | 27 + .../calibration_configuration_job.cpp | 135 + src/tests/precompiled_headers.h | 6 + src/tests/video_core/memory_tracker.cpp | 548 + src/video_core/CMakeLists.txt | 395 + src/video_core/buffer_cache/buffer_base.h | 126 + src/video_core/buffer_cache/buffer_cache.cpp | 16 + src/video_core/buffer_cache/buffer_cache.h | 1800 ++ .../buffer_cache/buffer_cache_base.h | 488 + .../buffer_cache/memory_tracker_base.h | 299 + src/video_core/buffer_cache/usage_tracker.h | 85 + src/video_core/buffer_cache/word_manager.h | 485 + src/video_core/cache_types.h | 24 + src/video_core/capture.h | 36 + src/video_core/cdma_pusher.cpp | 137 + src/video_core/cdma_pusher.h | 120 + src/video_core/compatible_formats.cpp | 296 + src/video_core/compatible_formats.h | 15 + src/video_core/control/channel_state.cpp | 41 + src/video_core/control/channel_state.h | 69 + .../control/channel_state_cache.cpp | 14 + src/video_core/control/channel_state_cache.h | 101 + .../control/channel_state_cache.inc | 88 + src/video_core/control/scheduler.cpp | 32 + src/video_core/control/scheduler.h | 37 + src/video_core/delayed_destruction_ring.h | 31 + src/video_core/dirty_flags.cpp | 77 + src/video_core/dirty_flags.h | 64 + src/video_core/dma_pusher.cpp | 226 + src/video_core/dma_pusher.h | 183 + src/video_core/engines/const_buffer_info.h | 16 + src/video_core/engines/draw_manager.cpp | 287 + src/video_core/engines/draw_manager.h | 117 + src/video_core/engines/engine_interface.h | 54 + src/video_core/engines/engine_upload.cpp | 82 + src/video_core/engines/engine_upload.h | 93 + src/video_core/engines/fermi_2d.cpp | 122 + src/video_core/engines/fermi_2d.h | 360 + src/video_core/engines/kepler_compute.cpp | 116 + src/video_core/engines/kepler_compute.h | 263 + src/video_core/engines/kepler_memory.cpp | 66 + src/video_core/engines/kepler_memory.h | 91 + src/video_core/engines/maxwell_3d.cpp | 680 + src/video_core/engines/maxwell_3d.h | 3564 +++ src/video_core/engines/maxwell_dma.cpp | 384 + src/video_core/engines/maxwell_dma.h | 333 + src/video_core/engines/puller.cpp | 309 + src/video_core/engines/puller.h | 177 + src/video_core/engines/sw_blitter/blitter.cpp | 240 + src/video_core/engines/sw_blitter/blitter.h | 27 + .../engines/sw_blitter/converter.cpp | 1234 ++ src/video_core/engines/sw_blitter/converter.h | 36 + .../engines/sw_blitter/generate_converters.py | 136 + src/video_core/fence_manager.h | 278 + src/video_core/framebuffer_config.cpp | 55 + src/video_core/framebuffer_config.h | 38 + src/video_core/fsr.cpp | 148 + src/video_core/fsr.h | 19 + src/video_core/gpu.cpp | 587 + src/video_core/gpu.h | 267 + src/video_core/gpu_thread.cpp | 128 + src/video_core/gpu_thread.h | 136 + src/video_core/guest_memory.h | 30 + src/video_core/host1x/codecs/codec.cpp | 113 + src/video_core/host1x/codecs/codec.h | 63 + src/video_core/host1x/codecs/h264.cpp | 281 + src/video_core/host1x/codecs/h264.h | 182 + src/video_core/host1x/codecs/vp8.cpp | 53 + src/video_core/host1x/codecs/vp8.h | 79 + src/video_core/host1x/codecs/vp9.cpp | 947 + src/video_core/host1x/codecs/vp9.h | 200 + src/video_core/host1x/codecs/vp9_types.h | 306 + src/video_core/host1x/control.cpp | 33 + src/video_core/host1x/control.h | 40 + src/video_core/host1x/ffmpeg/ffmpeg.cpp | 424 + src/video_core/host1x/ffmpeg/ffmpeg.h | 213 + .../host1x/gpu_device_memory_manager.cpp | 32 + .../host1x/gpu_device_memory_manager.h | 24 + src/video_core/host1x/host1x.cpp | 20 + src/video_core/host1x/host1x.h | 68 + src/video_core/host1x/nvdec.cpp | 48 + src/video_core/host1x/nvdec.h | 39 + src/video_core/host1x/nvdec_common.h | 97 + src/video_core/host1x/sync_manager.cpp | 50 + src/video_core/host1x/sync_manager.h | 53 + src/video_core/host1x/syncpoint_manager.cpp | 106 + src/video_core/host1x/syncpoint_manager.h | 96 + src/video_core/host1x/vic.cpp | 241 + src/video_core/host1x/vic.h | 67 + src/video_core/host_shaders/CMakeLists.txt | 168 + .../host_shaders/StringShaderHeader.cmake | 32 + src/video_core/host_shaders/astc_decoder.comp | 1187 + .../host_shaders/blit_color_float.frag | 13 + .../block_linear_unswizzle_2d.comp | 121 + .../block_linear_unswizzle_3d.comp | 124 + .../host_shaders/convert_abgr8_to_d24s8.frag | 17 + .../host_shaders/convert_abgr8_to_d32f.frag | 15 + .../host_shaders/convert_d24s8_to_abgr8.frag | 22 + .../host_shaders/convert_d32f_to_abgr8.frag | 14 + .../host_shaders/convert_depth_to_float.frag | 12 + .../host_shaders/convert_float_to_depth.frag | 12 + .../convert_msaa_to_non_msaa.comp | 33 + .../convert_non_msaa_to_msaa.comp | 32 + .../host_shaders/convert_s8d24_to_abgr8.frag | 22 + .../host_shaders/fidelityfx_fsr.frag | 109 + .../host_shaders/full_screen_triangle.vert | 35 + src/video_core/host_shaders/fxaa.frag | 75 + src/video_core/host_shaders/fxaa.vert | 37 + .../host_shaders/opengl_convert_s8d24.comp | 17 + .../host_shaders/opengl_copy_bc4.comp | 69 + .../host_shaders/opengl_fidelityfx_fsr.frag | 107 + .../opengl_fidelityfx_fsr_easu.frag | 9 + .../opengl_fidelityfx_fsr_rcas.frag | 9 + .../host_shaders/opengl_lmem_warmup.comp | 47 + .../host_shaders/opengl_present.frag | 13 + .../host_shaders/opengl_present.vert | 27 + .../opengl_present_scaleforce.frag | 101 + src/video_core/host_shaders/opengl_smaa.glsl | 1339 ++ .../host_shaders/pitch_unswizzle.comp | 85 + .../host_shaders/present_bicubic.frag | 56 + .../host_shaders/present_gaussian.frag | 59 + .../host_shaders/queries_prefix_scan_sum.comp | 173 + .../queries_prefix_scan_sum_nosubgroups.comp | 138 + .../resolve_conditional_render.comp | 20 + .../smaa_blending_weight_calculation.frag | 36 + .../smaa_blending_weight_calculation.vert | 43 + .../host_shaders/smaa_edge_detection.frag | 26 + .../host_shaders/smaa_edge_detection.vert | 40 + .../smaa_neighborhood_blending.frag | 31 + .../smaa_neighborhood_blending.vert | 41 + .../host_shaders/source_shader.h.in | 14 + .../vulkan_blit_depth_stencil.frag | 15 + .../host_shaders/vulkan_color_clear.frag | 14 + .../host_shaders/vulkan_color_clear.vert | 10 + .../vulkan_depthstencil_clear.frag | 12 + .../host_shaders/vulkan_fidelityfx_fsr.vert | 13 + .../vulkan_fidelityfx_fsr_easu_fp16.frag | 11 + .../vulkan_fidelityfx_fsr_easu_fp32.frag | 10 + .../vulkan_fidelityfx_fsr_rcas_fp16.frag | 11 + .../vulkan_fidelityfx_fsr_rcas_fp32.frag | 10 + .../host_shaders/vulkan_present.frag | 14 + .../host_shaders/vulkan_present.vert | 37 + .../vulkan_present_scaleforce_fp16.frag | 11 + .../vulkan_present_scaleforce_fp32.frag | 10 + .../host_shaders/vulkan_quad_indexed.comp | 42 + .../host_shaders/vulkan_turbo_mode.comp | 29 + src/video_core/host_shaders/vulkan_uint8.comp | 30 + src/video_core/invalidation_accumulator.h | 79 + src/video_core/macro/macro.cpp | 142 + src/video_core/macro/macro.h | 145 + src/video_core/macro/macro_hle.cpp | 603 + src/video_core/macro/macro_hle.h | 33 + src/video_core/macro/macro_interpreter.cpp | 363 + src/video_core/macro/macro_interpreter.h | 27 + src/video_core/macro/macro_jit_x64.cpp | 671 + src/video_core/macro/macro_jit_x64.h | 26 + src/video_core/memory_manager.cpp | 787 + src/video_core/memory_manager.h | 254 + src/video_core/precompiled_headers.h | 6 + src/video_core/present.h | 37 + src/video_core/pte_kind.h | 264 + src/video_core/query_cache.h | 491 + src/video_core/query_cache/bank_base.h | 105 + src/video_core/query_cache/query_base.h | 70 + src/video_core/query_cache/query_cache.h | 581 + src/video_core/query_cache/query_cache_base.h | 178 + src/video_core/query_cache/query_stream.h | 149 + src/video_core/query_cache/types.h | 74 + src/video_core/rasterizer_download_area.h | 16 + src/video_core/rasterizer_interface.h | 176 + src/video_core/renderer_base.cpp | 51 + src/video_core/renderer_base.h | 108 + .../renderer_null/null_rasterizer.cpp | 107 + .../renderer_null/null_rasterizer.h | 91 + .../renderer_null/renderer_null.cpp | 30 + src/video_core/renderer_null/renderer_null.h | 37 + src/video_core/renderer_opengl/blit_image.cpp | 58 + src/video_core/renderer_opengl/blit_image.h | 38 + .../renderer_opengl/gl_blit_screen.cpp | 97 + .../renderer_opengl/gl_blit_screen.h | 74 + .../renderer_opengl/gl_buffer_cache.cpp | 389 + .../renderer_opengl/gl_buffer_cache.h | 261 + .../renderer_opengl/gl_buffer_cache_base.cpp | 9 + .../renderer_opengl/gl_compute_pipeline.cpp | 261 + .../renderer_opengl/gl_compute_pipeline.h | 108 + src/video_core/renderer_opengl/gl_device.cpp | 337 + src/video_core/renderer_opengl/gl_device.h | 250 + .../renderer_opengl/gl_fence_manager.cpp | 62 + .../renderer_opengl/gl_fence_manager.h | 58 + .../renderer_opengl/gl_graphics_pipeline.cpp | 637 + .../renderer_opengl/gl_graphics_pipeline.h | 175 + .../renderer_opengl/gl_query_cache.cpp | 130 + .../renderer_opengl/gl_query_cache.h | 82 + .../renderer_opengl/gl_rasterizer.cpp | 1455 ++ .../renderer_opengl/gl_rasterizer.h | 271 + .../renderer_opengl/gl_resource_manager.cpp | 227 + .../renderer_opengl/gl_resource_manager.h | 353 + .../renderer_opengl/gl_shader_cache.cpp | 616 + .../renderer_opengl/gl_shader_cache.h | 91 + .../renderer_opengl/gl_shader_context.h | 33 + .../renderer_opengl/gl_shader_manager.cpp | 136 + .../renderer_opengl/gl_shader_manager.h | 52 + .../renderer_opengl/gl_shader_util.cpp | 111 + .../renderer_opengl/gl_shader_util.h | 21 + .../gl_staging_buffer_pool.cpp | 160 + .../renderer_opengl/gl_staging_buffer_pool.h | 103 + .../renderer_opengl/gl_state_tracker.cpp | 243 + .../renderer_opengl/gl_state_tracker.h | 235 + .../renderer_opengl/gl_texture_cache.cpp | 1434 ++ .../renderer_opengl/gl_texture_cache.h | 380 + .../renderer_opengl/gl_texture_cache_base.cpp | 9 + .../renderer_opengl/maxwell_to_gl.h | 592 + .../renderer_opengl/present/filters.cpp | 39 + .../renderer_opengl/present/filters.h | 17 + .../renderer_opengl/present/fsr.cpp | 98 + src/video_core/renderer_opengl/present/fsr.h | 39 + .../renderer_opengl/present/fxaa.cpp | 41 + src/video_core/renderer_opengl/present/fxaa.h | 27 + .../renderer_opengl/present/layer.cpp | 224 + .../renderer_opengl/present/layer.h | 84 + .../present/present_uniforms.h | 43 + .../renderer_opengl/present/smaa.cpp | 102 + src/video_core/renderer_opengl/present/smaa.h | 35 + src/video_core/renderer_opengl/present/util.h | 43 + .../present/window_adapt_pass.cpp | 118 + .../present/window_adapt_pass.h | 47 + .../renderer_opengl/renderer_opengl.cpp | 266 + .../renderer_opengl/renderer_opengl.h | 80 + .../renderer_opengl/util_shaders.cpp | 322 + src/video_core/renderer_opengl/util_shaders.h | 63 + src/video_core/renderer_vulkan/blit_image.cpp | 1002 + src/video_core/renderer_vulkan/blit_image.h | 161 + .../renderer_vulkan/fixed_pipeline_state.cpp | 480 + .../renderer_vulkan/fixed_pipeline_state.h | 286 + .../renderer_vulkan/maxwell_to_vk.cpp | 876 + .../renderer_vulkan/maxwell_to_vk.h | 78 + .../renderer_vulkan/pipeline_helper.h | 214 + .../renderer_vulkan/pipeline_statistics.cpp | 99 + .../renderer_vulkan/pipeline_statistics.h | 39 + .../renderer_vulkan/present/anti_alias_pass.h | 25 + .../renderer_vulkan/present/filters.cpp | 56 + .../renderer_vulkan/present/filters.h | 18 + .../renderer_vulkan/present/fsr.cpp | 226 + src/video_core/renderer_vulkan/present/fsr.h | 69 + .../renderer_vulkan/present/fxaa.cpp | 148 + src/video_core/renderer_vulkan/present/fxaa.h | 63 + .../renderer_vulkan/present/layer.cpp | 341 + .../renderer_vulkan/present/layer.h | 96 + .../present/present_push_constants.h | 34 + .../renderer_vulkan/present/smaa.cpp | 277 + src/video_core/renderer_vulkan/present/smaa.h | 87 + .../renderer_vulkan/present/util.cpp | 668 + src/video_core/renderer_vulkan/present/util.h | 61 + .../present/window_adapt_pass.cpp | 154 + .../present/window_adapt_pass.h | 60 + .../renderer_vulkan/renderer_vulkan.cpp | 280 + .../renderer_vulkan/renderer_vulkan.h | 96 + .../renderer_vulkan/vk_blit_screen.cpp | 149 + .../renderer_vulkan/vk_blit_screen.h | 85 + .../renderer_vulkan/vk_buffer_cache.cpp | 672 + .../renderer_vulkan/vk_buffer_cache.h | 189 + .../renderer_vulkan/vk_buffer_cache_base.cpp | 9 + .../renderer_vulkan/vk_command_pool.cpp | 45 + .../renderer_vulkan/vk_command_pool.h | 33 + .../renderer_vulkan/vk_compute_pass.cpp | 732 + .../renderer_vulkan/vk_compute_pass.h | 152 + .../renderer_vulkan/vk_compute_pipeline.cpp | 228 + .../renderer_vulkan/vk_compute_pipeline.h | 68 + .../renderer_vulkan/vk_descriptor_pool.cpp | 164 + .../renderer_vulkan/vk_descriptor_pool.h | 87 + .../renderer_vulkan/vk_fence_manager.cpp | 65 + .../renderer_vulkan/vk_fence_manager.h | 70 + .../renderer_vulkan/vk_graphics_pipeline.cpp | 917 + .../renderer_vulkan/vk_graphics_pipeline.h | 161 + .../renderer_vulkan/vk_master_semaphore.cpp | 227 + .../renderer_vulkan/vk_master_semaphore.h | 85 + .../renderer_vulkan/vk_pipeline_cache.cpp | 882 + .../renderer_vulkan/vk_pipeline_cache.h | 175 + .../renderer_vulkan/vk_present_manager.cpp | 488 + .../renderer_vulkan/vk_present_manager.h | 90 + .../renderer_vulkan/vk_query_cache.cpp | 1578 ++ .../renderer_vulkan/vk_query_cache.h | 75 + .../renderer_vulkan/vk_rasterizer.cpp | 1569 ++ .../renderer_vulkan/vk_rasterizer.h | 217 + .../renderer_vulkan/vk_render_pass_cache.cpp | 95 + .../renderer_vulkan/vk_render_pass_cache.h | 54 + .../renderer_vulkan/vk_resource_pool.cpp | 60 + .../renderer_vulkan/vk_resource_pool.h | 50 + .../renderer_vulkan/vk_scheduler.cpp | 341 + src/video_core/renderer_vulkan/vk_scheduler.h | 261 + .../renderer_vulkan/vk_shader_util.cpp | 23 + .../renderer_vulkan/vk_shader_util.h | 17 + .../vk_staging_buffer_pool.cpp | 258 + .../renderer_vulkan/vk_staging_buffer_pool.h | 124 + .../renderer_vulkan/vk_state_tracker.cpp | 254 + .../renderer_vulkan/vk_state_tracker.h | 288 + .../renderer_vulkan/vk_swapchain.cpp | 309 + src/video_core/renderer_vulkan/vk_swapchain.h | 141 + .../renderer_vulkan/vk_texture_cache.cpp | 2080 ++ .../renderer_vulkan/vk_texture_cache.h | 402 + .../renderer_vulkan/vk_texture_cache_base.cpp | 9 + .../renderer_vulkan/vk_turbo_mode.cpp | 237 + .../renderer_vulkan/vk_turbo_mode.h | 37 + .../renderer_vulkan/vk_update_descriptor.cpp | 44 + .../renderer_vulkan/vk_update_descriptor.h | 93 + src/video_core/shader_cache.cpp | 251 + src/video_core/shader_cache.h | 160 + src/video_core/shader_environment.cpp | 674 + src/video_core/shader_environment.h | 232 + src/video_core/shader_notify.cpp | 34 + src/video_core/shader_notify.h | 31 + src/video_core/smaa_area_tex.h | 11223 ++++++++++ src/video_core/smaa_search_tex.h | 88 + src/video_core/surface.cpp | 420 + src/video_core/surface.h | 522 + .../texture_cache/accelerated_swizzle.cpp | 69 + .../texture_cache/accelerated_swizzle.h | 44 + src/video_core/texture_cache/decode_bc.cpp | 135 + src/video_core/texture_cache/decode_bc.h | 19 + .../texture_cache/descriptor_table.h | 78 + .../texture_cache/format_lookup_table.cpp | 254 + .../texture_cache/format_lookup_table.h | 16 + src/video_core/texture_cache/formatter.cpp | 104 + src/video_core/texture_cache/formatter.h | 283 + src/video_core/texture_cache/image_base.cpp | 260 + src/video_core/texture_cache/image_base.h | 148 + src/video_core/texture_cache/image_info.cpp | 287 + src/video_core/texture_cache/image_info.h | 47 + .../texture_cache/image_view_base.cpp | 101 + .../texture_cache/image_view_base.h | 50 + .../texture_cache/image_view_info.cpp | 90 + .../texture_cache/image_view_info.h | 49 + src/video_core/texture_cache/render_targets.h | 50 + src/video_core/texture_cache/samples_helper.h | 98 + .../texture_cache/texture_cache.cpp | 15 + src/video_core/texture_cache/texture_cache.h | 2547 +++ .../texture_cache/texture_cache_base.h | 510 + src/video_core/texture_cache/types.h | 155 + src/video_core/texture_cache/util.cpp | 1348 ++ src/video_core/texture_cache/util.h | 122 + src/video_core/textures/astc.cpp | 1693 ++ src/video_core/textures/astc.h | 11 + src/video_core/textures/bcn.cpp | 86 + src/video_core/textures/bcn.h | 16 + src/video_core/textures/decoders.cpp | 275 + src/video_core/textures/decoders.h | 72 + src/video_core/textures/texture.cpp | 93 + src/video_core/textures/texture.h | 409 + src/video_core/textures/workers.cpp | 15 + src/video_core/textures/workers.h | 12 + src/video_core/transform_feedback.cpp | 115 + src/video_core/transform_feedback.h | 30 + src/video_core/video_core.cpp | 63 + src/video_core/video_core.h | 27 + .../nsight_aftermath_tracker.cpp | 212 + .../vulkan_common/nsight_aftermath_tracker.h | 83 + .../vulkan_common/vk_enum_string_helper.h | 8 + src/video_core/vulkan_common/vma.cpp | 6 + src/video_core/vulkan_common/vma.h | 11 + src/video_core/vulkan_common/vulkan.h | 26 + .../vulkan_common/vulkan_debug_callback.cpp | 85 + .../vulkan_common/vulkan_debug_callback.h | 12 + .../vulkan_common/vulkan_device.cpp | 1381 ++ src/video_core/vulkan_common/vulkan_device.h | 842 + .../vulkan_common/vulkan_instance.cpp | 155 + .../vulkan_common/vulkan_instance.h | 30 + .../vulkan_common/vulkan_library.cpp | 48 + src/video_core/vulkan_common/vulkan_library.h | 16 + .../vulkan_common/vulkan_memory_allocator.cpp | 376 + .../vulkan_common/vulkan_memory_allocator.h | 143 + .../vulkan_common/vulkan_surface.cpp | 94 + src/video_core/vulkan_common/vulkan_surface.h | 14 + .../vulkan_common/vulkan_wrapper.cpp | 1002 + src/video_core/vulkan_common/vulkan_wrapper.h | 1522 ++ src/web_service/CMakeLists.txt | 24 + src/web_service/announce_room_json.cpp | 145 + src/web_service/announce_room_json.h | 41 + src/web_service/precompiled_headers.h | 6 + src/web_service/telemetry_json.cpp | 130 + src/web_service/telemetry_json.h | 44 + src/web_service/verify_login.cpp | 27 + src/web_service/verify_login.h | 19 + src/web_service/verify_user_jwt.cpp | 70 + src/web_service/verify_user_jwt.h | 26 + src/web_service/web_backend.cpp | 206 + src/web_service/web_backend.h | 72 + src/web_service/web_result.h | 24 + src/yuzu/CMakeLists.txt | 480 + src/yuzu/Info.plist | 48 + src/yuzu/about_dialog.cpp | 32 + src/yuzu/about_dialog.h | 22 + src/yuzu/aboutdialog.ui | 184 + src/yuzu/applets/qt_amiibo_settings.cpp | 274 + src/yuzu/applets/qt_amiibo_settings.h | 85 + src/yuzu/applets/qt_amiibo_settings.ui | 494 + src/yuzu/applets/qt_controller.cpp | 778 + src/yuzu/applets/qt_controller.h | 183 + src/yuzu/applets/qt_controller.ui | 2699 +++ src/yuzu/applets/qt_error.cpp | 68 + src/yuzu/applets/qt_error.h | 34 + src/yuzu/applets/qt_profile_select.cpp | 260 + src/yuzu/applets/qt_profile_select.h | 87 + src/yuzu/applets/qt_software_keyboard.cpp | 1674 ++ src/yuzu/applets/qt_software_keyboard.h | 287 + src/yuzu/applets/qt_software_keyboard.ui | 3541 +++ src/yuzu/applets/qt_web_browser.cpp | 449 + src/yuzu/applets/qt_web_browser.h | 220 + src/yuzu/applets/qt_web_browser_scripts.h | 198 + src/yuzu/bootmanager.cpp | 1140 + src/yuzu/bootmanager.h | 280 + src/yuzu/breakpad.cpp | 77 + src/yuzu/breakpad.h | 10 + src/yuzu/compatdb.cpp | 210 + src/yuzu/compatdb.h | 43 + src/yuzu/compatdb.ui | 398 + src/yuzu/compatibility_list.cpp | 17 + src/yuzu/compatibility_list.h | 16 + .../configuration/configuration_shared.cpp | 19 + src/yuzu/configuration/configuration_shared.h | 27 + src/yuzu/configuration/configure.ui | 117 + src/yuzu/configuration/configure_applets.cpp | 84 + src/yuzu/configuration/configure_applets.h | 48 + src/yuzu/configuration/configure_applets.ui | 65 + src/yuzu/configuration/configure_audio.cpp | 278 + src/yuzu/configuration/configure_audio.h | 66 + src/yuzu/configuration/configure_audio.ui | 67 + src/yuzu/configuration/configure_camera.cpp | 163 + src/yuzu/configuration/configure_camera.h | 56 + src/yuzu/configuration/configure_camera.ui | 170 + src/yuzu/configuration/configure_cpu.cpp | 114 + src/yuzu/configuration/configure_cpu.h | 55 + src/yuzu/configuration/configure_cpu.ui | 151 + .../configuration/configure_cpu_debug.cpp | 78 + src/yuzu/configuration/configure_cpu_debug.h | 35 + src/yuzu/configuration/configure_cpu_debug.ui | 223 + src/yuzu/configuration/configure_debug.cpp | 130 + src/yuzu/configuration/configure_debug.h | 37 + src/yuzu/configuration/configure_debug.ui | 576 + .../configure_debug_controller.cpp | 44 + .../configure_debug_controller.h | 45 + .../configure_debug_controller.ui | 77 + .../configuration/configure_debug_tab.cpp | 45 + src/yuzu/configuration/configure_debug_tab.h | 41 + src/yuzu/configuration/configure_debug_tab.ui | 31 + src/yuzu/configuration/configure_dialog.cpp | 213 + src/yuzu/configuration/configure_dialog.h | 94 + .../configuration/configure_filesystem.cpp | 155 + src/yuzu/configuration/configure_filesystem.h | 43 + .../configuration/configure_filesystem.ui | 244 + src/yuzu/configuration/configure_general.cpp | 128 + src/yuzu/configuration/configure_general.h | 55 + src/yuzu/configuration/configure_general.ui | 134 + src/yuzu/configuration/configure_graphics.cpp | 552 + src/yuzu/configuration/configure_graphics.h | 116 + src/yuzu/configuration/configure_graphics.ui | 151 + .../configure_graphics_advanced.cpp | 82 + .../configure_graphics_advanced.h | 49 + .../configure_graphics_advanced.ui | 68 + src/yuzu/configuration/configure_hotkeys.cpp | 423 + src/yuzu/configuration/configure_hotkeys.h | 74 + src/yuzu/configuration/configure_hotkeys.ui | 76 + src/yuzu/configuration/configure_input.cpp | 309 + src/yuzu/configuration/configure_input.h | 81 + src/yuzu/configuration/configure_input.ui | 548 + .../configure_input_advanced.cpp | 204 + .../configuration/configure_input_advanced.h | 53 + .../configuration/configure_input_advanced.ui | 2821 +++ .../configure_input_per_game.cpp | 115 + .../configuration/configure_input_per_game.h | 46 + .../configuration/configure_input_per_game.ui | 333 + .../configuration/configure_input_player.cpp | 1670 ++ .../configuration/configure_input_player.h | 228 + .../configuration/configure_input_player.ui | 3323 +++ .../configure_input_player_widget.cpp | 3007 +++ .../configure_input_player_widget.h | 230 + .../configure_input_profile_dialog.cpp | 39 + .../configure_input_profile_dialog.h | 43 + .../configure_input_profile_dialog.ui | 71 + .../configuration/configure_linux_tab.cpp | 75 + src/yuzu/configuration/configure_linux_tab.h | 44 + src/yuzu/configuration/configure_linux_tab.ui | 53 + .../configuration/configure_motion_touch.cpp | 326 + .../configuration/configure_motion_touch.h | 93 + .../configuration/configure_motion_touch.ui | 297 + .../configuration/configure_mouse_panning.cpp | 90 + .../configuration/configure_mouse_panning.h | 36 + .../configuration/configure_mouse_panning.ui | 212 + src/yuzu/configuration/configure_network.cpp | 48 + src/yuzu/configuration/configure_network.h | 30 + src/yuzu/configuration/configure_network.ui | 60 + src/yuzu/configuration/configure_per_game.cpp | 204 + src/yuzu/configuration/configure_per_game.h | 91 + src/yuzu/configuration/configure_per_game.ui | 299 + .../configure_per_game_addons.cpp | 143 + .../configuration/configure_per_game_addons.h | 58 + .../configure_per_game_addons.ui | 41 + .../configure_profile_manager.cpp | 372 + .../configuration/configure_profile_manager.h | 90 + .../configure_profile_manager.ui | 181 + src/yuzu/configuration/configure_ringcon.cpp | 497 + src/yuzu/configuration/configure_ringcon.h | 94 + src/yuzu/configuration/configure_ringcon.ui | 374 + src/yuzu/configuration/configure_system.cpp | 206 + src/yuzu/configuration/configure_system.h | 63 + src/yuzu/configuration/configure_system.ui | 105 + src/yuzu/configuration/configure_tas.cpp | 81 + src/yuzu/configuration/configure_tas.h | 39 + src/yuzu/configuration/configure_tas.ui | 182 + .../configure_touch_from_button.cpp | 617 + .../configure_touch_from_button.h | 86 + .../configure_touch_from_button.ui | 221 + .../configuration/configure_touch_widget.h | 61 + .../configure_touchscreen_advanced.cpp | 50 + .../configure_touchscreen_advanced.h | 32 + .../configure_touchscreen_advanced.ui | 162 + src/yuzu/configuration/configure_ui.cpp | 354 + src/yuzu/configuration/configure_ui.h | 58 + src/yuzu/configuration/configure_ui.ui | 268 + .../configuration/configure_vibration.cpp | 133 + src/yuzu/configuration/configure_vibration.h | 51 + src/yuzu/configuration/configure_vibration.ui | 553 + src/yuzu/configuration/configure_web.cpp | 180 + src/yuzu/configuration/configure_web.h | 39 + src/yuzu/configuration/configure_web.ui | 210 + src/yuzu/configuration/input_profiles.cpp | 134 + src/yuzu/configuration/input_profiles.h | 36 + src/yuzu/configuration/qt_config.cpp | 560 + src/yuzu/configuration/qt_config.h | 55 + src/yuzu/configuration/shared_translation.cpp | 537 + src/yuzu/configuration/shared_translation.h | 68 + src/yuzu/configuration/shared_widget.cpp | 802 + src/yuzu/configuration/shared_widget.h | 178 + src/yuzu/debugger/console.cpp | 49 + src/yuzu/debugger/console.h | 13 + src/yuzu/debugger/controller.cpp | 116 + src/yuzu/debugger/controller.h | 56 + src/yuzu/debugger/profiler.cpp | 229 + src/yuzu/debugger/profiler.h | 27 + src/yuzu/debugger/wait_tree.cpp | 431 + src/yuzu/debugger/wait_tree.h | 188 + src/yuzu/discord.h | 24 + src/yuzu/discord_impl.cpp | 117 + src/yuzu/discord_impl.h | 32 + src/yuzu/game_list.cpp | 970 + src/yuzu/game_list.h | 204 + src/yuzu/game_list_p.h | 408 + src/yuzu/game_list_worker.cpp | 485 + src/yuzu/game_list_worker.h | 94 + src/yuzu/hotkeys.cpp | 214 + src/yuzu/hotkeys.h | 127 + src/yuzu/install_dialog.cpp | 69 + src/yuzu/install_dialog.h | 34 + src/yuzu/loading_screen.cpp | 202 + src/yuzu/loading_screen.h | 94 + src/yuzu/loading_screen.ui | 164 + src/yuzu/main.cpp | 5350 +++++ src/yuzu/main.h | 581 + src/yuzu/main.ui | 483 + src/yuzu/multiplayer/chat_room.cpp | 508 + src/yuzu/multiplayer/chat_room.h | 76 + src/yuzu/multiplayer/chat_room.ui | 59 + src/yuzu/multiplayer/client_room.cpp | 115 + src/yuzu/multiplayer/client_room.h | 39 + src/yuzu/multiplayer/client_room.ui | 80 + src/yuzu/multiplayer/direct_connect.cpp | 137 + src/yuzu/multiplayer/direct_connect.h | 49 + src/yuzu/multiplayer/direct_connect.ui | 165 + src/yuzu/multiplayer/host_room.cpp | 264 + src/yuzu/multiplayer/host_room.h | 80 + src/yuzu/multiplayer/host_room.ui | 207 + src/yuzu/multiplayer/lobby.cpp | 439 + src/yuzu/multiplayer/lobby.h | 138 + src/yuzu/multiplayer/lobby.ui | 130 + src/yuzu/multiplayer/lobby_p.h | 268 + src/yuzu/multiplayer/message.cpp | 85 + src/yuzu/multiplayer/message.h | 72 + src/yuzu/multiplayer/moderation_dialog.cpp | 112 + src/yuzu/multiplayer/moderation_dialog.h | 43 + src/yuzu/multiplayer/moderation_dialog.ui | 84 + src/yuzu/multiplayer/state.cpp | 336 + src/yuzu/multiplayer/state.h | 111 + src/yuzu/multiplayer/validation.h | 67 + src/yuzu/play_time_manager.cpp | 182 + src/yuzu/play_time_manager.h | 50 + src/yuzu/precompiled_headers.h | 6 + src/yuzu/qt_common.cpp | 60 + src/yuzu/qt_common.h | 15 + src/yuzu/startup_checks.cpp | 197 + src/yuzu/startup_checks.h | 24 + src/yuzu/uisettings.cpp | 112 + src/yuzu/uisettings.h | 279 + src/yuzu/util/clickable_label.cpp | 11 + src/yuzu/util/clickable_label.h | 21 + src/yuzu/util/controller_navigation.cpp | 179 + src/yuzu/util/controller_navigation.h | 50 + src/yuzu/util/limitable_input_dialog.cpp | 88 + src/yuzu/util/limitable_input_dialog.h | 40 + src/yuzu/util/overlay_dialog.cpp | 268 + src/yuzu/util/overlay_dialog.h | 108 + src/yuzu/util/overlay_dialog.ui | 404 + .../util/sequence_dialog/sequence_dialog.cpp | 38 + .../util/sequence_dialog/sequence_dialog.h | 23 + src/yuzu/util/url_request_interceptor.cpp | 33 + src/yuzu/util/url_request_interceptor.h | 29 + src/yuzu/util/util.cpp | 152 + src/yuzu/util/util.h | 29 + src/yuzu/vk_device_info.cpp | 67 + src/yuzu/vk_device_info.h | 36 + src/yuzu/yuzu.qrc | 10 + src/yuzu/yuzu.rc | 22 + src/yuzu_cmd/CMakeLists.txt | 65 + src/yuzu_cmd/emu_window/emu_window_sdl2.cpp | 254 + src/yuzu_cmd/emu_window/emu_window_sdl2.h | 95 + .../emu_window/emu_window_sdl2_gl.cpp | 153 + src/yuzu_cmd/emu_window/emu_window_sdl2_gl.h | 37 + .../emu_window/emu_window_sdl2_null.cpp | 51 + .../emu_window/emu_window_sdl2_null.h | 26 + .../emu_window/emu_window_sdl2_vk.cpp | 93 + src/yuzu_cmd/emu_window/emu_window_sdl2_vk.h | 26 + src/yuzu_cmd/precompiled_headers.h | 6 + src/yuzu_cmd/sdl_config.cpp | 262 + src/yuzu_cmd/sdl_config.h | 49 + src/yuzu_cmd/yuzu.cpp | 459 + src/yuzu_cmd/yuzu.rc | 20 + tools/reset-submodules.sh | 8 + vcpkg.json | 65 + 3633 files changed, 920216 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 CMakeModules/CopyYuzuFFmpegDeps.cmake create mode 100644 CMakeModules/CopyYuzuQt5Deps.cmake create mode 100644 CMakeModules/CopyYuzuSDLDeps.cmake create mode 100644 CMakeModules/DownloadExternals.cmake create mode 100644 CMakeModules/FindDiscordRPC.cmake create mode 100644 CMakeModules/FindFFmpeg.cmake create mode 100644 CMakeModules/FindLLVM.cmake create mode 100644 CMakeModules/FindOpus.cmake create mode 100644 CMakeModules/FindRenderDoc.cmake create mode 100644 CMakeModules/FindSimpleIni.cmake create mode 100644 CMakeModules/Findenet.cmake create mode 100644 CMakeModules/Findgamemode.cmake create mode 100644 CMakeModules/Findhttplib.cmake create mode 100644 CMakeModules/Findlibusb.cmake create mode 100644 CMakeModules/Findlz4.cmake create mode 100644 CMakeModules/Findstb.cmake create mode 100644 CMakeModules/Findzstd.cmake create mode 100644 CMakeModules/GenerateSCMRev.cmake create mode 100644 CMakeModules/MSVCCache.cmake create mode 100644 CMakeModules/MinGWClangCross.cmake create mode 100644 CMakeModules/MinGWCross.cmake create mode 100644 CMakeModules/WindowsCopyFiles.cmake create mode 100644 CONTRIBUTING.md create mode 100644 Doxyfile create mode 100644 LICENSE.txt create mode 100644 LICENSES/Apache-2.0.txt create mode 100644 LICENSES/BSD-2-Clause.txt create mode 100644 LICENSES/BSD-3-Clause.txt create mode 100644 LICENSES/BSL-1.0.txt create mode 100644 LICENSES/CC-BY-4.0.txt create mode 100644 LICENSES/CC-BY-SA-3.0.txt create mode 100644 LICENSES/CC0-1.0.txt create mode 100644 LICENSES/GPL-2.0-or-later.txt create mode 100644 LICENSES/GPL-3.0-or-later.txt create mode 100644 LICENSES/LGPL-3.0-or-later.txt create mode 100644 LICENSES/LLVM-exception.txt create mode 100644 LICENSES/MIT.txt create mode 100644 LICENSES/MPL-2.0.txt create mode 100644 LICENSES/Unlicense.txt create mode 100644 LICENSES/WTFPL.txt create mode 100644 LICENSES/Zlib.txt create mode 100644 README.md create mode 100644 dist/72-yuzu-input.rules create mode 100644 dist/compatibility_list/compatibility_list.qrc create mode 100644 dist/english_plurals/README.md create mode 100644 dist/english_plurals/en.ts create mode 100644 dist/icons/controller/applet_dual_joycon.png create mode 100644 dist/icons/controller/applet_dual_joycon_dark.png create mode 100644 dist/icons/controller/applet_dual_joycon_dark_disabled.png create mode 100644 dist/icons/controller/applet_dual_joycon_disabled.png create mode 100644 dist/icons/controller/applet_dual_joycon_midnight.png create mode 100644 dist/icons/controller/applet_dual_joycon_midnight_disabled.png create mode 100644 dist/icons/controller/applet_handheld.png create mode 100644 dist/icons/controller/applet_handheld_dark.png create mode 100644 dist/icons/controller/applet_handheld_dark_disabled.png create mode 100644 dist/icons/controller/applet_handheld_disabled.png create mode 100644 dist/icons/controller/applet_handheld_midnight.png create mode 100644 dist/icons/controller/applet_handheld_midnight_disabled.png create mode 100644 dist/icons/controller/applet_pro_controller.png create mode 100644 dist/icons/controller/applet_pro_controller_dark.png create mode 100644 dist/icons/controller/applet_pro_controller_dark_disabled.png create mode 100644 dist/icons/controller/applet_pro_controller_disabled.png create mode 100644 dist/icons/controller/applet_pro_controller_midnight.png create mode 100644 dist/icons/controller/applet_pro_controller_midnight_disabled.png create mode 100644 dist/icons/controller/applet_single_joycon_left.png create mode 100644 dist/icons/controller/applet_single_joycon_left_dark.png create mode 100644 dist/icons/controller/applet_single_joycon_left_dark_disabled.png create mode 100644 dist/icons/controller/applet_single_joycon_left_disabled.png create mode 100644 dist/icons/controller/applet_single_joycon_left_midnight.png create mode 100644 dist/icons/controller/applet_single_joycon_left_midnight_disabled.png create mode 100644 dist/icons/controller/applet_single_joycon_right.png create mode 100644 dist/icons/controller/applet_single_joycon_right_dark.png create mode 100644 dist/icons/controller/applet_single_joycon_right_dark_disabled.png create mode 100644 dist/icons/controller/applet_single_joycon_right_disabled.png create mode 100644 dist/icons/controller/applet_single_joycon_right_midnight.png create mode 100644 dist/icons/controller/applet_single_joycon_right_midnight_disabled.png create mode 100644 dist/icons/controller/controller.qrc create mode 100644 dist/icons/overlay/arrow_left.png create mode 100644 dist/icons/overlay/arrow_left_dark.png create mode 100644 dist/icons/overlay/arrow_right.png create mode 100644 dist/icons/overlay/arrow_right_dark.png create mode 100644 dist/icons/overlay/button_A.png create mode 100644 dist/icons/overlay/button_A_dark.png create mode 100644 dist/icons/overlay/button_B.png create mode 100644 dist/icons/overlay/button_B_dark.png create mode 100644 dist/icons/overlay/button_L.png create mode 100644 dist/icons/overlay/button_L_dark.png create mode 100644 dist/icons/overlay/button_R.png create mode 100644 dist/icons/overlay/button_R_dark.png create mode 100644 dist/icons/overlay/button_X.png create mode 100644 dist/icons/overlay/button_X_dark.png create mode 100644 dist/icons/overlay/button_Y.png create mode 100644 dist/icons/overlay/button_Y_dark.png create mode 100644 dist/icons/overlay/button_minus.png create mode 100644 dist/icons/overlay/button_minus_dark.png create mode 100644 dist/icons/overlay/button_plus.png create mode 100644 dist/icons/overlay/button_plus_dark.png create mode 100644 dist/icons/overlay/button_press_stick.png create mode 100644 dist/icons/overlay/button_press_stick_dark.png create mode 100644 dist/icons/overlay/controller_dual_joycon.png create mode 100644 dist/icons/overlay/controller_dual_joycon_dark.png create mode 100644 dist/icons/overlay/controller_handheld.png create mode 100644 dist/icons/overlay/controller_handheld_dark.png create mode 100644 dist/icons/overlay/controller_pro.png create mode 100644 dist/icons/overlay/controller_pro_dark.png create mode 100644 dist/icons/overlay/controller_single_joycon_left.png create mode 100644 dist/icons/overlay/controller_single_joycon_left_a.png create mode 100644 dist/icons/overlay/controller_single_joycon_left_a_dark.png create mode 100644 dist/icons/overlay/controller_single_joycon_left_b.png create mode 100644 dist/icons/overlay/controller_single_joycon_left_b_dark.png create mode 100644 dist/icons/overlay/controller_single_joycon_left_dark.png create mode 100644 dist/icons/overlay/controller_single_joycon_left_x.png create mode 100644 dist/icons/overlay/controller_single_joycon_left_x_dark.png create mode 100644 dist/icons/overlay/controller_single_joycon_left_y.png create mode 100644 dist/icons/overlay/controller_single_joycon_left_y_dark.png create mode 100644 dist/icons/overlay/controller_single_joycon_right.png create mode 100644 dist/icons/overlay/controller_single_joycon_right_dark.png create mode 100644 dist/icons/overlay/osk_button_B.png create mode 100644 dist/icons/overlay/osk_button_B_dark.png create mode 100644 dist/icons/overlay/osk_button_B_dark_disabled.png create mode 100644 dist/icons/overlay/osk_button_B_disabled.png create mode 100644 dist/icons/overlay/osk_button_Y.png create mode 100644 dist/icons/overlay/osk_button_Y_dark.png create mode 100644 dist/icons/overlay/osk_button_Y_dark_disabled.png create mode 100644 dist/icons/overlay/osk_button_Y_disabled.png create mode 100644 dist/icons/overlay/osk_button_backspace.png create mode 100644 dist/icons/overlay/osk_button_backspace_dark.png create mode 100644 dist/icons/overlay/osk_button_plus.png create mode 100644 dist/icons/overlay/osk_button_plus_dark.png create mode 100644 dist/icons/overlay/osk_button_plus_dark_disabled.png create mode 100644 dist/icons/overlay/osk_button_plus_disabled.png create mode 100644 dist/icons/overlay/osk_button_shift.png create mode 100644 dist/icons/overlay/osk_button_shift_dark.png create mode 100644 dist/icons/overlay/osk_button_shift_lock_off.png create mode 100644 dist/icons/overlay/osk_button_shift_lock_on.png create mode 100644 dist/icons/overlay/osk_button_shift_on.png create mode 100644 dist/icons/overlay/osk_button_shift_on_dark.png create mode 100644 dist/icons/overlay/overlay.qrc create mode 100644 dist/languages/.gitignore create mode 100644 dist/languages/.tx/config create mode 100644 dist/languages/README.md create mode 100644 dist/languages/ar.ts create mode 100644 dist/languages/ca.ts create mode 100644 dist/languages/cs.ts create mode 100644 dist/languages/da.ts create mode 100644 dist/languages/de.ts create mode 100644 dist/languages/el.ts create mode 100644 dist/languages/es.ts create mode 100644 dist/languages/fi.ts create mode 100644 dist/languages/fr.ts create mode 100644 dist/languages/hu.ts create mode 100644 dist/languages/id.ts create mode 100644 dist/languages/it.ts create mode 100644 dist/languages/ja_JP.ts create mode 100644 dist/languages/ko_KR.ts create mode 100644 dist/languages/nb.ts create mode 100644 dist/languages/nl.ts create mode 100644 dist/languages/pl.ts create mode 100644 dist/languages/pt_BR.ts create mode 100644 dist/languages/pt_PT.ts create mode 100644 dist/languages/ru_RU.ts create mode 100644 dist/languages/sv.ts create mode 100644 dist/languages/tr_TR.ts create mode 100644 dist/languages/uk.ts create mode 100644 dist/languages/vi.ts create mode 100644 dist/languages/vi_VN.ts create mode 100644 dist/languages/zh_CN.ts create mode 100644 dist/languages/zh_TW.ts create mode 100644 dist/org.yuzu_emu.yuzu.desktop create mode 100644 dist/org.yuzu_emu.yuzu.metainfo.xml create mode 100644 dist/org.yuzu_emu.yuzu.xml create mode 100644 dist/qt_themes/colorful/icons/16x16/checked.png create mode 100644 dist/qt_themes/colorful/icons/16x16/connected.png create mode 100644 dist/qt_themes/colorful/icons/16x16/connected_notification.png create mode 100644 dist/qt_themes/colorful/icons/16x16/disconnected.png create mode 100644 dist/qt_themes/colorful/icons/16x16/failed.png create mode 100644 dist/qt_themes/colorful/icons/16x16/info.png create mode 100644 dist/qt_themes/colorful/icons/16x16/lock.png create mode 100644 dist/qt_themes/colorful/icons/16x16/sync.png create mode 100644 dist/qt_themes/colorful/icons/16x16/view-refresh.png create mode 100644 dist/qt_themes/colorful/icons/256x256/plus_folder.png create mode 100644 dist/qt_themes/colorful/icons/48x48/bad_folder.png create mode 100644 dist/qt_themes/colorful/icons/48x48/chip.png create mode 100644 dist/qt_themes/colorful/icons/48x48/folder.png create mode 100644 dist/qt_themes/colorful/icons/48x48/list-add.png create mode 100644 dist/qt_themes/colorful/icons/48x48/no_avatar.png create mode 100644 dist/qt_themes/colorful/icons/48x48/sd_card.png create mode 100644 dist/qt_themes/colorful/icons/48x48/star.png create mode 100644 dist/qt_themes/colorful/icons/index.theme create mode 100644 dist/qt_themes/colorful/style.qrc create mode 100644 dist/qt_themes/colorful_dark/icons/16x16/lock.png create mode 100644 dist/qt_themes/colorful_dark/icons/16x16/view-refresh.png create mode 100644 dist/qt_themes/colorful_dark/icons/index.theme create mode 100644 dist/qt_themes/colorful_dark/style.qrc create mode 100644 dist/qt_themes/colorful_midnight_blue/icons/index.theme create mode 100644 dist/qt_themes/colorful_midnight_blue/style.qrc create mode 100644 dist/qt_themes/default/default.qrc create mode 100644 dist/qt_themes/default/icons/16x16/connected.png create mode 100644 dist/qt_themes/default/icons/16x16/connected_notification.png create mode 100644 dist/qt_themes/default/icons/16x16/disconnected.png create mode 100644 dist/qt_themes/default/icons/16x16/lock.png create mode 100644 dist/qt_themes/default/icons/256x256/plus_folder.png create mode 100644 dist/qt_themes/default/icons/256x256/yuzu.png create mode 100644 dist/qt_themes/default/icons/48x48/bad_folder.png create mode 100644 dist/qt_themes/default/icons/48x48/chip.png create mode 100644 dist/qt_themes/default/icons/48x48/folder.png create mode 100644 dist/qt_themes/default/icons/48x48/list-add.png create mode 100644 dist/qt_themes/default/icons/48x48/sd_card.png create mode 100644 dist/qt_themes/default/icons/48x48/star.png create mode 100644 dist/qt_themes/default/icons/index.theme create mode 100644 dist/qt_themes/default/style.qss create mode 100644 dist/qt_themes/default_dark/icons/index.theme create mode 100644 dist/qt_themes/default_dark/style.qrc create mode 100644 dist/qt_themes/default_dark/style.qss create mode 100644 dist/qt_themes/qdarkstyle/LICENSE.md create mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/connected.png create mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/connected_notification.png create mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/disconnected.png create mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/lock.png create mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/view-refresh.png create mode 100644 dist/qt_themes/qdarkstyle/icons/256x256/plus_folder.png create mode 100644 dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png create mode 100644 dist/qt_themes/qdarkstyle/icons/48x48/chip.png create mode 100644 dist/qt_themes/qdarkstyle/icons/48x48/folder.png create mode 100644 dist/qt_themes/qdarkstyle/icons/48x48/list-add.png create mode 100644 dist/qt_themes/qdarkstyle/icons/48x48/no_avatar.png create mode 100644 dist/qt_themes/qdarkstyle/icons/48x48/sd_card.png create mode 100644 dist/qt_themes/qdarkstyle/icons/48x48/star.png create mode 100644 dist/qt_themes/qdarkstyle/icons/index.theme create mode 100644 dist/qt_themes/qdarkstyle/rc/Hmovetoolbar.png create mode 100644 dist/qt_themes/qdarkstyle/rc/Hsepartoolbar.png create mode 100644 dist/qt_themes/qdarkstyle/rc/Vmovetoolbar.png create mode 100644 dist/qt_themes/qdarkstyle/rc/Vsepartoolbar.png create mode 100644 dist/qt_themes/qdarkstyle/rc/branch_closed-on.png create mode 100644 dist/qt_themes/qdarkstyle/rc/branch_closed.png create mode 100644 dist/qt_themes/qdarkstyle/rc/branch_open-on.png create mode 100644 dist/qt_themes/qdarkstyle/rc/branch_open.png create mode 100644 dist/qt_themes/qdarkstyle/rc/checkbox_checked.png create mode 100644 dist/qt_themes/qdarkstyle/rc/checkbox_checked_disabled.png create mode 100644 dist/qt_themes/qdarkstyle/rc/checkbox_checked_focus.png create mode 100644 dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate.png create mode 100644 dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_disabled.png create mode 100644 dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_focus.png create mode 100644 dist/qt_themes/qdarkstyle/rc/checkbox_unchecked.png create mode 100644 dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_disabled.png create mode 100644 dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_focus.png create mode 100644 dist/qt_themes/qdarkstyle/rc/close-hover.png create mode 100644 dist/qt_themes/qdarkstyle/rc/close-pressed.png create mode 100644 dist/qt_themes/qdarkstyle/rc/close.png create mode 100644 dist/qt_themes/qdarkstyle/rc/down_arrow.png create mode 100644 dist/qt_themes/qdarkstyle/rc/down_arrow_disabled.png create mode 100644 dist/qt_themes/qdarkstyle/rc/left_arrow.png create mode 100644 dist/qt_themes/qdarkstyle/rc/left_arrow_disabled.png create mode 100644 dist/qt_themes/qdarkstyle/rc/radio_checked.png create mode 100644 dist/qt_themes/qdarkstyle/rc/radio_checked_disabled.png create mode 100644 dist/qt_themes/qdarkstyle/rc/radio_checked_focus.png create mode 100644 dist/qt_themes/qdarkstyle/rc/radio_unchecked.png create mode 100644 dist/qt_themes/qdarkstyle/rc/radio_unchecked_disabled.png create mode 100644 dist/qt_themes/qdarkstyle/rc/radio_unchecked_focus.png create mode 100644 dist/qt_themes/qdarkstyle/rc/right_arrow.png create mode 100644 dist/qt_themes/qdarkstyle/rc/right_arrow_disabled.png create mode 100644 dist/qt_themes/qdarkstyle/rc/sizegrip.png create mode 100644 dist/qt_themes/qdarkstyle/rc/stylesheet-branch-end.png create mode 100644 dist/qt_themes/qdarkstyle/rc/stylesheet-branch-more.png create mode 100644 dist/qt_themes/qdarkstyle/rc/stylesheet-vline.png create mode 100644 dist/qt_themes/qdarkstyle/rc/transparent.png create mode 100644 dist/qt_themes/qdarkstyle/rc/undock.png create mode 100644 dist/qt_themes/qdarkstyle/rc/up_arrow.png create mode 100644 dist/qt_themes/qdarkstyle/rc/up_arrow_disabled.png create mode 100644 dist/qt_themes/qdarkstyle/style.qrc create mode 100644 dist/qt_themes/qdarkstyle/style.qss create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/LICENSE.rst create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/Hmovetoolbar.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/Hsepartoolbar.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/Vmovetoolbar.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/Vsepartoolbar.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed-on.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open-on.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/close-hover.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/close-pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/close.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/down_arrow.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/down_arrow_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/left_arrow.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/left_arrow_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/right_arrow.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/right_arrow_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/sizegrip.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-branch-end.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-branch-more.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-vline.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/undock.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/up_arrow.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/up_arrow_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed@2x.png create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/style.qrc create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/style.qss create mode 100644 dist/yuzu.bmp create mode 100644 dist/yuzu.icns create mode 100644 dist/yuzu.ico create mode 100644 dist/yuzu.manifest create mode 100644 dist/yuzu.svg create mode 100644 externals/CMakeLists.txt create mode 100644 externals/FidelityFX-FSR/ffx-fsr/ffx_a.h create mode 100644 externals/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h create mode 100644 externals/FidelityFX-FSR/license.txt create mode 100644 externals/bc_decoder/bc_decoder.cpp create mode 100644 externals/bc_decoder/bc_decoder.h create mode 100644 externals/cmake-modules/GetGitRevisionDescription.cmake create mode 100644 externals/cmake-modules/GetGitRevisionDescription.cmake.in create mode 100644 externals/demangle/ItaniumDemangle.cpp create mode 100644 externals/demangle/llvm/Demangle/Demangle.h create mode 100644 externals/demangle/llvm/Demangle/DemangleConfig.h create mode 100644 externals/demangle/llvm/Demangle/ItaniumDemangle.h create mode 100644 externals/demangle/llvm/Demangle/ItaniumNodes.def create mode 100644 externals/demangle/llvm/Demangle/StringView.h create mode 100644 externals/demangle/llvm/Demangle/StringViewExtras.h create mode 100644 externals/demangle/llvm/Demangle/Utility.h create mode 100644 externals/ffmpeg/CMakeLists.txt create mode 100644 externals/gamemode/gamemode_client.h create mode 100644 externals/getopt/CMakeLists.txt create mode 100644 externals/getopt/getopt.c create mode 100644 externals/getopt/getopt.h create mode 100644 externals/glad/CMakeLists.txt create mode 100644 externals/glad/Readme.md create mode 100644 externals/glad/include/KHR/khrplatform.h create mode 100644 externals/glad/include/glad/glad.h create mode 100644 externals/glad/src/glad.c create mode 100644 externals/libusb/CMakeLists.txt create mode 100644 externals/libusb/config.h.in create mode 100644 externals/microprofile/README.md create mode 100644 externals/microprofile/microprofile.h create mode 100644 externals/microprofile/microprofile_html.h create mode 100644 externals/microprofile/microprofileui.h create mode 100644 externals/nx_tzdb/CMakeLists.txt create mode 100644 externals/nx_tzdb/ListFilesInDirectory.cmake create mode 100644 externals/nx_tzdb/NxTzdbCreateHeader.cmake create mode 100644 externals/nx_tzdb/include/nx_tzdb.h create mode 100644 externals/nx_tzdb/tzdb_template.h.in create mode 100644 externals/renderdoc/renderdoc_app.h create mode 100644 externals/stb/stb_dxt.cpp create mode 100644 externals/stb/stb_dxt.h create mode 100644 externals/stb/stb_image.h create mode 100644 externals/stb/stb_image_resize.h create mode 100644 externals/stb/stb_image_write.h create mode 100644 externals/tz/tz/tz.cpp create mode 100644 externals/tz/tz/tz.h create mode 100755 hooks/pre-commit create mode 100644 src/.clang-format create mode 100644 src/CMakeLists.txt create mode 100644 src/android/.gitignore create mode 100644 src/android/app/build.gradle.kts create mode 100644 src/android/app/debug.keystore create mode 100644 src/android/app/proguard-rules.pro create mode 100644 src/android/app/src/ea/res/drawable/ic_yuzu.xml create mode 100644 src/android/app/src/ea/res/drawable/ic_yuzu_full.xml create mode 100644 src/android/app/src/ea/res/drawable/ic_yuzu_title.xml create mode 100644 src/android/app/src/main/AndroidManifest.xml create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/YuzuApplication.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AbstractDiffAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AbstractListAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AbstractSingleSelectionList.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AppletAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/CabinetLauncherDialogAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/DriverAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GamePropertiesAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/HomeSettingAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/InstallableAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/LicenseAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/SetupAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/disk_shader_cache/DiskShaderCacheProgress.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/DocumentProvider.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/NativeInput.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/YuzuInputDevice.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/YuzuVibrator.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/AnalogDirection.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/ButtonName.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/InputType.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/NativeAnalog.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/NativeButton.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/NativeTrigger.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/NpadStyleIndex.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/input/model/PlayerInput.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractBooleanSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractByteSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractFloatSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractIntSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractLongSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractShortSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/AbstractStringSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FloatSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/LongSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ShortSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/AnalogInputSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/ButtonInputSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/DateTimeSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/HeaderSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/InputProfileSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/InputSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/IntSingleChoiceSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/ModifierInputSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/RunnableSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SingleChoiceSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SliderSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringInputSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringSingleChoiceSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SubmenuSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SwitchSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/InputDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/InputProfileAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/InputProfileDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/NewInputProfileDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSearchFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsViewModel.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/InputViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SettingViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SliderViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/utils/SettingsFile.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddGameFolderDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/CabinetLauncherDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ContentTypeSelectionDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/CoreErrorDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriversLoadingDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EarlyAccessFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFolderPropertiesDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LaunchGameDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicenseBottomSheetDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/PermissionDeniedDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProgressDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ResetSettingsDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SearchFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/SetupWarningDialogFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/layout/AutofitGridLayoutManager.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Applet.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Driver.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/EmulationViewModel.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameDir.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameProperties.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameVerificationResult.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/HomeSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/HomeViewModel.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/InstallResult.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Installable.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/License.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/MessageDialogViewModel.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/MinimalDocumentFile.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/SelectableItem.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/SetupPage.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/model/TaskViewModel.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableButton.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableDpad.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableJoystick.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControl.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControlData.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControlDefault.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayLayout.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/ThemeProvider.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/AddonUtil.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DocumentsTree.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/FileUtil.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameIconUtils.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameMetadata.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverMetadata.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InputHandler.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InsetsHelper.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/LifecycleUtils.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/Log.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/MemoryUtil.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NfcReader.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ParamPackage.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/PreferenceUtil.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/SerializableHelper.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ThemeHelper.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ViewUtils.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/viewholder/AbstractViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt create mode 100644 src/android/app/src/main/jni/CMakeLists.txt create mode 100644 src/android/app/src/main/jni/android_config.cpp create mode 100644 src/android/app/src/main/jni/android_config.h create mode 100644 src/android/app/src/main/jni/android_settings.cpp create mode 100644 src/android/app/src/main/jni/android_settings.h create mode 100644 src/android/app/src/main/jni/emu_window/emu_window.cpp create mode 100644 src/android/app/src/main/jni/emu_window/emu_window.h create mode 100644 src/android/app/src/main/jni/game_metadata.cpp create mode 100644 src/android/app/src/main/jni/native.cpp create mode 100644 src/android/app/src/main/jni/native.h create mode 100644 src/android/app/src/main/jni/native_config.cpp create mode 100644 src/android/app/src/main/jni/native_input.cpp create mode 100644 src/android/app/src/main/jni/native_log.cpp create mode 100644 src/android/app/src/main/res/drawable-hdpi/ic_stat_notification_logo.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/ic_stat_notification_logo.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/tv_banner.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/ic_stat_notification_logo.png create mode 100644 src/android/app/src/main/res/drawable/button_anim.xml create mode 100644 src/android/app/src/main/res/drawable/button_l3.xml create mode 100644 src/android/app/src/main/res/drawable/button_l3_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/button_r3.xml create mode 100644 src/android/app/src/main/res/drawable/button_r3_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/default_icon.jpg create mode 100644 src/android/app/src/main/res/drawable/dpad_standard.xml create mode 100644 src/android/app/src/main/res/drawable/dpad_standard_cardinal_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/dpad_standard_diagonal_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_a.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_a_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_b.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_b_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_home.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_home_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_minus.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_minus_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_plus.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_plus_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_screenshot.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_screenshot_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_x.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_x_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_y.xml create mode 100644 src/android/app/src/main/res/drawable/facebutton_y_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/ic_add.xml create mode 100644 src/android/app/src/main/res/drawable/ic_album.xml create mode 100644 src/android/app/src/main/res/drawable/ic_applet.xml create mode 100644 src/android/app/src/main/res/drawable/ic_arrow_forward.xml create mode 100644 src/android/app/src/main/res/drawable/ic_audio.xml create mode 100644 src/android/app/src/main/res/drawable/ic_back.xml create mode 100644 src/android/app/src/main/res/drawable/ic_build.xml create mode 100644 src/android/app/src/main/res/drawable/ic_cartridge.xml create mode 100644 src/android/app/src/main/res/drawable/ic_cartridge_outline.xml create mode 100644 src/android/app/src/main/res/drawable/ic_check.xml create mode 100644 src/android/app/src/main/res/drawable/ic_check_circle.xml create mode 100644 src/android/app/src/main/res/drawable/ic_clear.xml create mode 100644 src/android/app/src/main/res/drawable/ic_code.xml create mode 100644 src/android/app/src/main/res/drawable/ic_controller.xml create mode 100644 src/android/app/src/main/res/drawable/ic_controller_disconnected.xml create mode 100644 src/android/app/src/main/res/drawable/ic_delete.xml create mode 100644 src/android/app/src/main/res/drawable/ic_diamond.xml create mode 100644 src/android/app/src/main/res/drawable/ic_discord.xml create mode 100644 src/android/app/src/main/res/drawable/ic_edit.xml create mode 100644 src/android/app/src/main/res/drawable/ic_exit.xml create mode 100644 src/android/app/src/main/res/drawable/ic_export.xml create mode 100644 src/android/app/src/main/res/drawable/ic_firmware.xml create mode 100644 src/android/app/src/main/res/drawable/ic_folder_open.xml create mode 100644 src/android/app/src/main/res/drawable/ic_github.xml create mode 100644 src/android/app/src/main/res/drawable/ic_graphics.xml create mode 100644 src/android/app/src/main/res/drawable/ic_icon_bg.xml create mode 100644 src/android/app/src/main/res/drawable/ic_import.xml create mode 100644 src/android/app/src/main/res/drawable/ic_info_outline.xml create mode 100644 src/android/app/src/main/res/drawable/ic_install.xml create mode 100644 src/android/app/src/main/res/drawable/ic_key.xml create mode 100644 src/android/app/src/main/res/drawable/ic_launcher.xml create mode 100644 src/android/app/src/main/res/drawable/ic_lock.xml create mode 100644 src/android/app/src/main/res/drawable/ic_log.xml create mode 100644 src/android/app/src/main/res/drawable/ic_mii.xml create mode 100644 src/android/app/src/main/res/drawable/ic_more_vert.xml create mode 100644 src/android/app/src/main/res/drawable/ic_new_label.xml create mode 100644 src/android/app/src/main/res/drawable/ic_nfc.xml create mode 100644 src/android/app/src/main/res/drawable/ic_notification.xml create mode 100644 src/android/app/src/main/res/drawable/ic_options.xml create mode 100644 src/android/app/src/main/res/drawable/ic_overlay.xml create mode 100644 src/android/app/src/main/res/drawable/ic_palette.xml create mode 100644 src/android/app/src/main/res/drawable/ic_pause.xml create mode 100644 src/android/app/src/main/res/drawable/ic_pip_mute.xml create mode 100644 src/android/app/src/main/res/drawable/ic_pip_pause.xml create mode 100644 src/android/app/src/main/res/drawable/ic_pip_play.xml create mode 100644 src/android/app/src/main/res/drawable/ic_pip_unmute.xml create mode 100644 src/android/app/src/main/res/drawable/ic_play.xml create mode 100644 src/android/app/src/main/res/drawable/ic_refresh.xml create mode 100644 src/android/app/src/main/res/drawable/ic_restore.xml create mode 100644 src/android/app/src/main/res/drawable/ic_save.xml create mode 100644 src/android/app/src/main/res/drawable/ic_search.xml create mode 100644 src/android/app/src/main/res/drawable/ic_settings.xml create mode 100644 src/android/app/src/main/res/drawable/ic_settings_outline.xml create mode 100644 src/android/app/src/main/res/drawable/ic_share.xml create mode 100644 src/android/app/src/main/res/drawable/ic_shortcut.xml create mode 100644 src/android/app/src/main/res/drawable/ic_system_settings.xml create mode 100644 src/android/app/src/main/res/drawable/ic_system_update_alt.xml create mode 100644 src/android/app/src/main/res/drawable/ic_unlock.xml create mode 100644 src/android/app/src/main/res/drawable/ic_website.xml create mode 100644 src/android/app/src/main/res/drawable/ic_yuzu.xml create mode 100644 src/android/app/src/main/res/drawable/ic_yuzu_full.xml create mode 100644 src/android/app/src/main/res/drawable/ic_yuzu_title.xml create mode 100644 src/android/app/src/main/res/drawable/joystick.xml create mode 100644 src/android/app/src/main/res/drawable/joystick_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/joystick_range.xml create mode 100644 src/android/app/src/main/res/drawable/l_shoulder.xml create mode 100644 src/android/app/src/main/res/drawable/l_shoulder_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/premium_background.xml create mode 100644 src/android/app/src/main/res/drawable/r_shoulder.xml create mode 100644 src/android/app/src/main/res/drawable/r_shoulder_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/selector_cartridge.xml create mode 100644 src/android/app/src/main/res/drawable/selector_settings.xml create mode 100644 src/android/app/src/main/res/drawable/shortcut.xml create mode 100644 src/android/app/src/main/res/drawable/stick_one_direction_anim.xml create mode 100644 src/android/app/src/main/res/drawable/stick_two_direction_anim.xml create mode 100644 src/android/app/src/main/res/drawable/zl_trigger.xml create mode 100644 src/android/app/src/main/res/drawable/zl_trigger_depressed.xml create mode 100644 src/android/app/src/main/res/drawable/zr_trigger.xml create mode 100644 src/android/app/src/main/res/drawable/zr_trigger_depressed.xml create mode 100644 src/android/app/src/main/res/layout-ldrtl/list_item_setting_input.xml create mode 100644 src/android/app/src/main/res/layout-w1000dp/card_installable_icon.xml create mode 100644 src/android/app/src/main/res/layout-w600dp/activity_main.xml create mode 100644 src/android/app/src/main/res/layout-w600dp/fragment_about.xml create mode 100644 src/android/app/src/main/res/layout-w600dp/fragment_game_info.xml create mode 100644 src/android/app/src/main/res/layout-w600dp/fragment_game_properties.xml create mode 100644 src/android/app/src/main/res/layout-w600dp/fragment_setup.xml create mode 100644 src/android/app/src/main/res/layout-w600dp/page_setup.xml create mode 100644 src/android/app/src/main/res/layout/activity_emulation.xml create mode 100644 src/android/app/src/main/res/layout/activity_main.xml create mode 100644 src/android/app/src/main/res/layout/activity_settings.xml create mode 100644 src/android/app/src/main/res/layout/card_driver_option.xml create mode 100644 src/android/app/src/main/res/layout/card_folder.xml create mode 100644 src/android/app/src/main/res/layout/card_game.xml create mode 100644 src/android/app/src/main/res/layout/card_home_option.xml create mode 100644 src/android/app/src/main/res/layout/card_installable.xml create mode 100644 src/android/app/src/main/res/layout/card_installable_icon.xml create mode 100644 src/android/app/src/main/res/layout/card_simple_outlined.xml create mode 100644 src/android/app/src/main/res/layout/dialog_add_folder.xml create mode 100644 src/android/app/src/main/res/layout/dialog_edit_text.xml create mode 100644 src/android/app/src/main/res/layout/dialog_folder_properties.xml create mode 100644 src/android/app/src/main/res/layout/dialog_input_profiles.xml create mode 100644 src/android/app/src/main/res/layout/dialog_license.xml create mode 100644 src/android/app/src/main/res/layout/dialog_list.xml create mode 100644 src/android/app/src/main/res/layout/dialog_list_item.xml create mode 100644 src/android/app/src/main/res/layout/dialog_mapping.xml create mode 100644 src/android/app/src/main/res/layout/dialog_overlay_adjust.xml create mode 100644 src/android/app/src/main/res/layout/dialog_progress_bar.xml create mode 100644 src/android/app/src/main/res/layout/dialog_slider.xml create mode 100644 src/android/app/src/main/res/layout/fragment_about.xml create mode 100644 src/android/app/src/main/res/layout/fragment_addons.xml create mode 100644 src/android/app/src/main/res/layout/fragment_applet_launcher.xml create mode 100644 src/android/app/src/main/res/layout/fragment_driver_manager.xml create mode 100644 src/android/app/src/main/res/layout/fragment_early_access.xml create mode 100644 src/android/app/src/main/res/layout/fragment_emulation.xml create mode 100644 src/android/app/src/main/res/layout/fragment_folders.xml create mode 100644 src/android/app/src/main/res/layout/fragment_game_info.xml create mode 100644 src/android/app/src/main/res/layout/fragment_game_properties.xml create mode 100644 src/android/app/src/main/res/layout/fragment_games.xml create mode 100644 src/android/app/src/main/res/layout/fragment_home_settings.xml create mode 100644 src/android/app/src/main/res/layout/fragment_installables.xml create mode 100644 src/android/app/src/main/res/layout/fragment_licenses.xml create mode 100644 src/android/app/src/main/res/layout/fragment_search.xml create mode 100644 src/android/app/src/main/res/layout/fragment_settings.xml create mode 100644 src/android/app/src/main/res/layout/fragment_settings_search.xml create mode 100644 src/android/app/src/main/res/layout/fragment_setup.xml create mode 100644 src/android/app/src/main/res/layout/header_in_game.xml create mode 100644 src/android/app/src/main/res/layout/list_item_addon.xml create mode 100644 src/android/app/src/main/res/layout/list_item_input_profile.xml create mode 100644 src/android/app/src/main/res/layout/list_item_setting.xml create mode 100644 src/android/app/src/main/res/layout/list_item_setting_input.xml create mode 100644 src/android/app/src/main/res/layout/list_item_setting_switch.xml create mode 100644 src/android/app/src/main/res/layout/list_item_settings_header.xml create mode 100644 src/android/app/src/main/res/layout/page_setup.xml create mode 100644 src/android/app/src/main/res/menu-w600dp/menu_navigation.xml create mode 100644 src/android/app/src/main/res/menu/menu_driver_manager.xml create mode 100644 src/android/app/src/main/res/menu/menu_in_game.xml create mode 100644 src/android/app/src/main/res/menu/menu_input_options.xml create mode 100644 src/android/app/src/main/res/menu/menu_navigation.xml create mode 100644 src/android/app/src/main/res/menu/menu_overlay_options.xml create mode 100644 src/android/app/src/main/res/menu/menu_settings.xml create mode 100644 src/android/app/src/main/res/navigation/emulation_navigation.xml create mode 100644 src/android/app/src/main/res/navigation/home_navigation.xml create mode 100644 src/android/app/src/main/res/navigation/settings_navigation.xml create mode 100644 src/android/app/src/main/res/resources.properties create mode 100644 src/android/app/src/main/res/values-ar/strings.xml create mode 100644 src/android/app/src/main/res/values-ckb/strings.xml create mode 100644 src/android/app/src/main/res/values-cs/strings.xml create mode 100644 src/android/app/src/main/res/values-de/strings.xml create mode 100644 src/android/app/src/main/res/values-es/strings.xml create mode 100644 src/android/app/src/main/res/values-fa/strings.xml create mode 100644 src/android/app/src/main/res/values-fr/strings.xml create mode 100644 src/android/app/src/main/res/values-he/strings.xml create mode 100644 src/android/app/src/main/res/values-hu/strings.xml create mode 100644 src/android/app/src/main/res/values-id/strings.xml create mode 100644 src/android/app/src/main/res/values-it/strings.xml create mode 100644 src/android/app/src/main/res/values-ja/strings.xml create mode 100644 src/android/app/src/main/res/values-ko/strings.xml create mode 100644 src/android/app/src/main/res/values-nb/strings.xml create mode 100644 src/android/app/src/main/res/values-night-v31/themes.xml create mode 100644 src/android/app/src/main/res/values-night/themes.xml create mode 100644 src/android/app/src/main/res/values-night/yuzu_colors.xml create mode 100644 src/android/app/src/main/res/values-pl/strings.xml create mode 100644 src/android/app/src/main/res/values-pt-rBR/strings.xml create mode 100644 src/android/app/src/main/res/values-pt-rPT/strings.xml create mode 100644 src/android/app/src/main/res/values-ru/strings.xml create mode 100644 src/android/app/src/main/res/values-uk/strings.xml create mode 100644 src/android/app/src/main/res/values-v31/themes.xml create mode 100644 src/android/app/src/main/res/values-vi/strings.xml create mode 100644 src/android/app/src/main/res/values-w600dp/bools.xml create mode 100644 src/android/app/src/main/res/values-w600dp/dimens.xml create mode 100644 src/android/app/src/main/res/values-w600dp/integers.xml create mode 100644 src/android/app/src/main/res/values-zh-rCN/strings.xml create mode 100644 src/android/app/src/main/res/values-zh-rTW/strings.xml create mode 100644 src/android/app/src/main/res/values/arrays.xml create mode 100644 src/android/app/src/main/res/values/bools.xml create mode 100644 src/android/app/src/main/res/values/dimens.xml create mode 100644 src/android/app/src/main/res/values/integers.xml create mode 100644 src/android/app/src/main/res/values/strings.xml create mode 100644 src/android/app/src/main/res/values/styles.xml create mode 100644 src/android/app/src/main/res/values/themes.xml create mode 100644 src/android/app/src/main/res/values/yuzu_colors.xml create mode 100644 src/android/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 src/android/app/src/main/res/xml/data_extraction_rules_api_31.xml create mode 100644 src/android/app/src/main/res/xml/game_mode_config.xml create mode 100644 src/android/app/src/main/res/xml/nfc_tech_filter.xml create mode 100644 src/android/build.gradle.kts create mode 100644 src/android/gradle.properties create mode 100644 src/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 src/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 src/android/gradlew create mode 100644 src/android/gradlew.bat create mode 100644 src/android/settings.gradle.kts create mode 100644 src/audio_core/CMakeLists.txt create mode 100644 src/audio_core/adsp/adsp.cpp create mode 100644 src/audio_core/adsp/adsp.h create mode 100644 src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp create mode 100644 src/audio_core/adsp/apps/audio_renderer/audio_renderer.h create mode 100644 src/audio_core/adsp/apps/audio_renderer/command_buffer.h create mode 100644 src/audio_core/adsp/apps/audio_renderer/command_list_processor.cpp create mode 100644 src/audio_core/adsp/apps/audio_renderer/command_list_processor.h create mode 100644 src/audio_core/adsp/apps/opus/opus_decode_object.cpp create mode 100644 src/audio_core/adsp/apps/opus/opus_decode_object.h create mode 100644 src/audio_core/adsp/apps/opus/opus_decoder.cpp create mode 100644 src/audio_core/adsp/apps/opus/opus_decoder.h create mode 100644 src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp create mode 100644 src/audio_core/adsp/apps/opus/opus_multistream_decode_object.h create mode 100644 src/audio_core/adsp/apps/opus/shared_memory.h create mode 100644 src/audio_core/adsp/mailbox.h create mode 100644 src/audio_core/audio_core.cpp create mode 100644 src/audio_core/audio_core.h create mode 100644 src/audio_core/audio_event.cpp create mode 100644 src/audio_core/audio_event.h create mode 100644 src/audio_core/audio_in_manager.cpp create mode 100644 src/audio_core/audio_in_manager.h create mode 100644 src/audio_core/audio_manager.cpp create mode 100644 src/audio_core/audio_manager.h create mode 100644 src/audio_core/audio_out_manager.cpp create mode 100644 src/audio_core/audio_out_manager.h create mode 100644 src/audio_core/audio_render_manager.cpp create mode 100644 src/audio_core/audio_render_manager.h create mode 100644 src/audio_core/common/audio_renderer_parameter.h create mode 100644 src/audio_core/common/common.h create mode 100644 src/audio_core/common/feature_support.h create mode 100644 src/audio_core/common/wave_buffer.h create mode 100644 src/audio_core/common/workbuffer_allocator.h create mode 100644 src/audio_core/device/audio_buffer.h create mode 100644 src/audio_core/device/audio_buffers.h create mode 100644 src/audio_core/device/device_session.cpp create mode 100644 src/audio_core/device/device_session.h create mode 100644 src/audio_core/in/audio_in.cpp create mode 100644 src/audio_core/in/audio_in.h create mode 100644 src/audio_core/in/audio_in_system.cpp create mode 100644 src/audio_core/in/audio_in_system.h create mode 100644 src/audio_core/opus/decoder.cpp create mode 100644 src/audio_core/opus/decoder.h create mode 100644 src/audio_core/opus/decoder_manager.cpp create mode 100644 src/audio_core/opus/decoder_manager.h create mode 100644 src/audio_core/opus/hardware_opus.cpp create mode 100644 src/audio_core/opus/hardware_opus.h create mode 100644 src/audio_core/opus/parameters.h create mode 100644 src/audio_core/out/audio_out.cpp create mode 100644 src/audio_core/out/audio_out.h create mode 100644 src/audio_core/out/audio_out_system.cpp create mode 100644 src/audio_core/out/audio_out_system.h create mode 100644 src/audio_core/precompiled_headers.h create mode 100644 src/audio_core/renderer/audio_device.cpp create mode 100644 src/audio_core/renderer/audio_device.h create mode 100644 src/audio_core/renderer/audio_renderer.cpp create mode 100644 src/audio_core/renderer/audio_renderer.h create mode 100644 src/audio_core/renderer/behavior/behavior_info.cpp create mode 100644 src/audio_core/renderer/behavior/behavior_info.h create mode 100644 src/audio_core/renderer/behavior/info_updater.cpp create mode 100644 src/audio_core/renderer/behavior/info_updater.h create mode 100644 src/audio_core/renderer/command/command_buffer.cpp create mode 100644 src/audio_core/renderer/command/command_buffer.h create mode 100644 src/audio_core/renderer/command/command_generator.cpp create mode 100644 src/audio_core/renderer/command/command_generator.h create mode 100644 src/audio_core/renderer/command/command_list_header.h create mode 100644 src/audio_core/renderer/command/command_processing_time_estimator.cpp create mode 100644 src/audio_core/renderer/command/command_processing_time_estimator.h create mode 100644 src/audio_core/renderer/command/commands.h create mode 100644 src/audio_core/renderer/command/data_source/adpcm.cpp create mode 100644 src/audio_core/renderer/command/data_source/adpcm.h create mode 100644 src/audio_core/renderer/command/data_source/decode.cpp create mode 100644 src/audio_core/renderer/command/data_source/decode.h create mode 100644 src/audio_core/renderer/command/data_source/pcm_float.cpp create mode 100644 src/audio_core/renderer/command/data_source/pcm_float.h create mode 100644 src/audio_core/renderer/command/data_source/pcm_int16.cpp create mode 100644 src/audio_core/renderer/command/data_source/pcm_int16.h create mode 100644 src/audio_core/renderer/command/effect/aux_.cpp create mode 100644 src/audio_core/renderer/command/effect/aux_.h create mode 100644 src/audio_core/renderer/command/effect/biquad_filter.cpp create mode 100644 src/audio_core/renderer/command/effect/biquad_filter.h create mode 100644 src/audio_core/renderer/command/effect/capture.cpp create mode 100644 src/audio_core/renderer/command/effect/capture.h create mode 100644 src/audio_core/renderer/command/effect/compressor.cpp create mode 100644 src/audio_core/renderer/command/effect/compressor.h create mode 100644 src/audio_core/renderer/command/effect/delay.cpp create mode 100644 src/audio_core/renderer/command/effect/delay.h create mode 100644 src/audio_core/renderer/command/effect/i3dl2_reverb.cpp create mode 100644 src/audio_core/renderer/command/effect/i3dl2_reverb.h create mode 100644 src/audio_core/renderer/command/effect/light_limiter.cpp create mode 100644 src/audio_core/renderer/command/effect/light_limiter.h create mode 100644 src/audio_core/renderer/command/effect/multi_tap_biquad_filter.cpp create mode 100644 src/audio_core/renderer/command/effect/multi_tap_biquad_filter.h create mode 100644 src/audio_core/renderer/command/effect/reverb.cpp create mode 100644 src/audio_core/renderer/command/effect/reverb.h create mode 100644 src/audio_core/renderer/command/icommand.h create mode 100644 src/audio_core/renderer/command/mix/clear_mix.cpp create mode 100644 src/audio_core/renderer/command/mix/clear_mix.h create mode 100644 src/audio_core/renderer/command/mix/copy_mix.cpp create mode 100644 src/audio_core/renderer/command/mix/copy_mix.h create mode 100644 src/audio_core/renderer/command/mix/depop_for_mix_buffers.cpp create mode 100644 src/audio_core/renderer/command/mix/depop_for_mix_buffers.h create mode 100644 src/audio_core/renderer/command/mix/depop_prepare.cpp create mode 100644 src/audio_core/renderer/command/mix/depop_prepare.h create mode 100644 src/audio_core/renderer/command/mix/mix.cpp create mode 100644 src/audio_core/renderer/command/mix/mix.h create mode 100644 src/audio_core/renderer/command/mix/mix_ramp.cpp create mode 100644 src/audio_core/renderer/command/mix/mix_ramp.h create mode 100644 src/audio_core/renderer/command/mix/mix_ramp_grouped.cpp create mode 100644 src/audio_core/renderer/command/mix/mix_ramp_grouped.h create mode 100644 src/audio_core/renderer/command/mix/volume.cpp create mode 100644 src/audio_core/renderer/command/mix/volume.h create mode 100644 src/audio_core/renderer/command/mix/volume_ramp.cpp create mode 100644 src/audio_core/renderer/command/mix/volume_ramp.h create mode 100644 src/audio_core/renderer/command/performance/performance.cpp create mode 100644 src/audio_core/renderer/command/performance/performance.h create mode 100644 src/audio_core/renderer/command/resample/downmix_6ch_to_2ch.cpp create mode 100644 src/audio_core/renderer/command/resample/downmix_6ch_to_2ch.h create mode 100644 src/audio_core/renderer/command/resample/resample.cpp create mode 100644 src/audio_core/renderer/command/resample/resample.h create mode 100644 src/audio_core/renderer/command/resample/upsample.cpp create mode 100644 src/audio_core/renderer/command/resample/upsample.h create mode 100644 src/audio_core/renderer/command/sink/circular_buffer.cpp create mode 100644 src/audio_core/renderer/command/sink/circular_buffer.h create mode 100644 src/audio_core/renderer/command/sink/device.cpp create mode 100644 src/audio_core/renderer/command/sink/device.h create mode 100644 src/audio_core/renderer/effect/aux_.cpp create mode 100644 src/audio_core/renderer/effect/aux_.h create mode 100644 src/audio_core/renderer/effect/biquad_filter.cpp create mode 100644 src/audio_core/renderer/effect/biquad_filter.h create mode 100644 src/audio_core/renderer/effect/buffer_mixer.cpp create mode 100644 src/audio_core/renderer/effect/buffer_mixer.h create mode 100644 src/audio_core/renderer/effect/capture.cpp create mode 100644 src/audio_core/renderer/effect/capture.h create mode 100644 src/audio_core/renderer/effect/compressor.cpp create mode 100644 src/audio_core/renderer/effect/compressor.h create mode 100644 src/audio_core/renderer/effect/delay.cpp create mode 100644 src/audio_core/renderer/effect/delay.h create mode 100644 src/audio_core/renderer/effect/effect_context.cpp create mode 100644 src/audio_core/renderer/effect/effect_context.h create mode 100644 src/audio_core/renderer/effect/effect_info_base.h create mode 100644 src/audio_core/renderer/effect/effect_reset.h create mode 100644 src/audio_core/renderer/effect/effect_result_state.h create mode 100644 src/audio_core/renderer/effect/i3dl2.cpp create mode 100644 src/audio_core/renderer/effect/i3dl2.h create mode 100644 src/audio_core/renderer/effect/light_limiter.cpp create mode 100644 src/audio_core/renderer/effect/light_limiter.h create mode 100644 src/audio_core/renderer/effect/reverb.cpp create mode 100644 src/audio_core/renderer/effect/reverb.h create mode 100644 src/audio_core/renderer/memory/address_info.h create mode 100644 src/audio_core/renderer/memory/memory_pool_info.cpp create mode 100644 src/audio_core/renderer/memory/memory_pool_info.h create mode 100644 src/audio_core/renderer/memory/pool_mapper.cpp create mode 100644 src/audio_core/renderer/memory/pool_mapper.h create mode 100644 src/audio_core/renderer/mix/mix_context.cpp create mode 100644 src/audio_core/renderer/mix/mix_context.h create mode 100644 src/audio_core/renderer/mix/mix_info.cpp create mode 100644 src/audio_core/renderer/mix/mix_info.h create mode 100644 src/audio_core/renderer/nodes/bit_array.h create mode 100644 src/audio_core/renderer/nodes/edge_matrix.cpp create mode 100644 src/audio_core/renderer/nodes/edge_matrix.h create mode 100644 src/audio_core/renderer/nodes/node_states.cpp create mode 100644 src/audio_core/renderer/nodes/node_states.h create mode 100644 src/audio_core/renderer/performance/detail_aspect.cpp create mode 100644 src/audio_core/renderer/performance/detail_aspect.h create mode 100644 src/audio_core/renderer/performance/entry_aspect.cpp create mode 100644 src/audio_core/renderer/performance/entry_aspect.h create mode 100644 src/audio_core/renderer/performance/performance_detail.h create mode 100644 src/audio_core/renderer/performance/performance_entry.h create mode 100644 src/audio_core/renderer/performance/performance_entry_addresses.h create mode 100644 src/audio_core/renderer/performance/performance_frame_header.h create mode 100644 src/audio_core/renderer/performance/performance_manager.cpp create mode 100644 src/audio_core/renderer/performance/performance_manager.h create mode 100644 src/audio_core/renderer/sink/circular_buffer_sink_info.cpp create mode 100644 src/audio_core/renderer/sink/circular_buffer_sink_info.h create mode 100644 src/audio_core/renderer/sink/device_sink_info.cpp create mode 100644 src/audio_core/renderer/sink/device_sink_info.h create mode 100644 src/audio_core/renderer/sink/sink_context.cpp create mode 100644 src/audio_core/renderer/sink/sink_context.h create mode 100644 src/audio_core/renderer/sink/sink_info_base.cpp create mode 100644 src/audio_core/renderer/sink/sink_info_base.h create mode 100644 src/audio_core/renderer/splitter/splitter_context.cpp create mode 100644 src/audio_core/renderer/splitter/splitter_context.h create mode 100644 src/audio_core/renderer/splitter/splitter_destinations_data.cpp create mode 100644 src/audio_core/renderer/splitter/splitter_destinations_data.h create mode 100644 src/audio_core/renderer/splitter/splitter_info.cpp create mode 100644 src/audio_core/renderer/splitter/splitter_info.h create mode 100644 src/audio_core/renderer/system.cpp create mode 100644 src/audio_core/renderer/system.h create mode 100644 src/audio_core/renderer/system_manager.cpp create mode 100644 src/audio_core/renderer/system_manager.h create mode 100644 src/audio_core/renderer/upsampler/upsampler_info.cpp create mode 100644 src/audio_core/renderer/upsampler/upsampler_info.h create mode 100644 src/audio_core/renderer/upsampler/upsampler_manager.cpp create mode 100644 src/audio_core/renderer/upsampler/upsampler_manager.h create mode 100644 src/audio_core/renderer/upsampler/upsampler_state.h create mode 100644 src/audio_core/renderer/voice/voice_channel_resource.h create mode 100644 src/audio_core/renderer/voice/voice_context.cpp create mode 100644 src/audio_core/renderer/voice/voice_context.h create mode 100644 src/audio_core/renderer/voice/voice_info.cpp create mode 100644 src/audio_core/renderer/voice/voice_info.h create mode 100644 src/audio_core/renderer/voice/voice_state.h create mode 100644 src/audio_core/sink/cubeb_sink.cpp create mode 100644 src/audio_core/sink/cubeb_sink.h create mode 100644 src/audio_core/sink/null_sink.h create mode 100644 src/audio_core/sink/oboe_sink.cpp create mode 100644 src/audio_core/sink/oboe_sink.h create mode 100644 src/audio_core/sink/sdl2_sink.cpp create mode 100644 src/audio_core/sink/sdl2_sink.h create mode 100644 src/audio_core/sink/sink.h create mode 100644 src/audio_core/sink/sink_details.cpp create mode 100644 src/audio_core/sink/sink_details.h create mode 100644 src/audio_core/sink/sink_stream.cpp create mode 100644 src/audio_core/sink/sink_stream.h create mode 100644 src/common/CMakeLists.txt create mode 100644 src/common/address_space.cpp create mode 100644 src/common/address_space.h create mode 100644 src/common/address_space.inc create mode 100644 src/common/algorithm.h create mode 100644 src/common/alignment.h create mode 100644 src/common/android/android_common.cpp create mode 100644 src/common/android/android_common.h create mode 100644 src/common/android/applets/software_keyboard.cpp create mode 100644 src/common/android/applets/software_keyboard.h create mode 100644 src/common/android/id_cache.cpp create mode 100644 src/common/android/id_cache.h create mode 100644 src/common/announce_multiplayer_room.h create mode 100644 src/common/arm64/native_clock.cpp create mode 100644 src/common/arm64/native_clock.h create mode 100644 src/common/assert.cpp create mode 100644 src/common/assert.h create mode 100644 src/common/atomic_helpers.h create mode 100644 src/common/atomic_ops.h create mode 100644 src/common/bit_cast.h create mode 100644 src/common/bit_field.h create mode 100644 src/common/bit_set.h create mode 100644 src/common/bit_util.h create mode 100644 src/common/bounded_threadsafe_queue.h create mode 100644 src/common/cityhash.cpp create mode 100644 src/common/cityhash.h create mode 100644 src/common/common_funcs.h create mode 100644 src/common/common_precompiled_headers.h create mode 100644 src/common/common_types.h create mode 100644 src/common/concepts.h create mode 100644 src/common/container_hash.h create mode 100644 src/common/demangle.cpp create mode 100644 src/common/demangle.h create mode 100644 src/common/detached_tasks.cpp create mode 100644 src/common/detached_tasks.h create mode 100644 src/common/div_ceil.h create mode 100644 src/common/dynamic_library.cpp create mode 100644 src/common/dynamic_library.h create mode 100644 src/common/elf.h create mode 100644 src/common/error.cpp create mode 100644 src/common/error.h create mode 100644 src/common/expected.h create mode 100644 src/common/fiber.cpp create mode 100644 src/common/fiber.h create mode 100644 src/common/fixed_point.h create mode 100644 src/common/free_region_manager.h create mode 100644 src/common/fs/file.cpp create mode 100644 src/common/fs/file.h create mode 100644 src/common/fs/fs.cpp create mode 100644 src/common/fs/fs.h create mode 100644 src/common/fs/fs_android.cpp create mode 100644 src/common/fs/fs_android.h create mode 100644 src/common/fs/fs_paths.h create mode 100644 src/common/fs/fs_types.h create mode 100644 src/common/fs/fs_util.cpp create mode 100644 src/common/fs/fs_util.h create mode 100644 src/common/fs/path_util.cpp create mode 100644 src/common/fs/path_util.h create mode 100644 src/common/hash.h create mode 100644 src/common/heap_tracker.cpp create mode 100644 src/common/heap_tracker.h create mode 100644 src/common/hex_util.cpp create mode 100644 src/common/hex_util.h create mode 100644 src/common/host_memory.cpp create mode 100644 src/common/host_memory.h create mode 100644 src/common/input.h create mode 100644 src/common/intrusive_list.h create mode 100644 src/common/intrusive_red_black_tree.h create mode 100644 src/common/linux/gamemode.cpp create mode 100644 src/common/linux/gamemode.h create mode 100644 src/common/literals.h create mode 100644 src/common/logging/backend.cpp create mode 100644 src/common/logging/backend.h create mode 100644 src/common/logging/filter.cpp create mode 100644 src/common/logging/filter.h create mode 100644 src/common/logging/formatter.h create mode 100644 src/common/logging/log.h create mode 100644 src/common/logging/log_entry.h create mode 100644 src/common/logging/text_formatter.cpp create mode 100644 src/common/logging/text_formatter.h create mode 100644 src/common/logging/types.h create mode 100644 src/common/lru_cache.h create mode 100644 src/common/lz4_compression.cpp create mode 100644 src/common/lz4_compression.h create mode 100644 src/common/make_unique_for_overwrite.h create mode 100644 src/common/math_util.h create mode 100644 src/common/memory_detect.cpp create mode 100644 src/common/memory_detect.h create mode 100644 src/common/microprofile.cpp create mode 100644 src/common/microprofile.h create mode 100644 src/common/microprofileui.h create mode 100644 src/common/multi_level_page_table.cpp create mode 100644 src/common/multi_level_page_table.h create mode 100644 src/common/multi_level_page_table.inc create mode 100644 src/common/nvidia_flags.cpp create mode 100644 src/common/nvidia_flags.h create mode 100644 src/common/overflow.h create mode 100644 src/common/page_table.cpp create mode 100644 src/common/page_table.h create mode 100644 src/common/param_package.cpp create mode 100644 src/common/param_package.h create mode 100644 src/common/parent_of_member.h create mode 100644 src/common/point.h create mode 100644 src/common/polyfill_ranges.h create mode 100644 src/common/polyfill_thread.h create mode 100644 src/common/precompiled_headers.h create mode 100644 src/common/quaternion.h create mode 100644 src/common/range_map.h create mode 100644 src/common/range_mutex.h create mode 100644 src/common/range_sets.h create mode 100644 src/common/range_sets.inc create mode 100644 src/common/reader_writer_queue.h create mode 100644 src/common/ring_buffer.h create mode 100644 src/common/scm_rev.cpp.in create mode 100644 src/common/scm_rev.h create mode 100644 src/common/scope_exit.h create mode 100644 src/common/scratch_buffer.h create mode 100644 src/common/settings.cpp create mode 100644 src/common/settings.h create mode 100644 src/common/settings_common.cpp create mode 100644 src/common/settings_common.h create mode 100644 src/common/settings_enums.h create mode 100644 src/common/settings_input.cpp create mode 100644 src/common/settings_input.h create mode 100644 src/common/settings_setting.h create mode 100644 src/common/signal_chain.cpp create mode 100644 src/common/signal_chain.h create mode 100644 src/common/slot_vector.h create mode 100644 src/common/socket_types.h create mode 100644 src/common/spin_lock.cpp create mode 100644 src/common/spin_lock.h create mode 100644 src/common/stb.cpp create mode 100644 src/common/stb.h create mode 100644 src/common/steady_clock.cpp create mode 100644 src/common/steady_clock.h create mode 100644 src/common/stream.cpp create mode 100644 src/common/stream.h create mode 100644 src/common/string_util.cpp create mode 100644 src/common/string_util.h create mode 100644 src/common/swap.h create mode 100644 src/common/telemetry.cpp create mode 100644 src/common/telemetry.h create mode 100644 src/common/thread.cpp create mode 100644 src/common/thread.h create mode 100644 src/common/thread_queue_list.h create mode 100644 src/common/thread_worker.h create mode 100644 src/common/threadsafe_queue.h create mode 100644 src/common/time_zone.cpp create mode 100644 src/common/time_zone.h create mode 100644 src/common/tiny_mt.h create mode 100644 src/common/tree.h create mode 100644 src/common/typed_address.h create mode 100644 src/common/uint128.h create mode 100644 src/common/unique_function.h create mode 100644 src/common/uuid.cpp create mode 100644 src/common/uuid.h create mode 100644 src/common/vector_math.h create mode 100644 src/common/virtual_buffer.cpp create mode 100644 src/common/virtual_buffer.h create mode 100644 src/common/wall_clock.cpp create mode 100644 src/common/wall_clock.h create mode 100644 src/common/windows/timer_resolution.cpp create mode 100644 src/common/windows/timer_resolution.h create mode 100644 src/common/x64/cpu_detect.cpp create mode 100644 src/common/x64/cpu_detect.h create mode 100644 src/common/x64/cpu_wait.cpp create mode 100644 src/common/x64/cpu_wait.h create mode 100644 src/common/x64/native_clock.cpp create mode 100644 src/common/x64/native_clock.h create mode 100644 src/common/x64/rdtsc.cpp create mode 100644 src/common/x64/rdtsc.h create mode 100644 src/common/x64/xbyak_abi.h create mode 100644 src/common/x64/xbyak_util.h create mode 100644 src/common/zstd_compression.cpp create mode 100644 src/common/zstd_compression.h create mode 100644 src/core/CMakeLists.txt create mode 100644 src/core/arm/arm_interface.cpp create mode 100644 src/core/arm/arm_interface.h create mode 100644 src/core/arm/debug.cpp create mode 100644 src/core/arm/debug.h create mode 100644 src/core/arm/dynarmic/arm_dynarmic.cpp create mode 100644 src/core/arm/dynarmic/arm_dynarmic.h create mode 100644 src/core/arm/dynarmic/arm_dynarmic_32.cpp create mode 100644 src/core/arm/dynarmic/arm_dynarmic_32.h create mode 100644 src/core/arm/dynarmic/arm_dynarmic_64.cpp create mode 100644 src/core/arm/dynarmic/arm_dynarmic_64.h create mode 100644 src/core/arm/dynarmic/dynarmic_cp15.cpp create mode 100644 src/core/arm/dynarmic/dynarmic_cp15.h create mode 100644 src/core/arm/dynarmic/dynarmic_exclusive_monitor.cpp create mode 100644 src/core/arm/dynarmic/dynarmic_exclusive_monitor.h create mode 100644 src/core/arm/exclusive_monitor.cpp create mode 100644 src/core/arm/exclusive_monitor.h create mode 100644 src/core/arm/nce/arm_nce.cpp create mode 100644 src/core/arm/nce/arm_nce.h create mode 100644 src/core/arm/nce/arm_nce.s create mode 100644 src/core/arm/nce/arm_nce_asm_definitions.h create mode 100644 src/core/arm/nce/guest_context.h create mode 100644 src/core/arm/nce/instructions.h create mode 100644 src/core/arm/nce/interpreter_visitor.cpp create mode 100644 src/core/arm/nce/interpreter_visitor.h create mode 100644 src/core/arm/nce/patcher.cpp create mode 100644 src/core/arm/nce/patcher.h create mode 100644 src/core/arm/nce/visitor_base.h create mode 100644 src/core/arm/symbols.cpp create mode 100644 src/core/arm/symbols.h create mode 100644 src/core/constants.cpp create mode 100644 src/core/constants.h create mode 100644 src/core/core.cpp create mode 100644 src/core/core.h create mode 100644 src/core/core_timing.cpp create mode 100644 src/core/core_timing.h create mode 100644 src/core/cpu_manager.cpp create mode 100644 src/core/cpu_manager.h create mode 100644 src/core/crypto/aes_util.cpp create mode 100644 src/core/crypto/aes_util.h create mode 100644 src/core/crypto/ctr_encryption_layer.cpp create mode 100644 src/core/crypto/ctr_encryption_layer.h create mode 100644 src/core/crypto/encryption_layer.cpp create mode 100644 src/core/crypto/encryption_layer.h create mode 100644 src/core/crypto/key_manager.cpp create mode 100644 src/core/crypto/key_manager.h create mode 100644 src/core/crypto/partition_data_manager.cpp create mode 100644 src/core/crypto/partition_data_manager.h create mode 100644 src/core/crypto/sha_util.cpp create mode 100644 src/core/crypto/sha_util.h create mode 100644 src/core/crypto/xts_encryption_layer.cpp create mode 100644 src/core/crypto/xts_encryption_layer.h create mode 100644 src/core/debugger/debugger.cpp create mode 100644 src/core/debugger/debugger.h create mode 100644 src/core/debugger/debugger_interface.h create mode 100644 src/core/debugger/gdbstub.cpp create mode 100644 src/core/debugger/gdbstub.h create mode 100644 src/core/debugger/gdbstub_arch.cpp create mode 100644 src/core/debugger/gdbstub_arch.h create mode 100644 src/core/device_memory.cpp create mode 100644 src/core/device_memory.h create mode 100644 src/core/device_memory_manager.h create mode 100644 src/core/device_memory_manager.inc create mode 100644 src/core/file_sys/bis_factory.cpp create mode 100644 src/core/file_sys/bis_factory.h create mode 100644 src/core/file_sys/card_image.cpp create mode 100644 src/core/file_sys/card_image.h create mode 100644 src/core/file_sys/common_funcs.h create mode 100644 src/core/file_sys/content_archive.cpp create mode 100644 src/core/file_sys/content_archive.h create mode 100644 src/core/file_sys/control_metadata.cpp create mode 100644 src/core/file_sys/control_metadata.h create mode 100644 src/core/file_sys/errors.h create mode 100644 src/core/file_sys/fs_directory.h create mode 100644 src/core/file_sys/fs_file.h create mode 100644 src/core/file_sys/fs_filesystem.h create mode 100644 src/core/file_sys/fs_memory_management.h create mode 100644 src/core/file_sys/fs_operate_range.h create mode 100644 src/core/file_sys/fs_path.h create mode 100644 src/core/file_sys/fs_path_utility.h create mode 100644 src/core/file_sys/fs_save_data_types.h create mode 100644 src/core/file_sys/fs_string_util.h create mode 100644 src/core/file_sys/fsa/fs_i_directory.h create mode 100644 src/core/file_sys/fsa/fs_i_file.h create mode 100644 src/core/file_sys/fsa/fs_i_filesystem.h create mode 100644 src/core/file_sys/fsmitm_romfsbuild.cpp create mode 100644 src/core/file_sys/fsmitm_romfsbuild.h create mode 100644 src/core/file_sys/fssrv/fssrv_sf_path.h create mode 100644 src/core/file_sys/fssystem/fs_i_storage.h create mode 100644 src/core/file_sys/fssystem/fs_types.h create mode 100644 src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_aes_ctr_storage.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_aes_ctr_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_aes_xts_storage.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_aes_xts_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_alignment_matching_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_alignment_matching_storage_impl.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_alignment_matching_storage_impl.h create mode 100644 src/core/file_sys/fssystem/fssystem_bucket_tree.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_bucket_tree.h create mode 100644 src/core/file_sys/fssystem/fssystem_bucket_tree_template_impl.h create mode 100644 src/core/file_sys/fssystem/fssystem_bucket_tree_utils.h create mode 100644 src/core/file_sys/fssystem/fssystem_compressed_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_compression_common.h create mode 100644 src/core/file_sys/fssystem/fssystem_compression_configuration.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_compression_configuration.h create mode 100644 src/core/file_sys/fssystem/fssystem_crypto_configuration.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_crypto_configuration.h create mode 100644 src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_indirect_storage.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_indirect_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_integrity_romfs_storage.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_integrity_romfs_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_integrity_verification_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_memory_resource_buffer_hold_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h create mode 100644 src/core/file_sys/fssystem/fssystem_nca_header.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_nca_header.h create mode 100644 src/core/file_sys/fssystem/fssystem_nca_reader.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_pooled_buffer.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_pooled_buffer.h create mode 100644 src/core/file_sys/fssystem/fssystem_sparse_storage.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_sparse_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_switch_storage.h create mode 100644 src/core/file_sys/fssystem/fssystem_utility.cpp create mode 100644 src/core/file_sys/fssystem/fssystem_utility.h create mode 100644 src/core/file_sys/ips_layer.cpp create mode 100644 src/core/file_sys/ips_layer.h create mode 100644 src/core/file_sys/kernel_executable.cpp create mode 100644 src/core/file_sys/kernel_executable.h create mode 100644 src/core/file_sys/nca_metadata.cpp create mode 100644 src/core/file_sys/nca_metadata.h create mode 100644 src/core/file_sys/partition_filesystem.cpp create mode 100644 src/core/file_sys/partition_filesystem.h create mode 100644 src/core/file_sys/patch_manager.cpp create mode 100644 src/core/file_sys/patch_manager.h create mode 100644 src/core/file_sys/program_metadata.cpp create mode 100644 src/core/file_sys/program_metadata.h create mode 100644 src/core/file_sys/registered_cache.cpp create mode 100644 src/core/file_sys/registered_cache.h create mode 100644 src/core/file_sys/romfs.cpp create mode 100644 src/core/file_sys/romfs.h create mode 100644 src/core/file_sys/romfs_factory.cpp create mode 100644 src/core/file_sys/romfs_factory.h create mode 100644 src/core/file_sys/savedata_factory.cpp create mode 100644 src/core/file_sys/savedata_factory.h create mode 100644 src/core/file_sys/sdmc_factory.cpp create mode 100644 src/core/file_sys/sdmc_factory.h create mode 100644 src/core/file_sys/submission_package.cpp create mode 100644 src/core/file_sys/submission_package.h create mode 100644 src/core/file_sys/system_archive/data/font_chinese_simplified.cpp create mode 100644 src/core/file_sys/system_archive/data/font_chinese_simplified.h create mode 100644 src/core/file_sys/system_archive/data/font_chinese_traditional.cpp create mode 100644 src/core/file_sys/system_archive/data/font_chinese_traditional.h create mode 100644 src/core/file_sys/system_archive/data/font_extended_chinese_simplified.cpp create mode 100644 src/core/file_sys/system_archive/data/font_extended_chinese_simplified.h create mode 100644 src/core/file_sys/system_archive/data/font_korean.cpp create mode 100644 src/core/file_sys/system_archive/data/font_korean.h create mode 100644 src/core/file_sys/system_archive/data/font_nintendo_extended.cpp create mode 100644 src/core/file_sys/system_archive/data/font_nintendo_extended.h create mode 100644 src/core/file_sys/system_archive/data/font_standard.cpp create mode 100644 src/core/file_sys/system_archive/data/font_standard.h create mode 100644 src/core/file_sys/system_archive/mii_model.cpp create mode 100644 src/core/file_sys/system_archive/mii_model.h create mode 100644 src/core/file_sys/system_archive/ng_word.cpp create mode 100644 src/core/file_sys/system_archive/ng_word.h create mode 100644 src/core/file_sys/system_archive/shared_font.cpp create mode 100644 src/core/file_sys/system_archive/shared_font.h create mode 100644 src/core/file_sys/system_archive/system_archive.cpp create mode 100644 src/core/file_sys/system_archive/system_archive.h create mode 100644 src/core/file_sys/system_archive/system_version.cpp create mode 100644 src/core/file_sys/system_archive/system_version.h create mode 100644 src/core/file_sys/system_archive/time_zone_binary.cpp create mode 100644 src/core/file_sys/system_archive/time_zone_binary.h create mode 100644 src/core/file_sys/vfs/vfs.cpp create mode 100644 src/core/file_sys/vfs/vfs.h create mode 100644 src/core/file_sys/vfs/vfs_cached.cpp create mode 100644 src/core/file_sys/vfs/vfs_cached.h create mode 100644 src/core/file_sys/vfs/vfs_concat.cpp create mode 100644 src/core/file_sys/vfs/vfs_concat.h create mode 100644 src/core/file_sys/vfs/vfs_layered.cpp create mode 100644 src/core/file_sys/vfs/vfs_layered.h create mode 100644 src/core/file_sys/vfs/vfs_offset.cpp create mode 100644 src/core/file_sys/vfs/vfs_offset.h create mode 100644 src/core/file_sys/vfs/vfs_real.cpp create mode 100644 src/core/file_sys/vfs/vfs_real.h create mode 100644 src/core/file_sys/vfs/vfs_static.h create mode 100644 src/core/file_sys/vfs/vfs_types.h create mode 100644 src/core/file_sys/vfs/vfs_vector.cpp create mode 100644 src/core/file_sys/vfs/vfs_vector.h create mode 100644 src/core/file_sys/xts_archive.cpp create mode 100644 src/core/file_sys/xts_archive.h create mode 100644 src/core/frontend/applets/applet.h create mode 100644 src/core/frontend/applets/cabinet.cpp create mode 100644 src/core/frontend/applets/cabinet.h create mode 100644 src/core/frontend/applets/controller.cpp create mode 100644 src/core/frontend/applets/controller.h create mode 100644 src/core/frontend/applets/error.cpp create mode 100644 src/core/frontend/applets/error.h create mode 100644 src/core/frontend/applets/general.cpp create mode 100644 src/core/frontend/applets/general.h create mode 100644 src/core/frontend/applets/mii_edit.cpp create mode 100644 src/core/frontend/applets/mii_edit.h create mode 100644 src/core/frontend/applets/profile_select.cpp create mode 100644 src/core/frontend/applets/profile_select.h create mode 100644 src/core/frontend/applets/software_keyboard.cpp create mode 100644 src/core/frontend/applets/software_keyboard.h create mode 100644 src/core/frontend/applets/web_browser.cpp create mode 100644 src/core/frontend/applets/web_browser.h create mode 100644 src/core/frontend/emu_window.cpp create mode 100644 src/core/frontend/emu_window.h create mode 100644 src/core/frontend/framebuffer_layout.cpp create mode 100644 src/core/frontend/framebuffer_layout.h create mode 100644 src/core/frontend/graphics_context.h create mode 100644 src/core/gpu_dirty_memory_manager.h create mode 100644 src/core/guest_memory.h create mode 100644 src/core/hardware_properties.h create mode 100644 src/core/hle/api_version.h create mode 100644 src/core/hle/ipc.h create mode 100644 src/core/hle/kernel/arch/arm64/k_memory_region_device_types.inc create mode 100644 src/core/hle/kernel/board/nintendo/nx/k_memory_layout.cpp create mode 100644 src/core/hle/kernel/board/nintendo/nx/k_memory_layout.h create mode 100644 src/core/hle/kernel/board/nintendo/nx/k_memory_region_device_types.inc create mode 100644 src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp create mode 100644 src/core/hle/kernel/board/nintendo/nx/k_system_control.h create mode 100644 src/core/hle/kernel/board/nintendo/nx/secure_monitor.h create mode 100644 src/core/hle/kernel/code_set.cpp create mode 100644 src/core/hle/kernel/code_set.h create mode 100644 src/core/hle/kernel/global_scheduler_context.cpp create mode 100644 src/core/hle/kernel/global_scheduler_context.h create mode 100644 src/core/hle/kernel/init/init_slab_setup.cpp create mode 100644 src/core/hle/kernel/init/init_slab_setup.h create mode 100644 src/core/hle/kernel/initial_process.h create mode 100644 src/core/hle/kernel/k_address_arbiter.cpp create mode 100644 src/core/hle/kernel/k_address_arbiter.h create mode 100644 src/core/hle/kernel/k_address_space_info.cpp create mode 100644 src/core/hle/kernel/k_address_space_info.h create mode 100644 src/core/hle/kernel/k_affinity_mask.h create mode 100644 src/core/hle/kernel/k_auto_object.cpp create mode 100644 src/core/hle/kernel/k_auto_object.h create mode 100644 src/core/hle/kernel/k_auto_object_container.cpp create mode 100644 src/core/hle/kernel/k_auto_object_container.h create mode 100644 src/core/hle/kernel/k_capabilities.cpp create mode 100644 src/core/hle/kernel/k_capabilities.h create mode 100644 src/core/hle/kernel/k_class_token.cpp create mode 100644 src/core/hle/kernel/k_class_token.h create mode 100644 src/core/hle/kernel/k_client_port.cpp create mode 100644 src/core/hle/kernel/k_client_port.h create mode 100644 src/core/hle/kernel/k_client_session.cpp create mode 100644 src/core/hle/kernel/k_client_session.h create mode 100644 src/core/hle/kernel/k_code_memory.cpp create mode 100644 src/core/hle/kernel/k_code_memory.h create mode 100644 src/core/hle/kernel/k_condition_variable.cpp create mode 100644 src/core/hle/kernel/k_condition_variable.h create mode 100644 src/core/hle/kernel/k_debug.h create mode 100644 src/core/hle/kernel/k_device_address_space.cpp create mode 100644 src/core/hle/kernel/k_device_address_space.h create mode 100644 src/core/hle/kernel/k_dynamic_page_manager.h create mode 100644 src/core/hle/kernel/k_dynamic_resource_manager.h create mode 100644 src/core/hle/kernel/k_dynamic_slab_heap.h create mode 100644 src/core/hle/kernel/k_event.cpp create mode 100644 src/core/hle/kernel/k_event.h create mode 100644 src/core/hle/kernel/k_event_info.h create mode 100644 src/core/hle/kernel/k_handle_table.cpp create mode 100644 src/core/hle/kernel/k_handle_table.h create mode 100644 src/core/hle/kernel/k_hardware_timer.cpp create mode 100644 src/core/hle/kernel/k_hardware_timer.h create mode 100644 src/core/hle/kernel/k_hardware_timer_base.h create mode 100644 src/core/hle/kernel/k_interrupt_manager.cpp create mode 100644 src/core/hle/kernel/k_interrupt_manager.h create mode 100644 src/core/hle/kernel/k_light_client_session.cpp create mode 100644 src/core/hle/kernel/k_light_client_session.h create mode 100644 src/core/hle/kernel/k_light_condition_variable.cpp create mode 100644 src/core/hle/kernel/k_light_condition_variable.h create mode 100644 src/core/hle/kernel/k_light_lock.cpp create mode 100644 src/core/hle/kernel/k_light_lock.h create mode 100644 src/core/hle/kernel/k_light_server_session.cpp create mode 100644 src/core/hle/kernel/k_light_server_session.h create mode 100644 src/core/hle/kernel/k_light_session.cpp create mode 100644 src/core/hle/kernel/k_light_session.h create mode 100644 src/core/hle/kernel/k_memory_block.h create mode 100644 src/core/hle/kernel/k_memory_block_manager.cpp create mode 100644 src/core/hle/kernel/k_memory_block_manager.h create mode 100644 src/core/hle/kernel/k_memory_layout.cpp create mode 100644 src/core/hle/kernel/k_memory_layout.h create mode 100644 src/core/hle/kernel/k_memory_manager.cpp create mode 100644 src/core/hle/kernel/k_memory_manager.h create mode 100644 src/core/hle/kernel/k_memory_region.h create mode 100644 src/core/hle/kernel/k_memory_region_type.h create mode 100644 src/core/hle/kernel/k_object_name.cpp create mode 100644 src/core/hle/kernel/k_object_name.h create mode 100644 src/core/hle/kernel/k_page_bitmap.h create mode 100644 src/core/hle/kernel/k_page_buffer.cpp create mode 100644 src/core/hle/kernel/k_page_buffer.h create mode 100644 src/core/hle/kernel/k_page_group.cpp create mode 100644 src/core/hle/kernel/k_page_group.h create mode 100644 src/core/hle/kernel/k_page_heap.cpp create mode 100644 src/core/hle/kernel/k_page_heap.h create mode 100644 src/core/hle/kernel/k_page_table.h create mode 100644 src/core/hle/kernel/k_page_table_base.cpp create mode 100644 src/core/hle/kernel/k_page_table_base.h create mode 100644 src/core/hle/kernel/k_page_table_manager.h create mode 100644 src/core/hle/kernel/k_page_table_slab_heap.h create mode 100644 src/core/hle/kernel/k_port.cpp create mode 100644 src/core/hle/kernel/k_port.h create mode 100644 src/core/hle/kernel/k_priority_queue.h create mode 100644 src/core/hle/kernel/k_process.cpp create mode 100644 src/core/hle/kernel/k_process.h create mode 100644 src/core/hle/kernel/k_process_page_table.h create mode 100644 src/core/hle/kernel/k_readable_event.cpp create mode 100644 src/core/hle/kernel/k_readable_event.h create mode 100644 src/core/hle/kernel/k_resource_limit.cpp create mode 100644 src/core/hle/kernel/k_resource_limit.h create mode 100644 src/core/hle/kernel/k_scheduler.cpp create mode 100644 src/core/hle/kernel/k_scheduler.h create mode 100644 src/core/hle/kernel/k_scheduler_lock.h create mode 100644 src/core/hle/kernel/k_scoped_lock.h create mode 100644 src/core/hle/kernel/k_scoped_resource_reservation.h create mode 100644 src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h create mode 100644 src/core/hle/kernel/k_server_port.cpp create mode 100644 src/core/hle/kernel/k_server_port.h create mode 100644 src/core/hle/kernel/k_server_session.cpp create mode 100644 src/core/hle/kernel/k_server_session.h create mode 100644 src/core/hle/kernel/k_session.cpp create mode 100644 src/core/hle/kernel/k_session.h create mode 100644 src/core/hle/kernel/k_session_request.cpp create mode 100644 src/core/hle/kernel/k_session_request.h create mode 100644 src/core/hle/kernel/k_shared_memory.cpp create mode 100644 src/core/hle/kernel/k_shared_memory.h create mode 100644 src/core/hle/kernel/k_shared_memory_info.h create mode 100644 src/core/hle/kernel/k_slab_heap.h create mode 100644 src/core/hle/kernel/k_spin_lock.cpp create mode 100644 src/core/hle/kernel/k_spin_lock.h create mode 100644 src/core/hle/kernel/k_synchronization_object.cpp create mode 100644 src/core/hle/kernel/k_synchronization_object.h create mode 100644 src/core/hle/kernel/k_system_control.h create mode 100644 src/core/hle/kernel/k_system_resource.cpp create mode 100644 src/core/hle/kernel/k_system_resource.h create mode 100644 src/core/hle/kernel/k_thread.cpp create mode 100644 src/core/hle/kernel/k_thread.h create mode 100644 src/core/hle/kernel/k_thread_local_page.cpp create mode 100644 src/core/hle/kernel/k_thread_local_page.h create mode 100644 src/core/hle/kernel/k_thread_queue.cpp create mode 100644 src/core/hle/kernel/k_thread_queue.h create mode 100644 src/core/hle/kernel/k_timer_task.h create mode 100644 src/core/hle/kernel/k_trace.h create mode 100644 src/core/hle/kernel/k_transfer_memory.cpp create mode 100644 src/core/hle/kernel/k_transfer_memory.h create mode 100644 src/core/hle/kernel/k_typed_address.h create mode 100644 src/core/hle/kernel/k_worker_task.h create mode 100644 src/core/hle/kernel/k_worker_task_manager.cpp create mode 100644 src/core/hle/kernel/k_worker_task_manager.h create mode 100644 src/core/hle/kernel/kernel.cpp create mode 100644 src/core/hle/kernel/kernel.h create mode 100644 src/core/hle/kernel/memory_types.h create mode 100644 src/core/hle/kernel/message_buffer.h create mode 100644 src/core/hle/kernel/physical_core.cpp create mode 100644 src/core/hle/kernel/physical_core.h create mode 100644 src/core/hle/kernel/physical_memory.h create mode 100644 src/core/hle/kernel/slab_helpers.h create mode 100644 src/core/hle/kernel/svc.cpp create mode 100644 src/core/hle/kernel/svc.h create mode 100644 src/core/hle/kernel/svc/svc_activity.cpp create mode 100644 src/core/hle/kernel/svc/svc_address_arbiter.cpp create mode 100644 src/core/hle/kernel/svc/svc_address_translation.cpp create mode 100644 src/core/hle/kernel/svc/svc_cache.cpp create mode 100644 src/core/hle/kernel/svc/svc_code_memory.cpp create mode 100644 src/core/hle/kernel/svc/svc_condition_variable.cpp create mode 100644 src/core/hle/kernel/svc/svc_debug.cpp create mode 100644 src/core/hle/kernel/svc/svc_debug_string.cpp create mode 100644 src/core/hle/kernel/svc/svc_device_address_space.cpp create mode 100644 src/core/hle/kernel/svc/svc_event.cpp create mode 100644 src/core/hle/kernel/svc/svc_exception.cpp create mode 100644 src/core/hle/kernel/svc/svc_info.cpp create mode 100644 src/core/hle/kernel/svc/svc_insecure_memory.cpp create mode 100644 src/core/hle/kernel/svc/svc_interrupt_event.cpp create mode 100644 src/core/hle/kernel/svc/svc_io_pool.cpp create mode 100644 src/core/hle/kernel/svc/svc_ipc.cpp create mode 100644 src/core/hle/kernel/svc/svc_kernel_debug.cpp create mode 100644 src/core/hle/kernel/svc/svc_light_ipc.cpp create mode 100644 src/core/hle/kernel/svc/svc_lock.cpp create mode 100644 src/core/hle/kernel/svc/svc_memory.cpp create mode 100644 src/core/hle/kernel/svc/svc_physical_memory.cpp create mode 100644 src/core/hle/kernel/svc/svc_port.cpp create mode 100644 src/core/hle/kernel/svc/svc_power_management.cpp create mode 100644 src/core/hle/kernel/svc/svc_process.cpp create mode 100644 src/core/hle/kernel/svc/svc_process_memory.cpp create mode 100644 src/core/hle/kernel/svc/svc_processor.cpp create mode 100644 src/core/hle/kernel/svc/svc_query_memory.cpp create mode 100644 src/core/hle/kernel/svc/svc_register.cpp create mode 100644 src/core/hle/kernel/svc/svc_resource_limit.cpp create mode 100644 src/core/hle/kernel/svc/svc_secure_monitor_call.cpp create mode 100644 src/core/hle/kernel/svc/svc_session.cpp create mode 100644 src/core/hle/kernel/svc/svc_shared_memory.cpp create mode 100644 src/core/hle/kernel/svc/svc_synchronization.cpp create mode 100644 src/core/hle/kernel/svc/svc_thread.cpp create mode 100644 src/core/hle/kernel/svc/svc_thread_profiler.cpp create mode 100644 src/core/hle/kernel/svc/svc_tick.cpp create mode 100644 src/core/hle/kernel/svc/svc_transfer_memory.cpp create mode 100644 src/core/hle/kernel/svc_common.h create mode 100644 src/core/hle/kernel/svc_generator.py create mode 100644 src/core/hle/kernel/svc_results.h create mode 100644 src/core/hle/kernel/svc_types.h create mode 100644 src/core/hle/kernel/svc_version.h create mode 100644 src/core/hle/result.h create mode 100644 src/core/hle/service/acc/acc.cpp create mode 100644 src/core/hle/service/acc/acc.h create mode 100644 src/core/hle/service/acc/acc_aa.cpp create mode 100644 src/core/hle/service/acc/acc_aa.h create mode 100644 src/core/hle/service/acc/acc_su.cpp create mode 100644 src/core/hle/service/acc/acc_su.h create mode 100644 src/core/hle/service/acc/acc_u0.cpp create mode 100644 src/core/hle/service/acc/acc_u0.h create mode 100644 src/core/hle/service/acc/acc_u1.cpp create mode 100644 src/core/hle/service/acc/acc_u1.h create mode 100644 src/core/hle/service/acc/async_context.cpp create mode 100644 src/core/hle/service/acc/async_context.h create mode 100644 src/core/hle/service/acc/errors.h create mode 100644 src/core/hle/service/acc/profile_manager.cpp create mode 100644 src/core/hle/service/acc/profile_manager.h create mode 100644 src/core/hle/service/am/am.cpp create mode 100644 src/core/hle/service/am/am.h create mode 100644 src/core/hle/service/am/am_results.h create mode 100644 src/core/hle/service/am/am_types.h create mode 100644 src/core/hle/service/am/applet.cpp create mode 100644 src/core/hle/service/am/applet.h create mode 100644 src/core/hle/service/am/applet_data_broker.cpp create mode 100644 src/core/hle/service/am/applet_data_broker.h create mode 100644 src/core/hle/service/am/applet_manager.cpp create mode 100644 src/core/hle/service/am/applet_manager.h create mode 100644 src/core/hle/service/am/applet_message_queue.cpp create mode 100644 src/core/hle/service/am/applet_message_queue.h create mode 100644 src/core/hle/service/am/display_layer_manager.cpp create mode 100644 src/core/hle/service/am/display_layer_manager.h create mode 100644 src/core/hle/service/am/frontend/applet_cabinet.cpp create mode 100644 src/core/hle/service/am/frontend/applet_cabinet.h create mode 100644 src/core/hle/service/am/frontend/applet_controller.cpp create mode 100644 src/core/hle/service/am/frontend/applet_controller.h create mode 100644 src/core/hle/service/am/frontend/applet_error.cpp create mode 100644 src/core/hle/service/am/frontend/applet_error.h create mode 100644 src/core/hle/service/am/frontend/applet_general.cpp create mode 100644 src/core/hle/service/am/frontend/applet_general.h create mode 100644 src/core/hle/service/am/frontend/applet_mii_edit.cpp create mode 100644 src/core/hle/service/am/frontend/applet_mii_edit.h create mode 100644 src/core/hle/service/am/frontend/applet_mii_edit_types.h create mode 100644 src/core/hle/service/am/frontend/applet_profile_select.cpp create mode 100644 src/core/hle/service/am/frontend/applet_profile_select.h create mode 100644 src/core/hle/service/am/frontend/applet_software_keyboard.cpp create mode 100644 src/core/hle/service/am/frontend/applet_software_keyboard.h create mode 100644 src/core/hle/service/am/frontend/applet_software_keyboard_types.h create mode 100644 src/core/hle/service/am/frontend/applet_web_browser.cpp create mode 100644 src/core/hle/service/am/frontend/applet_web_browser.h create mode 100644 src/core/hle/service/am/frontend/applet_web_browser_types.h create mode 100644 src/core/hle/service/am/frontend/applets.cpp create mode 100644 src/core/hle/service/am/frontend/applets.h create mode 100644 src/core/hle/service/am/hid_registration.cpp create mode 100644 src/core/hle/service/am/hid_registration.h create mode 100644 src/core/hle/service/am/library_applet_storage.cpp create mode 100644 src/core/hle/service/am/library_applet_storage.h create mode 100644 src/core/hle/service/am/process.cpp create mode 100644 src/core/hle/service/am/process.h create mode 100644 src/core/hle/service/am/service/all_system_applet_proxies_service.cpp create mode 100644 src/core/hle/service/am/service/all_system_applet_proxies_service.h create mode 100644 src/core/hle/service/am/service/applet_common_functions.cpp create mode 100644 src/core/hle/service/am/service/applet_common_functions.h create mode 100644 src/core/hle/service/am/service/application_accessor.cpp create mode 100644 src/core/hle/service/am/service/application_accessor.h create mode 100644 src/core/hle/service/am/service/application_creator.cpp create mode 100644 src/core/hle/service/am/service/application_creator.h create mode 100644 src/core/hle/service/am/service/application_functions.cpp create mode 100644 src/core/hle/service/am/service/application_functions.h create mode 100644 src/core/hle/service/am/service/application_proxy.cpp create mode 100644 src/core/hle/service/am/service/application_proxy.h create mode 100644 src/core/hle/service/am/service/application_proxy_service.cpp create mode 100644 src/core/hle/service/am/service/application_proxy_service.h create mode 100644 src/core/hle/service/am/service/audio_controller.cpp create mode 100644 src/core/hle/service/am/service/audio_controller.h create mode 100644 src/core/hle/service/am/service/common_state_getter.cpp create mode 100644 src/core/hle/service/am/service/common_state_getter.h create mode 100644 src/core/hle/service/am/service/cradle_firmware_updater.cpp create mode 100644 src/core/hle/service/am/service/cradle_firmware_updater.h create mode 100644 src/core/hle/service/am/service/debug_functions.cpp create mode 100644 src/core/hle/service/am/service/debug_functions.h create mode 100644 src/core/hle/service/am/service/display_controller.cpp create mode 100644 src/core/hle/service/am/service/display_controller.h create mode 100644 src/core/hle/service/am/service/global_state_controller.cpp create mode 100644 src/core/hle/service/am/service/global_state_controller.h create mode 100644 src/core/hle/service/am/service/home_menu_functions.cpp create mode 100644 src/core/hle/service/am/service/home_menu_functions.h create mode 100644 src/core/hle/service/am/service/library_applet_accessor.cpp create mode 100644 src/core/hle/service/am/service/library_applet_accessor.h create mode 100644 src/core/hle/service/am/service/library_applet_creator.cpp create mode 100644 src/core/hle/service/am/service/library_applet_creator.h create mode 100644 src/core/hle/service/am/service/library_applet_proxy.cpp create mode 100644 src/core/hle/service/am/service/library_applet_proxy.h create mode 100644 src/core/hle/service/am/service/library_applet_self_accessor.cpp create mode 100644 src/core/hle/service/am/service/library_applet_self_accessor.h create mode 100644 src/core/hle/service/am/service/lock_accessor.cpp create mode 100644 src/core/hle/service/am/service/lock_accessor.h create mode 100644 src/core/hle/service/am/service/process_winding_controller.cpp create mode 100644 src/core/hle/service/am/service/process_winding_controller.h create mode 100644 src/core/hle/service/am/service/self_controller.cpp create mode 100644 src/core/hle/service/am/service/self_controller.h create mode 100644 src/core/hle/service/am/service/storage.cpp create mode 100644 src/core/hle/service/am/service/storage.h create mode 100644 src/core/hle/service/am/service/storage_accessor.cpp create mode 100644 src/core/hle/service/am/service/storage_accessor.h create mode 100644 src/core/hle/service/am/service/system_applet_proxy.cpp create mode 100644 src/core/hle/service/am/service/system_applet_proxy.h create mode 100644 src/core/hle/service/am/service/window_controller.cpp create mode 100644 src/core/hle/service/am/service/window_controller.h create mode 100644 src/core/hle/service/aoc/addon_content_manager.cpp create mode 100644 src/core/hle/service/aoc/addon_content_manager.h create mode 100644 src/core/hle/service/aoc/purchase_event_manager.cpp create mode 100644 src/core/hle/service/aoc/purchase_event_manager.h create mode 100644 src/core/hle/service/apm/apm.cpp create mode 100644 src/core/hle/service/apm/apm.h create mode 100644 src/core/hle/service/apm/apm_controller.cpp create mode 100644 src/core/hle/service/apm/apm_controller.h create mode 100644 src/core/hle/service/apm/apm_interface.cpp create mode 100644 src/core/hle/service/apm/apm_interface.h create mode 100644 src/core/hle/service/audio/audio.cpp create mode 100644 src/core/hle/service/audio/audio.h create mode 100644 src/core/hle/service/audio/audio_controller.cpp create mode 100644 src/core/hle/service/audio/audio_controller.h create mode 100644 src/core/hle/service/audio/audio_device.cpp create mode 100644 src/core/hle/service/audio/audio_device.h create mode 100644 src/core/hle/service/audio/audio_in.cpp create mode 100644 src/core/hle/service/audio/audio_in.h create mode 100644 src/core/hle/service/audio/audio_in_manager.cpp create mode 100644 src/core/hle/service/audio/audio_in_manager.h create mode 100644 src/core/hle/service/audio/audio_out.cpp create mode 100644 src/core/hle/service/audio/audio_out.h create mode 100644 src/core/hle/service/audio/audio_out_manager.cpp create mode 100644 src/core/hle/service/audio/audio_out_manager.h create mode 100644 src/core/hle/service/audio/audio_renderer.cpp create mode 100644 src/core/hle/service/audio/audio_renderer.h create mode 100644 src/core/hle/service/audio/audio_renderer_manager.cpp create mode 100644 src/core/hle/service/audio/audio_renderer_manager.h create mode 100644 src/core/hle/service/audio/errors.h create mode 100644 src/core/hle/service/audio/final_output_recorder_manager.cpp create mode 100644 src/core/hle/service/audio/final_output_recorder_manager.h create mode 100644 src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp create mode 100644 src/core/hle/service/audio/final_output_recorder_manager_for_applet.h create mode 100644 src/core/hle/service/audio/hardware_opus_decoder.cpp create mode 100644 src/core/hle/service/audio/hardware_opus_decoder.h create mode 100644 src/core/hle/service/audio/hardware_opus_decoder_manager.cpp create mode 100644 src/core/hle/service/audio/hardware_opus_decoder_manager.h create mode 100644 src/core/hle/service/bcat/backend/backend.cpp create mode 100644 src/core/hle/service/bcat/backend/backend.h create mode 100644 src/core/hle/service/bcat/bcat.cpp create mode 100644 src/core/hle/service/bcat/bcat.h create mode 100644 src/core/hle/service/bcat/bcat_result.h create mode 100644 src/core/hle/service/bcat/bcat_service.cpp create mode 100644 src/core/hle/service/bcat/bcat_service.h create mode 100644 src/core/hle/service/bcat/bcat_types.h create mode 100644 src/core/hle/service/bcat/bcat_util.h create mode 100644 src/core/hle/service/bcat/delivery_cache_directory_service.cpp create mode 100644 src/core/hle/service/bcat/delivery_cache_directory_service.h create mode 100644 src/core/hle/service/bcat/delivery_cache_file_service.cpp create mode 100644 src/core/hle/service/bcat/delivery_cache_file_service.h create mode 100644 src/core/hle/service/bcat/delivery_cache_progress_service.cpp create mode 100644 src/core/hle/service/bcat/delivery_cache_progress_service.h create mode 100644 src/core/hle/service/bcat/delivery_cache_storage_service.cpp create mode 100644 src/core/hle/service/bcat/delivery_cache_storage_service.h create mode 100644 src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp create mode 100644 src/core/hle/service/bcat/news/newly_arrived_event_holder.h create mode 100644 src/core/hle/service/bcat/news/news_data_service.cpp create mode 100644 src/core/hle/service/bcat/news/news_data_service.h create mode 100644 src/core/hle/service/bcat/news/news_database_service.cpp create mode 100644 src/core/hle/service/bcat/news/news_database_service.h create mode 100644 src/core/hle/service/bcat/news/news_service.cpp create mode 100644 src/core/hle/service/bcat/news/news_service.h create mode 100644 src/core/hle/service/bcat/news/overwrite_event_holder.cpp create mode 100644 src/core/hle/service/bcat/news/overwrite_event_holder.h create mode 100644 src/core/hle/service/bcat/news/service_creator.cpp create mode 100644 src/core/hle/service/bcat/news/service_creator.h create mode 100644 src/core/hle/service/bcat/service_creator.cpp create mode 100644 src/core/hle/service/bcat/service_creator.h create mode 100644 src/core/hle/service/bpc/bpc.cpp create mode 100644 src/core/hle/service/bpc/bpc.h create mode 100644 src/core/hle/service/btdrv/btdrv.cpp create mode 100644 src/core/hle/service/btdrv/btdrv.h create mode 100644 src/core/hle/service/btm/btm.cpp create mode 100644 src/core/hle/service/btm/btm.h create mode 100644 src/core/hle/service/btm/btm_debug.cpp create mode 100644 src/core/hle/service/btm/btm_debug.h create mode 100644 src/core/hle/service/btm/btm_system.cpp create mode 100644 src/core/hle/service/btm/btm_system.h create mode 100644 src/core/hle/service/btm/btm_system_core.cpp create mode 100644 src/core/hle/service/btm/btm_system_core.h create mode 100644 src/core/hle/service/btm/btm_user.cpp create mode 100644 src/core/hle/service/btm/btm_user.h create mode 100644 src/core/hle/service/btm/btm_user_core.cpp create mode 100644 src/core/hle/service/btm/btm_user_core.h create mode 100644 src/core/hle/service/caps/caps.cpp create mode 100644 src/core/hle/service/caps/caps.h create mode 100644 src/core/hle/service/caps/caps_a.cpp create mode 100644 src/core/hle/service/caps/caps_a.h create mode 100644 src/core/hle/service/caps/caps_c.cpp create mode 100644 src/core/hle/service/caps/caps_c.h create mode 100644 src/core/hle/service/caps/caps_manager.cpp create mode 100644 src/core/hle/service/caps/caps_manager.h create mode 100644 src/core/hle/service/caps/caps_result.h create mode 100644 src/core/hle/service/caps/caps_sc.cpp create mode 100644 src/core/hle/service/caps/caps_sc.h create mode 100644 src/core/hle/service/caps/caps_ss.cpp create mode 100644 src/core/hle/service/caps/caps_ss.h create mode 100644 src/core/hle/service/caps/caps_su.cpp create mode 100644 src/core/hle/service/caps/caps_su.h create mode 100644 src/core/hle/service/caps/caps_types.h create mode 100644 src/core/hle/service/caps/caps_u.cpp create mode 100644 src/core/hle/service/caps/caps_u.h create mode 100644 src/core/hle/service/cmif_serialization.h create mode 100644 src/core/hle/service/cmif_types.h create mode 100644 src/core/hle/service/erpt/erpt.cpp create mode 100644 src/core/hle/service/erpt/erpt.h create mode 100644 src/core/hle/service/es/es.cpp create mode 100644 src/core/hle/service/es/es.h create mode 100644 src/core/hle/service/eupld/eupld.cpp create mode 100644 src/core/hle/service/eupld/eupld.h create mode 100644 src/core/hle/service/fatal/fatal.cpp create mode 100644 src/core/hle/service/fatal/fatal.h create mode 100644 src/core/hle/service/fatal/fatal_p.cpp create mode 100644 src/core/hle/service/fatal/fatal_p.h create mode 100644 src/core/hle/service/fatal/fatal_u.cpp create mode 100644 src/core/hle/service/fatal/fatal_u.h create mode 100644 src/core/hle/service/fgm/fgm.cpp create mode 100644 src/core/hle/service/fgm/fgm.h create mode 100644 src/core/hle/service/filesystem/filesystem.cpp create mode 100644 src/core/hle/service/filesystem/filesystem.h create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_directory.cpp create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_directory.h create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_file.cpp create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_file.h create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_filesystem.h create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_storage.cpp create mode 100644 src/core/hle/service/filesystem/fsp/fs_i_storage.h create mode 100644 src/core/hle/service/filesystem/fsp/fsp_ldr.cpp create mode 100644 src/core/hle/service/filesystem/fsp/fsp_ldr.h create mode 100644 src/core/hle/service/filesystem/fsp/fsp_pr.cpp create mode 100644 src/core/hle/service/filesystem/fsp/fsp_pr.h create mode 100644 src/core/hle/service/filesystem/fsp/fsp_srv.cpp create mode 100644 src/core/hle/service/filesystem/fsp/fsp_srv.h create mode 100644 src/core/hle/service/filesystem/fsp/fsp_types.h create mode 100644 src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp create mode 100644 src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h create mode 100644 src/core/hle/service/filesystem/romfs_controller.cpp create mode 100644 src/core/hle/service/filesystem/romfs_controller.h create mode 100644 src/core/hle/service/filesystem/save_data_controller.cpp create mode 100644 src/core/hle/service/filesystem/save_data_controller.h create mode 100644 src/core/hle/service/friend/friend.cpp create mode 100644 src/core/hle/service/friend/friend.h create mode 100644 src/core/hle/service/friend/friend_interface.cpp create mode 100644 src/core/hle/service/friend/friend_interface.h create mode 100644 src/core/hle/service/glue/arp.cpp create mode 100644 src/core/hle/service/glue/arp.h create mode 100644 src/core/hle/service/glue/bgtc.cpp create mode 100644 src/core/hle/service/glue/bgtc.h create mode 100644 src/core/hle/service/glue/ectx.cpp create mode 100644 src/core/hle/service/glue/ectx.h create mode 100644 src/core/hle/service/glue/errors.h create mode 100644 src/core/hle/service/glue/glue.cpp create mode 100644 src/core/hle/service/glue/glue.h create mode 100644 src/core/hle/service/glue/glue_manager.cpp create mode 100644 src/core/hle/service/glue/glue_manager.h create mode 100644 src/core/hle/service/glue/notif.cpp create mode 100644 src/core/hle/service/glue/notif.h create mode 100644 src/core/hle/service/glue/time/alarm_worker.cpp create mode 100644 src/core/hle/service/glue/time/alarm_worker.h create mode 100644 src/core/hle/service/glue/time/file_timestamp_worker.cpp create mode 100644 src/core/hle/service/glue/time/file_timestamp_worker.h create mode 100644 src/core/hle/service/glue/time/manager.cpp create mode 100644 src/core/hle/service/glue/time/manager.h create mode 100644 src/core/hle/service/glue/time/pm_state_change_handler.cpp create mode 100644 src/core/hle/service/glue/time/pm_state_change_handler.h create mode 100644 src/core/hle/service/glue/time/standard_steady_clock_resource.cpp create mode 100644 src/core/hle/service/glue/time/standard_steady_clock_resource.h create mode 100644 src/core/hle/service/glue/time/static.cpp create mode 100644 src/core/hle/service/glue/time/static.h create mode 100644 src/core/hle/service/glue/time/time_zone.cpp create mode 100644 src/core/hle/service/glue/time/time_zone.h create mode 100644 src/core/hle/service/glue/time/time_zone_binary.cpp create mode 100644 src/core/hle/service/glue/time/time_zone_binary.h create mode 100644 src/core/hle/service/glue/time/worker.cpp create mode 100644 src/core/hle/service/glue/time/worker.h create mode 100644 src/core/hle/service/grc/grc.cpp create mode 100644 src/core/hle/service/grc/grc.h create mode 100644 src/core/hle/service/hid/active_vibration_device_list.cpp create mode 100644 src/core/hle/service/hid/active_vibration_device_list.h create mode 100644 src/core/hle/service/hid/applet_resource.cpp create mode 100644 src/core/hle/service/hid/applet_resource.h create mode 100644 src/core/hle/service/hid/hid.cpp create mode 100644 src/core/hle/service/hid/hid.h create mode 100644 src/core/hle/service/hid/hid_debug_server.cpp create mode 100644 src/core/hle/service/hid/hid_debug_server.h create mode 100644 src/core/hle/service/hid/hid_server.cpp create mode 100644 src/core/hle/service/hid/hid_server.h create mode 100644 src/core/hle/service/hid/hid_system_server.cpp create mode 100644 src/core/hle/service/hid/hid_system_server.h create mode 100644 src/core/hle/service/hid/hidbus.cpp create mode 100644 src/core/hle/service/hid/hidbus.h create mode 100644 src/core/hle/service/hid/irs.cpp create mode 100644 src/core/hle/service/hid/irs.h create mode 100644 src/core/hle/service/hid/xcd.cpp create mode 100644 src/core/hle/service/hid/xcd.h create mode 100644 src/core/hle/service/hle_ipc.cpp create mode 100644 src/core/hle/service/hle_ipc.h create mode 100644 src/core/hle/service/ipc_helpers.h create mode 100644 src/core/hle/service/jit/jit.cpp create mode 100644 src/core/hle/service/jit/jit.h create mode 100644 src/core/hle/service/jit/jit_code_memory.cpp create mode 100644 src/core/hle/service/jit/jit_code_memory.h create mode 100644 src/core/hle/service/jit/jit_context.cpp create mode 100644 src/core/hle/service/jit/jit_context.h create mode 100644 src/core/hle/service/kernel_helpers.cpp create mode 100644 src/core/hle/service/kernel_helpers.h create mode 100644 src/core/hle/service/lbl/lbl.cpp create mode 100644 src/core/hle/service/lbl/lbl.h create mode 100644 src/core/hle/service/ldn/lan_discovery.cpp create mode 100644 src/core/hle/service/ldn/lan_discovery.h create mode 100644 src/core/hle/service/ldn/ldn.cpp create mode 100644 src/core/hle/service/ldn/ldn.h create mode 100644 src/core/hle/service/ldn/ldn_results.h create mode 100644 src/core/hle/service/ldn/ldn_types.h create mode 100644 src/core/hle/service/ldn/monitor_service.cpp create mode 100644 src/core/hle/service/ldn/monitor_service.h create mode 100644 src/core/hle/service/ldn/sf_monitor_service.cpp create mode 100644 src/core/hle/service/ldn/sf_monitor_service.h create mode 100644 src/core/hle/service/ldn/sf_service.cpp create mode 100644 src/core/hle/service/ldn/sf_service.h create mode 100644 src/core/hle/service/ldn/sf_service_monitor.cpp create mode 100644 src/core/hle/service/ldn/sf_service_monitor.h create mode 100644 src/core/hle/service/ldn/system_local_communication_service.cpp create mode 100644 src/core/hle/service/ldn/system_local_communication_service.h create mode 100644 src/core/hle/service/ldn/user_local_communication_service.cpp create mode 100644 src/core/hle/service/ldn/user_local_communication_service.h create mode 100644 src/core/hle/service/ldr/ldr.cpp create mode 100644 src/core/hle/service/ldr/ldr.h create mode 100644 src/core/hle/service/lm/lm.cpp create mode 100644 src/core/hle/service/lm/lm.h create mode 100644 src/core/hle/service/mig/mig.cpp create mode 100644 src/core/hle/service/mig/mig.h create mode 100644 src/core/hle/service/mii/mii.cpp create mode 100644 src/core/hle/service/mii/mii.h create mode 100644 src/core/hle/service/mii/mii_database.cpp create mode 100644 src/core/hle/service/mii/mii_database.h create mode 100644 src/core/hle/service/mii/mii_database_manager.cpp create mode 100644 src/core/hle/service/mii/mii_database_manager.h create mode 100644 src/core/hle/service/mii/mii_manager.cpp create mode 100644 src/core/hle/service/mii/mii_manager.h create mode 100644 src/core/hle/service/mii/mii_result.h create mode 100644 src/core/hle/service/mii/mii_types.h create mode 100644 src/core/hle/service/mii/mii_util.h create mode 100644 src/core/hle/service/mii/types/char_info.cpp create mode 100644 src/core/hle/service/mii/types/char_info.h create mode 100644 src/core/hle/service/mii/types/core_data.cpp create mode 100644 src/core/hle/service/mii/types/core_data.h create mode 100644 src/core/hle/service/mii/types/raw_data.cpp create mode 100644 src/core/hle/service/mii/types/raw_data.h create mode 100644 src/core/hle/service/mii/types/store_data.cpp create mode 100644 src/core/hle/service/mii/types/store_data.h create mode 100644 src/core/hle/service/mii/types/ver3_store_data.cpp create mode 100644 src/core/hle/service/mii/types/ver3_store_data.h create mode 100644 src/core/hle/service/mm/mm_u.cpp create mode 100644 src/core/hle/service/mm/mm_u.h create mode 100644 src/core/hle/service/mnpp/mnpp_app.cpp create mode 100644 src/core/hle/service/mnpp/mnpp_app.h create mode 100644 src/core/hle/service/ncm/ncm.cpp create mode 100644 src/core/hle/service/ncm/ncm.h create mode 100644 src/core/hle/service/nfc/common/amiibo_crypto.cpp create mode 100644 src/core/hle/service/nfc/common/amiibo_crypto.h create mode 100644 src/core/hle/service/nfc/common/device.cpp create mode 100644 src/core/hle/service/nfc/common/device.h create mode 100644 src/core/hle/service/nfc/common/device_manager.cpp create mode 100644 src/core/hle/service/nfc/common/device_manager.h create mode 100644 src/core/hle/service/nfc/mifare_result.h create mode 100644 src/core/hle/service/nfc/mifare_types.h create mode 100644 src/core/hle/service/nfc/nfc.cpp create mode 100644 src/core/hle/service/nfc/nfc.h create mode 100644 src/core/hle/service/nfc/nfc_interface.cpp create mode 100644 src/core/hle/service/nfc/nfc_interface.h create mode 100644 src/core/hle/service/nfc/nfc_result.h create mode 100644 src/core/hle/service/nfc/nfc_types.h create mode 100644 src/core/hle/service/nfp/nfp.cpp create mode 100644 src/core/hle/service/nfp/nfp.h create mode 100644 src/core/hle/service/nfp/nfp_interface.cpp create mode 100644 src/core/hle/service/nfp/nfp_interface.h create mode 100644 src/core/hle/service/nfp/nfp_result.h create mode 100644 src/core/hle/service/nfp/nfp_types.h create mode 100644 src/core/hle/service/ngc/ngc.cpp create mode 100644 src/core/hle/service/ngc/ngc.h create mode 100644 src/core/hle/service/nifm/nifm.cpp create mode 100644 src/core/hle/service/nifm/nifm.h create mode 100644 src/core/hle/service/nim/nim.cpp create mode 100644 src/core/hle/service/nim/nim.h create mode 100644 src/core/hle/service/npns/npns.cpp create mode 100644 src/core/hle/service/npns/npns.h create mode 100644 src/core/hle/service/ns/account_proxy_interface.cpp create mode 100644 src/core/hle/service/ns/account_proxy_interface.h create mode 100644 src/core/hle/service/ns/application_manager_interface.cpp create mode 100644 src/core/hle/service/ns/application_manager_interface.h create mode 100644 src/core/hle/service/ns/application_version_interface.cpp create mode 100644 src/core/hle/service/ns/application_version_interface.h create mode 100644 src/core/hle/service/ns/content_management_interface.cpp create mode 100644 src/core/hle/service/ns/content_management_interface.h create mode 100644 src/core/hle/service/ns/develop_interface.cpp create mode 100644 src/core/hle/service/ns/develop_interface.h create mode 100644 src/core/hle/service/ns/document_interface.cpp create mode 100644 src/core/hle/service/ns/document_interface.h create mode 100644 src/core/hle/service/ns/download_task_interface.cpp create mode 100644 src/core/hle/service/ns/download_task_interface.h create mode 100644 src/core/hle/service/ns/dynamic_rights_interface.cpp create mode 100644 src/core/hle/service/ns/dynamic_rights_interface.h create mode 100644 src/core/hle/service/ns/ecommerce_interface.cpp create mode 100644 src/core/hle/service/ns/ecommerce_interface.h create mode 100644 src/core/hle/service/ns/factory_reset_interface.cpp create mode 100644 src/core/hle/service/ns/factory_reset_interface.h create mode 100644 src/core/hle/service/ns/language.cpp create mode 100644 src/core/hle/service/ns/language.h create mode 100644 src/core/hle/service/ns/ns.cpp create mode 100644 src/core/hle/service/ns/ns.h create mode 100644 src/core/hle/service/ns/ns_results.h create mode 100644 src/core/hle/service/ns/ns_types.h create mode 100644 src/core/hle/service/ns/platform_service_manager.cpp create mode 100644 src/core/hle/service/ns/platform_service_manager.h create mode 100644 src/core/hle/service/ns/query_service.cpp create mode 100644 src/core/hle/service/ns/query_service.h create mode 100644 src/core/hle/service/ns/read_only_application_control_data_interface.cpp create mode 100644 src/core/hle/service/ns/read_only_application_control_data_interface.h create mode 100644 src/core/hle/service/ns/read_only_application_record_interface.cpp create mode 100644 src/core/hle/service/ns/read_only_application_record_interface.h create mode 100644 src/core/hle/service/ns/service_getter_interface.cpp create mode 100644 src/core/hle/service/ns/service_getter_interface.h create mode 100644 src/core/hle/service/ns/system_update_control.cpp create mode 100644 src/core/hle/service/ns/system_update_control.h create mode 100644 src/core/hle/service/ns/system_update_interface.cpp create mode 100644 src/core/hle/service/ns/system_update_interface.h create mode 100644 src/core/hle/service/ns/vulnerability_manager_interface.cpp create mode 100644 src/core/hle/service/ns/vulnerability_manager_interface.h create mode 100644 src/core/hle/service/nvdrv/core/container.cpp create mode 100644 src/core/hle/service/nvdrv/core/container.h create mode 100644 src/core/hle/service/nvdrv/core/heap_mapper.cpp create mode 100644 src/core/hle/service/nvdrv/core/heap_mapper.h create mode 100644 src/core/hle/service/nvdrv/core/nvmap.cpp create mode 100644 src/core/hle/service/nvdrv/core/nvmap.h create mode 100644 src/core/hle/service/nvdrv/core/syncpoint_manager.cpp create mode 100644 src/core/hle/service/nvdrv/core/syncpoint_manager.h create mode 100644 src/core/hle/service/nvdrv/devices/ioctl_serialization.h create mode 100644 src/core/hle/service/nvdrv/devices/nvdevice.h create mode 100644 src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvdisp_disp0.h create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_ctrl.h create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_gpu.h create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_nvdec.h create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_vic.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvhost_vic.h create mode 100644 src/core/hle/service/nvdrv/devices/nvmap.cpp create mode 100644 src/core/hle/service/nvdrv/devices/nvmap.h create mode 100644 src/core/hle/service/nvdrv/nvdata.h create mode 100644 src/core/hle/service/nvdrv/nvdrv.cpp create mode 100644 src/core/hle/service/nvdrv/nvdrv.h create mode 100644 src/core/hle/service/nvdrv/nvdrv_interface.cpp create mode 100644 src/core/hle/service/nvdrv/nvdrv_interface.h create mode 100644 src/core/hle/service/nvdrv/nvmemp.cpp create mode 100644 src/core/hle/service/nvdrv/nvmemp.h create mode 100644 src/core/hle/service/nvnflinger/binder.h create mode 100644 src/core/hle/service/nvnflinger/buffer_item.h create mode 100644 src/core/hle/service/nvnflinger/buffer_item_consumer.cpp create mode 100644 src/core/hle/service/nvnflinger/buffer_item_consumer.h create mode 100644 src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp create mode 100644 src/core/hle/service/nvnflinger/buffer_queue_consumer.h create mode 100644 src/core/hle/service/nvnflinger/buffer_queue_core.cpp create mode 100644 src/core/hle/service/nvnflinger/buffer_queue_core.h create mode 100644 src/core/hle/service/nvnflinger/buffer_queue_defs.h create mode 100644 src/core/hle/service/nvnflinger/buffer_queue_producer.cpp create mode 100644 src/core/hle/service/nvnflinger/buffer_queue_producer.h create mode 100644 src/core/hle/service/nvnflinger/buffer_slot.h create mode 100644 src/core/hle/service/nvnflinger/buffer_transform_flags.h create mode 100644 src/core/hle/service/nvnflinger/consumer_base.cpp create mode 100644 src/core/hle/service/nvnflinger/consumer_base.h create mode 100644 src/core/hle/service/nvnflinger/consumer_listener.h create mode 100644 src/core/hle/service/nvnflinger/display.h create mode 100644 src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp create mode 100644 src/core/hle/service/nvnflinger/graphic_buffer_producer.h create mode 100644 src/core/hle/service/nvnflinger/hardware_composer.cpp create mode 100644 src/core/hle/service/nvnflinger/hardware_composer.h create mode 100644 src/core/hle/service/nvnflinger/hos_binder_driver.cpp create mode 100644 src/core/hle/service/nvnflinger/hos_binder_driver.h create mode 100644 src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp create mode 100644 src/core/hle/service/nvnflinger/hos_binder_driver_server.h create mode 100644 src/core/hle/service/nvnflinger/hwc_layer.h create mode 100644 src/core/hle/service/nvnflinger/nvnflinger.cpp create mode 100644 src/core/hle/service/nvnflinger/nvnflinger.h create mode 100644 src/core/hle/service/nvnflinger/parcel.h create mode 100644 src/core/hle/service/nvnflinger/pixel_format.h create mode 100644 src/core/hle/service/nvnflinger/producer_listener.h create mode 100644 src/core/hle/service/nvnflinger/status.h create mode 100644 src/core/hle/service/nvnflinger/surface_flinger.cpp create mode 100644 src/core/hle/service/nvnflinger/surface_flinger.h create mode 100644 src/core/hle/service/nvnflinger/ui/fence.h create mode 100644 src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp create mode 100644 src/core/hle/service/nvnflinger/ui/graphic_buffer.h create mode 100644 src/core/hle/service/nvnflinger/window.h create mode 100644 src/core/hle/service/olsc/daemon_controller.cpp create mode 100644 src/core/hle/service/olsc/daemon_controller.h create mode 100644 src/core/hle/service/olsc/native_handle_holder.cpp create mode 100644 src/core/hle/service/olsc/native_handle_holder.h create mode 100644 src/core/hle/service/olsc/olsc.cpp create mode 100644 src/core/hle/service/olsc/olsc.h create mode 100644 src/core/hle/service/olsc/olsc_service_for_application.cpp create mode 100644 src/core/hle/service/olsc/olsc_service_for_application.h create mode 100644 src/core/hle/service/olsc/olsc_service_for_system_service.cpp create mode 100644 src/core/hle/service/olsc/olsc_service_for_system_service.h create mode 100644 src/core/hle/service/olsc/remote_storage_controller.cpp create mode 100644 src/core/hle/service/olsc/remote_storage_controller.h create mode 100644 src/core/hle/service/olsc/transfer_task_list_controller.cpp create mode 100644 src/core/hle/service/olsc/transfer_task_list_controller.h create mode 100644 src/core/hle/service/omm/omm.cpp create mode 100644 src/core/hle/service/omm/omm.h create mode 100644 src/core/hle/service/omm/operation_mode_manager.cpp create mode 100644 src/core/hle/service/omm/operation_mode_manager.h create mode 100644 src/core/hle/service/omm/policy_manager_system.cpp create mode 100644 src/core/hle/service/omm/policy_manager_system.h create mode 100644 src/core/hle/service/omm/power_state_interface.cpp create mode 100644 src/core/hle/service/omm/power_state_interface.h create mode 100644 src/core/hle/service/os/event.cpp create mode 100644 src/core/hle/service/os/event.h create mode 100644 src/core/hle/service/os/multi_wait.cpp create mode 100644 src/core/hle/service/os/multi_wait.h create mode 100644 src/core/hle/service/os/multi_wait_holder.cpp create mode 100644 src/core/hle/service/os/multi_wait_holder.h create mode 100644 src/core/hle/service/os/multi_wait_utils.h create mode 100644 src/core/hle/service/os/mutex.cpp create mode 100644 src/core/hle/service/os/mutex.h create mode 100644 src/core/hle/service/pcie/pcie.cpp create mode 100644 src/core/hle/service/pcie/pcie.h create mode 100644 src/core/hle/service/pctl/parental_control_service.cpp create mode 100644 src/core/hle/service/pctl/parental_control_service.h create mode 100644 src/core/hle/service/pctl/parental_control_service_factory.cpp create mode 100644 src/core/hle/service/pctl/parental_control_service_factory.h create mode 100644 src/core/hle/service/pctl/pctl.cpp create mode 100644 src/core/hle/service/pctl/pctl.h create mode 100644 src/core/hle/service/pctl/pctl_results.h create mode 100644 src/core/hle/service/pctl/pctl_types.h create mode 100644 src/core/hle/service/pcv/pcv.cpp create mode 100644 src/core/hle/service/pcv/pcv.h create mode 100644 src/core/hle/service/pm/pm.cpp create mode 100644 src/core/hle/service/pm/pm.h create mode 100644 src/core/hle/service/prepo/prepo.cpp create mode 100644 src/core/hle/service/prepo/prepo.h create mode 100644 src/core/hle/service/psc/ovln/ovln_types.h create mode 100644 src/core/hle/service/psc/ovln/receiver.cpp create mode 100644 src/core/hle/service/psc/ovln/receiver.h create mode 100644 src/core/hle/service/psc/ovln/receiver_service.cpp create mode 100644 src/core/hle/service/psc/ovln/receiver_service.h create mode 100644 src/core/hle/service/psc/ovln/sender.cpp create mode 100644 src/core/hle/service/psc/ovln/sender.h create mode 100644 src/core/hle/service/psc/ovln/sender_service.cpp create mode 100644 src/core/hle/service/psc/ovln/sender_service.h create mode 100644 src/core/hle/service/psc/pm_control.cpp create mode 100644 src/core/hle/service/psc/pm_control.h create mode 100644 src/core/hle/service/psc/pm_module.cpp create mode 100644 src/core/hle/service/psc/pm_module.h create mode 100644 src/core/hle/service/psc/pm_service.cpp create mode 100644 src/core/hle/service/psc/pm_service.h create mode 100644 src/core/hle/service/psc/psc.cpp create mode 100644 src/core/hle/service/psc/psc.h create mode 100644 src/core/hle/service/psc/time/alarms.cpp create mode 100644 src/core/hle/service/psc/time/alarms.h create mode 100644 src/core/hle/service/psc/time/clocks/context_writers.cpp create mode 100644 src/core/hle/service/psc/time/clocks/context_writers.h create mode 100644 src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h create mode 100644 src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp create mode 100644 src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h create mode 100644 src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp create mode 100644 src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h create mode 100644 src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp create mode 100644 src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h create mode 100644 src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.cpp create mode 100644 src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h create mode 100644 src/core/hle/service/psc/time/clocks/steady_clock_core.h create mode 100644 src/core/hle/service/psc/time/clocks/system_clock_core.cpp create mode 100644 src/core/hle/service/psc/time/clocks/system_clock_core.h create mode 100644 src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp create mode 100644 src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h create mode 100644 src/core/hle/service/psc/time/common.cpp create mode 100644 src/core/hle/service/psc/time/common.h create mode 100644 src/core/hle/service/psc/time/errors.h create mode 100644 src/core/hle/service/psc/time/manager.h create mode 100644 src/core/hle/service/psc/time/power_state_request_manager.cpp create mode 100644 src/core/hle/service/psc/time/power_state_request_manager.h create mode 100644 src/core/hle/service/psc/time/power_state_service.cpp create mode 100644 src/core/hle/service/psc/time/power_state_service.h create mode 100644 src/core/hle/service/psc/time/service_manager.cpp create mode 100644 src/core/hle/service/psc/time/service_manager.h create mode 100644 src/core/hle/service/psc/time/shared_memory.cpp create mode 100644 src/core/hle/service/psc/time/shared_memory.h create mode 100644 src/core/hle/service/psc/time/static.cpp create mode 100644 src/core/hle/service/psc/time/static.h create mode 100644 src/core/hle/service/psc/time/steady_clock.cpp create mode 100644 src/core/hle/service/psc/time/steady_clock.h create mode 100644 src/core/hle/service/psc/time/system_clock.cpp create mode 100644 src/core/hle/service/psc/time/system_clock.h create mode 100644 src/core/hle/service/psc/time/time_zone.cpp create mode 100644 src/core/hle/service/psc/time/time_zone.h create mode 100644 src/core/hle/service/psc/time/time_zone_service.cpp create mode 100644 src/core/hle/service/psc/time/time_zone_service.h create mode 100644 src/core/hle/service/ptm/psm.cpp create mode 100644 src/core/hle/service/ptm/psm.h create mode 100644 src/core/hle/service/ptm/ptm.cpp create mode 100644 src/core/hle/service/ptm/ptm.h create mode 100644 src/core/hle/service/ptm/ts.cpp create mode 100644 src/core/hle/service/ptm/ts.h create mode 100644 src/core/hle/service/ro/ro.cpp create mode 100644 src/core/hle/service/ro/ro.h create mode 100644 src/core/hle/service/ro/ro_nro_utils.cpp create mode 100644 src/core/hle/service/ro/ro_nro_utils.h create mode 100644 src/core/hle/service/ro/ro_results.h create mode 100644 src/core/hle/service/ro/ro_types.h create mode 100644 src/core/hle/service/server_manager.cpp create mode 100644 src/core/hle/service/server_manager.h create mode 100644 src/core/hle/service/service.cpp create mode 100644 src/core/hle/service/service.h create mode 100644 src/core/hle/service/services.cpp create mode 100644 src/core/hle/service/services.h create mode 100644 src/core/hle/service/set/factory_settings_server.cpp create mode 100644 src/core/hle/service/set/factory_settings_server.h create mode 100644 src/core/hle/service/set/firmware_debug_settings_server.cpp create mode 100644 src/core/hle/service/set/firmware_debug_settings_server.h create mode 100644 src/core/hle/service/set/key_code_map.h create mode 100644 src/core/hle/service/set/setting_formats/appln_settings.cpp create mode 100644 src/core/hle/service/set/setting_formats/appln_settings.h create mode 100644 src/core/hle/service/set/setting_formats/device_settings.cpp create mode 100644 src/core/hle/service/set/setting_formats/device_settings.h create mode 100644 src/core/hle/service/set/setting_formats/private_settings.cpp create mode 100644 src/core/hle/service/set/setting_formats/private_settings.h create mode 100644 src/core/hle/service/set/setting_formats/system_settings.cpp create mode 100644 src/core/hle/service/set/setting_formats/system_settings.h create mode 100644 src/core/hle/service/set/settings.cpp create mode 100644 src/core/hle/service/set/settings.h create mode 100644 src/core/hle/service/set/settings_server.cpp create mode 100644 src/core/hle/service/set/settings_server.h create mode 100644 src/core/hle/service/set/settings_types.h create mode 100644 src/core/hle/service/set/system_settings_server.cpp create mode 100644 src/core/hle/service/set/system_settings_server.h create mode 100644 src/core/hle/service/sm/sm.cpp create mode 100644 src/core/hle/service/sm/sm.h create mode 100644 src/core/hle/service/sm/sm_controller.cpp create mode 100644 src/core/hle/service/sm/sm_controller.h create mode 100644 src/core/hle/service/sockets/bsd.cpp create mode 100644 src/core/hle/service/sockets/bsd.h create mode 100644 src/core/hle/service/sockets/nsd.cpp create mode 100644 src/core/hle/service/sockets/nsd.h create mode 100644 src/core/hle/service/sockets/sfdnsres.cpp create mode 100644 src/core/hle/service/sockets/sfdnsres.h create mode 100644 src/core/hle/service/sockets/sockets.cpp create mode 100644 src/core/hle/service/sockets/sockets.h create mode 100644 src/core/hle/service/sockets/sockets_translate.cpp create mode 100644 src/core/hle/service/sockets/sockets_translate.h create mode 100644 src/core/hle/service/spl/csrng.cpp create mode 100644 src/core/hle/service/spl/csrng.h create mode 100644 src/core/hle/service/spl/spl.cpp create mode 100644 src/core/hle/service/spl/spl.h create mode 100644 src/core/hle/service/spl/spl_module.cpp create mode 100644 src/core/hle/service/spl/spl_module.h create mode 100644 src/core/hle/service/spl/spl_results.h create mode 100644 src/core/hle/service/spl/spl_types.h create mode 100644 src/core/hle/service/ssl/cert_store.cpp create mode 100644 src/core/hle/service/ssl/cert_store.h create mode 100644 src/core/hle/service/ssl/ssl.cpp create mode 100644 src/core/hle/service/ssl/ssl.h create mode 100644 src/core/hle/service/ssl/ssl_backend.h create mode 100644 src/core/hle/service/ssl/ssl_backend_none.cpp create mode 100644 src/core/hle/service/ssl/ssl_backend_openssl.cpp create mode 100644 src/core/hle/service/ssl/ssl_backend_schannel.cpp create mode 100644 src/core/hle/service/ssl/ssl_backend_securetransport.cpp create mode 100644 src/core/hle/service/ssl/ssl_types.h create mode 100644 src/core/hle/service/usb/usb.cpp create mode 100644 src/core/hle/service/usb/usb.h create mode 100644 src/core/hle/service/vi/application_display_service.cpp create mode 100644 src/core/hle/service/vi/application_display_service.h create mode 100644 src/core/hle/service/vi/application_root_service.cpp create mode 100644 src/core/hle/service/vi/application_root_service.h create mode 100644 src/core/hle/service/vi/conductor.cpp create mode 100644 src/core/hle/service/vi/conductor.h create mode 100644 src/core/hle/service/vi/container.cpp create mode 100644 src/core/hle/service/vi/container.h create mode 100644 src/core/hle/service/vi/display.h create mode 100644 src/core/hle/service/vi/display_list.h create mode 100644 src/core/hle/service/vi/layer.h create mode 100644 src/core/hle/service/vi/layer_list.h create mode 100644 src/core/hle/service/vi/manager_display_service.cpp create mode 100644 src/core/hle/service/vi/manager_display_service.h create mode 100644 src/core/hle/service/vi/manager_root_service.cpp create mode 100644 src/core/hle/service/vi/manager_root_service.h create mode 100644 src/core/hle/service/vi/service_creator.cpp create mode 100644 src/core/hle/service/vi/service_creator.h create mode 100644 src/core/hle/service/vi/shared_buffer_manager.cpp create mode 100644 src/core/hle/service/vi/shared_buffer_manager.h create mode 100644 src/core/hle/service/vi/system_display_service.cpp create mode 100644 src/core/hle/service/vi/system_display_service.h create mode 100644 src/core/hle/service/vi/system_root_service.cpp create mode 100644 src/core/hle/service/vi/system_root_service.h create mode 100644 src/core/hle/service/vi/vi.cpp create mode 100644 src/core/hle/service/vi/vi.h create mode 100644 src/core/hle/service/vi/vi_results.h create mode 100644 src/core/hle/service/vi/vi_types.h create mode 100644 src/core/hle/service/vi/vsync_manager.cpp create mode 100644 src/core/hle/service/vi/vsync_manager.h create mode 100644 src/core/internal_network/network.cpp create mode 100644 src/core/internal_network/network.h create mode 100644 src/core/internal_network/network_interface.cpp create mode 100644 src/core/internal_network/network_interface.h create mode 100644 src/core/internal_network/socket_proxy.cpp create mode 100644 src/core/internal_network/socket_proxy.h create mode 100644 src/core/internal_network/sockets.h create mode 100644 src/core/loader/deconstructed_rom_directory.cpp create mode 100644 src/core/loader/deconstructed_rom_directory.h create mode 100644 src/core/loader/kip.cpp create mode 100644 src/core/loader/kip.h create mode 100644 src/core/loader/loader.cpp create mode 100644 src/core/loader/loader.h create mode 100644 src/core/loader/nax.cpp create mode 100644 src/core/loader/nax.h create mode 100644 src/core/loader/nca.cpp create mode 100644 src/core/loader/nca.h create mode 100644 src/core/loader/nro.cpp create mode 100644 src/core/loader/nro.h create mode 100644 src/core/loader/nso.cpp create mode 100644 src/core/loader/nso.h create mode 100644 src/core/loader/nsp.cpp create mode 100644 src/core/loader/nsp.h create mode 100644 src/core/loader/xci.cpp create mode 100644 src/core/loader/xci.h create mode 100644 src/core/memory.cpp create mode 100644 src/core/memory.h create mode 100644 src/core/memory/cheat_engine.cpp create mode 100644 src/core/memory/cheat_engine.h create mode 100644 src/core/memory/dmnt_cheat_types.h create mode 100644 src/core/memory/dmnt_cheat_vm.cpp create mode 100644 src/core/memory/dmnt_cheat_vm.h create mode 100644 src/core/perf_stats.cpp create mode 100644 src/core/perf_stats.h create mode 100644 src/core/precompiled_headers.h create mode 100644 src/core/reporter.cpp create mode 100644 src/core/reporter.h create mode 100644 src/core/telemetry_session.cpp create mode 100644 src/core/telemetry_session.h create mode 100644 src/core/tools/freezer.cpp create mode 100644 src/core/tools/freezer.h create mode 100644 src/core/tools/renderdoc.cpp create mode 100644 src/core/tools/renderdoc.h create mode 100644 src/dedicated_room/CMakeLists.txt create mode 100644 src/dedicated_room/precompiled_headers.h create mode 100644 src/dedicated_room/yuzu_room.cpp create mode 100644 src/dedicated_room/yuzu_room.rc create mode 100644 src/frontend_common/CMakeLists.txt create mode 100644 src/frontend_common/config.cpp create mode 100644 src/frontend_common/config.h create mode 100644 src/frontend_common/content_manager.h create mode 100644 src/hid_core/CMakeLists.txt create mode 100644 src/hid_core/frontend/emulated_console.cpp create mode 100644 src/hid_core/frontend/emulated_console.h create mode 100644 src/hid_core/frontend/emulated_controller.cpp create mode 100644 src/hid_core/frontend/emulated_controller.h create mode 100644 src/hid_core/frontend/emulated_devices.cpp create mode 100644 src/hid_core/frontend/emulated_devices.h create mode 100644 src/hid_core/frontend/input_converter.cpp create mode 100644 src/hid_core/frontend/input_converter.h create mode 100644 src/hid_core/frontend/input_interpreter.cpp create mode 100644 src/hid_core/frontend/input_interpreter.h create mode 100644 src/hid_core/frontend/motion_input.cpp create mode 100644 src/hid_core/frontend/motion_input.h create mode 100644 src/hid_core/hid_core.cpp create mode 100644 src/hid_core/hid_core.h create mode 100644 src/hid_core/hid_result.h create mode 100644 src/hid_core/hid_types.h create mode 100644 src/hid_core/hid_util.h create mode 100644 src/hid_core/hidbus/hidbus_base.cpp create mode 100644 src/hid_core/hidbus/hidbus_base.h create mode 100644 src/hid_core/hidbus/ringcon.cpp create mode 100644 src/hid_core/hidbus/ringcon.h create mode 100644 src/hid_core/hidbus/starlink.cpp create mode 100644 src/hid_core/hidbus/starlink.h create mode 100644 src/hid_core/hidbus/stubbed.cpp create mode 100644 src/hid_core/hidbus/stubbed.h create mode 100644 src/hid_core/irsensor/clustering_processor.cpp create mode 100644 src/hid_core/irsensor/clustering_processor.h create mode 100644 src/hid_core/irsensor/image_transfer_processor.cpp create mode 100644 src/hid_core/irsensor/image_transfer_processor.h create mode 100644 src/hid_core/irsensor/ir_led_processor.cpp create mode 100644 src/hid_core/irsensor/ir_led_processor.h create mode 100644 src/hid_core/irsensor/irs_types.h create mode 100644 src/hid_core/irsensor/moment_processor.cpp create mode 100644 src/hid_core/irsensor/moment_processor.h create mode 100644 src/hid_core/irsensor/pointing_processor.cpp create mode 100644 src/hid_core/irsensor/pointing_processor.h create mode 100644 src/hid_core/irsensor/processor_base.cpp create mode 100644 src/hid_core/irsensor/processor_base.h create mode 100644 src/hid_core/irsensor/tera_plugin_processor.cpp create mode 100644 src/hid_core/irsensor/tera_plugin_processor.h create mode 100644 src/hid_core/precompiled_headers.h create mode 100644 src/hid_core/resource_manager.cpp create mode 100644 src/hid_core/resource_manager.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_battery_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_battery_handler.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_button_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_button_handler.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_led_handler.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_mcu_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_mcu_handler.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_nfc_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_nfc_handler.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_pad.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_pad.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_pad_holder.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_pad_holder.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_palma_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_palma_handler.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_properties_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_properties_handler.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_sixaxis_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_sixaxis_handler.h create mode 100644 src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp create mode 100644 src/hid_core/resources/abstracted_pad/abstract_vibration_handler.h create mode 100644 src/hid_core/resources/applet_resource.cpp create mode 100644 src/hid_core/resources/applet_resource.h create mode 100644 src/hid_core/resources/controller_base.cpp create mode 100644 src/hid_core/resources/controller_base.h create mode 100644 src/hid_core/resources/debug_pad/debug_pad.cpp create mode 100644 src/hid_core/resources/debug_pad/debug_pad.h create mode 100644 src/hid_core/resources/debug_pad/debug_pad_types.h create mode 100644 src/hid_core/resources/digitizer/digitizer.cpp create mode 100644 src/hid_core/resources/digitizer/digitizer.h create mode 100644 src/hid_core/resources/hid_firmware_settings.cpp create mode 100644 src/hid_core/resources/hid_firmware_settings.h create mode 100644 src/hid_core/resources/irs_ring_lifo.h create mode 100644 src/hid_core/resources/keyboard/keyboard.cpp create mode 100644 src/hid_core/resources/keyboard/keyboard.h create mode 100644 src/hid_core/resources/keyboard/keyboard_types.h create mode 100644 src/hid_core/resources/mouse/debug_mouse.cpp create mode 100644 src/hid_core/resources/mouse/debug_mouse.h create mode 100644 src/hid_core/resources/mouse/mouse.cpp create mode 100644 src/hid_core/resources/mouse/mouse.h create mode 100644 src/hid_core/resources/mouse/mouse_types.h create mode 100644 src/hid_core/resources/npad/npad.cpp create mode 100644 src/hid_core/resources/npad/npad.h create mode 100644 src/hid_core/resources/npad/npad_data.cpp create mode 100644 src/hid_core/resources/npad/npad_data.h create mode 100644 src/hid_core/resources/npad/npad_resource.cpp create mode 100644 src/hid_core/resources/npad/npad_resource.h create mode 100644 src/hid_core/resources/npad/npad_types.h create mode 100644 src/hid_core/resources/npad/npad_vibration.cpp create mode 100644 src/hid_core/resources/npad/npad_vibration.h create mode 100644 src/hid_core/resources/palma/palma.cpp create mode 100644 src/hid_core/resources/palma/palma.h create mode 100644 src/hid_core/resources/ring_lifo.h create mode 100644 src/hid_core/resources/shared_memory_format.h create mode 100644 src/hid_core/resources/shared_memory_holder.cpp create mode 100644 src/hid_core/resources/shared_memory_holder.h create mode 100644 src/hid_core/resources/six_axis/console_six_axis.cpp create mode 100644 src/hid_core/resources/six_axis/console_six_axis.h create mode 100644 src/hid_core/resources/six_axis/seven_six_axis.cpp create mode 100644 src/hid_core/resources/six_axis/seven_six_axis.h create mode 100644 src/hid_core/resources/six_axis/six_axis.cpp create mode 100644 src/hid_core/resources/six_axis/six_axis.h create mode 100644 src/hid_core/resources/system_buttons/capture_button.cpp create mode 100644 src/hid_core/resources/system_buttons/capture_button.h create mode 100644 src/hid_core/resources/system_buttons/home_button.cpp create mode 100644 src/hid_core/resources/system_buttons/home_button.h create mode 100644 src/hid_core/resources/system_buttons/sleep_button.cpp create mode 100644 src/hid_core/resources/system_buttons/sleep_button.h create mode 100644 src/hid_core/resources/system_buttons/system_button_types.h create mode 100644 src/hid_core/resources/touch_screen/gesture.cpp create mode 100644 src/hid_core/resources/touch_screen/gesture.h create mode 100644 src/hid_core/resources/touch_screen/gesture_handler.cpp create mode 100644 src/hid_core/resources/touch_screen/gesture_handler.h create mode 100644 src/hid_core/resources/touch_screen/touch_screen.cpp create mode 100644 src/hid_core/resources/touch_screen/touch_screen.h create mode 100644 src/hid_core/resources/touch_screen/touch_screen_driver.cpp create mode 100644 src/hid_core/resources/touch_screen/touch_screen_driver.h create mode 100644 src/hid_core/resources/touch_screen/touch_screen_resource.cpp create mode 100644 src/hid_core/resources/touch_screen/touch_screen_resource.h create mode 100644 src/hid_core/resources/touch_screen/touch_types.h create mode 100644 src/hid_core/resources/unique_pad/unique_pad.cpp create mode 100644 src/hid_core/resources/unique_pad/unique_pad.h create mode 100644 src/hid_core/resources/vibration/gc_vibration_device.cpp create mode 100644 src/hid_core/resources/vibration/gc_vibration_device.h create mode 100644 src/hid_core/resources/vibration/n64_vibration_device.cpp create mode 100644 src/hid_core/resources/vibration/n64_vibration_device.h create mode 100644 src/hid_core/resources/vibration/vibration_base.cpp create mode 100644 src/hid_core/resources/vibration/vibration_base.h create mode 100644 src/hid_core/resources/vibration/vibration_device.cpp create mode 100644 src/hid_core/resources/vibration/vibration_device.h create mode 100644 src/input_common/CMakeLists.txt create mode 100644 src/input_common/drivers/android.cpp create mode 100644 src/input_common/drivers/android.h create mode 100644 src/input_common/drivers/camera.cpp create mode 100644 src/input_common/drivers/camera.h create mode 100644 src/input_common/drivers/gc_adapter.cpp create mode 100644 src/input_common/drivers/gc_adapter.h create mode 100644 src/input_common/drivers/joycon.cpp create mode 100644 src/input_common/drivers/joycon.h create mode 100644 src/input_common/drivers/keyboard.cpp create mode 100644 src/input_common/drivers/keyboard.h create mode 100644 src/input_common/drivers/mouse.cpp create mode 100644 src/input_common/drivers/mouse.h create mode 100644 src/input_common/drivers/sdl_driver.cpp create mode 100644 src/input_common/drivers/sdl_driver.h create mode 100644 src/input_common/drivers/tas_input.cpp create mode 100644 src/input_common/drivers/tas_input.h create mode 100644 src/input_common/drivers/touch_screen.cpp create mode 100644 src/input_common/drivers/touch_screen.h create mode 100644 src/input_common/drivers/udp_client.cpp create mode 100644 src/input_common/drivers/udp_client.h create mode 100644 src/input_common/drivers/virtual_amiibo.cpp create mode 100644 src/input_common/drivers/virtual_amiibo.h create mode 100644 src/input_common/drivers/virtual_gamepad.cpp create mode 100644 src/input_common/drivers/virtual_gamepad.h create mode 100644 src/input_common/helpers/joycon_driver.cpp create mode 100644 src/input_common/helpers/joycon_driver.h create mode 100644 src/input_common/helpers/joycon_protocol/calibration.cpp create mode 100644 src/input_common/helpers/joycon_protocol/calibration.h create mode 100644 src/input_common/helpers/joycon_protocol/common_protocol.cpp create mode 100644 src/input_common/helpers/joycon_protocol/common_protocol.h create mode 100644 src/input_common/helpers/joycon_protocol/generic_functions.cpp create mode 100644 src/input_common/helpers/joycon_protocol/generic_functions.h create mode 100644 src/input_common/helpers/joycon_protocol/irs.cpp create mode 100644 src/input_common/helpers/joycon_protocol/irs.h create mode 100644 src/input_common/helpers/joycon_protocol/joycon_types.h create mode 100644 src/input_common/helpers/joycon_protocol/nfc.cpp create mode 100644 src/input_common/helpers/joycon_protocol/nfc.h create mode 100644 src/input_common/helpers/joycon_protocol/poller.cpp create mode 100644 src/input_common/helpers/joycon_protocol/poller.h create mode 100644 src/input_common/helpers/joycon_protocol/ringcon.cpp create mode 100644 src/input_common/helpers/joycon_protocol/ringcon.h create mode 100644 src/input_common/helpers/joycon_protocol/rumble.cpp create mode 100644 src/input_common/helpers/joycon_protocol/rumble.h create mode 100644 src/input_common/helpers/stick_from_buttons.cpp create mode 100644 src/input_common/helpers/stick_from_buttons.h create mode 100644 src/input_common/helpers/touch_from_buttons.cpp create mode 100644 src/input_common/helpers/touch_from_buttons.h create mode 100644 src/input_common/helpers/udp_protocol.cpp create mode 100644 src/input_common/helpers/udp_protocol.h create mode 100644 src/input_common/input_engine.cpp create mode 100644 src/input_common/input_engine.h create mode 100644 src/input_common/input_mapping.cpp create mode 100644 src/input_common/input_mapping.h create mode 100644 src/input_common/input_poller.cpp create mode 100644 src/input_common/input_poller.h create mode 100644 src/input_common/main.cpp create mode 100644 src/input_common/main.h create mode 100644 src/input_common/precompiled_headers.h create mode 100644 src/network/CMakeLists.txt create mode 100644 src/network/announce_multiplayer_session.cpp create mode 100644 src/network/announce_multiplayer_session.h create mode 100644 src/network/network.cpp create mode 100644 src/network/network.h create mode 100644 src/network/packet.cpp create mode 100644 src/network/packet.h create mode 100644 src/network/precompiled_headers.h create mode 100644 src/network/room.cpp create mode 100644 src/network/room.h create mode 100644 src/network/room_member.cpp create mode 100644 src/network/room_member.h create mode 100644 src/network/verify_user.cpp create mode 100644 src/network/verify_user.h create mode 100644 src/shader_recompiler/CMakeLists.txt create mode 100644 src/shader_recompiler/backend/bindings.h create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm.h create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_barriers.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_bitwise_conversion.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_composite.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_control_flow.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_convert.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_floating_point.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_image.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_instructions.h create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_logical.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_memory.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_select.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_shared_memory.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_special.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_undefined.cpp create mode 100644 src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp create mode 100644 src/shader_recompiler/backend/glasm/glasm_emit_context.cpp create mode 100644 src/shader_recompiler/backend/glasm/glasm_emit_context.h create mode 100644 src/shader_recompiler/backend/glasm/reg_alloc.cpp create mode 100644 src/shader_recompiler/backend/glasm/reg_alloc.h create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl.h create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_barriers.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_bitwise_conversion.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_control_flow.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_convert.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_floating_point.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_image.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_instructions.h create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_logical.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_select.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_special.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_undefined.cpp create mode 100644 src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp create mode 100644 src/shader_recompiler/backend/glsl/glsl_emit_context.cpp create mode 100644 src/shader_recompiler/backend/glsl/glsl_emit_context.h create mode 100644 src/shader_recompiler/backend/glsl/var_alloc.cpp create mode 100644 src/shader_recompiler/backend/glsl/var_alloc.h create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv.h create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_image.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_instructions.h create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_select.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_special.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp create mode 100644 src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp create mode 100644 src/shader_recompiler/backend/spirv/spirv_emit_context.cpp create mode 100644 src/shader_recompiler/backend/spirv/spirv_emit_context.h create mode 100644 src/shader_recompiler/environment.h create mode 100644 src/shader_recompiler/exception.h create mode 100644 src/shader_recompiler/frontend/ir/abstract_syntax_list.h create mode 100644 src/shader_recompiler/frontend/ir/attribute.cpp create mode 100644 src/shader_recompiler/frontend/ir/attribute.h create mode 100644 src/shader_recompiler/frontend/ir/basic_block.cpp create mode 100644 src/shader_recompiler/frontend/ir/basic_block.h create mode 100644 src/shader_recompiler/frontend/ir/breadth_first_search.h create mode 100644 src/shader_recompiler/frontend/ir/condition.cpp create mode 100644 src/shader_recompiler/frontend/ir/condition.h create mode 100644 src/shader_recompiler/frontend/ir/flow_test.cpp create mode 100644 src/shader_recompiler/frontend/ir/flow_test.h create mode 100644 src/shader_recompiler/frontend/ir/ir_emitter.cpp create mode 100644 src/shader_recompiler/frontend/ir/ir_emitter.h create mode 100644 src/shader_recompiler/frontend/ir/microinstruction.cpp create mode 100644 src/shader_recompiler/frontend/ir/modifiers.h create mode 100644 src/shader_recompiler/frontend/ir/opcodes.cpp create mode 100644 src/shader_recompiler/frontend/ir/opcodes.h create mode 100644 src/shader_recompiler/frontend/ir/opcodes.inc create mode 100644 src/shader_recompiler/frontend/ir/patch.cpp create mode 100644 src/shader_recompiler/frontend/ir/patch.h create mode 100644 src/shader_recompiler/frontend/ir/post_order.cpp create mode 100644 src/shader_recompiler/frontend/ir/post_order.h create mode 100644 src/shader_recompiler/frontend/ir/pred.h create mode 100644 src/shader_recompiler/frontend/ir/program.cpp create mode 100644 src/shader_recompiler/frontend/ir/program.h create mode 100644 src/shader_recompiler/frontend/ir/reg.h create mode 100644 src/shader_recompiler/frontend/ir/type.cpp create mode 100644 src/shader_recompiler/frontend/ir/type.h create mode 100644 src/shader_recompiler/frontend/ir/value.cpp create mode 100644 src/shader_recompiler/frontend/ir/value.h create mode 100644 src/shader_recompiler/frontend/maxwell/control_flow.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/control_flow.h create mode 100644 src/shader_recompiler/frontend/maxwell/decode.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/decode.h create mode 100644 src/shader_recompiler/frontend/maxwell/indirect_branch_table_track.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/indirect_branch_table_track.h create mode 100644 src/shader_recompiler/frontend/maxwell/instruction.h create mode 100644 src/shader_recompiler/frontend/maxwell/location.h create mode 100644 src/shader_recompiler/frontend/maxwell/maxwell.inc create mode 100644 src/shader_recompiler/frontend/maxwell/opcodes.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/opcodes.h create mode 100644 src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/structured_control_flow.h create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_global_memory.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_shared_memory.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/attribute_memory_to_physical.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/barrier_operations.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/bitfield_extract.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/bitfield_insert.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/branch_indirect.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/common_encoding.h create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.h create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/condition_code_set.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/double_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/double_compare_and_set.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/double_fused_multiply_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/double_min_max.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/double_multiply.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/double_set_predicate.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/exit_program.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/find_leading_one.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_compare.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_compare_and_set.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_floating_point.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_integer.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_fused_multiply_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_min_max.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multi_function.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multiply.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_range_reduction.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_set_predicate.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_swizzled_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/half_floating_point_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/half_floating_point_fused_multiply_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/half_floating_point_helper.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/half_floating_point_helper.h create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/half_floating_point_multiply.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/half_floating_point_set.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/half_floating_point_set_predicate.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/impl.h create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_add_three_input.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_compare.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_compare_and_set.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_funnel_shift.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_minimum_maximum.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_popcount.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_scaled_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_set_predicate.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_shift_left.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_shift_right.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_short_multiply_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/integer_to_integer_conversion.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/load_constant.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/load_constant.h create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/load_effective_address.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/load_store_local_shared.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/logic_operation.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/logic_operation_three_input.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/logic_operation_three_input_lut3.py create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/move_predicate_to_register.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/move_register.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/move_register_to_predicate.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/not_implemented.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/output_geometry.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/pixel_load.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/predicate_set_predicate.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/predicate_set_register.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/select_source_with_predicate.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/surface_atomic_operations.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/surface_load_store.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch_swizzled.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather_swizzled.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/texture_gradient.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/texture_load.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/texture_load_swizzled.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/texture_mipmap_level.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/texture_query.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/video_helper.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/video_helper.h create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/video_minimum_maximum.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/video_multiply_add.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/video_set_predicate.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/vote.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/impl/warp_shuffle.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/translate.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate/translate.h create mode 100644 src/shader_recompiler/frontend/maxwell/translate_program.cpp create mode 100644 src/shader_recompiler/frontend/maxwell/translate_program.h create mode 100644 src/shader_recompiler/host_translate_info.h create mode 100644 src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/constant_propagation_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/dead_code_elimination_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/dual_vertex_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/identity_removal_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/layer_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/lower_fp16_to_fp32.cpp create mode 100644 src/shader_recompiler/ir_opt/lower_fp64_to_fp32.cpp create mode 100644 src/shader_recompiler/ir_opt/lower_int64_to_int32.cpp create mode 100644 src/shader_recompiler/ir_opt/passes.h create mode 100644 src/shader_recompiler/ir_opt/position_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/rescaling_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/texture_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/vendor_workaround_pass.cpp create mode 100644 src/shader_recompiler/ir_opt/verification_pass.cpp create mode 100644 src/shader_recompiler/object_pool.h create mode 100644 src/shader_recompiler/precompiled_headers.h create mode 100644 src/shader_recompiler/profile.h create mode 100644 src/shader_recompiler/program_header.h create mode 100644 src/shader_recompiler/runtime_info.h create mode 100644 src/shader_recompiler/shader_info.h create mode 100644 src/shader_recompiler/stage.h create mode 100644 src/shader_recompiler/varying_state.h create mode 100644 src/tests/CMakeLists.txt create mode 100644 src/tests/common/bit_field.cpp create mode 100644 src/tests/common/cityhash.cpp create mode 100644 src/tests/common/container_hash.cpp create mode 100644 src/tests/common/fibers.cpp create mode 100644 src/tests/common/host_memory.cpp create mode 100644 src/tests/common/param_package.cpp create mode 100644 src/tests/common/range_map.cpp create mode 100644 src/tests/common/ring_buffer.cpp create mode 100644 src/tests/common/scratch_buffer.cpp create mode 100644 src/tests/common/unique_function.cpp create mode 100644 src/tests/core/core_timing.cpp create mode 100644 src/tests/core/internal_network/network.cpp create mode 100644 src/tests/input_common/calibration_configuration_job.cpp create mode 100644 src/tests/precompiled_headers.h create mode 100644 src/tests/video_core/memory_tracker.cpp create mode 100644 src/video_core/CMakeLists.txt create mode 100644 src/video_core/buffer_cache/buffer_base.h create mode 100644 src/video_core/buffer_cache/buffer_cache.cpp create mode 100644 src/video_core/buffer_cache/buffer_cache.h create mode 100644 src/video_core/buffer_cache/buffer_cache_base.h create mode 100644 src/video_core/buffer_cache/memory_tracker_base.h create mode 100644 src/video_core/buffer_cache/usage_tracker.h create mode 100644 src/video_core/buffer_cache/word_manager.h create mode 100644 src/video_core/cache_types.h create mode 100644 src/video_core/capture.h create mode 100644 src/video_core/cdma_pusher.cpp create mode 100644 src/video_core/cdma_pusher.h create mode 100644 src/video_core/compatible_formats.cpp create mode 100644 src/video_core/compatible_formats.h create mode 100644 src/video_core/control/channel_state.cpp create mode 100644 src/video_core/control/channel_state.h create mode 100644 src/video_core/control/channel_state_cache.cpp create mode 100644 src/video_core/control/channel_state_cache.h create mode 100644 src/video_core/control/channel_state_cache.inc create mode 100644 src/video_core/control/scheduler.cpp create mode 100644 src/video_core/control/scheduler.h create mode 100644 src/video_core/delayed_destruction_ring.h create mode 100644 src/video_core/dirty_flags.cpp create mode 100644 src/video_core/dirty_flags.h create mode 100644 src/video_core/dma_pusher.cpp create mode 100644 src/video_core/dma_pusher.h create mode 100644 src/video_core/engines/const_buffer_info.h create mode 100644 src/video_core/engines/draw_manager.cpp create mode 100644 src/video_core/engines/draw_manager.h create mode 100644 src/video_core/engines/engine_interface.h create mode 100644 src/video_core/engines/engine_upload.cpp create mode 100644 src/video_core/engines/engine_upload.h create mode 100644 src/video_core/engines/fermi_2d.cpp create mode 100644 src/video_core/engines/fermi_2d.h create mode 100644 src/video_core/engines/kepler_compute.cpp create mode 100644 src/video_core/engines/kepler_compute.h create mode 100644 src/video_core/engines/kepler_memory.cpp create mode 100644 src/video_core/engines/kepler_memory.h create mode 100644 src/video_core/engines/maxwell_3d.cpp create mode 100644 src/video_core/engines/maxwell_3d.h create mode 100644 src/video_core/engines/maxwell_dma.cpp create mode 100644 src/video_core/engines/maxwell_dma.h create mode 100644 src/video_core/engines/puller.cpp create mode 100644 src/video_core/engines/puller.h create mode 100644 src/video_core/engines/sw_blitter/blitter.cpp create mode 100644 src/video_core/engines/sw_blitter/blitter.h create mode 100644 src/video_core/engines/sw_blitter/converter.cpp create mode 100644 src/video_core/engines/sw_blitter/converter.h create mode 100644 src/video_core/engines/sw_blitter/generate_converters.py create mode 100644 src/video_core/fence_manager.h create mode 100644 src/video_core/framebuffer_config.cpp create mode 100644 src/video_core/framebuffer_config.h create mode 100644 src/video_core/fsr.cpp create mode 100644 src/video_core/fsr.h create mode 100644 src/video_core/gpu.cpp create mode 100644 src/video_core/gpu.h create mode 100644 src/video_core/gpu_thread.cpp create mode 100644 src/video_core/gpu_thread.h create mode 100644 src/video_core/guest_memory.h create mode 100644 src/video_core/host1x/codecs/codec.cpp create mode 100644 src/video_core/host1x/codecs/codec.h create mode 100644 src/video_core/host1x/codecs/h264.cpp create mode 100644 src/video_core/host1x/codecs/h264.h create mode 100644 src/video_core/host1x/codecs/vp8.cpp create mode 100644 src/video_core/host1x/codecs/vp8.h create mode 100644 src/video_core/host1x/codecs/vp9.cpp create mode 100644 src/video_core/host1x/codecs/vp9.h create mode 100644 src/video_core/host1x/codecs/vp9_types.h create mode 100644 src/video_core/host1x/control.cpp create mode 100644 src/video_core/host1x/control.h create mode 100644 src/video_core/host1x/ffmpeg/ffmpeg.cpp create mode 100644 src/video_core/host1x/ffmpeg/ffmpeg.h create mode 100644 src/video_core/host1x/gpu_device_memory_manager.cpp create mode 100644 src/video_core/host1x/gpu_device_memory_manager.h create mode 100644 src/video_core/host1x/host1x.cpp create mode 100644 src/video_core/host1x/host1x.h create mode 100644 src/video_core/host1x/nvdec.cpp create mode 100644 src/video_core/host1x/nvdec.h create mode 100644 src/video_core/host1x/nvdec_common.h create mode 100644 src/video_core/host1x/sync_manager.cpp create mode 100644 src/video_core/host1x/sync_manager.h create mode 100644 src/video_core/host1x/syncpoint_manager.cpp create mode 100644 src/video_core/host1x/syncpoint_manager.h create mode 100644 src/video_core/host1x/vic.cpp create mode 100644 src/video_core/host1x/vic.h create mode 100644 src/video_core/host_shaders/CMakeLists.txt create mode 100644 src/video_core/host_shaders/StringShaderHeader.cmake create mode 100644 src/video_core/host_shaders/astc_decoder.comp create mode 100644 src/video_core/host_shaders/blit_color_float.frag create mode 100644 src/video_core/host_shaders/block_linear_unswizzle_2d.comp create mode 100644 src/video_core/host_shaders/block_linear_unswizzle_3d.comp create mode 100644 src/video_core/host_shaders/convert_abgr8_to_d24s8.frag create mode 100644 src/video_core/host_shaders/convert_abgr8_to_d32f.frag create mode 100644 src/video_core/host_shaders/convert_d24s8_to_abgr8.frag create mode 100644 src/video_core/host_shaders/convert_d32f_to_abgr8.frag create mode 100644 src/video_core/host_shaders/convert_depth_to_float.frag create mode 100644 src/video_core/host_shaders/convert_float_to_depth.frag create mode 100644 src/video_core/host_shaders/convert_msaa_to_non_msaa.comp create mode 100644 src/video_core/host_shaders/convert_non_msaa_to_msaa.comp create mode 100644 src/video_core/host_shaders/convert_s8d24_to_abgr8.frag create mode 100644 src/video_core/host_shaders/fidelityfx_fsr.frag create mode 100644 src/video_core/host_shaders/full_screen_triangle.vert create mode 100644 src/video_core/host_shaders/fxaa.frag create mode 100644 src/video_core/host_shaders/fxaa.vert create mode 100644 src/video_core/host_shaders/opengl_convert_s8d24.comp create mode 100644 src/video_core/host_shaders/opengl_copy_bc4.comp create mode 100644 src/video_core/host_shaders/opengl_fidelityfx_fsr.frag create mode 100644 src/video_core/host_shaders/opengl_fidelityfx_fsr_easu.frag create mode 100644 src/video_core/host_shaders/opengl_fidelityfx_fsr_rcas.frag create mode 100644 src/video_core/host_shaders/opengl_lmem_warmup.comp create mode 100644 src/video_core/host_shaders/opengl_present.frag create mode 100644 src/video_core/host_shaders/opengl_present.vert create mode 100644 src/video_core/host_shaders/opengl_present_scaleforce.frag create mode 100644 src/video_core/host_shaders/opengl_smaa.glsl create mode 100644 src/video_core/host_shaders/pitch_unswizzle.comp create mode 100644 src/video_core/host_shaders/present_bicubic.frag create mode 100644 src/video_core/host_shaders/present_gaussian.frag create mode 100644 src/video_core/host_shaders/queries_prefix_scan_sum.comp create mode 100644 src/video_core/host_shaders/queries_prefix_scan_sum_nosubgroups.comp create mode 100644 src/video_core/host_shaders/resolve_conditional_render.comp create mode 100644 src/video_core/host_shaders/smaa_blending_weight_calculation.frag create mode 100644 src/video_core/host_shaders/smaa_blending_weight_calculation.vert create mode 100644 src/video_core/host_shaders/smaa_edge_detection.frag create mode 100644 src/video_core/host_shaders/smaa_edge_detection.vert create mode 100644 src/video_core/host_shaders/smaa_neighborhood_blending.frag create mode 100644 src/video_core/host_shaders/smaa_neighborhood_blending.vert create mode 100644 src/video_core/host_shaders/source_shader.h.in create mode 100644 src/video_core/host_shaders/vulkan_blit_depth_stencil.frag create mode 100644 src/video_core/host_shaders/vulkan_color_clear.frag create mode 100644 src/video_core/host_shaders/vulkan_color_clear.vert create mode 100644 src/video_core/host_shaders/vulkan_depthstencil_clear.frag create mode 100644 src/video_core/host_shaders/vulkan_fidelityfx_fsr.vert create mode 100644 src/video_core/host_shaders/vulkan_fidelityfx_fsr_easu_fp16.frag create mode 100644 src/video_core/host_shaders/vulkan_fidelityfx_fsr_easu_fp32.frag create mode 100644 src/video_core/host_shaders/vulkan_fidelityfx_fsr_rcas_fp16.frag create mode 100644 src/video_core/host_shaders/vulkan_fidelityfx_fsr_rcas_fp32.frag create mode 100644 src/video_core/host_shaders/vulkan_present.frag create mode 100644 src/video_core/host_shaders/vulkan_present.vert create mode 100644 src/video_core/host_shaders/vulkan_present_scaleforce_fp16.frag create mode 100644 src/video_core/host_shaders/vulkan_present_scaleforce_fp32.frag create mode 100644 src/video_core/host_shaders/vulkan_quad_indexed.comp create mode 100644 src/video_core/host_shaders/vulkan_turbo_mode.comp create mode 100644 src/video_core/host_shaders/vulkan_uint8.comp create mode 100644 src/video_core/invalidation_accumulator.h create mode 100644 src/video_core/macro/macro.cpp create mode 100644 src/video_core/macro/macro.h create mode 100644 src/video_core/macro/macro_hle.cpp create mode 100644 src/video_core/macro/macro_hle.h create mode 100644 src/video_core/macro/macro_interpreter.cpp create mode 100644 src/video_core/macro/macro_interpreter.h create mode 100644 src/video_core/macro/macro_jit_x64.cpp create mode 100644 src/video_core/macro/macro_jit_x64.h create mode 100644 src/video_core/memory_manager.cpp create mode 100644 src/video_core/memory_manager.h create mode 100644 src/video_core/precompiled_headers.h create mode 100644 src/video_core/present.h create mode 100644 src/video_core/pte_kind.h create mode 100644 src/video_core/query_cache.h create mode 100644 src/video_core/query_cache/bank_base.h create mode 100644 src/video_core/query_cache/query_base.h create mode 100644 src/video_core/query_cache/query_cache.h create mode 100644 src/video_core/query_cache/query_cache_base.h create mode 100644 src/video_core/query_cache/query_stream.h create mode 100644 src/video_core/query_cache/types.h create mode 100644 src/video_core/rasterizer_download_area.h create mode 100644 src/video_core/rasterizer_interface.h create mode 100644 src/video_core/renderer_base.cpp create mode 100644 src/video_core/renderer_base.h create mode 100644 src/video_core/renderer_null/null_rasterizer.cpp create mode 100644 src/video_core/renderer_null/null_rasterizer.h create mode 100644 src/video_core/renderer_null/renderer_null.cpp create mode 100644 src/video_core/renderer_null/renderer_null.h create mode 100644 src/video_core/renderer_opengl/blit_image.cpp create mode 100644 src/video_core/renderer_opengl/blit_image.h create mode 100644 src/video_core/renderer_opengl/gl_blit_screen.cpp create mode 100644 src/video_core/renderer_opengl/gl_blit_screen.h create mode 100644 src/video_core/renderer_opengl/gl_buffer_cache.cpp create mode 100644 src/video_core/renderer_opengl/gl_buffer_cache.h create mode 100644 src/video_core/renderer_opengl/gl_buffer_cache_base.cpp create mode 100644 src/video_core/renderer_opengl/gl_compute_pipeline.cpp create mode 100644 src/video_core/renderer_opengl/gl_compute_pipeline.h create mode 100644 src/video_core/renderer_opengl/gl_device.cpp create mode 100644 src/video_core/renderer_opengl/gl_device.h create mode 100644 src/video_core/renderer_opengl/gl_fence_manager.cpp create mode 100644 src/video_core/renderer_opengl/gl_fence_manager.h create mode 100644 src/video_core/renderer_opengl/gl_graphics_pipeline.cpp create mode 100644 src/video_core/renderer_opengl/gl_graphics_pipeline.h create mode 100644 src/video_core/renderer_opengl/gl_query_cache.cpp create mode 100644 src/video_core/renderer_opengl/gl_query_cache.h create mode 100644 src/video_core/renderer_opengl/gl_rasterizer.cpp create mode 100644 src/video_core/renderer_opengl/gl_rasterizer.h create mode 100644 src/video_core/renderer_opengl/gl_resource_manager.cpp create mode 100644 src/video_core/renderer_opengl/gl_resource_manager.h create mode 100644 src/video_core/renderer_opengl/gl_shader_cache.cpp create mode 100644 src/video_core/renderer_opengl/gl_shader_cache.h create mode 100644 src/video_core/renderer_opengl/gl_shader_context.h create mode 100644 src/video_core/renderer_opengl/gl_shader_manager.cpp create mode 100644 src/video_core/renderer_opengl/gl_shader_manager.h create mode 100644 src/video_core/renderer_opengl/gl_shader_util.cpp create mode 100644 src/video_core/renderer_opengl/gl_shader_util.h create mode 100644 src/video_core/renderer_opengl/gl_staging_buffer_pool.cpp create mode 100644 src/video_core/renderer_opengl/gl_staging_buffer_pool.h create mode 100644 src/video_core/renderer_opengl/gl_state_tracker.cpp create mode 100644 src/video_core/renderer_opengl/gl_state_tracker.h create mode 100644 src/video_core/renderer_opengl/gl_texture_cache.cpp create mode 100644 src/video_core/renderer_opengl/gl_texture_cache.h create mode 100644 src/video_core/renderer_opengl/gl_texture_cache_base.cpp create mode 100644 src/video_core/renderer_opengl/maxwell_to_gl.h create mode 100644 src/video_core/renderer_opengl/present/filters.cpp create mode 100644 src/video_core/renderer_opengl/present/filters.h create mode 100644 src/video_core/renderer_opengl/present/fsr.cpp create mode 100644 src/video_core/renderer_opengl/present/fsr.h create mode 100644 src/video_core/renderer_opengl/present/fxaa.cpp create mode 100644 src/video_core/renderer_opengl/present/fxaa.h create mode 100644 src/video_core/renderer_opengl/present/layer.cpp create mode 100644 src/video_core/renderer_opengl/present/layer.h create mode 100644 src/video_core/renderer_opengl/present/present_uniforms.h create mode 100644 src/video_core/renderer_opengl/present/smaa.cpp create mode 100644 src/video_core/renderer_opengl/present/smaa.h create mode 100644 src/video_core/renderer_opengl/present/util.h create mode 100644 src/video_core/renderer_opengl/present/window_adapt_pass.cpp create mode 100644 src/video_core/renderer_opengl/present/window_adapt_pass.h create mode 100644 src/video_core/renderer_opengl/renderer_opengl.cpp create mode 100644 src/video_core/renderer_opengl/renderer_opengl.h create mode 100644 src/video_core/renderer_opengl/util_shaders.cpp create mode 100644 src/video_core/renderer_opengl/util_shaders.h create mode 100644 src/video_core/renderer_vulkan/blit_image.cpp create mode 100644 src/video_core/renderer_vulkan/blit_image.h create mode 100644 src/video_core/renderer_vulkan/fixed_pipeline_state.cpp create mode 100644 src/video_core/renderer_vulkan/fixed_pipeline_state.h create mode 100644 src/video_core/renderer_vulkan/maxwell_to_vk.cpp create mode 100644 src/video_core/renderer_vulkan/maxwell_to_vk.h create mode 100644 src/video_core/renderer_vulkan/pipeline_helper.h create mode 100644 src/video_core/renderer_vulkan/pipeline_statistics.cpp create mode 100644 src/video_core/renderer_vulkan/pipeline_statistics.h create mode 100644 src/video_core/renderer_vulkan/present/anti_alias_pass.h create mode 100644 src/video_core/renderer_vulkan/present/filters.cpp create mode 100644 src/video_core/renderer_vulkan/present/filters.h create mode 100644 src/video_core/renderer_vulkan/present/fsr.cpp create mode 100644 src/video_core/renderer_vulkan/present/fsr.h create mode 100644 src/video_core/renderer_vulkan/present/fxaa.cpp create mode 100644 src/video_core/renderer_vulkan/present/fxaa.h create mode 100644 src/video_core/renderer_vulkan/present/layer.cpp create mode 100644 src/video_core/renderer_vulkan/present/layer.h create mode 100644 src/video_core/renderer_vulkan/present/present_push_constants.h create mode 100644 src/video_core/renderer_vulkan/present/smaa.cpp create mode 100644 src/video_core/renderer_vulkan/present/smaa.h create mode 100644 src/video_core/renderer_vulkan/present/util.cpp create mode 100644 src/video_core/renderer_vulkan/present/util.h create mode 100644 src/video_core/renderer_vulkan/present/window_adapt_pass.cpp create mode 100644 src/video_core/renderer_vulkan/present/window_adapt_pass.h create mode 100644 src/video_core/renderer_vulkan/renderer_vulkan.cpp create mode 100644 src/video_core/renderer_vulkan/renderer_vulkan.h create mode 100644 src/video_core/renderer_vulkan/vk_blit_screen.cpp create mode 100644 src/video_core/renderer_vulkan/vk_blit_screen.h create mode 100644 src/video_core/renderer_vulkan/vk_buffer_cache.cpp create mode 100644 src/video_core/renderer_vulkan/vk_buffer_cache.h create mode 100644 src/video_core/renderer_vulkan/vk_buffer_cache_base.cpp create mode 100644 src/video_core/renderer_vulkan/vk_command_pool.cpp create mode 100644 src/video_core/renderer_vulkan/vk_command_pool.h create mode 100644 src/video_core/renderer_vulkan/vk_compute_pass.cpp create mode 100644 src/video_core/renderer_vulkan/vk_compute_pass.h create mode 100644 src/video_core/renderer_vulkan/vk_compute_pipeline.cpp create mode 100644 src/video_core/renderer_vulkan/vk_compute_pipeline.h create mode 100644 src/video_core/renderer_vulkan/vk_descriptor_pool.cpp create mode 100644 src/video_core/renderer_vulkan/vk_descriptor_pool.h create mode 100644 src/video_core/renderer_vulkan/vk_fence_manager.cpp create mode 100644 src/video_core/renderer_vulkan/vk_fence_manager.h create mode 100644 src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp create mode 100644 src/video_core/renderer_vulkan/vk_graphics_pipeline.h create mode 100644 src/video_core/renderer_vulkan/vk_master_semaphore.cpp create mode 100644 src/video_core/renderer_vulkan/vk_master_semaphore.h create mode 100644 src/video_core/renderer_vulkan/vk_pipeline_cache.cpp create mode 100644 src/video_core/renderer_vulkan/vk_pipeline_cache.h create mode 100644 src/video_core/renderer_vulkan/vk_present_manager.cpp create mode 100644 src/video_core/renderer_vulkan/vk_present_manager.h create mode 100644 src/video_core/renderer_vulkan/vk_query_cache.cpp create mode 100644 src/video_core/renderer_vulkan/vk_query_cache.h create mode 100644 src/video_core/renderer_vulkan/vk_rasterizer.cpp create mode 100644 src/video_core/renderer_vulkan/vk_rasterizer.h create mode 100644 src/video_core/renderer_vulkan/vk_render_pass_cache.cpp create mode 100644 src/video_core/renderer_vulkan/vk_render_pass_cache.h create mode 100644 src/video_core/renderer_vulkan/vk_resource_pool.cpp create mode 100644 src/video_core/renderer_vulkan/vk_resource_pool.h create mode 100644 src/video_core/renderer_vulkan/vk_scheduler.cpp create mode 100644 src/video_core/renderer_vulkan/vk_scheduler.h create mode 100644 src/video_core/renderer_vulkan/vk_shader_util.cpp create mode 100644 src/video_core/renderer_vulkan/vk_shader_util.h create mode 100644 src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp create mode 100644 src/video_core/renderer_vulkan/vk_staging_buffer_pool.h create mode 100644 src/video_core/renderer_vulkan/vk_state_tracker.cpp create mode 100644 src/video_core/renderer_vulkan/vk_state_tracker.h create mode 100644 src/video_core/renderer_vulkan/vk_swapchain.cpp create mode 100644 src/video_core/renderer_vulkan/vk_swapchain.h create mode 100644 src/video_core/renderer_vulkan/vk_texture_cache.cpp create mode 100644 src/video_core/renderer_vulkan/vk_texture_cache.h create mode 100644 src/video_core/renderer_vulkan/vk_texture_cache_base.cpp create mode 100644 src/video_core/renderer_vulkan/vk_turbo_mode.cpp create mode 100644 src/video_core/renderer_vulkan/vk_turbo_mode.h create mode 100644 src/video_core/renderer_vulkan/vk_update_descriptor.cpp create mode 100644 src/video_core/renderer_vulkan/vk_update_descriptor.h create mode 100644 src/video_core/shader_cache.cpp create mode 100644 src/video_core/shader_cache.h create mode 100644 src/video_core/shader_environment.cpp create mode 100644 src/video_core/shader_environment.h create mode 100644 src/video_core/shader_notify.cpp create mode 100644 src/video_core/shader_notify.h create mode 100644 src/video_core/smaa_area_tex.h create mode 100644 src/video_core/smaa_search_tex.h create mode 100644 src/video_core/surface.cpp create mode 100644 src/video_core/surface.h create mode 100644 src/video_core/texture_cache/accelerated_swizzle.cpp create mode 100644 src/video_core/texture_cache/accelerated_swizzle.h create mode 100644 src/video_core/texture_cache/decode_bc.cpp create mode 100644 src/video_core/texture_cache/decode_bc.h create mode 100644 src/video_core/texture_cache/descriptor_table.h create mode 100644 src/video_core/texture_cache/format_lookup_table.cpp create mode 100644 src/video_core/texture_cache/format_lookup_table.h create mode 100644 src/video_core/texture_cache/formatter.cpp create mode 100644 src/video_core/texture_cache/formatter.h create mode 100644 src/video_core/texture_cache/image_base.cpp create mode 100644 src/video_core/texture_cache/image_base.h create mode 100644 src/video_core/texture_cache/image_info.cpp create mode 100644 src/video_core/texture_cache/image_info.h create mode 100644 src/video_core/texture_cache/image_view_base.cpp create mode 100644 src/video_core/texture_cache/image_view_base.h create mode 100644 src/video_core/texture_cache/image_view_info.cpp create mode 100644 src/video_core/texture_cache/image_view_info.h create mode 100644 src/video_core/texture_cache/render_targets.h create mode 100644 src/video_core/texture_cache/samples_helper.h create mode 100644 src/video_core/texture_cache/texture_cache.cpp create mode 100644 src/video_core/texture_cache/texture_cache.h create mode 100644 src/video_core/texture_cache/texture_cache_base.h create mode 100644 src/video_core/texture_cache/types.h create mode 100644 src/video_core/texture_cache/util.cpp create mode 100644 src/video_core/texture_cache/util.h create mode 100644 src/video_core/textures/astc.cpp create mode 100644 src/video_core/textures/astc.h create mode 100644 src/video_core/textures/bcn.cpp create mode 100644 src/video_core/textures/bcn.h create mode 100644 src/video_core/textures/decoders.cpp create mode 100644 src/video_core/textures/decoders.h create mode 100644 src/video_core/textures/texture.cpp create mode 100644 src/video_core/textures/texture.h create mode 100644 src/video_core/textures/workers.cpp create mode 100644 src/video_core/textures/workers.h create mode 100644 src/video_core/transform_feedback.cpp create mode 100644 src/video_core/transform_feedback.h create mode 100644 src/video_core/video_core.cpp create mode 100644 src/video_core/video_core.h create mode 100644 src/video_core/vulkan_common/nsight_aftermath_tracker.cpp create mode 100644 src/video_core/vulkan_common/nsight_aftermath_tracker.h create mode 100644 src/video_core/vulkan_common/vk_enum_string_helper.h create mode 100644 src/video_core/vulkan_common/vma.cpp create mode 100644 src/video_core/vulkan_common/vma.h create mode 100644 src/video_core/vulkan_common/vulkan.h create mode 100644 src/video_core/vulkan_common/vulkan_debug_callback.cpp create mode 100644 src/video_core/vulkan_common/vulkan_debug_callback.h create mode 100644 src/video_core/vulkan_common/vulkan_device.cpp create mode 100644 src/video_core/vulkan_common/vulkan_device.h create mode 100644 src/video_core/vulkan_common/vulkan_instance.cpp create mode 100644 src/video_core/vulkan_common/vulkan_instance.h create mode 100644 src/video_core/vulkan_common/vulkan_library.cpp create mode 100644 src/video_core/vulkan_common/vulkan_library.h create mode 100644 src/video_core/vulkan_common/vulkan_memory_allocator.cpp create mode 100644 src/video_core/vulkan_common/vulkan_memory_allocator.h create mode 100644 src/video_core/vulkan_common/vulkan_surface.cpp create mode 100644 src/video_core/vulkan_common/vulkan_surface.h create mode 100644 src/video_core/vulkan_common/vulkan_wrapper.cpp create mode 100644 src/video_core/vulkan_common/vulkan_wrapper.h create mode 100644 src/web_service/CMakeLists.txt create mode 100644 src/web_service/announce_room_json.cpp create mode 100644 src/web_service/announce_room_json.h create mode 100644 src/web_service/precompiled_headers.h create mode 100644 src/web_service/telemetry_json.cpp create mode 100644 src/web_service/telemetry_json.h create mode 100644 src/web_service/verify_login.cpp create mode 100644 src/web_service/verify_login.h create mode 100644 src/web_service/verify_user_jwt.cpp create mode 100644 src/web_service/verify_user_jwt.h create mode 100644 src/web_service/web_backend.cpp create mode 100644 src/web_service/web_backend.h create mode 100644 src/web_service/web_result.h create mode 100644 src/yuzu/CMakeLists.txt create mode 100644 src/yuzu/Info.plist create mode 100644 src/yuzu/about_dialog.cpp create mode 100644 src/yuzu/about_dialog.h create mode 100644 src/yuzu/aboutdialog.ui create mode 100644 src/yuzu/applets/qt_amiibo_settings.cpp create mode 100644 src/yuzu/applets/qt_amiibo_settings.h create mode 100644 src/yuzu/applets/qt_amiibo_settings.ui create mode 100644 src/yuzu/applets/qt_controller.cpp create mode 100644 src/yuzu/applets/qt_controller.h create mode 100644 src/yuzu/applets/qt_controller.ui create mode 100644 src/yuzu/applets/qt_error.cpp create mode 100644 src/yuzu/applets/qt_error.h create mode 100644 src/yuzu/applets/qt_profile_select.cpp create mode 100644 src/yuzu/applets/qt_profile_select.h create mode 100644 src/yuzu/applets/qt_software_keyboard.cpp create mode 100644 src/yuzu/applets/qt_software_keyboard.h create mode 100644 src/yuzu/applets/qt_software_keyboard.ui create mode 100644 src/yuzu/applets/qt_web_browser.cpp create mode 100644 src/yuzu/applets/qt_web_browser.h create mode 100644 src/yuzu/applets/qt_web_browser_scripts.h create mode 100644 src/yuzu/bootmanager.cpp create mode 100644 src/yuzu/bootmanager.h create mode 100644 src/yuzu/breakpad.cpp create mode 100644 src/yuzu/breakpad.h create mode 100644 src/yuzu/compatdb.cpp create mode 100644 src/yuzu/compatdb.h create mode 100644 src/yuzu/compatdb.ui create mode 100644 src/yuzu/compatibility_list.cpp create mode 100644 src/yuzu/compatibility_list.h create mode 100644 src/yuzu/configuration/configuration_shared.cpp create mode 100644 src/yuzu/configuration/configuration_shared.h create mode 100644 src/yuzu/configuration/configure.ui create mode 100644 src/yuzu/configuration/configure_applets.cpp create mode 100644 src/yuzu/configuration/configure_applets.h create mode 100644 src/yuzu/configuration/configure_applets.ui create mode 100644 src/yuzu/configuration/configure_audio.cpp create mode 100644 src/yuzu/configuration/configure_audio.h create mode 100644 src/yuzu/configuration/configure_audio.ui create mode 100644 src/yuzu/configuration/configure_camera.cpp create mode 100644 src/yuzu/configuration/configure_camera.h create mode 100644 src/yuzu/configuration/configure_camera.ui create mode 100644 src/yuzu/configuration/configure_cpu.cpp create mode 100644 src/yuzu/configuration/configure_cpu.h create mode 100644 src/yuzu/configuration/configure_cpu.ui create mode 100644 src/yuzu/configuration/configure_cpu_debug.cpp create mode 100644 src/yuzu/configuration/configure_cpu_debug.h create mode 100644 src/yuzu/configuration/configure_cpu_debug.ui create mode 100644 src/yuzu/configuration/configure_debug.cpp create mode 100644 src/yuzu/configuration/configure_debug.h create mode 100644 src/yuzu/configuration/configure_debug.ui create mode 100644 src/yuzu/configuration/configure_debug_controller.cpp create mode 100644 src/yuzu/configuration/configure_debug_controller.h create mode 100644 src/yuzu/configuration/configure_debug_controller.ui create mode 100644 src/yuzu/configuration/configure_debug_tab.cpp create mode 100644 src/yuzu/configuration/configure_debug_tab.h create mode 100644 src/yuzu/configuration/configure_debug_tab.ui create mode 100644 src/yuzu/configuration/configure_dialog.cpp create mode 100644 src/yuzu/configuration/configure_dialog.h create mode 100644 src/yuzu/configuration/configure_filesystem.cpp create mode 100644 src/yuzu/configuration/configure_filesystem.h create mode 100644 src/yuzu/configuration/configure_filesystem.ui create mode 100644 src/yuzu/configuration/configure_general.cpp create mode 100644 src/yuzu/configuration/configure_general.h create mode 100644 src/yuzu/configuration/configure_general.ui create mode 100644 src/yuzu/configuration/configure_graphics.cpp create mode 100644 src/yuzu/configuration/configure_graphics.h create mode 100644 src/yuzu/configuration/configure_graphics.ui create mode 100644 src/yuzu/configuration/configure_graphics_advanced.cpp create mode 100644 src/yuzu/configuration/configure_graphics_advanced.h create mode 100644 src/yuzu/configuration/configure_graphics_advanced.ui create mode 100644 src/yuzu/configuration/configure_hotkeys.cpp create mode 100644 src/yuzu/configuration/configure_hotkeys.h create mode 100644 src/yuzu/configuration/configure_hotkeys.ui create mode 100644 src/yuzu/configuration/configure_input.cpp create mode 100644 src/yuzu/configuration/configure_input.h create mode 100644 src/yuzu/configuration/configure_input.ui create mode 100644 src/yuzu/configuration/configure_input_advanced.cpp create mode 100644 src/yuzu/configuration/configure_input_advanced.h create mode 100644 src/yuzu/configuration/configure_input_advanced.ui create mode 100644 src/yuzu/configuration/configure_input_per_game.cpp create mode 100644 src/yuzu/configuration/configure_input_per_game.h create mode 100644 src/yuzu/configuration/configure_input_per_game.ui create mode 100644 src/yuzu/configuration/configure_input_player.cpp create mode 100644 src/yuzu/configuration/configure_input_player.h create mode 100644 src/yuzu/configuration/configure_input_player.ui create mode 100644 src/yuzu/configuration/configure_input_player_widget.cpp create mode 100644 src/yuzu/configuration/configure_input_player_widget.h create mode 100644 src/yuzu/configuration/configure_input_profile_dialog.cpp create mode 100644 src/yuzu/configuration/configure_input_profile_dialog.h create mode 100644 src/yuzu/configuration/configure_input_profile_dialog.ui create mode 100644 src/yuzu/configuration/configure_linux_tab.cpp create mode 100644 src/yuzu/configuration/configure_linux_tab.h create mode 100644 src/yuzu/configuration/configure_linux_tab.ui create mode 100644 src/yuzu/configuration/configure_motion_touch.cpp create mode 100644 src/yuzu/configuration/configure_motion_touch.h create mode 100644 src/yuzu/configuration/configure_motion_touch.ui create mode 100644 src/yuzu/configuration/configure_mouse_panning.cpp create mode 100644 src/yuzu/configuration/configure_mouse_panning.h create mode 100644 src/yuzu/configuration/configure_mouse_panning.ui create mode 100644 src/yuzu/configuration/configure_network.cpp create mode 100644 src/yuzu/configuration/configure_network.h create mode 100644 src/yuzu/configuration/configure_network.ui create mode 100644 src/yuzu/configuration/configure_per_game.cpp create mode 100644 src/yuzu/configuration/configure_per_game.h create mode 100644 src/yuzu/configuration/configure_per_game.ui create mode 100644 src/yuzu/configuration/configure_per_game_addons.cpp create mode 100644 src/yuzu/configuration/configure_per_game_addons.h create mode 100644 src/yuzu/configuration/configure_per_game_addons.ui create mode 100644 src/yuzu/configuration/configure_profile_manager.cpp create mode 100644 src/yuzu/configuration/configure_profile_manager.h create mode 100644 src/yuzu/configuration/configure_profile_manager.ui create mode 100644 src/yuzu/configuration/configure_ringcon.cpp create mode 100644 src/yuzu/configuration/configure_ringcon.h create mode 100644 src/yuzu/configuration/configure_ringcon.ui create mode 100644 src/yuzu/configuration/configure_system.cpp create mode 100644 src/yuzu/configuration/configure_system.h create mode 100644 src/yuzu/configuration/configure_system.ui create mode 100644 src/yuzu/configuration/configure_tas.cpp create mode 100644 src/yuzu/configuration/configure_tas.h create mode 100644 src/yuzu/configuration/configure_tas.ui create mode 100644 src/yuzu/configuration/configure_touch_from_button.cpp create mode 100644 src/yuzu/configuration/configure_touch_from_button.h create mode 100644 src/yuzu/configuration/configure_touch_from_button.ui create mode 100644 src/yuzu/configuration/configure_touch_widget.h create mode 100644 src/yuzu/configuration/configure_touchscreen_advanced.cpp create mode 100644 src/yuzu/configuration/configure_touchscreen_advanced.h create mode 100644 src/yuzu/configuration/configure_touchscreen_advanced.ui create mode 100644 src/yuzu/configuration/configure_ui.cpp create mode 100644 src/yuzu/configuration/configure_ui.h create mode 100644 src/yuzu/configuration/configure_ui.ui create mode 100644 src/yuzu/configuration/configure_vibration.cpp create mode 100644 src/yuzu/configuration/configure_vibration.h create mode 100644 src/yuzu/configuration/configure_vibration.ui create mode 100644 src/yuzu/configuration/configure_web.cpp create mode 100644 src/yuzu/configuration/configure_web.h create mode 100644 src/yuzu/configuration/configure_web.ui create mode 100644 src/yuzu/configuration/input_profiles.cpp create mode 100644 src/yuzu/configuration/input_profiles.h create mode 100644 src/yuzu/configuration/qt_config.cpp create mode 100644 src/yuzu/configuration/qt_config.h create mode 100644 src/yuzu/configuration/shared_translation.cpp create mode 100644 src/yuzu/configuration/shared_translation.h create mode 100644 src/yuzu/configuration/shared_widget.cpp create mode 100644 src/yuzu/configuration/shared_widget.h create mode 100644 src/yuzu/debugger/console.cpp create mode 100644 src/yuzu/debugger/console.h create mode 100644 src/yuzu/debugger/controller.cpp create mode 100644 src/yuzu/debugger/controller.h create mode 100644 src/yuzu/debugger/profiler.cpp create mode 100644 src/yuzu/debugger/profiler.h create mode 100644 src/yuzu/debugger/wait_tree.cpp create mode 100644 src/yuzu/debugger/wait_tree.h create mode 100644 src/yuzu/discord.h create mode 100644 src/yuzu/discord_impl.cpp create mode 100644 src/yuzu/discord_impl.h create mode 100644 src/yuzu/game_list.cpp create mode 100644 src/yuzu/game_list.h create mode 100644 src/yuzu/game_list_p.h create mode 100644 src/yuzu/game_list_worker.cpp create mode 100644 src/yuzu/game_list_worker.h create mode 100644 src/yuzu/hotkeys.cpp create mode 100644 src/yuzu/hotkeys.h create mode 100644 src/yuzu/install_dialog.cpp create mode 100644 src/yuzu/install_dialog.h create mode 100644 src/yuzu/loading_screen.cpp create mode 100644 src/yuzu/loading_screen.h create mode 100644 src/yuzu/loading_screen.ui create mode 100644 src/yuzu/main.cpp create mode 100644 src/yuzu/main.h create mode 100644 src/yuzu/main.ui create mode 100644 src/yuzu/multiplayer/chat_room.cpp create mode 100644 src/yuzu/multiplayer/chat_room.h create mode 100644 src/yuzu/multiplayer/chat_room.ui create mode 100644 src/yuzu/multiplayer/client_room.cpp create mode 100644 src/yuzu/multiplayer/client_room.h create mode 100644 src/yuzu/multiplayer/client_room.ui create mode 100644 src/yuzu/multiplayer/direct_connect.cpp create mode 100644 src/yuzu/multiplayer/direct_connect.h create mode 100644 src/yuzu/multiplayer/direct_connect.ui create mode 100644 src/yuzu/multiplayer/host_room.cpp create mode 100644 src/yuzu/multiplayer/host_room.h create mode 100644 src/yuzu/multiplayer/host_room.ui create mode 100644 src/yuzu/multiplayer/lobby.cpp create mode 100644 src/yuzu/multiplayer/lobby.h create mode 100644 src/yuzu/multiplayer/lobby.ui create mode 100644 src/yuzu/multiplayer/lobby_p.h create mode 100644 src/yuzu/multiplayer/message.cpp create mode 100644 src/yuzu/multiplayer/message.h create mode 100644 src/yuzu/multiplayer/moderation_dialog.cpp create mode 100644 src/yuzu/multiplayer/moderation_dialog.h create mode 100644 src/yuzu/multiplayer/moderation_dialog.ui create mode 100644 src/yuzu/multiplayer/state.cpp create mode 100644 src/yuzu/multiplayer/state.h create mode 100644 src/yuzu/multiplayer/validation.h create mode 100644 src/yuzu/play_time_manager.cpp create mode 100644 src/yuzu/play_time_manager.h create mode 100644 src/yuzu/precompiled_headers.h create mode 100644 src/yuzu/qt_common.cpp create mode 100644 src/yuzu/qt_common.h create mode 100644 src/yuzu/startup_checks.cpp create mode 100644 src/yuzu/startup_checks.h create mode 100644 src/yuzu/uisettings.cpp create mode 100644 src/yuzu/uisettings.h create mode 100644 src/yuzu/util/clickable_label.cpp create mode 100644 src/yuzu/util/clickable_label.h create mode 100644 src/yuzu/util/controller_navigation.cpp create mode 100644 src/yuzu/util/controller_navigation.h create mode 100644 src/yuzu/util/limitable_input_dialog.cpp create mode 100644 src/yuzu/util/limitable_input_dialog.h create mode 100644 src/yuzu/util/overlay_dialog.cpp create mode 100644 src/yuzu/util/overlay_dialog.h create mode 100644 src/yuzu/util/overlay_dialog.ui create mode 100644 src/yuzu/util/sequence_dialog/sequence_dialog.cpp create mode 100644 src/yuzu/util/sequence_dialog/sequence_dialog.h create mode 100644 src/yuzu/util/url_request_interceptor.cpp create mode 100644 src/yuzu/util/url_request_interceptor.h create mode 100644 src/yuzu/util/util.cpp create mode 100644 src/yuzu/util/util.h create mode 100644 src/yuzu/vk_device_info.cpp create mode 100644 src/yuzu/vk_device_info.h create mode 100644 src/yuzu/yuzu.qrc create mode 100644 src/yuzu/yuzu.rc create mode 100644 src/yuzu_cmd/CMakeLists.txt create mode 100644 src/yuzu_cmd/emu_window/emu_window_sdl2.cpp create mode 100644 src/yuzu_cmd/emu_window/emu_window_sdl2.h create mode 100644 src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp create mode 100644 src/yuzu_cmd/emu_window/emu_window_sdl2_gl.h create mode 100644 src/yuzu_cmd/emu_window/emu_window_sdl2_null.cpp create mode 100644 src/yuzu_cmd/emu_window/emu_window_sdl2_null.h create mode 100644 src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp create mode 100644 src/yuzu_cmd/emu_window/emu_window_sdl2_vk.h create mode 100644 src/yuzu_cmd/precompiled_headers.h create mode 100644 src/yuzu_cmd/sdl_config.cpp create mode 100644 src/yuzu_cmd/sdl_config.h create mode 100644 src/yuzu_cmd/yuzu.cpp create mode 100644 src/yuzu_cmd/yuzu.rc create mode 100755 tools/reset-submodules.sh create mode 100644 vcpkg.json diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..8c35b22 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,732 @@ +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +cmake_minimum_required(VERSION 3.22) + +project(yuzu) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules") + +include(DownloadExternals) +include(CMakeDependentOption) +include(CTest) + +# Set bundled sdl2/qt as dependent options. +# OFF by default, but if ENABLE_SDL2 and MSVC are true then ON +option(ENABLE_SDL2 "Enable the SDL2 frontend" ON) +CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF) +# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion +CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF) + +cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF) + +option(ENABLE_OPENGL "Enable OpenGL" ON) +mark_as_advanced(FORCE ENABLE_OPENGL) +option(ENABLE_QT "Enable the Qt frontend" ON) +option(ENABLE_QT6 "Allow usage of Qt6 to be attempted" OFF) +set(QT6_LOCATION "" CACHE PATH "Additional Location to search for Qt6 libraries like C:/Qt/6.3.1/msvc2019_64/") + +option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF) +CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF) + +option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON) + +option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" "${WIN32}") + +option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ON) + +option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan-Utility-Libraries from externals" ON) + +option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF) + +option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF) + +option(ENABLE_CUBEB "Enables the cubeb audio backend" ON) + +option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF) + +option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}") + +option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON) + +option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON) + +CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Compile LDN room server" ON "NOT ANDROID" OFF) + +CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF) + +option(YUZU_USE_BUNDLED_VCPKG "Use vcpkg for yuzu dependencies" "${MSVC}") + +option(YUZU_CHECK_SUBMODULES "Check if submodules are present" ON) + +option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF) + +option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" OFF) + +option(YUZU_ENABLE_PORTABLE "Allow yuzu to enable portable mode if a user folder is found in the CWD" ON) + +CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF) + +CMAKE_DEPENDENT_OPTION(USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" OFF) + +set(DEFAULT_ENABLE_OPENSSL ON) +if (ANDROID OR WIN32 OR APPLE) + # - Windows defaults to the Schannel backend. + # - macOS defaults to the SecureTransport backend. + # - Android currently has no SSL backend as the NDK doesn't include any SSL + # library; a proper 'native' backend would have to go through Java. + # But you can force builds for those platforms to use OpenSSL if you have + # your own copy of it. + set(DEFAULT_ENABLE_OPENSSL OFF) +endif() +option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) + +if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) + set(vvl_version "sdk-1.3.261.1") + set(vvl_zip_file "${CMAKE_BINARY_DIR}/externals/vvl-android.zip") + if (NOT EXISTS "${vvl_zip_file}") + # Download and extract validation layer release to externals directory + set(vvl_base_url "https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download") + file(DOWNLOAD "${vvl_base_url}/${vvl_version}/android-binaries-${vvl_version}-android.zip" + "${vvl_zip_file}" SHOW_PROGRESS) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${vvl_zip_file}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") + endif() + + # Copy the arm64 binary to src/android/app/main/jniLibs + set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/arm64-v8a/") + file(COPY "${CMAKE_BINARY_DIR}/externals/android-binaries-${vvl_version}/arm64-v8a/libVkLayer_khronos_validation.so" + DESTINATION "${vvl_lib_path}") +endif() + +if (ANDROID) + set(CMAKE_SKIP_INSTALL_RULES ON) +endif() + +if (YUZU_USE_BUNDLED_VCPKG) + if (ANDROID) + set(ENV{ANDROID_NDK_HOME} "${ANDROID_NDK}") + list(APPEND VCPKG_MANIFEST_FEATURES "android") + + if (CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a") + set(VCPKG_TARGET_TRIPLET "arm64-android") + # this is to avoid CMake using the host pkg-config to find the host + # libraries when building for Android targets + set(PKG_CONFIG_EXECUTABLE "aarch64-none-linux-android-pkg-config" CACHE FILEPATH "" FORCE) + elseif (CMAKE_ANDROID_ARCH_ABI STREQUAL "x86_64") + set(VCPKG_TARGET_TRIPLET "x64-android") + set(PKG_CONFIG_EXECUTABLE "x86_64-none-linux-android-pkg-config" CACHE FILEPATH "" FORCE) + else() + message(FATAL_ERROR "Unsupported Android architecture ${CMAKE_ANDROID_ARCH_ABI}") + endif() + endif() + + if (MSVC) + set(VCPKG_DOWNLOADS_PATH ${PROJECT_SOURCE_DIR}/externals/vcpkg/downloads) + set(NASM_VERSION "2.16.01") + set(NASM_DESTINATION_PATH ${VCPKG_DOWNLOADS_PATH}/nasm-${NASM_VERSION}-win64.zip) + set(NASM_DOWNLOAD_URL "https://github.com/yuzu-mirror/ext-windows-bin/raw/master/nasm/nasm-${NASM_VERSION}-win64.zip") + + if (NOT EXISTS ${NASM_DESTINATION_PATH}) + file(DOWNLOAD ${NASM_DOWNLOAD_URL} ${NASM_DESTINATION_PATH} SHOW_PROGRESS STATUS NASM_STATUS) + + if (NOT NASM_STATUS EQUAL 0) + # Warn and not fail since vcpkg is supposed to download this package for us in the first place + message(WARNING "External nasm vcpkg package download from ${NASM_DOWNLOAD_URL} failed with status ${NASM_STATUS}") + endif() + endif() + endif() + + if (YUZU_TESTS) + list(APPEND VCPKG_MANIFEST_FEATURES "yuzu-tests") + endif() + if (ENABLE_WEB_SERVICE) + list(APPEND VCPKG_MANIFEST_FEATURES "web-service") + endif() + if (ANDROID) + list(APPEND VCPKG_MANIFEST_FEATURES "android") + endif() + + include(${CMAKE_SOURCE_DIR}/externals/vcpkg/scripts/buildsystems/vcpkg.cmake) +elseif(NOT "$ENV{VCPKG_TOOLCHAIN_FILE}" STREQUAL "") + # Disable manifest mode (use vcpkg classic mode) when using a custom vcpkg installation + option(VCPKG_MANIFEST_MODE "") + include("$ENV{VCPKG_TOOLCHAIN_FILE}") +endif() + +if (YUZU_USE_PRECOMPILED_HEADERS) + if (MSVC AND CCACHE) + # buildcache does not properly cache PCH files, leading to compilation errors. + # See https://github.com/mbitsnbites/buildcache/discussions/230 + message(WARNING "buildcache does not properly support Precompiled Headers. Disabling PCH") + set(DYNARMIC_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) + set(YUZU_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) + endif() +endif() +if (YUZU_USE_PRECOMPILED_HEADERS) + message(STATUS "Using Precompiled Headers.") + set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON) +endif() + + +# Default to a Release build +get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if (NOT IS_MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) + message(STATUS "Defaulting to a Release build") +endif() + +if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit) + if (EXISTS ${PROJECT_SOURCE_DIR}/.git/) + message(STATUS "Copying pre-commit hook") + file(COPY hooks/pre-commit DESTINATION ${PROJECT_SOURCE_DIR}/.git/hooks) + endif() +endif() + +# Sanity check : Check that all submodules are present +# ======================================================================= + +function(check_submodules_present) + file(READ "${PROJECT_SOURCE_DIR}/.gitmodules" gitmodules) + string(REGEX MATCHALL "path *= *[^ \t\r\n]*" gitmodules ${gitmodules}) + foreach(module ${gitmodules}) + string(REGEX REPLACE "path *= *" "" module ${module}) + if (NOT EXISTS "${PROJECT_SOURCE_DIR}/${module}/.git") + message(FATAL_ERROR "Git submodule ${module} not found. " + "Please run: \ngit submodule update --init --recursive") + endif() + endforeach() +endfunction() + +if(EXISTS ${PROJECT_SOURCE_DIR}/.gitmodules AND YUZU_CHECK_SUBMODULES) + check_submodules_present() +endif() +configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc + ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc + COPYONLY) +if (EXISTS ${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json) + configure_file("${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json" + "${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" + COPYONLY) +endif() +if (ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) + message(STATUS "Downloading compatibility list for yuzu...") + file(DOWNLOAD + https://api.yuzu-emu.org/gamedb/ + "${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" SHOW_PROGRESS) +endif() +if (NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) + file(WRITE ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json "") +endif() + +# Detect current compilation architecture and create standard definitions +# ======================================================================= + +include(CheckSymbolExists) +function(detect_architecture symbol arch) + if (NOT DEFINED ARCHITECTURE) + set(CMAKE_REQUIRED_QUIET 1) + check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch}) + unset(CMAKE_REQUIRED_QUIET) + + # The output variable needs to be unique across invocations otherwise + # CMake's crazy scope rules will keep it defined + if (ARCHITECTURE_${arch}) + set(ARCHITECTURE "${arch}" PARENT_SCOPE) + set(ARCHITECTURE_${arch} 1 PARENT_SCOPE) + add_definitions(-DARCHITECTURE_${arch}=1) + endif() + endif() +endfunction() + +if (NOT ENABLE_GENERIC) + if (MSVC) + detect_architecture("_M_AMD64" x86_64) + detect_architecture("_M_IX86" x86) + detect_architecture("_M_ARM" arm) + detect_architecture("_M_ARM64" arm64) + else() + detect_architecture("__x86_64__" x86_64) + detect_architecture("__i386__" x86) + detect_architecture("__arm__" arm) + detect_architecture("__aarch64__" arm64) + endif() +endif() + +if (NOT DEFINED ARCHITECTURE) + set(ARCHITECTURE "GENERIC") + set(ARCHITECTURE_GENERIC 1) + add_definitions(-DARCHITECTURE_GENERIC=1) +endif() +message(STATUS "Target architecture: ${ARCHITECTURE}") + +if (UNIX) + add_definitions(-DYUZU_UNIX=1) +endif() + +if (ARCHITECTURE_arm64 AND (ANDROID OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")) + set(HAS_NCE 1) + add_definitions(-DHAS_NCE=1) +endif() + +# Configure C++ standard +# =========================== + +# boost asio's concept usage doesn't play nicely with some compilers yet. +add_definitions(-DBOOST_ASIO_DISABLE_CONCEPTS) +if (MSVC) + add_compile_options($<$:/std:c++20>) + + # boost still makes use of deprecated result_of. + add_definitions(-D_HAS_DEPRECATED_RESULT_OF) +else() + set(CMAKE_CXX_STANDARD 20) + set(CMAKE_CXX_STANDARD_REQUIRED ON) +endif() + +# Output binaries to bin/ +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) + +# System imported libraries +# ======================================================================= + +# Enforce the search mode of non-required packages for better and shorter failure messages +find_package(Boost 1.79.0 REQUIRED context) +find_package(enet 1.3 MODULE) +find_package(fmt 9 REQUIRED) +find_package(LLVM 17.0.2 MODULE COMPONENTS Demangle) +find_package(lz4 REQUIRED) +find_package(nlohmann_json 3.8 REQUIRED) +find_package(Opus 1.3 MODULE) +find_package(RenderDoc MODULE) +find_package(SimpleIni MODULE) +find_package(stb MODULE) +find_package(VulkanMemoryAllocator CONFIG) +find_package(ZLIB 1.2 REQUIRED) +find_package(zstd 1.5 REQUIRED) + +if (NOT YUZU_USE_EXTERNAL_VULKAN_HEADERS) + find_package(VulkanHeaders 1.3.274 REQUIRED) +endif() + +if (NOT YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES) + find_package(VulkanUtilityLibraries REQUIRED) +endif() + +if (ENABLE_LIBUSB) + find_package(libusb 1.0.24 MODULE) +endif() + +if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) + find_package(xbyak 6 CONFIG) +endif() + +if (ARCHITECTURE_arm64) + find_package(oaknut 2.0.1 CONFIG) +endif() + +if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) + find_package(dynarmic 6.4.0 CONFIG) +endif() + +if (ENABLE_CUBEB) + find_package(cubeb CONFIG) +endif() + +if (USE_DISCORD_PRESENCE) + find_package(DiscordRPC MODULE) +endif() + +if (ENABLE_WEB_SERVICE) + find_package(cpp-jwt 1.4 CONFIG) + find_package(httplib 0.12 MODULE COMPONENTS OpenSSL) +endif() + +if (YUZU_TESTS) + find_package(Catch2 3.0.1 REQUIRED) +endif() + +# boost:asio has functions that require AcceptEx et al +if (MINGW) + find_library(MSWSOCK_LIBRARY mswsock REQUIRED) +endif() + +if(ENABLE_OPENSSL) + find_package(OpenSSL 1.1.1 REQUIRED) +endif() + +if (UNIX AND NOT APPLE) + find_package(gamemode 1.7 MODULE) +endif() + +# Please consider this as a stub +if(ENABLE_QT6 AND Qt6_LOCATION) + list(APPEND CMAKE_PREFIX_PATH "${Qt6_LOCATION}") +endif() + +function(set_yuzu_qt_components) + # Best practice is to ask for all components at once, so they are from the same version + set(YUZU_QT_COMPONENTS2 Core Widgets Concurrent) + if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + list(APPEND YUZU_QT_COMPONENTS2 DBus) + endif() + if (YUZU_USE_QT_MULTIMEDIA) + list(APPEND YUZU_QT_COMPONENTS2 Multimedia) + endif() + if (YUZU_USE_QT_WEB_ENGINE) + list(APPEND YUZU_QT_COMPONENTS2 WebEngineCore WebEngineWidgets) + endif() + if (ENABLE_QT_TRANSLATION) + list(APPEND YUZU_QT_COMPONENTS2 LinguistTools) + endif() + if (USE_DISCORD_PRESENCE) + list(APPEND YUZU_QT_COMPONENTS2 Network) + endif() + set(YUZU_QT_COMPONENTS ${YUZU_QT_COMPONENTS2} PARENT_SCOPE) +endfunction(set_yuzu_qt_components) + +# Qt5 requires that we find components, so it doesn't fit our pretty little find package function +if(ENABLE_QT) + set(QT_VERSION 5.15) + # These are used to specify minimum versions + set(QT5_VERSION 5.15) + set(QT6_VERSION 6.3.1) + + set_yuzu_qt_components() + if (ENABLE_QT6) + find_package(Qt6 ${QT6_VERSION} COMPONENTS ${YUZU_QT_COMPONENTS}) + endif() + if (Qt6_FOUND) + message(STATUS "yuzu/CMakeLists.txt: Qt6Widgets_VERSION ${Qt6Widgets_VERSION}, setting QT_VERSION") + set(QT_VERSION ${Qt6Widgets_VERSION}) + set(QT_MAJOR_VERSION 6) + # Qt6 sets cxx_std_17 and we need to undo that + set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "") + else() + message(STATUS "yuzu/CMakeLists.txt: Qt6 not found/not selected, trying for Qt5") + # When Qt6 partially found, need this set to use Qt5 when not specifying version + set(QT_DEFAULT_MAJOR_VERSION 5) + set(QT_MAJOR_VERSION 5) + + set(YUZU_USE_QT_MULTIMEDIA ON) + # Check for system Qt on Linux, fallback to bundled Qt + if (UNIX AND NOT APPLE) + if (NOT YUZU_USE_BUNDLED_QT) + find_package(Qt5 ${QT5_VERSION} COMPONENTS Widgets DBus Multimedia) + endif() + if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND (NOT Qt5_FOUND OR YUZU_USE_BUNDLED_QT)) + # Check for dependencies, then enable bundled Qt download + + # Check that the system GLIBCXX version is compatible + find_program(OBJDUMP objdump) + if (NOT OBJDUMP) + message(FATAL_ERROR "Required program `objdump` not found.") + endif() + find_library(LIBSTDCXX libstdc++.so.6) + execute_process( + COMMAND + ${OBJDUMP} -T ${LIBSTDCXX} + COMMAND + grep GLIBCXX_3.4.28 + COMMAND + sed "s/[0-9a-f]*.* //" + COMMAND + sed "s/ .*//" + COMMAND + sort -u + OUTPUT_VARIABLE + GLIBCXX_MET + ) + if (NOT GLIBCXX_MET) + message(FATAL_ERROR "Qt too old or not found, and bundled Qt package is not \ + compatible with this system. Either install Qt ${QT_VERSION}, or provide the path \ + to Qt by setting the variable Qt5_ROOT.") + endif() + + # Check for headers + find_package(PkgConfig REQUIRED) + pkg_check_modules(QT_DEP_GLU QUIET glu>=9.0.0) + if (NOT QT_DEP_GLU_FOUND) + message(FATAL_ERROR "Qt bundled package dependency `glu` not found. \ + Perhaps `libglu1-mesa-dev` needs to be installed?") + endif() + pkg_check_modules(QT_DEP_MESA QUIET dri>=20.0.8) + if (NOT QT_DEP_MESA_FOUND) + message(FATAL_ERROR "Qt bundled package dependency `dri` not found. \ + Perhaps `mesa-common-dev` needs to be installed?") + endif() + + # Check for X libraries + set(BUNDLED_QT_REQUIREMENTS + libxcb-icccm.so.4 + libxcb-image.so.0 + libxcb-keysyms.so.1 + libxcb-randr.so.0 + libxcb-render-util.so.0 + libxcb-render.so.0 + libxcb-shape.so.0 + libxcb-shm.so.0 + libxcb-sync.so.1 + libxcb-xfixes.so.0 + libxcb-xinerama.so.0 + libxcb-xkb.so.1 + libxcb.so.1 + libxkbcommon-x11.so.0 + libxkbcommon.so.0 + ) + set(UNRESOLVED_QT_DEPS "") + foreach (REQUIREMENT ${BUNDLED_QT_REQUIREMENTS}) + find_library(BUNDLED_QT_${REQUIREMENT} ${REQUIREMENT}) + if (NOT BUNDLED_QT_${REQUIREMENT}) + set(UNRESOLVED_QT_DEPS ${UNRESOLVED_QT_DEPS} ${REQUIREMENT}) + endif() + unset(BUNDLED_QT_${REQUIREMENT}) + endforeach() + unset(BUNDLED_QT_REQUIREMENTS) + + if (NOT "${UNRESOLVED_QT_DEPS}" STREQUAL "") + message(FATAL_ERROR "Bundled Qt package missing required dependencies: ${UNRESOLVED_QT_DEPS}") + endif() + + set(YUZU_USE_BUNDLED_QT ON CACHE BOOL "Download bundled Qt" FORCE) + endif() + if (YUZU_USE_BUNDLED_QT) + # Binary package currently does not support Qt webengine, so make sure it's disabled + set(YUZU_USE_QT_WEB_ENGINE OFF CACHE BOOL "Use Qt Webengine" FORCE) + endif() + endif() + + set(YUZU_QT_NO_CMAKE_SYSTEM_PATH) + + if(YUZU_USE_BUNDLED_QT) + if ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND ARCHITECTURE_x86_64) + set(QT_BUILD qt-5.15.2-msvc2019_64) + elseif ((${CMAKE_SYSTEM_NAME} STREQUAL "Linux") AND NOT MINGW AND ARCHITECTURE_x86_64) + set(QT_BUILD qt5_5_15_2) + else() + message(FATAL_ERROR "No bundled Qt binaries for your toolchain. Disable YUZU_USE_BUNDLED_QT and provide your own.") + endif() + + if (DEFINED QT_BUILD) + download_bundled_external("qt/" ${QT_BUILD} QT_PREFIX) + endif() + + set(QT_PREFIX_HINT HINTS "${QT_PREFIX}") + + set(YUZU_QT_NO_CMAKE_SYSTEM_PATH "NO_CMAKE_SYSTEM_PATH") + # Binary package for Qt5 has Qt Multimedia + set(YUZU_USE_QT_MULTIMEDIA ON CACHE BOOL "Use Qt Multimedia" FORCE) + endif() + + set_yuzu_qt_components() + find_package(Qt5 ${QT5_VERSION} COMPONENTS ${YUZU_QT_COMPONENTS} ${QT_PREFIX_HINT} ${YUZU_QT_NO_CMAKE_SYSTEM_PATH}) + endif() + +endif() + +# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the yuzu_find_package +if (ENABLE_SDL2) + if (YUZU_USE_BUNDLED_SDL2) + # Detect toolchain and platform + if ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND ARCHITECTURE_x86_64) + set(SDL2_VER "SDL2-2.28.2") + else() + message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable YUZU_USE_BUNDLED_SDL2 and provide your own.") + endif() + + if (DEFINED SDL2_VER) + download_bundled_external("sdl2/" ${SDL2_VER} SDL2_PREFIX) + endif() + + set(SDL2_FOUND YES) + set(SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include" CACHE PATH "Path to SDL2 headers") + set(SDL2_LIBRARY "${SDL2_PREFIX}/lib/x64/SDL2.lib" CACHE PATH "Path to SDL2 library") + set(SDL2_DLL_DIR "${SDL2_PREFIX}/lib/x64/" CACHE PATH "Path to SDL2.dll") + + add_library(SDL2::SDL2 INTERFACE IMPORTED) + target_link_libraries(SDL2::SDL2 INTERFACE "${SDL2_LIBRARY}") + target_include_directories(SDL2::SDL2 INTERFACE "${SDL2_INCLUDE_DIR}") + elseif (YUZU_USE_EXTERNAL_SDL2) + message(STATUS "Using SDL2 from externals.") + else() + find_package(SDL2 2.26.4 REQUIRED) + endif() +endif() + +# List of all FFmpeg components required +set(FFmpeg_COMPONENTS + avcodec + avfilter + avutil + swscale) + +if (UNIX AND NOT APPLE AND NOT ANDROID) + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBVA libva) +endif() +if (NOT YUZU_USE_BUNDLED_FFMPEG) + # Use system installed FFmpeg + find_package(FFmpeg 4.3 REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS}) +endif() + +if (WIN32 AND YUZU_CRASH_DUMPS) + set(BREAKPAD_VER "breakpad-c89f9dd") + download_bundled_external("breakpad/" ${BREAKPAD_VER} BREAKPAD_PREFIX) + + set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include") + set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib") + + add_library(libbreakpad_client INTERFACE IMPORTED) + target_link_libraries(libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_LIBRARY}") + target_include_directories(libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_INCLUDE_DIR}") +endif() + +# Prefer the -pthread flag on Linux. +set(THREADS_PREFER_PTHREAD_FLAG ON) +find_package(Threads REQUIRED) + +# Platform-specific library requirements +# ====================================== + +if (APPLE) + # Umbrella framework for everything GUI-related + find_library(COCOA_LIBRARY Cocoa) + set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY}) +elseif (WIN32) + # Target Windows 10 + add_definitions(-D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00) + set(PLATFORM_LIBRARIES winmm ws2_32 iphlpapi) + if (MINGW) + # PSAPI is the Process Status API + set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version) + endif() +elseif (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$") + set(PLATFORM_LIBRARIES rt) +endif() + +# Setup a custom clang-format target (if clang-format can be found) that will run +# against all the src files. This should be used before making a pull request. +# ======================================================================= + +set(CLANG_FORMAT_POSTFIX "-15") +find_program(CLANG_FORMAT + NAMES clang-format${CLANG_FORMAT_POSTFIX} + clang-format + PATHS ${PROJECT_BINARY_DIR}/externals) +# if find_program doesn't find it, try to download from externals +if (NOT CLANG_FORMAT) + if (WIN32 AND NOT CMAKE_CROSSCOMPILING) + message(STATUS "Clang format not found! Downloading...") + set(CLANG_FORMAT "${PROJECT_BINARY_DIR}/externals/clang-format${CLANG_FORMAT_POSTFIX}.exe") + file(DOWNLOAD + https://github.com/yuzu-mirror/ext-windows-bin/raw/master/clang-format${CLANG_FORMAT_POSTFIX}.exe + "${CLANG_FORMAT}" SHOW_PROGRESS + STATUS DOWNLOAD_SUCCESS) + if (NOT DOWNLOAD_SUCCESS EQUAL 0) + message(WARNING "Could not download clang format! Disabling the clang format target") + file(REMOVE ${CLANG_FORMAT}) + unset(CLANG_FORMAT) + endif() + else() + message(WARNING "Clang format not found! Disabling the clang format target") + endif() +endif() + +if (CLANG_FORMAT) + set(SRCS ${PROJECT_SOURCE_DIR}/src) + set(CCOMMENT "Running clang format against all the .h and .cpp files in src/") + if (WIN32) + add_custom_target(clang-format + COMMAND powershell.exe -Command "Get-ChildItem '${SRCS}/*' -Include *.cpp,*.h -Recurse | Foreach {&'${CLANG_FORMAT}' -i $_.fullname}" + COMMENT ${CCOMMENT}) + elseif(MINGW) + add_custom_target(clang-format + COMMAND find `cygpath -u ${SRCS}` -iname *.h -o -iname *.cpp | xargs `cygpath -u ${CLANG_FORMAT}` -i + COMMENT ${CCOMMENT}) + else() + add_custom_target(clang-format + COMMAND find ${SRCS} -iname *.h -o -iname *.cpp | xargs ${CLANG_FORMAT} -i + COMMENT ${CCOMMENT}) + endif() + unset(SRCS) + unset(CCOMMENT) +endif() + +# Include source code +# =================== + +# This function should be passed a list of all files in a target. It will automatically generate +# file groups following the directory hierarchy, so that the layout of the files in IDEs matches the +# one in the filesystem. +function(create_target_directory_groups target_name) + # Place any files that aren't in the source list in a separate group so that they don't get in + # the way. + source_group("Other Files" REGULAR_EXPRESSION ".") + + get_target_property(target_sources "${target_name}" SOURCES) + + foreach(file_name IN LISTS target_sources) + get_filename_component(dir_name "${file_name}" PATH) + # Group names use '\' as a separator even though the entire rest of CMake uses '/'... + string(REPLACE "/" "\\" group_name "${dir_name}") + source_group("${group_name}" FILES "${file_name}") + endforeach() +endfunction() + +# Prevent boost from linking against libs when building +target_link_libraries(Boost::headers INTERFACE Boost::disable_autolinking) +# Adjustments for MSVC + Ninja +if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja") + add_compile_options( + /wd4464 # relative include path contains '..' + /wd4711 # function 'function' selected for automatic inline expansion + /wd4820 # 'bytes' bytes padding added after construct 'member_name' + ) +endif() + +if (YUZU_USE_FASTER_LD AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + # We will assume that if the compiler is GCC, it will attempt to use ld.bfd by default. + # Try to pick a faster linker. + find_program(LLD lld) + find_program(MOLD mold) + + if (MOLD AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1") + message(NOTICE "Selecting mold as linker") + add_link_options("-fuse-ld=mold") + elseif (LLD) + message(NOTICE "Selecting lld as linker") + add_link_options("-fuse-ld=lld") + endif() +endif() + +add_subdirectory(externals) +add_subdirectory(src) + +# Set yuzu project or yuzu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not +if(ENABLE_QT) + set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu) +else() + set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu-cmd) +endif() + + +# Installation instructions +# ========================= + +# Install freedesktop.org metadata files, following those specifications: +# https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html +# https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html +# https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html +# https://www.freedesktop.org/software/appstream/docs/ +if(ENABLE_QT AND UNIX AND NOT APPLE) + install(FILES "dist/org.yuzu_emu.yuzu.desktop" + DESTINATION "share/applications") + install(FILES "dist/yuzu.svg" + DESTINATION "share/icons/hicolor/scalable/apps" + RENAME "org.yuzu_emu.yuzu.svg") + install(FILES "dist/org.yuzu_emu.yuzu.xml" + DESTINATION "share/mime/packages") + install(FILES "dist/org.yuzu_emu.yuzu.metainfo.xml" + DESTINATION "share/metainfo") +endif() diff --git a/CMakeModules/CopyYuzuFFmpegDeps.cmake b/CMakeModules/CopyYuzuFFmpegDeps.cmake new file mode 100644 index 0000000..e50696c --- /dev/null +++ b/CMakeModules/CopyYuzuFFmpegDeps.cmake @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2020 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +function(copy_yuzu_FFmpeg_deps target_dir) + include(WindowsCopyFiles) + set(DLL_DEST "$/") + file(READ "${FFmpeg_PATH}/requirements.txt" FFmpeg_REQUIRED_DLLS) + string(STRIP "${FFmpeg_REQUIRED_DLLS}" FFmpeg_REQUIRED_DLLS) + windows_copy_files(${target_dir} ${FFmpeg_LIBRARY_DIR} ${DLL_DEST} ${FFmpeg_REQUIRED_DLLS}) +endfunction(copy_yuzu_FFmpeg_deps) diff --git a/CMakeModules/CopyYuzuQt5Deps.cmake b/CMakeModules/CopyYuzuQt5Deps.cmake new file mode 100644 index 0000000..b3a65c3 --- /dev/null +++ b/CMakeModules/CopyYuzuQt5Deps.cmake @@ -0,0 +1,125 @@ +# SPDX-FileCopyrightText: 2016 Citra Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +function(copy_yuzu_Qt5_deps target_dir) + include(WindowsCopyFiles) + if (MSVC) + set(DLL_DEST "$/") + set(Qt5_DLL_DIR "${Qt5_DIR}/../../../bin") + else() + set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/") + set(Qt5_DLL_DIR "${Qt5_DIR}/../../../lib/") + endif() + set(Qt5_PLATFORMS_DIR "${Qt5_DIR}/../../../plugins/platforms/") + set(Qt5_PLATFORMTHEMES_DIR "${Qt5_DIR}/../../../plugins/platformthemes/") + set(Qt5_PLATFORMINPUTCONTEXTS_DIR "${Qt5_DIR}/../../../plugins/platforminputcontexts/") + set(Qt5_MEDIASERVICE_DIR "${Qt5_DIR}/../../../plugins/mediaservice/") + set(Qt5_XCBGLINTEGRATIONS_DIR "${Qt5_DIR}/../../../plugins/xcbglintegrations/") + set(Qt5_STYLES_DIR "${Qt5_DIR}/../../../plugins/styles/") + set(Qt5_IMAGEFORMATS_DIR "${Qt5_DIR}/../../../plugins/imageformats/") + set(Qt5_RESOURCES_DIR "${Qt5_DIR}/../../../resources/") + set(PLATFORMS ${DLL_DEST}plugins/platforms/) + set(MEDIASERVICE ${DLL_DEST}mediaservice/) + set(STYLES ${DLL_DEST}plugins/styles/) + set(IMAGEFORMATS ${DLL_DEST}plugins/imageformats/) + if (MSVC) + windows_copy_files(${target_dir} ${Qt5_DLL_DIR} ${DLL_DEST} + Qt5Core$<$:d>.* + Qt5Gui$<$:d>.* + Qt5Widgets$<$:d>.* + Qt5Network$<$:d>.* + ) + if (YUZU_USE_QT_MULTIMEDIA) + windows_copy_files(${target_dir} ${Qt5_DLL_DIR} ${DLL_DEST} + Qt5Multimedia$<$:d>.* + ) + endif() + if (YUZU_USE_QT_WEB_ENGINE) + windows_copy_files(${target_dir} ${Qt5_DLL_DIR} ${DLL_DEST} + Qt5Network$<$:d>.* + Qt5Positioning$<$:d>.* + Qt5PrintSupport$<$:d>.* + Qt5Qml$<$:d>.* + Qt5QmlModels$<$:d>.* + Qt5Quick$<$:d>.* + Qt5QuickWidgets$<$:d>.* + Qt5WebChannel$<$:d>.* + Qt5WebEngineCore$<$:d>.* + Qt5WebEngineWidgets$<$:d>.* + QtWebEngineProcess$<$:d>.* + ) + + windows_copy_files(${target_dir} ${Qt5_RESOURCES_DIR} ${DLL_DEST} + icudtl.dat + qtwebengine_devtools_resources.pak + qtwebengine_resources.pak + qtwebengine_resources_100p.pak + qtwebengine_resources_200p.pak + ) + endif () + windows_copy_files(yuzu ${Qt5_PLATFORMS_DIR} ${PLATFORMS} qwindows$<$:d>.*) + windows_copy_files(yuzu ${Qt5_STYLES_DIR} ${STYLES} qwindowsvistastyle$<$:d>.*) + windows_copy_files(yuzu ${Qt5_IMAGEFORMATS_DIR} ${IMAGEFORMATS} + qjpeg$<$:d>.* + qgif$<$:d>.* + ) + windows_copy_files(yuzu ${Qt5_MEDIASERVICE_DIR} ${MEDIASERVICE} + dsengine$<$:d>.* + wmfengine$<$:d>.* + ) + else() + set(Qt5_DLLS + "${Qt5_DLL_DIR}libQt5Core.so.5" + "${Qt5_DLL_DIR}libQt5DBus.so.5" + "${Qt5_DLL_DIR}libQt5Gui.so.5" + "${Qt5_DLL_DIR}libQt5Widgets.so.5" + "${Qt5_DLL_DIR}libQt5XcbQpa.so.5" + "${Qt5_DLL_DIR}libicudata.so.60" + "${Qt5_DLL_DIR}libicui18n.so.60" + "${Qt5_DLL_DIR}libicuuc.so.60" + ) + set(Qt5_IMAGEFORMAT_DLLS + "${Qt5_IMAGEFORMATS_DIR}libqjpeg.so" + "${Qt5_IMAGEFORMATS_DIR}libqgif.so" + "${Qt5_IMAGEFORMATS_DIR}libqico.so" + ) + set(Qt5_PLATFORMTHEME_DLLS + "${Qt5_PLATFORMTHEMES_DIR}libqgtk3.so" + "${Qt5_PLATFORMTHEMES_DIR}libqxdgdesktopportal.so" + ) + set(Qt5_PLATFORM_DLLS + "${Qt5_PLATFORMS_DIR}libqxcb.so" + ) + set(Qt5_PLATFORMINPUTCONTEXT_DLLS + "${Qt5_PLATFORMINPUTCONTEXTS_DIR}libcomposeplatforminputcontextplugin.so" + "${Qt5_PLATFORMINPUTCONTEXTS_DIR}libibusplatforminputcontextplugin.so" + ) + set(Qt5_XCBGLINTEGRATION_DLLS + "${Qt5_XCBGLINTEGRATIONS_DIR}libqxcb-glx-integration.so" + ) + foreach(LIB ${Qt5_DLLS}) + file(COPY ${LIB} DESTINATION "${DLL_DEST}/lib" FOLLOW_SYMLINK_CHAIN) + endforeach() + foreach(LIB ${Qt5_IMAGEFORMAT_DLLS}) + file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/imageformats/" FOLLOW_SYMLINK_CHAIN) + endforeach() + foreach(LIB ${Qt5_PLATFORMTHEME_DLLS}) + file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/platformthemes/" FOLLOW_SYMLINK_CHAIN) + endforeach() + foreach(LIB ${Qt5_PLATFORM_DLLS}) + file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/platforms/" FOLLOW_SYMLINK_CHAIN) + endforeach() + foreach(LIB ${Qt5_PLATFORMINPUTCONTEXT_DLLS}) + file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/platforminputcontexts/" FOLLOW_SYMLINK_CHAIN) + endforeach() + foreach(LIB ${Qt5_XCBGLINTEGRATION_DLLS}) + file(COPY ${LIB} DESTINATION "${DLL_DEST}plugins/xcbglintegrations/" FOLLOW_SYMLINK_CHAIN) + endforeach() + + endif() + # Create an empty qt.conf file. Qt will detect that this file exists, and use the folder that its in as the root folder. + # This way it'll look for plugins in the root/plugins/ folder + add_custom_command(TARGET yuzu POST_BUILD + COMMAND ${CMAKE_COMMAND} -E touch ${DLL_DEST}qt.conf + ) +endfunction(copy_yuzu_Qt5_deps) diff --git a/CMakeModules/CopyYuzuSDLDeps.cmake b/CMakeModules/CopyYuzuSDLDeps.cmake new file mode 100644 index 0000000..464eed5 --- /dev/null +++ b/CMakeModules/CopyYuzuSDLDeps.cmake @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: 2016 Citra Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +function(copy_yuzu_SDL_deps target_dir) + include(WindowsCopyFiles) + set(DLL_DEST "$/") + windows_copy_files(${target_dir} ${SDL2_DLL_DIR} ${DLL_DEST} SDL2.dll) +endfunction(copy_yuzu_SDL_deps) diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake new file mode 100644 index 0000000..d22e021 --- /dev/null +++ b/CMakeModules/DownloadExternals.cmake @@ -0,0 +1,56 @@ +# SPDX-FileCopyrightText: 2017 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +# This function downloads a binary library package from our external repo. +# Params: +# remote_path: path to the file to download, relative to the remote repository root +# prefix_var: name of a variable which will be set with the path to the extracted contents +function(download_bundled_external remote_path lib_name prefix_var) + +set(package_base_url "https://github.com/yuzu-mirror/") +set(package_repo "no_platform") +set(package_extension "no_platform") +if (WIN32) + set(package_repo "ext-windows-bin/raw/master/") + set(package_extension ".7z") +elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + set(package_repo "ext-linux-bin/raw/main/") + set(package_extension ".tar.xz") +elseif (ANDROID) + set(package_repo "ext-android-bin/raw/main/") + set(package_extension ".tar.xz") +else() + message(FATAL_ERROR "No package available for this platform") +endif() +set(package_url "${package_base_url}${package_repo}") + +set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}") +if (NOT EXISTS "${prefix}") + message(STATUS "Downloading binaries for ${lib_name}...") + file(DOWNLOAD + ${package_url}${remote_path}${lib_name}${package_extension} + "${CMAKE_BINARY_DIR}/externals/${lib_name}${package_extension}" SHOW_PROGRESS) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${CMAKE_BINARY_DIR}/externals/${lib_name}${package_extension}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") +endif() +message(STATUS "Using bundled binaries at ${prefix}") +set(${prefix_var} "${prefix}" PARENT_SCOPE) +endfunction() + +function(download_moltenvk_external platform version) + set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK") + set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar") + if (NOT EXISTS ${MOLTENVK_DIR}) + if (NOT EXISTS ${MOLTENVK_TAR}) + file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/${version}/MoltenVK-${platform}.tar + ${MOLTENVK_TAR} SHOW_PROGRESS) + endif() + + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") + endif() + + # Add the MoltenVK library path to the prefix so find_library can locate it. + list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}") + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) +endfunction() diff --git a/CMakeModules/FindDiscordRPC.cmake b/CMakeModules/FindDiscordRPC.cmake new file mode 100644 index 0000000..44ca990 --- /dev/null +++ b/CMakeModules/FindDiscordRPC.cmake @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: 2022 Alexandre Bouvier +# +# SPDX-License-Identifier: GPL-3.0-or-later + +find_path(DiscordRPC_INCLUDE_DIR discord_rpc.h) + +find_library(DiscordRPC_LIBRARY discord-rpc) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(DiscordRPC + REQUIRED_VARS + DiscordRPC_LIBRARY + DiscordRPC_INCLUDE_DIR +) + +if (DiscordRPC_FOUND AND NOT TARGET DiscordRPC::discord-rpc) + add_library(DiscordRPC::discord-rpc UNKNOWN IMPORTED) + set_target_properties(DiscordRPC::discord-rpc PROPERTIES + IMPORTED_LOCATION "${DiscordRPC_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${DiscordRPC_INCLUDE_DIR}" + ) +endif() + +mark_as_advanced( + DiscordRPC_INCLUDE_DIR + DiscordRPC_LIBRARY +) diff --git a/CMakeModules/FindFFmpeg.cmake b/CMakeModules/FindFFmpeg.cmake new file mode 100644 index 0000000..5cb1f3c --- /dev/null +++ b/CMakeModules/FindFFmpeg.cmake @@ -0,0 +1,195 @@ +# SPDX-FileCopyrightText: 2019 Citra Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +# FindFFmpeg +# ---------- +# +# Find the native FFmpeg includes and libraries +# +# This module defines the following variables: +# +# FFmpeg_INCLUDE_: where to find .h +# FFmpeg_LIBRARY_: where to find the library +# FFmpeg_INCLUDE_DIR: aggregate all the include paths +# FFmpeg_LIBRARIES: aggregate all the paths to the libraries +# FFmpeg_FOUND: True if all components have been found +# +# This module defines the following targets, which are preferred over variables: +# +# FFmpeg::: Target to use directly, with include path, +# library and dependencies set up. If you are using a static build, you are +# responsible for adding any external dependencies (such as zlib, bzlib...). +# +# can be one of: +# avcodec +# avdevice +# avfilter +# avformat +# avutil +# postproc +# swresample +# swscale +# + +set(_FFmpeg_ALL_COMPONENTS + avcodec + avdevice + avfilter + avformat + avutil + postproc + swresample + swscale +) + +set(_FFmpeg_DEPS_avcodec avutil) +set(_FFmpeg_DEPS_avdevice avcodec avformat avutil) +set(_FFmpeg_DEPS_avfilter avutil) +set(_FFmpeg_DEPS_avformat avcodec avutil) +set(_FFmpeg_DEPS_postproc avutil) +set(_FFmpeg_DEPS_swresample avutil) +set(_FFmpeg_DEPS_swscale avutil) + +function(find_ffmpeg LIBNAME) + if(DEFINED ENV{FFMPEG_DIR}) + set(FFMPEG_DIR $ENV{FFMPEG_DIR}) + endif() + + if(FFMPEG_DIR) + list(APPEND INCLUDE_PATHS + ${FFMPEG_DIR} + ${FFMPEG_DIR}/ffmpeg + ${FFMPEG_DIR}/lib${LIBNAME} + ${FFMPEG_DIR}/include/lib${LIBNAME} + ${FFMPEG_DIR}/include/ffmpeg + ${FFMPEG_DIR}/include + NO_DEFAULT_PATH + NO_CMAKE_FIND_ROOT_PATH + ) + list(APPEND LIB_PATHS + ${FFMPEG_DIR} + ${FFMPEG_DIR}/lib + ${FFMPEG_DIR}/lib${LIBNAME} + NO_DEFAULT_PATH + NO_CMAKE_FIND_ROOT_PATH + ) + else() + list(APPEND INCLUDE_PATHS + /usr/local/include/ffmpeg + /usr/local/include/lib${LIBNAME} + /usr/include/ffmpeg + /usr/include/lib${LIBNAME} + /usr/include/ffmpeg/lib${LIBNAME} + ) + + list(APPEND LIB_PATHS + /usr/local/lib + /usr/lib + ) + endif() + + find_path(FFmpeg_INCLUDE_${LIBNAME} lib${LIBNAME}/${LIBNAME}.h + HINTS ${INCLUDE_PATHS} + ) + + find_library(FFmpeg_LIBRARY_${LIBNAME} ${LIBNAME} + HINTS ${LIB_PATHS} + ) + + if(NOT FFMPEG_DIR AND (NOT FFmpeg_LIBRARY_${LIBNAME} OR NOT FFmpeg_INCLUDE_${LIBNAME})) + # Didn't find it in the usual paths, try pkg-config + find_package(PkgConfig QUIET) + pkg_check_modules(FFmpeg_PKGCONFIG_${LIBNAME} QUIET lib${LIBNAME}) + + find_path(FFmpeg_INCLUDE_${LIBNAME} lib${LIBNAME}/${LIBNAME}.h + ${FFmpeg_PKGCONFIG_${LIBNAME}_INCLUDE_DIRS} + ) + + find_library(FFmpeg_LIBRARY_${LIBNAME} ${LIBNAME} + ${FFmpeg_PKGCONFIG_${LIBNAME}_LIBRARY_DIRS} + ) + endif() + + if(FFmpeg_INCLUDE_${LIBNAME} AND FFmpeg_LIBRARY_${LIBNAME}) + set(FFmpeg_INCLUDE_${LIBNAME} "${FFmpeg_INCLUDE_${LIBNAME}}" PARENT_SCOPE) + set(FFmpeg_LIBRARY_${LIBNAME} "${FFmpeg_LIBRARY_${LIBNAME}}" PARENT_SCOPE) + + # Extract FFmpeg version from version.h + foreach(v MAJOR MINOR MICRO) + set(FFmpeg_${LIBNAME}_VERSION_${v} 0) + endforeach() + string(TOUPPER ${LIBNAME} LIBNAME_UPPER) + file(STRINGS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version.h" _FFmpeg_VERSION_H_CONTENTS REGEX "#define LIB${LIBNAME_UPPER}_VERSION_(MAJOR|MINOR|MICRO) ") + set(_FFmpeg_VERSION_REGEX "([0-9]+)") + foreach(v MAJOR MINOR MICRO) + if("${_FFmpeg_VERSION_H_CONTENTS}" MATCHES "#define LIB${LIBNAME_UPPER}_VERSION_${v}[\\t ]+${_FFmpeg_VERSION_REGEX}") + set(FFmpeg_${LIBNAME}_VERSION_${v} "${CMAKE_MATCH_1}") + endif() + endforeach() + set(FFmpeg_${LIBNAME}_VERSION "${FFmpeg_${LIBNAME}_VERSION_MAJOR}.${FFmpeg_${LIBNAME}_VERSION_MINOR}.${FFmpeg_${LIBNAME}_VERSION_MICRO}") + set(FFmpeg_${c}_VERSION "${FFmpeg_${LIBNAME}_VERSION}" PARENT_SCOPE) + unset(_FFmpeg_VERSION_REGEX) + unset(_FFmpeg_VERSION_H_CONTENTS) + + set(FFmpeg_${c}_FOUND TRUE PARENT_SCOPE) + if(NOT FFmpeg_FIND_QUIETLY) + message("-- Found ${LIBNAME}: ${FFmpeg_INCLUDE_${LIBNAME}} ${FFmpeg_LIBRARY_${LIBNAME}} (version: ${FFmpeg_${LIBNAME}_VERSION})") + endif() + endif() +endfunction() + +foreach(c ${_FFmpeg_ALL_COMPONENTS}) + find_ffmpeg(${c}) +endforeach() + +foreach(c ${_FFmpeg_ALL_COMPONENTS}) + if(FFmpeg_${c}_FOUND) + list(APPEND FFmpeg_INCLUDE_DIR ${FFmpeg_INCLUDE_${c}}) + list(APPEND FFmpeg_LIBRARIES ${FFmpeg_LIBRARY_${c}}) + + add_library(FFmpeg::${c} IMPORTED UNKNOWN) + set_target_properties(FFmpeg::${c} PROPERTIES + IMPORTED_LOCATION ${FFmpeg_LIBRARY_${c}} + INTERFACE_INCLUDE_DIRECTORIES ${FFmpeg_INCLUDE_${c}} + ) + if(_FFmpeg_DEPS_${c}) + set(deps) + foreach(dep ${_FFmpeg_DEPS_${c}}) + list(APPEND deps FFmpeg::${dep}) + endforeach() + + set_target_properties(FFmpeg::${c} PROPERTIES + INTERFACE_LINK_LIBRARIES "${deps}" + ) + unset(deps) + endif() + endif() +endforeach() + +if(FFmpeg_INCLUDE_DIR) + list(REMOVE_DUPLICATES FFmpeg_INCLUDE_DIR) +endif() + +foreach(c ${FFmpeg_FIND_COMPONENTS}) + list(APPEND _FFmpeg_REQUIRED_VARS FFmpeg_INCLUDE_${c} FFmpeg_LIBRARY_${c}) +endforeach() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(FFmpeg + REQUIRED_VARS ${_FFmpeg_REQUIRED_VARS} + HANDLE_COMPONENTS +) + +foreach(c ${_FFmpeg_ALL_COMPONENTS}) + unset(_FFmpeg_DEPS_${c}) +endforeach() +unset(_FFmpeg_ALL_COMPONENTS) +unset(_FFmpeg_REQUIRED_VARS) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(FFmpeg + REQUIRED_VARS + FFmpeg_LIBRARIES + FFmpeg_INCLUDE_DIR + HANDLE_COMPONENTS +) diff --git a/CMakeModules/FindLLVM.cmake b/CMakeModules/FindLLVM.cmake new file mode 100644 index 0000000..efbd0ca --- /dev/null +++ b/CMakeModules/FindLLVM.cmake @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: 2023 Alexandre Bouvier +# +# SPDX-License-Identifier: GPL-3.0-or-later + +find_package(LLVM QUIET COMPONENTS CONFIG) +if (LLVM_FOUND) + separate_arguments(LLVM_DEFINITIONS) + if (LLVMDemangle IN_LIST LLVM_AVAILABLE_LIBS) + set(LLVM_Demangle_FOUND TRUE) + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LLVM HANDLE_COMPONENTS CONFIG_MODE) + +if (LLVM_FOUND AND LLVM_Demangle_FOUND AND NOT TARGET LLVM::Demangle) + add_library(LLVM::Demangle INTERFACE IMPORTED) + target_compile_definitions(LLVM::Demangle INTERFACE ${LLVM_DEFINITIONS}) + target_include_directories(LLVM::Demangle INTERFACE ${LLVM_INCLUDE_DIRS}) + # prefer shared LLVM: https://github.com/llvm/llvm-project/issues/34593 + # but use ugly hack because llvm_config doesn't support interface library + add_library(_dummy_lib SHARED EXCLUDE_FROM_ALL src/yuzu/main.cpp) + llvm_config(_dummy_lib USE_SHARED demangle) + get_target_property(LLVM_LIBRARIES _dummy_lib LINK_LIBRARIES) + target_link_libraries(LLVM::Demangle INTERFACE ${LLVM_LIBRARIES}) +endif() diff --git a/CMakeModules/FindOpus.cmake b/CMakeModules/FindOpus.cmake new file mode 100644 index 0000000..25a44fd --- /dev/null +++ b/CMakeModules/FindOpus.cmake @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +find_package(PkgConfig QUIET) +pkg_search_module(OPUS QUIET IMPORTED_TARGET opus) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Opus + REQUIRED_VARS OPUS_LINK_LIBRARIES + VERSION_VAR OPUS_VERSION +) + +if (Opus_FOUND AND NOT TARGET Opus::opus) + add_library(Opus::opus ALIAS PkgConfig::OPUS) +endif() diff --git a/CMakeModules/FindRenderDoc.cmake b/CMakeModules/FindRenderDoc.cmake new file mode 100644 index 0000000..2678b93 --- /dev/null +++ b/CMakeModules/FindRenderDoc.cmake @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2023 Alexandre Bouvier +# +# SPDX-License-Identifier: GPL-3.0-or-later + +find_path(RenderDoc_INCLUDE_DIR renderdoc_app.h) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(RenderDoc + REQUIRED_VARS RenderDoc_INCLUDE_DIR +) + +if (RenderDoc_FOUND AND NOT TARGET RenderDoc::API) + add_library(RenderDoc::API INTERFACE IMPORTED) + set_target_properties(RenderDoc::API PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${RenderDoc_INCLUDE_DIR}" + ) +endif() + +mark_as_advanced(RenderDoc_INCLUDE_DIR) diff --git a/CMakeModules/FindSimpleIni.cmake b/CMakeModules/FindSimpleIni.cmake new file mode 100644 index 0000000..13426b2 --- /dev/null +++ b/CMakeModules/FindSimpleIni.cmake @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2023 Alexandre Bouvier +# +# SPDX-License-Identifier: GPL-3.0-or-later + +include(FindPackageHandleStandardArgs) + +find_package(SimpleIni QUIET CONFIG) +if (SimpleIni_CONSIDERED_CONFIGS) + find_package_handle_standard_args(SimpleIni CONFIG_MODE) +else() + find_package(PkgConfig QUIET) + pkg_search_module(SIMPLEINI QUIET IMPORTED_TARGET simpleini) + find_package_handle_standard_args(SimpleIni + REQUIRED_VARS SIMPLEINI_INCLUDEDIR + VERSION_VAR SIMPLEINI_VERSION + ) +endif() + +if (SimpleIni_FOUND AND NOT TARGET SimpleIni::SimpleIni) + add_library(SimpleIni::SimpleIni ALIAS PkgConfig::SIMPLEINI) +endif() diff --git a/CMakeModules/Findenet.cmake b/CMakeModules/Findenet.cmake new file mode 100644 index 0000000..859a6f3 --- /dev/null +++ b/CMakeModules/Findenet.cmake @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: 2022 Alexandre Bouvier +# +# SPDX-License-Identifier: GPL-3.0-or-later + +find_package(PkgConfig QUIET) +pkg_search_module(ENET QUIET IMPORTED_TARGET libenet) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(enet + REQUIRED_VARS ENET_LINK_LIBRARIES + VERSION_VAR ENET_VERSION +) + +if (enet_FOUND AND NOT TARGET enet::enet) + add_library(enet::enet ALIAS PkgConfig::ENET) +endif() diff --git a/CMakeModules/Findgamemode.cmake b/CMakeModules/Findgamemode.cmake new file mode 100644 index 0000000..aa2f366 --- /dev/null +++ b/CMakeModules/Findgamemode.cmake @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +find_package(PkgConfig QUIET) +pkg_search_module(GAMEMODE QUIET IMPORTED_TARGET gamemode) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(gamemode + REQUIRED_VARS GAMEMODE_INCLUDEDIR + VERSION_VAR GAMEMODE_VERSION +) + +if (gamemode_FOUND AND NOT TARGET gamemode::headers) + add_library(gamemode::headers ALIAS PkgConfig::GAMEMODE) +endif() diff --git a/CMakeModules/Findhttplib.cmake b/CMakeModules/Findhttplib.cmake new file mode 100644 index 0000000..48967ad --- /dev/null +++ b/CMakeModules/Findhttplib.cmake @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: 2022 Andrea Pappacoda +# +# SPDX-License-Identifier: GPL-2.0-or-later + +include(FindPackageHandleStandardArgs) + +find_package(httplib QUIET CONFIG) +if (httplib_CONSIDERED_CONFIGS) + find_package_handle_standard_args(httplib HANDLE_COMPONENTS CONFIG_MODE) +else() + find_package(PkgConfig QUIET) + pkg_search_module(HTTPLIB QUIET IMPORTED_TARGET cpp-httplib) + if ("-DCPPHTTPLIB_OPENSSL_SUPPORT" IN_LIST HTTPLIB_CFLAGS_OTHER) + set(httplib_OpenSSL_FOUND TRUE) + endif() + if ("-DCPPHTTPLIB_ZLIB_SUPPORT" IN_LIST HTTPLIB_CFLAGS_OTHER) + set(httplib_ZLIB_FOUND TRUE) + endif() + if ("-DCPPHTTPLIB_BROTLI_SUPPORT" IN_LIST HTTPLIB_CFLAGS_OTHER) + set(httplib_Brotli_FOUND TRUE) + endif() + find_package_handle_standard_args(httplib + REQUIRED_VARS HTTPLIB_INCLUDEDIR + VERSION_VAR HTTPLIB_VERSION + HANDLE_COMPONENTS + ) +endif() + +if (httplib_FOUND AND NOT TARGET httplib::httplib) + add_library(httplib::httplib ALIAS PkgConfig::HTTPLIB) +endif() diff --git a/CMakeModules/Findlibusb.cmake b/CMakeModules/Findlibusb.cmake new file mode 100644 index 0000000..0eadce9 --- /dev/null +++ b/CMakeModules/Findlibusb.cmake @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: 2022 Alexandre Bouvier +# +# SPDX-License-Identifier: GPL-3.0-or-later + +find_package(PkgConfig QUIET) +pkg_search_module(LIBUSB QUIET IMPORTED_TARGET libusb-1.0) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(libusb + REQUIRED_VARS LIBUSB_LINK_LIBRARIES + VERSION_VAR LIBUSB_VERSION +) + +if (libusb_FOUND AND NOT TARGET libusb::usb) + add_library(libusb::usb ALIAS PkgConfig::LIBUSB) +endif() diff --git a/CMakeModules/Findlz4.cmake b/CMakeModules/Findlz4.cmake new file mode 100644 index 0000000..7a9a02d --- /dev/null +++ b/CMakeModules/Findlz4.cmake @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +include(FindPackageHandleStandardArgs) + +find_package(lz4 QUIET CONFIG) +if (lz4_CONSIDERED_CONFIGS) + find_package_handle_standard_args(lz4 CONFIG_MODE) +else() + find_package(PkgConfig QUIET) + pkg_search_module(LZ4 QUIET IMPORTED_TARGET liblz4) + find_package_handle_standard_args(lz4 + REQUIRED_VARS LZ4_LINK_LIBRARIES + VERSION_VAR LZ4_VERSION + ) +endif() + +if (lz4_FOUND AND NOT TARGET lz4::lz4) + if (TARGET LZ4::lz4_shared) + add_library(lz4::lz4 ALIAS LZ4::lz4_shared) + elseif (TARGET LZ4::lz4_static) + add_library(lz4::lz4 ALIAS LZ4::lz4_static) + else() + add_library(lz4::lz4 ALIAS PkgConfig::LZ4) + endif() +endif() diff --git a/CMakeModules/Findstb.cmake b/CMakeModules/Findstb.cmake new file mode 100644 index 0000000..bff9985 --- /dev/null +++ b/CMakeModules/Findstb.cmake @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: 2023 Alexandre Bouvier +# +# SPDX-License-Identifier: GPL-3.0-or-later + +find_path(stb_image_INCLUDE_DIR stb_image.h PATH_SUFFIXES stb) +find_path(stb_image_resize_INCLUDE_DIR stb_image_resize.h PATH_SUFFIXES stb) +find_path(stb_image_write_INCLUDE_DIR stb_image_write.h PATH_SUFFIXES stb) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(stb + REQUIRED_VARS + stb_image_INCLUDE_DIR + stb_image_resize_INCLUDE_DIR + stb_image_write_INCLUDE_DIR +) + +if (stb_FOUND AND NOT TARGET stb::headers) + add_library(stb::headers INTERFACE IMPORTED) + set_property(TARGET stb::headers PROPERTY + INTERFACE_INCLUDE_DIRECTORIES + "${stb_image_INCLUDE_DIR}" + "${stb_image_resize_INCLUDE_DIR}" + "${stb_image_write_INCLUDE_DIR}" + ) +endif() + +mark_as_advanced( + stb_image_INCLUDE_DIR + stb_image_resize_INCLUDE_DIR + stb_image_write_INCLUDE_DIR +) diff --git a/CMakeModules/Findzstd.cmake b/CMakeModules/Findzstd.cmake new file mode 100644 index 0000000..ae3ea08 --- /dev/null +++ b/CMakeModules/Findzstd.cmake @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +include(FindPackageHandleStandardArgs) + +find_package(zstd QUIET CONFIG) +if (zstd_CONSIDERED_CONFIGS) + find_package_handle_standard_args(zstd CONFIG_MODE) +else() + find_package(PkgConfig QUIET) + pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd) + find_package_handle_standard_args(zstd + REQUIRED_VARS ZSTD_LINK_LIBRARIES + VERSION_VAR ZSTD_VERSION + ) +endif() + +if (zstd_FOUND AND NOT TARGET zstd::zstd) + if (TARGET zstd::libzstd_shared) + add_library(zstd::zstd ALIAS zstd::libzstd_shared) + elseif (TARGET zstd::libzstd_static) + add_library(zstd::zstd ALIAS zstd::libzstd_static) + else() + add_library(zstd::zstd ALIAS PkgConfig::ZSTD) + endif() +endif() diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake new file mode 100644 index 0000000..1d4aa97 --- /dev/null +++ b/CMakeModules/GenerateSCMRev.cmake @@ -0,0 +1,56 @@ +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +# Gets a UTC timestamp and sets the provided variable to it +function(get_timestamp _var) + string(TIMESTAMP timestamp UTC) + set(${_var} "${timestamp}" PARENT_SCOPE) +endfunction() + +# generate git/build information +include(GetGitRevisionDescription) +if(NOT GIT_REF_SPEC) + get_git_head_revision(GIT_REF_SPEC GIT_REV) +endif() +if(NOT GIT_DESC) + git_describe(GIT_DESC --always --long --dirty) +endif() +if (NOT GIT_BRANCH) + git_branch_name(GIT_BRANCH) +endif() +get_timestamp(BUILD_DATE) + +# Generate cpp with Git revision from template +# Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well +set(REPO_NAME "") +set(BUILD_VERSION "0") +set(BUILD_ID ${DISPLAY_VERSION}) +if (BUILD_REPOSITORY) + # regex capture the string nightly or canary into CMAKE_MATCH_1 + string(REGEX MATCH "yuzu-emu/yuzu-?(.*)" OUTVAR ${BUILD_REPOSITORY}) + if ("${CMAKE_MATCH_COUNT}" GREATER 0) + # capitalize the first letter of each word in the repo name. + string(REPLACE "-" ";" REPO_NAME_LIST ${CMAKE_MATCH_1}) + foreach(WORD ${REPO_NAME_LIST}) + string(SUBSTRING ${WORD} 0 1 FIRST_LETTER) + string(SUBSTRING ${WORD} 1 -1 REMAINDER) + string(TOUPPER ${FIRST_LETTER} FIRST_LETTER) + set(REPO_NAME "${REPO_NAME}${FIRST_LETTER}${REMAINDER}") + endforeach() + if (BUILD_TAG) + string(REGEX MATCH "${CMAKE_MATCH_1}-([0-9]+)" OUTVAR ${BUILD_TAG}) + if (${CMAKE_MATCH_COUNT} GREATER 0) + set(BUILD_VERSION ${CMAKE_MATCH_1}) + endif() + if (BUILD_VERSION) + # This leaves a trailing space on the last word, but we actually want that + # because of how it's styled in the title bar. + set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ") + else() + set(BUILD_FULLNAME "") + endif() + endif() + endif() +endif() + +configure_file(scm_rev.cpp.in scm_rev.cpp @ONLY) diff --git a/CMakeModules/MSVCCache.cmake b/CMakeModules/MSVCCache.cmake new file mode 100644 index 0000000..ba0d22d --- /dev/null +++ b/CMakeModules/MSVCCache.cmake @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# buildcache wrapper +OPTION(USE_CCACHE "Use buildcache for compilation" OFF) +IF(USE_CCACHE) + FIND_PROGRAM(CCACHE buildcache) + IF (CCACHE) + MESSAGE(STATUS "Using buildcache found in PATH") + SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) + SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) + ELSE(CCACHE) + MESSAGE(WARNING "USE_CCACHE enabled, but no buildcache executable found") + ENDIF(CCACHE) +ENDIF(USE_CCACHE) diff --git a/CMakeModules/MinGWClangCross.cmake b/CMakeModules/MinGWClangCross.cmake new file mode 100644 index 0000000..286a59a --- /dev/null +++ b/CMakeModules/MinGWClangCross.cmake @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +set(MINGW_PREFIX /usr/x86_64-w64-mingw32/) +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86_64) + +set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX}) +set(SDL2_PATH ${MINGW_PREFIX}) +set(MINGW_TOOL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-) + +# Specify the cross compiler +set(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}clang) +set(CMAKE_CXX_COMPILER ${MINGW_TOOL_PREFIX}clang++) +set(CMAKE_RC_COMPILER ${MINGW_TOOL_PREFIX}windres) +set(CMAKE_C_COMPILER_AR ${MINGW_TOOL_PREFIX}ar) +set(CMAKE_CXX_COMPILER_AR ${MINGW_TOOL_PREFIX}ar) +set(CMAKE_C_COMPILER_RANLIB ${MINGW_TOOL_PREFIX}ranlib) +set(CMAKE_CXX_COMPILER_RANLIB ${MINGW_TOOL_PREFIX}ranlib) + +# Mingw tools +set(STRIP ${MINGW_TOOL_PREFIX}strip) +set(WINDRES ${MINGW_TOOL_PREFIX}windres) +set(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config) + +# ccache wrapper +option(USE_CCACHE "Use ccache for compilation" OFF) +if(USE_CCACHE) + find_program(CCACHE ccache) + if(CCACHE) + message(STATUS "Using ccache found in PATH") + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) + set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) + else(CCACHE) + message(WARNING "USE_CCACHE enabled, but no ccache found") + endif(CCACHE) +endif(USE_CCACHE) + +# Search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + + +# Echo modified cmake vars to screen for debugging purposes +if(NOT DEFINED ENV{MINGW_DEBUG_INFO}) + message("") + message("Custom cmake vars: (blank = system default)") + message("-----------------------------------------") + message("* CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}") + message("* CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}") + message("* CMAKE_RC_COMPILER : ${CMAKE_RC_COMPILER}") + message("* WINDRES : ${WINDRES}") + message("* ENV{PKG_CONFIG} : $ENV{PKG_CONFIG}") + message("* STRIP : ${STRIP}") + message("* USE_CCACHE : ${USE_CCACHE}") + message("") + # So that the debug info only appears once + set(ENV{MINGW_DEBUG_INFO} SHOWN) +endif() diff --git a/CMakeModules/MinGWCross.cmake b/CMakeModules/MinGWCross.cmake new file mode 100644 index 0000000..61464f7 --- /dev/null +++ b/CMakeModules/MinGWCross.cmake @@ -0,0 +1,57 @@ +# SPDX-FileCopyrightText: 2018 tech4me +# SPDX-License-Identifier: GPL-2.0-or-later + +set(MINGW_PREFIX /usr/x86_64-w64-mingw32/) +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86_64) +# Actually a hack, w/o this will cause some strange errors +set(CMAKE_HOST_WIN32 TRUE) + + +set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX}) +set(SDL2_PATH ${MINGW_PREFIX}) +set(MINGW_TOOL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-) + +# Specify the cross compiler +set(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}gcc) +set(CMAKE_CXX_COMPILER ${MINGW_TOOL_PREFIX}g++) +set(CMAKE_RC_COMPILER ${MINGW_TOOL_PREFIX}windres) + +# Mingw tools +set(STRIP ${MINGW_TOOL_PREFIX}strip) +set(WINDRES ${MINGW_TOOL_PREFIX}windres) +set(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config) + +# ccache wrapper +option(USE_CCACHE "Use ccache for compilation" OFF) +if(USE_CCACHE) + find_program(CCACHE ccache) + if(CCACHE) + message(STATUS "Using ccache found in PATH") + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) + set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) + else(CCACHE) + message(WARNING "USE_CCACHE enabled, but no ccache found") + endif(CCACHE) +endif(USE_CCACHE) + +# Search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + + +# Echo modified cmake vars to screen for debugging purposes +if(NOT DEFINED ENV{MINGW_DEBUG_INFO}) + message("") + message("Custom cmake vars: (blank = system default)") + message("-----------------------------------------") + message("* CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}") + message("* CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}") + message("* CMAKE_RC_COMPILER : ${CMAKE_RC_COMPILER}") + message("* WINDRES : ${WINDRES}") + message("* ENV{PKG_CONFIG} : $ENV{PKG_CONFIG}") + message("* STRIP : ${STRIP}") + message("* USE_CCACHE : ${USE_CCACHE}") + message("") + # So that the debug info only appears once + set(ENV{MINGW_DEBUG_INFO} SHOWN) +endif() diff --git a/CMakeModules/WindowsCopyFiles.cmake b/CMakeModules/WindowsCopyFiles.cmake new file mode 100644 index 0000000..08b5983 --- /dev/null +++ b/CMakeModules/WindowsCopyFiles.cmake @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +# This file provides the function windows_copy_files. +# This is only valid on Windows. + +# Include guard +if(__windows_copy_files) + return() +endif() +set(__windows_copy_files YES) + +# Any number of files to copy from SOURCE_DIR to DEST_DIR can be specified after DEST_DIR. +# This copying happens post-build. +function(windows_copy_files TARGET SOURCE_DIR DEST_DIR) + # windows commandline expects the / to be \ so switch them + string(REPLACE "/" "\\\\" SOURCE_DIR ${SOURCE_DIR}) + string(REPLACE "/" "\\\\" DEST_DIR ${DEST_DIR}) + + # /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output + # cmake adds an extra check for command success which doesn't work too well with robocopy + # so trick it into thinking the command was successful with the || cmd /c "exit /b 0" + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR} + COMMAND robocopy ${SOURCE_DIR} ${DEST_DIR} ${ARGN} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0" + ) +endfunction() diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..12651c2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ + + +**The Contributor's Guide has moved to [the yuzu wiki](https://github.com/yuzu-mirror/yuzu/wiki/Contributing).** diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..f91b182 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,2372 @@ +# SPDX-FileCopyrightText: 2014 Yuri Kunde Schlesner +# SPDX-License-Identifier: GPL-2.0-or-later + +# Doxyfile 1.8.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = yuzu + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Nintendo Switch emulator/debugger" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is included in +# the documentation. The maximum height of the logo should not exceed 55 pixels +# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo +# to the output directory. + +PROJECT_LOGO = dist/doc-icon.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc-build/ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a +# new page for each member. If set to NO, the documentation of a member will be +# part of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = YES + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO these classes will be included in the various overviews. This option has +# no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the +# todo list. This list is created by putting \todo commands in the +# documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the +# test list. This list is created by putting \test commands in the +# documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES the list +# will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = NO + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO doxygen will only warn about wrong or incomplete parameter +# documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT = src/ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER ) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# compiled with the --with-libclang option. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefor more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra stylesheet files is of importance (e.g. the last +# stylesheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the stylesheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated ( +# YES) or that it should be included in the master .chm file ( NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated ( +# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , / diff --git a/dist/org.yuzu_emu.yuzu.xml b/dist/org.yuzu_emu.yuzu.xml new file mode 100644 index 0000000..b774eb0 --- /dev/null +++ b/dist/org.yuzu_emu.yuzu.xml @@ -0,0 +1,39 @@ + + + + + + + Nintendo Switch homebrew executable + NRO + + + + + + + Nintendo Switch homebrew executable + NSO + + + + + + + Nintendo Switch Package + NSP + + + + + + + Nintendo Switch Card Image + XCI + + + + diff --git a/dist/qt_themes/colorful/icons/16x16/checked.png b/dist/qt_themes/colorful/icons/16x16/checked.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e64e9e083479d3ee98f767e7db0afa918733a4 GIT binary patch literal 414 zcmV;P0b%}$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0W(QNK~y+TrIVpf z13?r;rwD=qLqJlEKo|qzU|U% z7YH{wot?LH-*n!*?W6{63=b9=HldpXDUIOavAB2}Pbd180OK;l8EnJ6v6?>M298Md znj@%6fO(za9@cVTww|F+k|!rQLAmn~elmwlQut5i#`AOvzcG7+KCFVC)M57}#uu1A z^RzVYg2lZ9H(&9m2Y)p$fS#TS;;P_-ib!R82QIw{8{xmHiE zK`MLO2B{~RrD)~+Jyf?qz}_z48lon38S|YjoWBG0&(ArfFTBE5^|a!r5C8xG07*qo IM6N<$fJ%=P)0k{|sIn0V`B1xGGFnerg>I4!7^B>UM&p)aM9vQI<{ZJ4 z8HZ4p+_%{7AT1;1-`r}Q8XRRVYW9}G=D3HXRO!FFg z<>v6FfXkm66-$M=OnPPtTpl}lK!#o^J26y#00VLkV5Ig4hAIxCZ~AU@6mMaG2|$+zA&;BarDZyi@16B z4lE8kTwX8y!4LxB2>hW4yn!GbZg+WiA%P|k^Ip;o774}ts6fO6U&y7=hp3TO@-WL? z{^Mh)gLW3&bGqIiV!1gSPQ{V|zW{P&fJjHVbAtc? N002ovPDHLkV1hH82Xp`c literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/16x16/connected_notification.png b/dist/qt_themes/colorful/icons/16x16/connected_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..72466e098e471ae5a97c49a56536dd4bf62b3a08 GIT binary patch literal 760 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0*y&TK~y+Tl~Y|v z6j2oZ?(CguoZVz~OB-RWz#nLd9z^@Yo&q%@j2=qtp^PLV$cmEeAL_xE^2wfrs242~ zp$Ef$h%#S%kW`EcLR4x6ZEJVk8F%j7>CU(tNkRF+;a<+Y=R4my_gvyQ4zjp<{ql`; zI^D*(O+BwTbI<>_2MD8-wl5<%-+In!I@(0@^Fzo{bD*j!D3xKFhG&Lp!dzV1$6_(` z^gLuV6YIgUEb0c8*Ie*2x#lAhY;J={1gb21z6E0ugAZC@F^euEux;jDmV`UFz7l>- zK|xT%#N<56!g^D3Wwr@)QUY z@d)MRLDK?Qog0L{ZY_3>K0_%MP_m~6ird7|QOF|6#=1I$H9tA_=53H>6>z~YHTJ@7 zb_Nd4PV}Lux(a+|27GF2$(u@fs~(9UHZ*jca>r)zc$_}(It@ippva0SLlzB`5RY_2 zDJ%pZ9`=H=;M3EPtE-_V5`;>`*WTHAw^h71&5pJA_QIN1DX?Z|p%fSYQs6=ghhYg- zVhSf|d1>iW;`5ymOPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0v$<2K~y+Tl~PS> zQ$Z9x^WL<1ZG=jLsqtf@CIu;o=wGnd1VlHD;-XFKLZw(mq)@*>1VJ>!or+OVq^`wu znJxuC&?1zmaamnO1NME*%5JoAzwQ9hHiSzzQVT5*fC(vPaz_Kh*+6Kq5b=Zyr$6d-BjRvNsUN9r<)$o0v zs;137DRgyhL@Z{(G)=_g8<0qB!nUp3v1>;LeY^L_vp9U_(^UgFXW)W|)!HD0fHMwq z`Rc|0_8q`L@sq zk>1%G63fVBGANuFmY*(fDuPllKmS8eCS`Em`r?L1hp>O&UTLdSRsk4e>gLt9;4C;0 zLcq{BFQXMa*Fk%G45d;@#y$LM{=|d(5AnGC1hkF9bzQ?)OM&Zp`Y#clJ$)W#YAJ!{ z4H0nGY&P-w?HjzG{fJLxahf`;55)a!M*cR#Fvf$Tw4UQO#< z+13h9kDdH|_{gEo)RvScR^ra>BKrFe$hQ&GwNfR74B5P3+o;Y|898=5|6Tg*(O>)p iN=@~G{{?26=FLU_5=aXOVS_yY0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TNZ6DwG(7XLBVgY-Of0gl9N`1$71F4gIoC7Ns%KV{!E#(sSHPb4 z(H0iazHiYX76&M(7WhJwJ#j1fRUNEz*v1bmuz(K)PiU_upW--rVBGUHbS7~Yq~j3d z0pB9-^E7(E%6y`SY(9%py1{n*nW{zpBTL5Tn1REwzu2}x6v+nVAx4qQEUL#B6v-*2 Z^b7poNv{?|^27iD002ovPDHLkV1i32vs(ZF literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/16x16/info.png b/dist/qt_themes/colorful/icons/16x16/info.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9330f4c85c308cdded20086095eca71bff2490 GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2>u z-+(Y~}U&3=E8#o-U3d z7QJgH8u~FginQ&&c`)E?nOCaf8o37U40pz*MGd(eiffGQZwJP{p>8~GY@h%q`&&~OAOXGFsRnxV*wkg^)@F=9p zo}INUax;?(f5)51wOyYYPUbHcy|aAzUup9frQY4*-|nWhs!F1a9oR>wN)QsJCwC+ERJ$5_$Y=Gq!R||%KE`h|Li$FVdQ&MBb@058+682|tP literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/16x16/lock.png b/dist/qt_themes/colorful/icons/16x16/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..fd27069d807e26186c8a610bdbcc0ce172562af6 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!TX*rjv*HQTYGJ}4mk+4vg>ROSwGo6XvJPv zzlZ+oGn97-o-r-r&$VfgJ0KmA>2yufc!z{~qGQbm$8Tq=^*@-iIzITdZ+^wR?aTAG zy=^&a8Kl52V{ys6@63-oYYcdPN9cVtn5|nNv)ozk?u}LA z|1=jF*xy&`&-?QyY@&mH_rsJ||S^eTg=tDnm{r-UW|<05{U literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/16x16/sync.png b/dist/qt_themes/colorful/icons/16x16/sync.png new file mode 100644 index 0000000000000000000000000000000000000000..0d57789c3a5167710d1746423610dd994777a5a6 GIT binary patch literal 548 zcmV+<0^9wGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGZhyVZuhylMZe;xn;0l7&;K~y+Tl~YS7 zgi#d!?wuizg}1V0EjtUcRK$YC?CfOYH8Tx1EXYbE&m<+;%0|S}%49*2orsN;x2$`-P~4WeGn;lS!7 zd>1gHgBYe9BOmB(!oeA>!aG*s^VdN;E6luP>IJ`Wf;ng5r$7)RG~+y2CBteS&+dr} z6G8=yzHuGAu~@U3!M-ivwSCNkHMZJmlTyG0^({>i;P{za%iJSvPu!Uw3K4yMPB+)i$Z z@7{vJB-<)PLT|Ib1{+HOyKq02DD&t{NbKtxbNEPNR5DwceKbknXytsVvi$(dg!u-} zC9Z7Me%;GY&Sk3TR>IL;$W25ML$@RmGIJ}LMTXQYmL(`idjtFz)^a2?p z3xP1>)&}zuprB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt;DaT^vI! zdXHXO?dResz;fZRvg2D(hZAudG7gC+giq$}KOcG4zro@DnrG}2G&q=8CN#Jv2-qAk zIjJ+#`oXqIX2G$hS8WgP*%
    P@0_exQBEhkNRG4vEbF(e=wge3`J!mrnDK5~jx# zUU8hS;5{7IoY@i1eaCa!ii`_xR|*?vr#zBue!3=;y?e(G)x3h?UwC-!Cn58K{>@QcV*C}8#I7dD9^Y}8_gWU)lKmGvA3u?Q86s88 o#x1&7v25w|org}xo1bUDudAldyso>n5$H<>Pgg&ebxsLQ00=gQyZ`_I literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/256x256/plus_folder.png b/dist/qt_themes/colorful/icons/256x256/plus_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..760fe6245e72cd0144b4dd198465db6c902ad400 GIT binary patch literal 4643 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 N&`{A*F1u|N`hPMhH%|Zn literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/48x48/bad_folder.png b/dist/qt_themes/colorful/icons/48x48/bad_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..34069c6b230de579d436fa9f0c21ae37af905b2e GIT binary patch literal 528 zcmV+r0`L8aP)D=(%e@MHK8fkB=Bj zAo71N_TM-+BcNWZW5yA1JUFhvNgbx+#t;a7*^hmf6*R3n7W%qhe}R$vr)HtS?Z$}H zG4o!X(_6sz@(}sdBcmf285ttS{PG$t1;D%q2XCGsu;Kn*4EJ`EV}rNOsB1G50Q+ud zk;W!zsIv`2?JeY3^jMW_j?@CSU7w3IHc5j`^%!idCC8%2D%f^^N-bd7vjgnAMv6H$ zRRc8@7^o_rcZ`lz$ux@g9a}{@0rQS^^6Ppp>nQlxOkH&kI3Aw3BuX6#@;?!z_y14T zWD@^HDbsuT!ZivN`yU9kwIux}`Y&I&S~39%P%Vo&wyKl@Ww{HS`zJUY4#@7Hv$NlKH@gFOfWh#;p`a7> zHS|=Xi|Jg_aj&Q#lU501AZa|+UAa*$TBPeBeF7jKv8Dk59qm|`?ej*L3uX^12YbBVuC(8l1+gV$k**_t@c>ZJWBZB=;`hL$Y!X2M?Al&7anv=x5Djc` zF{wX=?AZ&m9kLRimbq{p`;P&?xFf(F2AivLfXd3&7a92KYV;p~>3ie@1>}zj8+*Yu zi1xtn5y8a+fD4SCBnjp`f!P{6Z7!DRe2Uhd-S73pU@#lExS?7!1ks16+4{ U)=xYDaR2}S07*qoM6N<$f@LZ5LI3~& literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/48x48/folder.png b/dist/qt_themes/colorful/icons/48x48/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..498de4c62940559bcfa3c609f7e7474ee8d86ae3 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!hD1*n$B+!?x05z{F*}O5F27(eFndMoj+0rh z&40xH>tws))HAoNDb{TF1AmTbg1vvM{SK{ta!*3~yJ+!)lAVWV&RycPFhE13E=fG| z{;|wSu|F(+sy(|uFZrH++0<`EXXd#6OY88yk-96naQ3a=s-IZ*Mcjyg^Hped$L!qi z%Nu{^ytsFDZ`S68H$NYoZToJXVxeu_-lz9MzHG4Dnwk1|k- z)~iH;!ZoYKb0iMl`PS*vyLEB3S>J-KUs+~KW%p^nb}KG(nEz~9`TJGQDeI0eyQ*M+ z{q3idHxmD6Mc3=>-?Mj)jN*D=sBp1PxMbenmA6-}RqQ-41{geD{an^LB{Ts5V+X_j literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/48x48/list-add.png b/dist/qt_themes/colorful/icons/48x48/list-add.png new file mode 100644 index 0000000000000000000000000000000000000000..74e4882aaedc98b57cce65ae5c0a2683bab31279 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCils0(?ST_0ALmnd!^rR{<%ek|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zprE6ti(`m~_uJEkTnq|4&KIBkn;y0>KuJVP%j$`*d51w2Hv=64#i!@TrNPv7(8A5T-G@yGywoSu{iDk literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/48x48/no_avatar.png b/dist/qt_themes/colorful/icons/48x48/no_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..76f812349b462cd8b05465d12a7e1a4df6788ea9 GIT binary patch literal 678 zcmV;X0$KfuP)tQW30PJ^1R99 zJ4_fbpiykVY23ssd}-$;rf>@DYqRUZ8N9)-E}6s0njCX!;hOH^VXk6L4Zf?mth{_D z7i;kSi(^<8-@p$eu^PqC;Hsb{ai)1WTBIQRkkx&~FeH*1T5dEp;urIbS zrGbqJwIQ2g3sV{xN~jHK#TKSCFqcpp@;bIKrGe)Owf($SVRlNJ#5!5Vu8Q6NaKC_H zx7@2*dL4bVu41!n^HNs+1x9M{&1Do%6_dGVzM9NEnLx?<#V?z z%jS{jU0TRm+^Il3%(NcdQZ3x7LB5kIiO)|j)F|J{`B?dJEHXz^1 zVc7;I8z3F#Xqg7;7D8!g-t-jCz@deo<%wGPXGGIW5-{H89iO|Al&offQDYsv`dLmWMB|uJoCySmSNRH zXNIRALK~_ob_p;r)JrZ;FIPU6$&C&jo{= O&EVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGff&c&uf&sqz;-vrp1L;XbK~!i%?U~PS zOi>ia&v{dXiliH?Ea>m5YV=J@_#cF(BsMmFOT@16TZoX5NLUE55E8}4qVW$P%nb1( zn$EO{AYwr)%!F#a<9pxSl&Kl>?zm68m``)xJLk-u`|dgC{+d@RQ>ILKNUVOj#2Qy= zH543u4+o~h}$Yl66AKfZVTN z1_u%lf3?qEJG%pMtyv?S3^;TM*WBQU6Utn$o&iZTwvu=cA^zF6h|BG%2U@d&{S0_= z5ZC;HacHlWtYI|+602FVnIO`WGQ!~RNa5ZVg^L5`$5`c)UviOSjm9gt7)J}8Ennd_IIhAYjbzV_$ z-R3U(L9hBZLcElHUSGJ0}_t za#K6u#u;t;A6y91c|}nN6uuK}$z90DX>AG*=5ypGw*=|DB9H?LhAYw#E3y`AjA6H(U1-B9gn0&roO)bscV1CJA0u^I4ve`2%!{>TpAy09=b-!WT>Oda@r{HvE!H;BCkj^gxa@IHsz20kcfvGmtMh4a|N#xYyvOee95 zjyfs!k|(V=Id + + + + icons/index.theme + icons/16x16/checked.png + icons/16x16/connected.png + icons/16x16/connected_notification.png + icons/16x16/disconnected.png + icons/16x16/failed.png + icons/16x16/info.png + icons/16x16/lock.png + icons/16x16/sync.png + icons/16x16/view-refresh.png + icons/48x48/bad_folder.png + icons/48x48/chip.png + icons/48x48/folder.png + icons/48x48/list-add.png + icons/48x48/no_avatar.png + icons/48x48/sd_card.png + icons/48x48/star.png + icons/256x256/plus_folder.png + + + ../default/style.qss + + diff --git a/dist/qt_themes/colorful_dark/icons/16x16/lock.png b/dist/qt_themes/colorful_dark/icons/16x16/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..32c505848ebc0ac4c84f8b544e94d077270297f4 GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?- zhak*YAR(g%WJs2{MwA5SrEak- z(Yth#q2FN#0oVHplb3L;y{vRmU?=wu<3*1dWLOjf-ZdN%e8456z{F)G{`in6E4zb( zsLw-%>gi08EH^83Kd!!b=8t`Sn)pA?pQ{(Fa#t$iN$Ars>l4@DZ z)p0^Xf#-0)mH6>OzJ#@Rv%Xw!+^eF|%AT;j*!}ck`zHZ@6~CV@5K2=2S^Z?ouO|z3 zHa)OBsk?XW`H07=?br82pMI}pr|-zpbnImnmydeMpR00AhtK92t+{)Et1q`cL3ocAD?=SeT-Z%G3H8A)XJYD@<);T3K0RZTKqN4x+ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful_dark/icons/16x16/view-refresh.png b/dist/qt_themes/colorful_dark/icons/16x16/view-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..d4afd76f949ff5c65e039b69ff999325bff5d7b8 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zD}XSgpwrRCKtah8*NBqf{Irtt#G+J&^73-M%)IR4TP^t%4d#k2I8Aju + + + + icons/index.theme + icons/16x16/lock.png + icons/16x16/view-refresh.png + + + + ../qdarkstyle/rc/up_arrow_disabled.png + ../qdarkstyle/rc/Hmovetoolbar.png + ../qdarkstyle/rc/stylesheet-branch-end.png + ../qdarkstyle/rc/branch_closed-on.png + ../qdarkstyle/rc/stylesheet-vline.png + ../qdarkstyle/rc/branch_closed.png + ../qdarkstyle/rc/branch_open-on.png + ../qdarkstyle/rc/transparent.png + ../qdarkstyle/rc/right_arrow_disabled.png + ../qdarkstyle/rc/sizegrip.png + ../qdarkstyle/rc/close.png + ../qdarkstyle/rc/close-hover.png + ../qdarkstyle/rc/close-pressed.png + ../qdarkstyle/rc/down_arrow.png + ../qdarkstyle/rc/Vmovetoolbar.png + ../qdarkstyle/rc/left_arrow.png + ../qdarkstyle/rc/stylesheet-branch-more.png + ../qdarkstyle/rc/up_arrow.png + ../qdarkstyle/rc/right_arrow.png + ../qdarkstyle/rc/left_arrow_disabled.png + ../qdarkstyle/rc/Hsepartoolbar.png + ../qdarkstyle/rc/branch_open.png + ../qdarkstyle/rc/Vsepartoolbar.png + ../qdarkstyle/rc/down_arrow_disabled.png + ../qdarkstyle/rc/undock.png + ../qdarkstyle/rc/checkbox_checked_disabled.png + ../qdarkstyle/rc/checkbox_checked_focus.png + ../qdarkstyle/rc/checkbox_checked.png + ../qdarkstyle/rc/checkbox_indeterminate.png + ../qdarkstyle/rc/checkbox_indeterminate_focus.png + ../qdarkstyle/rc/checkbox_unchecked_disabled.png + ../qdarkstyle/rc/checkbox_unchecked_focus.png + ../qdarkstyle/rc/checkbox_unchecked.png + ../qdarkstyle/rc/radio_checked_disabled.png + ../qdarkstyle/rc/radio_checked_focus.png + ../qdarkstyle/rc/radio_checked.png + ../qdarkstyle/rc/radio_unchecked_disabled.png + ../qdarkstyle/rc/radio_unchecked_focus.png + ../qdarkstyle/rc/radio_unchecked.png + + + ../qdarkstyle/style.qss + + diff --git a/dist/qt_themes/colorful_midnight_blue/icons/index.theme b/dist/qt_themes/colorful_midnight_blue/icons/index.theme new file mode 100644 index 0000000..dcb2c50 --- /dev/null +++ b/dist/qt_themes/colorful_midnight_blue/icons/index.theme @@ -0,0 +1,8 @@ +[Icon Theme] +Name=colorful_midnight_blue +Comment=Colorful theme (Midnight Blue style) +Inherits=colorful +Directories=16x16 + +[16x16] +Size=16 diff --git a/dist/qt_themes/colorful_midnight_blue/style.qrc b/dist/qt_themes/colorful_midnight_blue/style.qrc new file mode 100644 index 0000000..b9821c6 --- /dev/null +++ b/dist/qt_themes/colorful_midnight_blue/style.qrc @@ -0,0 +1,63 @@ + + + + + icons/index.theme + ../colorful_dark/icons/16x16/lock.png + ../qdarkstyle/icons/16x16/view-refresh.png + ../colorful/icons/48x48/bad_folder.png + ../colorful/icons/48x48/chip.png + ../colorful/icons/48x48/folder.png + ../colorful/icons/48x48/list-add.png + ../colorful/icons/48x48/sd_card.png + ../colorful/icons/256x256/plus_folder.png + + + + ../qdarkstyle_midnight_blue/rc/up_arrow_disabled.png + ../qdarkstyle_midnight_blue/rc/Hmovetoolbar.png + ../qdarkstyle_midnight_blue/rc/stylesheet-branch-end.png + ../qdarkstyle_midnight_blue/rc/branch_closed-on.png + ../qdarkstyle_midnight_blue/rc/stylesheet-vline.png + ../qdarkstyle_midnight_blue/rc/branch_closed.png + ../qdarkstyle_midnight_blue/rc/branch_open-on.png + ../qdarkstyle_midnight_blue/rc/transparent.png + ../qdarkstyle_midnight_blue/rc/right_arrow_disabled.png + ../qdarkstyle_midnight_blue/rc/sizegrip.png + ../qdarkstyle_midnight_blue/rc/close.png + ../qdarkstyle_midnight_blue/rc/close-hover.png + ../qdarkstyle_midnight_blue/rc/close-pressed.png + ../qdarkstyle_midnight_blue/rc/down_arrow.png + ../qdarkstyle_midnight_blue/rc/Vmovetoolbar.png + ../qdarkstyle_midnight_blue/rc/left_arrow.png + ../qdarkstyle_midnight_blue/rc/stylesheet-branch-more.png + ../qdarkstyle_midnight_blue/rc/up_arrow.png + ../qdarkstyle_midnight_blue/rc/right_arrow.png + ../qdarkstyle_midnight_blue/rc/left_arrow_disabled.png + ../qdarkstyle_midnight_blue/rc/Hsepartoolbar.png + ../qdarkstyle_midnight_blue/rc/branch_open.png + ../qdarkstyle_midnight_blue/rc/Vsepartoolbar.png + ../qdarkstyle_midnight_blue/rc/down_arrow_disabled.png + ../qdarkstyle_midnight_blue/rc/undock.png + ../qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png + ../qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png + ../qdarkstyle_midnight_blue/rc/checkbox_checked.png + ../qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png + ../qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png + ../qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png + ../qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus.png + ../qdarkstyle_midnight_blue/rc/checkbox_unchecked.png + ../qdarkstyle_midnight_blue/rc/radio_checked_disabled.png + ../qdarkstyle_midnight_blue/rc/radio_checked_focus.png + ../qdarkstyle_midnight_blue/rc/radio_checked.png + ../qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png + ../qdarkstyle_midnight_blue/rc/radio_unchecked_focus.png + ../qdarkstyle_midnight_blue/rc/radio_unchecked.png + + + ../qdarkstyle_midnight_blue/style.qss + + diff --git a/dist/qt_themes/default/default.qrc b/dist/qt_themes/default/default.qrc new file mode 100644 index 0000000..2e01a34 --- /dev/null +++ b/dist/qt_themes/default/default.qrc @@ -0,0 +1,26 @@ + + + + + + icons/index.theme + icons/16x16/connected.png + icons/16x16/connected_notification.png + icons/16x16/disconnected.png + icons/16x16/lock.png + icons/48x48/bad_folder.png + icons/48x48/chip.png + icons/48x48/folder.png + icons/48x48/list-add.png + icons/48x48/sd_card.png + icons/48x48/star.png + icons/256x256/plus_folder.png + icons/256x256/yuzu.png + + + style.qss + + diff --git a/dist/qt_themes/default/icons/16x16/connected.png b/dist/qt_themes/default/icons/16x16/connected.png new file mode 100644 index 0000000000000000000000000000000000000000..0afc18cb7a19028fd567a7ca7ced62cd164657de GIT binary patch literal 575 zcmV-F0>J%=P)0k{|sIn0V`B1xGGFnerg>I4!7^B>UM&p)aM9vQI<{ZJ4 z8HZ4p+_%{7AT1;1-`r}Q8XRRVYW9}G=D3HXRO!FFg z<>v6FfXkm66-$M=OnPPtTpl}lK!#o^J26y#00VLkV5Ig4hAIxCZ~AU@6mMaG2|$+zA&;BarDZyi@16B z4lE8kTwX8y!4LxB2>hW4yn!GbZg+WiA%P|k^Ip;o774}ts6fO6U&y7=hp3TO@-WL? z{^Mh)gLW3&bGqIiV!1gSPQ{V|zW{P&fJjHVbAtc? N002ovPDHLkV1hH82Xp`c literal 0 HcmV?d00001 diff --git a/dist/qt_themes/default/icons/16x16/connected_notification.png b/dist/qt_themes/default/icons/16x16/connected_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..72466e098e471ae5a97c49a56536dd4bf62b3a08 GIT binary patch literal 760 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 Yh89WFHBF|yt6vw8JpDWxh~e3P1CC-@r2qf` literal 0 HcmV?d00001 diff --git a/dist/qt_themes/default/icons/256x256/yuzu.png b/dist/qt_themes/default/icons/256x256/yuzu.png new file mode 100644 index 0000000000000000000000000000000000000000..238adeb895cefd7bd7cff85c6a2187ebcb93443a GIT binary patch literal 4425 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 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/default/icons/48x48/bad_folder.png b/dist/qt_themes/default/icons/48x48/bad_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..364ec646f6f1c6b5b632fb68efd2602aa2c87f25 GIT binary patch literal 1007 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vG$aR2}!aRGnSI!pin1B6LLK~!i%?U_qx z6G0fqceY8JQfje^v^`Z?C}^vKU~SWss8#7Bq7>^BQS_o%D&FixC}>dx@paXk2fb!jWysaGN1x$Fnz386RA_cs9JkNVfB+5}*KzMVo z5<{y;q)9N<9gVg&R*6(8YL7rH){j>o{HZZs%M5)PVmcq>8+myruvCt+0wN**YAopb zi5M!s`S@ko?FTOqzlpEnUD1xlhIp(FB?VwYW}3myAWYoh(Hxy15i^77XU%ODqNIRm zsA)TAnqQsWj3B_=;jZ8e^3r zO;8hQYp#oK3eX^~iLVl1+rr`)T^lJus({Fr#zpu9r#Zfe>&A1#;Lj+IubP5$t@m?V zuuP;<$Q^+Ry$^k&L}ckuJgH9}7qJws3kZk&OEGZwi*y>8ZRk?sqDUR!2k0|I;u`ly zfa|C6>WL?*pz*^M1CM&j2Of5#h__<39qh|aiP$v~U5K}eU>cZq7KcNDz2T0geb~-E zz^C9^n}}TFz5u5E5Rnrej8uAxaM_G!0EK=Rp=(?hfG77T^ho4iLv7dvX}nq6NNrBuZx2B0n{&Y%FbQ3BjX|dkvr%emElgoI zw0EU!l-g)MR&=5T4ne0Kvq5?~w-zRGn!oAM^*Tr!RzSCZ@~MLUANU0C!aI=u%gB)< d$Nzz*{RLYl6+9v2Tqpnl002ovPDHLkV1lP2!l3{F literal 0 HcmV?d00001 diff --git a/dist/qt_themes/default/icons/48x48/chip.png b/dist/qt_themes/default/icons/48x48/chip.png new file mode 100644 index 0000000000000000000000000000000000000000..1b573d51af66864f03a7e20179d3ea4d5f36a012 GIT binary patch literal 511 zcmV9EdCE@3Mha(U=39Kwt-~tF_(V@tbhe@rpPOZE8smKIV=0D_cUSBbMlS7Ve^b~ zpCI|hZY>H}i=fZIrA1)D1@I{LT3H0%iJ()9pbkp0*SBv$NROG$ZR`C;c@8vM#WlBm z{-GACg|z-hS|#Kl^7*&fDJ`V(w`ieRqP0$ZEg|VT>qFz6Y$1y&q@7Zx@kTj?21PC) zHMxM)jIsc&7LsTWuF!bVv`}9saWpNoO|;gDRts6n>E5-FHCYQuD)BkSjYNaI%<}%J z58;F3UVI|X%|r>jh`p8;fgjL6pjLKcQNTIyl_2?73nvPx#1ZP1_K>z@;j|==^1poj532;bRa{vG$asU7#askq98zBGy0jx!G;=NG{;w3(V&)^%7sC5cDp(K0(Eum7VP&2?Hew~5;RZehy&5rvSNM^VC)kWN zVHMxeR!9z)a0X9MeRGaIYAAsD73r}op+A}nH0$iPO`j}shnuBljNAke zx8X5LOP&H)@c~@p1GvTqaE%Y(8Xv$lK7ea{0N3~cu2BH3wV2petzBcQsi*+=rFM+I z@R%hA!ebQOD;L`F4WoDakEpd5Es3~BH7uj{8KO0+<~9sC!03~Ca39O`<1^X@W>MAJ zi!oNvoJv_#H3rLyHYV{BZ6{_ytlBSEK+1 z9X(wfLp;3So;KuSP~dUC`0U^Gu!R9iB3fEjPkbdm@pg-Z*l@4;Y#AsZGNCu2rl{_h ojlvg2t|q1;trMCncE~dD#zk`|?lR_b0UE~O>FVdQ&MBb@0NraiKmY&$ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/default/icons/48x48/sd_card.png b/dist/qt_themes/default/icons/48x48/sd_card.png new file mode 100644 index 0000000000000000000000000000000000000000..6bcb7f6b1d93ab9bf8731849832aa88df68b0fd3 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?31We{epSZZGe6s+)c zaSX}0_x8FYUxNV$i^GTi^~cn&+=x(=%u};{v&H06PkCtJvZCsP{SW0+&pdlL-EzG| z-1TF9PY%8>U;^s5J>Boa&B$C$hNGxBS?WfCd ieyFWGC%N1H)%2fvs!qH~tv4HLK~kQselF{r5}E)AjzNq7 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/default/icons/48x48/star.png b/dist/qt_themes/default/icons/48x48/star.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b78f0c3e543913b18d4f95956109c7d2646ba8 GIT binary patch literal 1029 zcmV+g1p51lP)X)lQZo@-L=cu)ZHg3&%A{3AU{olP z1-a8`)uIOkK?H#db72rfkkLY-$D*Q0B3jg{0v8dMp}mlZe3E70Z83B4od0>=d**0_ z9}GA%|M|Xej&tVxXD-ZPc9DpYdjqf?NCHoQS21cCMHX-wW!zdW0rO_jS7;o=X+Bks z&Z4hSNC5qKPoST8mu+NJV>djmi?yxVq@d|Fxlh#Z0}n*oUc;J3@gDort_K=K+lN_m z7l8HHjZOghz(U}s=v!w>)Z`M9%jXd=hI$7c2gLppc!T{ZAF}iv7JYAL++6_HU^h4k z6j}Ng0l!7eY7@eymXKT$-N2BgK8#8y{KjO2Y>)N@Kn<`gB+o%nzwHup3)o?)Hv->6 z@(%#dP#Z%awgI2<{+b4rKR}5KZ;9^9l=l;`HOTxDU^IeA61d{Se>Eca2vF)bfin>W zo}%`CFBG7bLKKbDRzmp>tP=HJZ7K*qfakzHE#ieypcdE-YyuXC;I0MAeLUK50sCyH zfQvwG2qDwR)!I|S(|Nx^<+#6SuYrmf%}P{gP3dD2SQ#|h?r?fl42qN*&`iR&v&woIo+~%R@L- zt`Y7dl&@p`xF!g9;7<$ZJj6y&w`}R6QIB=wJR9Av6A9oXY8y>Un14sh237!t2005+lkvK%ox>dF@W0|O*YW8UHg=Uy00000NkvXXu0mjfk8a2c literal 0 HcmV?d00001 diff --git a/dist/qt_themes/default/icons/index.theme b/dist/qt_themes/default/icons/index.theme new file mode 100644 index 0000000..21b35e3 --- /dev/null +++ b/dist/qt_themes/default/icons/index.theme @@ -0,0 +1,14 @@ +[Icon Theme] +Name=default +Comment=default theme +Inherits=colorful +Directories=16x16,48x48,256x256 + +[16x16] +Size=16 + +[48x48] +Size=48 + +[256x256] +Size=256 diff --git a/dist/qt_themes/default/style.qss b/dist/qt_themes/default/style.qss new file mode 100644 index 0000000..921950c --- /dev/null +++ b/dist/qt_themes/default/style.qss @@ -0,0 +1,692 @@ +QAbstractSpinBox { + min-height: 19px; +} + +QPushButton#TogglableStatusBarButton { + color: #959595; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#TogglableStatusBarButton:checked { + color: #000000; +} + +QPushButton#TogglableStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton { + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#RendererStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton:checked { + color: #e85c00; +} + +QPushButton#RendererStatusBarButton:!checked { + color: #0066ff; +} + +QPushButton#GPUStatusBarButton { + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#GPUStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#GPUStatusBarButton:checked { + color: #b06020; +} + +QPushButton#GPUStatusBarButton:!checked { + color: #109010; +} + +QPushButton#DockingStatusBarButton { + min-width: 0px; + color: #000000; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#DockingStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#buttonRefreshDevices { + min-width: 21px; + min-height: 21px; + max-width: 21px; + max-height: 21px; +} + +QPushButton#button_reset_defaults { + min-width: 57px; + padding: 4px 8px; +} + +QWidget#bottomPerGameInput, +QWidget#topControllerApplet, +QWidget#bottomControllerApplet, +QGroupBox#groupPlayer1Connected:checked, +QGroupBox#groupPlayer2Connected:checked, +QGroupBox#groupPlayer3Connected:checked, +QGroupBox#groupPlayer4Connected:checked, +QGroupBox#groupPlayer5Connected:checked, +QGroupBox#groupPlayer6Connected:checked, +QGroupBox#groupPlayer7Connected:checked, +QGroupBox#groupPlayer8Connected:checked { + background-color: #f5f5f5; +} + +QWidget#topControllerApplet { + border-bottom: 1px solid #828790 +} + +QWidget#bottomPerGameInput, +QWidget#bottomControllerApplet { + border-top: 1px solid #828790 +} + +QWidget#topPerGameInput, +QWidget#middleControllerApplet { + background-color: #fff; +} + +QWidget#topPerGameInput QComboBox, +QWidget#middleControllerApplet QComboBox { + width: 120px; +} + +QWidget#connectedControllers { + background: transparent; +} + +QWidget#closeButtons { + background: transparent; +} + +QWidget#playersSupported, +QWidget#controllersSupported, +QWidget#controllerSupported1, +QWidget#controllerSupported2, +QWidget#controllerSupported3, +QWidget#controllerSupported4, +QWidget#controllerSupported5, +QWidget#controllerSupported6 { + border: none; + background: transparent; +} + +QGroupBox#groupPlayer1Connected, +QGroupBox#groupPlayer2Connected, +QGroupBox#groupPlayer3Connected, +QGroupBox#groupPlayer4Connected, +QGroupBox#groupPlayer5Connected, +QGroupBox#groupPlayer6Connected, +QGroupBox#groupPlayer7Connected, +QGroupBox#groupPlayer8Connected { + border: 1px solid #828790; + border-radius: 3px; + padding: 0px; + min-height: 98px; + max-height: 98px; +} + +QGroupBox#groupPlayer1Connected:unchecked, +QGroupBox#groupPlayer2Connected:unchecked, +QGroupBox#groupPlayer3Connected:unchecked, +QGroupBox#groupPlayer4Connected:unchecked, +QGroupBox#groupPlayer5Connected:unchecked, +QGroupBox#groupPlayer6Connected:unchecked, +QGroupBox#groupPlayer7Connected:unchecked, +QGroupBox#groupPlayer8Connected:unchecked { + border: 1px solid #d9d9d9; +} + +QGroupBox#groupPlayer1Connected::title, +QGroupBox#groupPlayer2Connected::title, +QGroupBox#groupPlayer3Connected::title, +QGroupBox#groupPlayer4Connected::title, +QGroupBox#groupPlayer5Connected::title, +QGroupBox#groupPlayer6Connected::title, +QGroupBox#groupPlayer7Connected::title, +QGroupBox#groupPlayer8Connected::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 0px; + padding-right: 0px; + padding-top: 1px; + margin-left: 0px; + margin-right: -4px; + margin-bottom: 4px; +} + +QCheckBox#checkboxPlayer1Connected, +QCheckBox#checkboxPlayer2Connected, +QCheckBox#checkboxPlayer3Connected, +QCheckBox#checkboxPlayer4Connected, +QCheckBox#checkboxPlayer5Connected, +QCheckBox#checkboxPlayer6Connected, +QCheckBox#checkboxPlayer7Connected, +QCheckBox#checkboxPlayer8Connected { + spacing: 0px; +} + +QWidget#Player1LEDs QCheckBox, +QWidget#Player2LEDs QCheckBox, +QWidget#Player3LEDs QCheckBox, +QWidget#Player4LEDs QCheckBox, +QWidget#Player5LEDs QCheckBox, +QWidget#Player6LEDs QCheckBox, +QWidget#Player7LEDs QCheckBox, +QWidget#Player8LEDs QCheckBox { + spacing: 0px; +} + +QWidget#Player1LEDs QCheckBox::indicator, +QWidget#Player2LEDs QCheckBox::indicator, +QWidget#Player3LEDs QCheckBox::indicator, +QWidget#Player4LEDs QCheckBox::indicator, +QWidget#Player5LEDs QCheckBox::indicator, +QWidget#Player6LEDs QCheckBox::indicator, +QWidget#Player7LEDs QCheckBox::indicator, +QWidget#Player8LEDs QCheckBox::indicator { + width: 6px; + height: 6px; + margin-left: 0px; +} + +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer1Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer2Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer3Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer4Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer5Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer6Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer7Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer8Connected::indicator { + width: 12px; + height: 12px; +} + +QCheckBox#checkboxPlayer1Connected::indicator, +QCheckBox#checkboxPlayer2Connected::indicator, +QCheckBox#checkboxPlayer3Connected::indicator, +QCheckBox#checkboxPlayer4Connected::indicator, +QCheckBox#checkboxPlayer5Connected::indicator, +QCheckBox#checkboxPlayer6Connected::indicator, +QCheckBox#checkboxPlayer7Connected::indicator, +QCheckBox#checkboxPlayer8Connected::indicator { + width: 14px; + height: 14px; +} + +QGroupBox#groupPlayer1Connected::indicator, +QGroupBox#groupPlayer2Connected::indicator, +QGroupBox#groupPlayer3Connected::indicator, +QGroupBox#groupPlayer4Connected::indicator, +QGroupBox#groupPlayer5Connected::indicator, +QGroupBox#groupPlayer6Connected::indicator, +QGroupBox#groupPlayer7Connected::indicator, +QGroupBox#groupPlayer8Connected::indicator { + width: 16px; + height: 16px; +} + +QWidget#Player1LEDs QCheckBox::indicator:checked, +QWidget#Player2LEDs QCheckBox::indicator:checked, +QWidget#Player3LEDs QCheckBox::indicator:checked, +QWidget#Player4LEDs QCheckBox::indicator:checked, +QWidget#Player5LEDs QCheckBox::indicator:checked, +QWidget#Player6LEDs QCheckBox::indicator:checked, +QWidget#Player7LEDs QCheckBox::indicator:checked, +QWidget#Player8LEDs QCheckBox::indicator:checked, +QGroupBox#groupPlayer1Connected::indicator:checked, +QGroupBox#groupPlayer2Connected::indicator:checked, +QGroupBox#groupPlayer3Connected::indicator:checked, +QGroupBox#groupPlayer4Connected::indicator:checked, +QGroupBox#groupPlayer5Connected::indicator:checked, +QGroupBox#groupPlayer6Connected::indicator:checked, +QGroupBox#groupPlayer7Connected::indicator:checked, +QGroupBox#groupPlayer8Connected::indicator:checked, +QCheckBox#checkboxPlayer1Connected::indicator:checked, +QCheckBox#checkboxPlayer2Connected::indicator:checked, +QCheckBox#checkboxPlayer3Connected::indicator:checked, +QCheckBox#checkboxPlayer4Connected::indicator:checked, +QCheckBox#checkboxPlayer5Connected::indicator:checked, +QCheckBox#checkboxPlayer6Connected::indicator:checked, +QCheckBox#checkboxPlayer7Connected::indicator:checked, +QCheckBox#checkboxPlayer8Connected::indicator:checked, +QGroupBox#groupConnectedController::indicator:checked { + border-radius: 2px; + border: 1px solid #929192; + background: #39ff14; + image: none; +} + +QWidget#Player1LEDs QCheckBox::indicator:unchecked, +QWidget#Player2LEDs QCheckBox::indicator:unchecked, +QWidget#Player3LEDs QCheckBox::indicator:unchecked, +QWidget#Player4LEDs QCheckBox::indicator:unchecked, +QWidget#Player5LEDs QCheckBox::indicator:unchecked, +QWidget#Player6LEDs QCheckBox::indicator:unchecked, +QWidget#Player7LEDs QCheckBox::indicator:unchecked, +QWidget#Player8LEDs QCheckBox::indicator:unchecked, +QGroupBox#groupPlayer1Connected::indicator:unchecked, +QGroupBox#groupPlayer2Connected::indicator:unchecked, +QGroupBox#groupPlayer3Connected::indicator:unchecked, +QGroupBox#groupPlayer4Connected::indicator:unchecked, +QGroupBox#groupPlayer5Connected::indicator:unchecked, +QGroupBox#groupPlayer6Connected::indicator:unchecked, +QGroupBox#groupPlayer7Connected::indicator:unchecked, +QGroupBox#groupPlayer8Connected::indicator:unchecked, +QCheckBox#checkboxPlayer1Connected::indicator:unchecked, +QCheckBox#checkboxPlayer2Connected::indicator:unchecked, +QCheckBox#checkboxPlayer3Connected::indicator:unchecked, +QCheckBox#checkboxPlayer4Connected::indicator:unchecked, +QCheckBox#checkboxPlayer5Connected::indicator:unchecked, +QCheckBox#checkboxPlayer6Connected::indicator:unchecked, +QCheckBox#checkboxPlayer7Connected::indicator:unchecked, +QCheckBox#checkboxPlayer8Connected::indicator:unchecked, +QGroupBox#groupConnectedController::indicator:unchecked { + border-radius: 2px; + border: 1px solid #929192; + background: transparent; + image: none; +} + +QWidget#controllerPlayer1, +QWidget#controllerPlayer2, +QWidget#controllerPlayer3, +QWidget#controllerPlayer4, +QWidget#controllerPlayer5, +QWidget#controllerPlayer6, +QWidget#controllerPlayer7, +QWidget#controllerPlayer8 { + background: transparent; +} + +QDialog#QtSoftwareKeyboardDialog, +QStackedWidget#topOSK { + background: rgba(51, 51, 51, .9); +} + + +QDialog#OverlayDialog, +QStackedWidget#stackedDialog { + background: rgba(51, 51, 51, .7); +} + +QWidget#boxOSK, +QWidget#lineOSK, +QWidget#richDialog, +QWidget#lineDialog { + background: transparent; +} + +QStackedWidget#bottomOSK, +QWidget#contentDialog, +QWidget#contentRichDialog { + background: rgba(240, 240, 240, 1); +} + +QWidget#contentDialog, +QWidget#contentRichDialog { + margin: 5px; + border-radius: 6px; +} + +QWidget#buttonsDialog, +QWidget#buttonsRichDialog { + margin: 5px; + border-top: 2px solid rgba(44, 44, 44, 1); +} + +QWidget#legendOSKnum { + border-top: 1px solid rgba(44, 44, 44, 1); +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::vertical { + background: #cdcdcd; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent; + border-radius: 4px; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::horizoncal { + background: #cdcdcd; + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent; + border-radius: 4px; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::handle { + background: #fff; + border-radius: 4px; + min-height: 5px; + min-width: 5px; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-line, +QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-line, +QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-page, +QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-page { + background: none; +} + +QWidget#inputOSK { + border-bottom: 3px solid rgba(255, 255, 255, .9); +} + +QWidget#inputOSK QLineEdit { + background: transparent; + border: none; + color: #ccc; +} + +QWidget#inputBoxOSK { + border: 2px solid rgba(255, 255, 255, .9); +} + +QWidget#inputBoxOSK QTextEdit { + background: transparent; + border: none; + color: #ccc; +} + +QWidget#richDialog QTextBrowser { + background: transparent; + border: none; + padding: 35px 65px; +} + + +QWidget#lineOSK QLabel#label_header { + color: #f0f0f0; +} + +QWidget#lineOSK QLabel#label_sub, +QWidget#lineOSK QLabel#label_characters, +QWidget#boxOSK QLabel#label_characters_box { + color: #ccc; +} + +QWidget#contentDialog QLabel#label_title, +QWidget#contentRichDialog QLabel#label_title_rich { + color: #888; +} + +QWidget#contentDialog QLabel#label_dialog { + padding: 20px 65px; +} + +QWidget#contentDialog QLabel#label_title, +QWidget#contentRichDialog QLabel#label_title_rich { + padding: 0px 65px; +} + +QDialog#OverlayDialog QPushButton { + color: rgba(49, 79, 239, 1); + background: transparent; + border: none; + padding: 0px; + min-width: 0px; +} + +QDialog#OverlayDialog QPushButton:focus, +QDialog#OverlayDialog QPushButton:hover { + color: rgba(49, 79, 239, 1); + background: rgba(255, 255, 255, 1); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; + outline: none; +} + +QDialog#OverlayDialog QPushButton:pressed { + color: rgba(240, 240, 240, 1); + background: rgba(150, 150, 150, 1); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; + outline: none; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton { + background: rgba(232, 232, 232, 1); + border: 2px solid rgba(240, 240, 240, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { + background: rgba(218, 218, 218, 1); + border: 2px solid rgba(240, 240, 240, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { + color: rgba(240, 240, 240, 1); + background: rgba(44, 44, 44, 1); + border: 2px solid rgba(240, 240, 240, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { + color: rgba(240, 240, 240, 1); + background: rgba(49, 79, 239, 1); + border: 2px solid rgba(240, 240, 240, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:focus, + +QDialog#QtSoftwareKeyboardDialog QPushButton:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover { + color: rgba(0, 0, 0, 1); + background: rgba(255, 255, 255, 1); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; + outline: none; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { + color: rgba(240, 240, 240, 1); + background: rgba(150, 150, 150, 1); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { + image: url(:/overlay/osk_button_B.png); + image-position: right; + qproperty-icon: url(:/overlay/osk_button_backspace.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { + image: url(:/overlay/osk_button_Y.png); + image-position: right; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { + image: url(:/overlay/osk_button_plus.png); + image-position: right; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; + qproperty-icon: url(:/overlay/osk_button_shift.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; + qproperty-icon: url(:/overlay/osk_button_shift_on.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_parenthesis { + padding-bottom: 7px; +} + +QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { + background: transparent; + color: #ccc; +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_L, +QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { + image: url(:/overlay/button_L.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { + image: url(:/overlay/arrow_left.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_R, +QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { + image: url(:/overlay/button_R.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { + image: url(:/overlay/arrow_right.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, +QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { + image: url(:/overlay/button_press_stick.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_X, +QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { + image: url(:/overlay/button_X.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_A, +QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { + image: url(:/overlay/button_A.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { + color: rgba(164, 164, 164, 1); + background-color: rgba(218, 218, 218, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_at:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_slash:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_percent:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_1:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_2:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_3:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_4:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_5:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_6:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_7:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_8:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_9:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { + color: rgba(164, 164, 164, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { + image: url(:/overlay/osk_button_plus_disabled.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { + image: url(:/overlay/osk_button_B_disabled.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { + image: url(:/overlay/osk_button_Y_disabled.png); +} diff --git a/dist/qt_themes/default_dark/icons/index.theme b/dist/qt_themes/default_dark/icons/index.theme new file mode 100644 index 0000000..60a072d --- /dev/null +++ b/dist/qt_themes/default_dark/icons/index.theme @@ -0,0 +1,8 @@ +[Icon Theme] +Name=default_dark +Comment=Colorful theme (Dark style) +Inherits=colorful +Directories=16x16 + +[16x16] +Size=16 diff --git a/dist/qt_themes/default_dark/style.qrc b/dist/qt_themes/default_dark/style.qrc new file mode 100644 index 0000000..7de4737 --- /dev/null +++ b/dist/qt_themes/default_dark/style.qrc @@ -0,0 +1,25 @@ + + + + ../colorful/icons/16x16/connected.png + ../colorful/icons/16x16/connected_notification.png + ../colorful/icons/16x16/disconnected.png + icons/index.theme + ../colorful_dark/icons/16x16/lock.png + ../colorful_dark/icons/16x16/view-refresh.png + ../colorful/icons/48x48/bad_folder.png + ../colorful/icons/48x48/chip.png + ../colorful/icons/48x48/folder.png + ../qdarkstyle/icons/48x48/no_avatar.png + ../colorful/icons/48x48/list-add.png + ../colorful/icons/48x48/sd_card.png + ../colorful/icons/256x256/plus_folder.png + + + + style.qss + + diff --git a/dist/qt_themes/default_dark/style.qss b/dist/qt_themes/default_dark/style.qss new file mode 100644 index 0000000..ca6daa2 --- /dev/null +++ b/dist/qt_themes/default_dark/style.qss @@ -0,0 +1,687 @@ +/* +* SPDX-FileCopyrightText: 2018 yuzu Emulator Project +* SPDX-License-Identifier: GPL-2.0-or-later +*/ +QAbstractSpinBox { + min-height: 19px; +} + +QPushButton#TogglableStatusBarButton { + color: #959595; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#TogglableStatusBarButton:checked { + color: palette(text); +} + +QPushButton#TogglableStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton { + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#RendererStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton:checked { + color: #e85c00; +} + +QPushButton#RendererStatusBarButton:!checked { + color: #00ccdd; +} + +QPushButton#GPUStatusBarButton { + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#GPUStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#GPUStatusBarButton:checked { + color: #ff8040; +} + +QPushButton#GPUStatusBarButton:!checked { + color: #40dd40; +} + +QPushButton#DockingStatusBarButton { + min-width: 0px; + color: palette(text); + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#DockingStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#buttonRefreshDevices { + min-width: 21px; + min-height: 21px; + max-width: 21px; + max-height: 21px; +} + +QWidget#bottomPerGameInput, +QWidget#topControllerApplet, +QWidget#bottomControllerApplet, +QGroupBox#groupPlayer1Connected:checked, +QGroupBox#groupPlayer2Connected:checked, +QGroupBox#groupPlayer3Connected:checked, +QGroupBox#groupPlayer4Connected:checked, +QGroupBox#groupPlayer5Connected:checked, +QGroupBox#groupPlayer6Connected:checked, +QGroupBox#groupPlayer7Connected:checked, +QGroupBox#groupPlayer8Connected:checked { + background-color: #f5f5f5; +} + +QWidget#topControllerApplet { + border-bottom: 1px solid #828790 +} + +QWidget#bottomPerGameInput, +QWidget#bottomControllerApplet { + border-top: 1px solid #828790 +} + +QWidget#topPerGameInput, +QWidget#middleControllerApplet { + background-color: #fff; +} + +QWidget#topPerGameInput QComboBox, +QWidget#middleControllerApplet QComboBox { + width: 120px; +} + +QWidget#connectedControllers { + background: transparent; +} + +QWidget#playersSupported, +QWidget#controllersSupported, +QWidget#controllerSupported1, +QWidget#controllerSupported2, +QWidget#controllerSupported3, +QWidget#controllerSupported4, +QWidget#controllerSupported5, +QWidget#controllerSupported6 { + border: none; + background: transparent; +} + +QGroupBox#groupPlayer1Connected, +QGroupBox#groupPlayer2Connected, +QGroupBox#groupPlayer3Connected, +QGroupBox#groupPlayer4Connected, +QGroupBox#groupPlayer5Connected, +QGroupBox#groupPlayer6Connected, +QGroupBox#groupPlayer7Connected, +QGroupBox#groupPlayer8Connected { + border: 1px solid #828790; + border-radius: 3px; + padding: 0px; + min-height: 98px; + max-height: 98px; +} + +QGroupBox#groupPlayer1Connected:unchecked, +QGroupBox#groupPlayer2Connected:unchecked, +QGroupBox#groupPlayer3Connected:unchecked, +QGroupBox#groupPlayer4Connected:unchecked, +QGroupBox#groupPlayer5Connected:unchecked, +QGroupBox#groupPlayer6Connected:unchecked, +QGroupBox#groupPlayer7Connected:unchecked, +QGroupBox#groupPlayer8Connected:unchecked { + border: 1px solid #d9d9d9; +} + +QGroupBox#groupPlayer1Connected::title, +QGroupBox#groupPlayer2Connected::title, +QGroupBox#groupPlayer3Connected::title, +QGroupBox#groupPlayer4Connected::title, +QGroupBox#groupPlayer5Connected::title, +QGroupBox#groupPlayer6Connected::title, +QGroupBox#groupPlayer7Connected::title, +QGroupBox#groupPlayer8Connected::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 0px; + padding-right: 0px; + padding-top: 1px; + margin-left: 0px; + margin-right: -4px; + margin-bottom: 4px; +} + +QCheckBox#checkboxPlayer1Connected, +QCheckBox#checkboxPlayer2Connected, +QCheckBox#checkboxPlayer3Connected, +QCheckBox#checkboxPlayer4Connected, +QCheckBox#checkboxPlayer5Connected, +QCheckBox#checkboxPlayer6Connected, +QCheckBox#checkboxPlayer7Connected, +QCheckBox#checkboxPlayer8Connected { + spacing: 0px; +} + +QWidget#Player1LEDs QCheckBox, +QWidget#Player2LEDs QCheckBox, +QWidget#Player3LEDs QCheckBox, +QWidget#Player4LEDs QCheckBox, +QWidget#Player5LEDs QCheckBox, +QWidget#Player6LEDs QCheckBox, +QWidget#Player7LEDs QCheckBox, +QWidget#Player8LEDs QCheckBox { + spacing: 0px; +} + +QWidget#Player1LEDs QCheckBox::indicator, +QWidget#Player2LEDs QCheckBox::indicator, +QWidget#Player3LEDs QCheckBox::indicator, +QWidget#Player4LEDs QCheckBox::indicator, +QWidget#Player5LEDs QCheckBox::indicator, +QWidget#Player6LEDs QCheckBox::indicator, +QWidget#Player7LEDs QCheckBox::indicator, +QWidget#Player8LEDs QCheckBox::indicator { + width: 6px; + height: 6px; + margin-left: 0px; +} + +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer1Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer2Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer3Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer4Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer5Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer6Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer7Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer8Connected::indicator { + width: 12px; + height: 12px; +} + +QCheckBox#checkboxPlayer1Connected::indicator, +QCheckBox#checkboxPlayer2Connected::indicator, +QCheckBox#checkboxPlayer3Connected::indicator, +QCheckBox#checkboxPlayer4Connected::indicator, +QCheckBox#checkboxPlayer5Connected::indicator, +QCheckBox#checkboxPlayer6Connected::indicator, +QCheckBox#checkboxPlayer7Connected::indicator, +QCheckBox#checkboxPlayer8Connected::indicator { + width: 14px; + height: 14px; +} + +QGroupBox#groupPlayer1Connected::indicator, +QGroupBox#groupPlayer2Connected::indicator, +QGroupBox#groupPlayer3Connected::indicator, +QGroupBox#groupPlayer4Connected::indicator, +QGroupBox#groupPlayer5Connected::indicator, +QGroupBox#groupPlayer6Connected::indicator, +QGroupBox#groupPlayer7Connected::indicator, +QGroupBox#groupPlayer8Connected::indicator { + width: 16px; + height: 16px; +} + +QWidget#Player1LEDs QCheckBox::indicator:checked, +QWidget#Player2LEDs QCheckBox::indicator:checked, +QWidget#Player3LEDs QCheckBox::indicator:checked, +QWidget#Player4LEDs QCheckBox::indicator:checked, +QWidget#Player5LEDs QCheckBox::indicator:checked, +QWidget#Player6LEDs QCheckBox::indicator:checked, +QWidget#Player7LEDs QCheckBox::indicator:checked, +QWidget#Player8LEDs QCheckBox::indicator:checked, +QGroupBox#groupPlayer1Connected::indicator:checked, +QGroupBox#groupPlayer2Connected::indicator:checked, +QGroupBox#groupPlayer3Connected::indicator:checked, +QGroupBox#groupPlayer4Connected::indicator:checked, +QGroupBox#groupPlayer5Connected::indicator:checked, +QGroupBox#groupPlayer6Connected::indicator:checked, +QGroupBox#groupPlayer7Connected::indicator:checked, +QGroupBox#groupPlayer8Connected::indicator:checked, +QCheckBox#checkboxPlayer1Connected::indicator:checked, +QCheckBox#checkboxPlayer2Connected::indicator:checked, +QCheckBox#checkboxPlayer3Connected::indicator:checked, +QCheckBox#checkboxPlayer4Connected::indicator:checked, +QCheckBox#checkboxPlayer5Connected::indicator:checked, +QCheckBox#checkboxPlayer6Connected::indicator:checked, +QCheckBox#checkboxPlayer7Connected::indicator:checked, +QCheckBox#checkboxPlayer8Connected::indicator:checked, +QGroupBox#groupConnectedController::indicator:checked { + border-radius: 2px; + border: 1px solid #929192; + background: #39ff14; + image: none; +} + +QWidget#Player1LEDs QCheckBox::indicator:unchecked, +QWidget#Player2LEDs QCheckBox::indicator:unchecked, +QWidget#Player3LEDs QCheckBox::indicator:unchecked, +QWidget#Player4LEDs QCheckBox::indicator:unchecked, +QWidget#Player5LEDs QCheckBox::indicator:unchecked, +QWidget#Player6LEDs QCheckBox::indicator:unchecked, +QWidget#Player7LEDs QCheckBox::indicator:unchecked, +QWidget#Player8LEDs QCheckBox::indicator:unchecked, +QGroupBox#groupPlayer1Connected::indicator:unchecked, +QGroupBox#groupPlayer2Connected::indicator:unchecked, +QGroupBox#groupPlayer3Connected::indicator:unchecked, +QGroupBox#groupPlayer4Connected::indicator:unchecked, +QGroupBox#groupPlayer5Connected::indicator:unchecked, +QGroupBox#groupPlayer6Connected::indicator:unchecked, +QGroupBox#groupPlayer7Connected::indicator:unchecked, +QGroupBox#groupPlayer8Connected::indicator:unchecked, +QCheckBox#checkboxPlayer1Connected::indicator:unchecked, +QCheckBox#checkboxPlayer2Connected::indicator:unchecked, +QCheckBox#checkboxPlayer3Connected::indicator:unchecked, +QCheckBox#checkboxPlayer4Connected::indicator:unchecked, +QCheckBox#checkboxPlayer5Connected::indicator:unchecked, +QCheckBox#checkboxPlayer6Connected::indicator:unchecked, +QCheckBox#checkboxPlayer7Connected::indicator:unchecked, +QCheckBox#checkboxPlayer8Connected::indicator:unchecked, +QGroupBox#groupConnectedController::indicator:unchecked { + border-radius: 2px; + border: 1px solid #929192; + background: transparent; + image: none; +} + +QWidget#controllerPlayer1, +QWidget#controllerPlayer2, +QWidget#controllerPlayer3, +QWidget#controllerPlayer4, +QWidget#controllerPlayer5, +QWidget#controllerPlayer6, +QWidget#controllerPlayer7, +QWidget#controllerPlayer8 { + background: transparent; +} + +QDialog#QtSoftwareKeyboardDialog, +QStackedWidget#topOSK { + background: rgba(51, 51, 51, .9); +} + + +QDialog#OverlayDialog, +QStackedWidget#stackedDialog { + background: rgba(51, 51, 51, .7); +} + +QWidget#boxOSK, +QWidget#lineOSK, +QWidget#richDialog, +QWidget#lineDialog { + background: transparent; +} + +QStackedWidget#bottomOSK, +QWidget#contentDialog, +QWidget#contentRichDialog { + background: rgba(240, 240, 240, 1); +} + +QWidget#contentDialog, +QWidget#contentRichDialog { + margin: 5px; + border-radius: 6px; +} + +QWidget#buttonsDialog, +QWidget#buttonsRichDialog { + margin: 5px; + border-top: 2px solid rgba(44, 44, 44, 1); +} + +QWidget#legendOSKnum { + border-top: 1px solid rgba(44, 44, 44, 1); +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::vertical { + background: #cdcdcd; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent; + border-radius: 4px; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::horizoncal { + background: #cdcdcd; + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent; + border-radius: 4px; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::handle { + background: #fff; + border-radius: 4px; + min-height: 5px; + min-width: 5px; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-line, +QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-line, +QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-page, +QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-page { + background: none; +} + +QWidget#inputOSK { + border-bottom: 3px solid rgba(255, 255, 255, .9); +} + +QWidget#inputOSK QLineEdit { + background: transparent; + border: none; + color: #ccc; +} + +QWidget#inputBoxOSK { + border: 2px solid rgba(255, 255, 255, .9); +} + +QWidget#inputBoxOSK QTextEdit { + background: transparent; + border: none; + color: #ccc; +} + +QWidget#richDialog QTextBrowser { + background: transparent; + border: none; + padding: 35px 65px; +} + + +QWidget#lineOSK QLabel#label_header { + color: #f0f0f0; +} + +QWidget#lineOSK QLabel#label_sub, +QWidget#lineOSK QLabel#label_characters, +QWidget#boxOSK QLabel#label_characters_box { + color: #ccc; +} + +QWidget#contentDialog QLabel#label_title, +QWidget#contentRichDialog QLabel#label_title_rich { + color: #888; +} + +QWidget#contentDialog QLabel#label_dialog { + padding: 20px 65px; +} + +QWidget#contentDialog QLabel#label_title, +QWidget#contentRichDialog QLabel#label_title_rich { + padding: 0px 65px; +} + +QDialog#OverlayDialog QPushButton { + color: rgba(49, 79, 239, 1); + background: transparent; + border: none; + padding: 0px; + min-width: 0px; +} + +QDialog#OverlayDialog QPushButton:focus, +QDialog#OverlayDialog QPushButton:hover { + color: rgba(49, 79, 239, 1); + background: rgba(255, 255, 255, 1); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; + outline: none; +} + +QDialog#OverlayDialog QPushButton:pressed { + color: rgba(240, 240, 240, 1); + background: rgba(150, 150, 150, 1); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; + outline: none; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton { + background: rgba(232, 232, 232, 1); + border: 2px solid rgba(240, 240, 240, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { + background: rgba(218, 218, 218, 1); + border: 2px solid rgba(240, 240, 240, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { + color: rgba(240, 240, 240, 1); + background: rgba(44, 44, 44, 1); + border: 2px solid rgba(240, 240, 240, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { + color: rgba(240, 240, 240, 1); + background: rgba(49, 79, 239, 1); + border: 2px solid rgba(240, 240, 240, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:focus, + +QDialog#QtSoftwareKeyboardDialog QPushButton:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover { + color: rgba(0, 0, 0, 1); + background: rgba(255, 255, 255, 1); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; + outline: none; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { + color: rgba(240, 240, 240, 1); + background: rgba(150, 150, 150, 1); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { + image: url(:/overlay/osk_button_B.png); + image-position: right; + qproperty-icon: url(:/overlay/osk_button_backspace.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { + image: url(:/overlay/osk_button_Y.png); + image-position: right; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { + image: url(:/overlay/osk_button_plus.png); + image-position: right; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; + qproperty-icon: url(:/overlay/osk_button_shift.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; + qproperty-icon: url(:/overlay/osk_button_shift_on.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_parenthesis { + padding-bottom: 7px; +} + +QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { + background: transparent; + color: #ccc; +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_L, +QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { + image: url(:/overlay/button_L.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { + image: url(:/overlay/arrow_left.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_R, +QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { + image: url(:/overlay/button_R.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { + image: url(:/overlay/arrow_right.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, +QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { + image: url(:/overlay/button_press_stick.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_X, +QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { + image: url(:/overlay/button_X.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_A, +QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { + image: url(:/overlay/button_A.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { + color: rgba(164, 164, 164, 1); + background-color: rgba(218, 218, 218, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_at:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_slash:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_percent:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_1:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_2:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_3:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_4:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_5:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_6:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_7:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_8:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_9:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { + color: rgba(164, 164, 164, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { + image: url(:/overlay/osk_button_plus_disabled.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { + image: url(:/overlay/osk_button_B_disabled.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { + image: url(:/overlay/osk_button_Y_disabled.png); +} diff --git a/dist/qt_themes/qdarkstyle/LICENSE.md b/dist/qt_themes/qdarkstyle/LICENSE.md new file mode 100644 index 0000000..d8910ae --- /dev/null +++ b/dist/qt_themes/qdarkstyle/LICENSE.md @@ -0,0 +1,183 @@ +# License + +## The MIT License (MIT) - Code + +Copyright (c) 2013-2018 Colin Duquesnoy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +## Creative Commons Attribution International 4.0 - Images + +QDarkStyle (c) 2013-2018 Colin Duquesnoy + +Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +### Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +* __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors). + +* __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees). + +## Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +### Section 1 – Definitions + +a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + +b. __Adapter's License__ means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + +c. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + +d. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + +e. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + +f. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + +g. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + +h. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License. + +i. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + +j. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + +k. __You__ means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +### Section 2 – Scope + +a. ___License grant.___ + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce, reproduce, and Share Adapted Material. + + 2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. __Term.__ The term of this Public License is specified in Section 6(a). + + 4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. __Downstream recipients.__ + + A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + +b. ___Other rights.___ + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +### Section 3 – License Conditions + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +a. ___Attribution.___ + + 1. If You Share the Licensed Material (including in modified form), You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. + +### Section 4 – Sui Generis Database Rights + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; + +b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + +c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +### Section 5 – Disclaimer of Warranties and Limitation of Liability + +a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__ + +b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__ + +c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +### Section 6 – Term and Termination + +a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + +b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + +c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + +d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +### Section 7 – Other Terms and Conditions + +a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + +b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +### Section 8 – Interpretation + +a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + +b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + +c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + +d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +> Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. +> +> Creative Commons may be contacted at creativecommons.org \ No newline at end of file diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/connected.png b/dist/qt_themes/qdarkstyle/icons/16x16/connected.png new file mode 100644 index 0000000000000000000000000000000000000000..0afc18cb7a19028fd567a7ca7ced62cd164657de GIT binary patch literal 575 zcmV-F0>J%=P)0k{|sIn0V`B1xGGFnerg>I4!7^B>UM&p)aM9vQI<{ZJ4 z8HZ4p+_%{7AT1;1-`r}Q8XRRVYW9}G=D3HXRO!FFg z<>v6FfXkm66-$M=OnPPtTpl}lK!#o^J26y#00VLkV5Ig4hAIxCZ~AU@6mMaG2|$+zA&;BarDZyi@16B z4lE8kTwX8y!4LxB2>hW4yn!GbZg+WiA%P|k^Ip;o774}ts6fO6U&y7=hp3TO@-WL? z{^Mh)gLW3&bGqIiV!1gSPQ{V|zW{P&fJjHVbAtc? N002ovPDHLkV1hH82Xp`c literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/connected_notification.png b/dist/qt_themes/qdarkstyle/icons/16x16/connected_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..72466e098e471ae5a97c49a56536dd4bf62b3a08 GIT binary patch literal 760 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0*y&TK~y+Tl~Y|v z6j2oZ?(CguoZVz~OB-RWz#nLd9z^@Yo&q%@j2=qtp^PLV$cmEeAL_xE^2wfrs242~ zp$Ef$h%#S%kW`EcLR4x6ZEJVk8F%j7>CU(tNkRF+;a<+Y=R4my_gvyQ4zjp<{ql`; zI^D*(O+BwTbI<>_2MD8-wl5<%-+In!I@(0@^Fzo{bD*j!D3xKFhG&Lp!dzV1$6_(` z^gLuV6YIgUEb0c8*Ie*2x#lAhY;J={1gb21z6E0ugAZC@F^euEux;jDmV`UFz7l>- zK|xT%#N<56!g^D3Wwr@)QUY z@d)MRLDK?Qog0L{ZY_3>K0_%MP_m~6ird7|QOF|6#=1I$H9tA_=53H>6>z~YHTJ@7 zb_Nd4PV}Lux(a+|27GF2$(u@fs~(9UHZ*jca>r)zc$_}(It@ippva0SLlzB`5RY_2 zDJ%pZ9`=H=;M3EPtE-_V5`;>`*WTHAw^h71&5pJA_QIN1DX?Z|p%fSYQs6=ghhYg- zVhSf|d1>iW;`5ymOPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0v$<2K~y+Tl~PS> zQ$Z9x^WL<1ZG=jLsqtf@CIu;o=wGnd1VlHD;-XFKLZw(mq)@*>1VJ>!or+OVq^`wu znJxuC&?1zmaamnO1NME*%5JoAzwQ9hHiSzzQVT5*fC(vPaz_Kh*+6Kq5b=Zyr$6d-BjRvNsUN9r<)$o0v zs;137DRgyhL@Z{(G)=_g8<0qB!nUp3v1>;LeY^L_vp9U_(^UgFXW)W|)!HD0fHMwq z`Rc|0_8q`L@sq zk>1%G63fVBGANuFmY*(fDuPllKmS8eCS`Em`r?L1hp>O&UTLdSRsk4e>gLt9;4C;0 zLcq{BFQXMa*Fk%G45d;@#y$LM{=|d(5AnGC1hkF9bzQ?)OM&Zp`Y#clJ$)W#YAJ!{ z4H0nGY&P-w?HjzG{fJLxahf`;55)a!M*cR#Fvf$Tw4UQO#< z+13h9kDdH|_{gEo)RvScR^ra>BKrFe$hQ&GwNfR74B5P3+o;Y|898=5|6Tg*(O>)p iN=@~G{{?26=FLU_5=aXOVS_yY0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0PIObK~y+Tm69-MR+S{A4rd$93002ovPDHLkV1n$NkJA7E literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/view-refresh.png b/dist/qt_themes/qdarkstyle/icons/16x16/view-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..d4afd76f949ff5c65e039b69ff999325bff5d7b8 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zD}XSgpwrRCKtah8*NBqf{Irtt#G+J&^73-M%)IR4TP^t%4d#k2I8AjubO%ZJc4Wi=K76~$%(ummCcGBuJ*0$4DscJG+Gof}VN~*E6 zwl1SFmP;$0nn6@>Ek%tgVk~oODasf|tGLM@_s{#+z285c&-eMh=e*B3?>X<2?&C#Q zMd~5}0ICevV}1ZYG7AB?k_;PhtR(=H-5JM@25?3frHcGeh7Nu8@V%NEv$%8f5_!W6`ML-MdQ+D4C0#gVnC2wcWNh)*pa!N_g0 zY2G2D7EXh#QnMTwcQsk=IH{6O(T?j+h$tvGQo(}`W00V~A071Mnr>>ztQSpYDciTN z?qTgMBqqHeXXaVk{&bSx(z>5tSx0iHHR!geeEJ1xvZjYfaOty3!^{~*maH1i);rSH z==-oU?=2&2QEsK}-!zFKk4Q%W>Ws@=2 zLUSP>G<73~@t>xv^DND~`Cxp!-xjLyYm?^Z$Gc7X4>#_%6^q_`w>p(7O;TLycEzJ2 zhi-A1(*01UE%wEP7esTM+hqKsy6@YnMMcBna;576=?+GDDzc&F184ben8NFkBUAWd zW?BQ9^8wokBiomO20OCbD0Ge%<+T9e6V?aSsAh@Y0>Tn#K#NS*0l($YdF9f*tq#BM zZ7JC^hchq2bB_e;e#*%ub(wOHly!djAnX8ag~aEi28=%jJCI%e6ybg_JaGDWxF1aY zn+JPp_2d3fCl=P7nS|ihR}^D!{H%Tyi2tb~_P(=f2&W3N95p^oDMaaiy=opM0&G1dx)O(q;pYoA57 zC}K4-v(a4TNCT}#JU}fv5w0BvdIG`a^wvg?D$o>VXDJ$|m~zuUCiTZl!c3J**Ah<6 zU5)Z5C*~X|GfOO#I0nFdljE;?vfOLQmo*DX%%BsnMirPF#pRBAz_&b2*lDeaD`;lA z)Q*>TkFH#8PjUR0#kI3W8N<3rYGaD&|MT@AJU1>n*4snIeNnN_aym!Hy2@!3{WMHY z%69ZXNz=DJpsq?uji`*&2Rs_-*21ficT`9z;nyDq(sYFdiZFE*we;|yWNdre(%T0;FQF?&0WBHLAn2qGp}aP#phG0Aod^Jc0>yiTAMbw$zk zxyL95em))E9AZ>RAa!cQa_5xydNj()2g| z`OW;U#aALFM#smE6Y|CCTu{06fvnAFo7Xcz<8-$%9XpsJgVnMA9aXzX`t-HTZEZ;f zR;_vZs7wcO=VRv&8Lcn0J&ec%U6Stky2*D{R9TJ7Eys1$jDePbL&_0HS-QC-_I_EKiO$qU{vF zlPMgK6gH)WjlI9fn7EEwi&49ov-nYPftgUe?&uN`+czD%(3y5(me|J%ba^&)3&Fe- zFG{0ximo|6O8N5_UF_?=B1#W!vGyP-jD19K4e&=u3bIj!KKN2AL3sCM=O*T%R NFlb)Ks-0Mg{|0pPAie+q literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png b/dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..245f96c7ba65c9a792abc01a1b76c39accd3ee5e GIT binary patch literal 1061 zcmV+=1ls$FP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vG$asU7#askq98zBGy1G-5>K~!i%?U`Fh z6k!y{XV&$Gn6yQxPlkd}SwWHMy0VoOURDZGvmm&c?) zLp=nUQE3qovAd-~k=btReErYNS@)vCI`eI=us`^F&iVG6`Oca7=9`O3nlx#aHY(d0 zgbHcmZ8jRdvb;{{u*VCo~4h;sKP$yH73{=pYoLQ6-c7A~3*4C_tkn ziR2c6o!`-iNiNAL0y|v^#ZR3{s2!pUdO={DJcyE&MG*P~^+Q{Dmf{&`lJf-vX!rQapmKX_8n3(E;rz zM@1#Au(v3Pq74b$X5SLne>TiXXp`QsaOg%_3oX~92yc+%8XBM#iie6y8ITVxG;j6H zVkw(z`lK8<(&I2!j3|cW6!3X>mBZKQ>hd-@Pms^eR{6#@ntbU6Ow?B{vuE0$302^T zsaMITHvU;U(hCUMGkY*=%Qyt0ERd0Tngi)bEx^0SU4jL;o5LBfV4w2WSC?`q6}e|1 z6zap@9OxGo=yj@QTMwV^2U%K1##vbDNGrhSac+faHzH-UXyEDV!n==N!GC8oi8g;z zb(P`ELrMX-ZL5l=UW6Nd!;8L?hkaF3ZI|@E5|L7X-&3;>PbN+d=SL`&{zg~$EJ?v~ z0UzD&96TeQ<1kG0QI0v{LectY8xAdFxqzI!P&aOsB^-t+_chd3_?umH5tkcH4EpBg zhv?Zz3YH4+?X6ygJIi(2o82hHN^iKS}uCCxuZlF}rj4uQUV^c-WRQ3nQ z&``o>V7@%*hZcIdjH8V^qzsgkky;EbG=(ONE-_TFO(iz4jb@xGTLJym>xu9i>VW8z z$f80yKnI{HC>qMyq0e17gD~_FYAG>*>$Evs06la)hZg;aCrAL=i~>gVWfaaZOeYkg zIK`nHk5KYP7zNHm9W)B1D)e=3JEyBNYyCzC`gFYmqK?Io*?;oMA_#qf?nC!*bb9T(N<6W3g0f0S0 zV;VJm<6U$@2LA_IHvkym377)w?Hs6yYosB54NQP%;3~8+J4p}tbQPz_H_+26zH{Q@ zw|oG>|4{)(35wtHsL{aG5`6=1gN3VkZh%)S*F-~jWr^M?)O#pb*UI(l8snT}pu28s z=exXpfSp&tz8iJe@gB7GPG0f0SE=9|@1Wv^eB(8yP(RUF5vgxrBqGaD;Rq~cQ`;WF ztB~vW*m{?@3Y{Cdfz;#%Qge9?;OT{G#y1k6SL=l;n?&I^4sP+TjmH;Hy@fI6zWjy8 z6j~%2Dur4F^AlNW+BC2(Ul8F$qNHsfW;q|~+cYqB(ZDtElc4x_G>#UFCi-m7Do=OV0 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/folder.png b/dist/qt_themes/qdarkstyle/icons/48x48/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..11a76b5c1256ade016d4e22cf048656cb0788ad3 GIT binary patch literal 594 zcmV-Y0Px#1ZP1_K>z@;j|==^1poj532;bRa{vG$asU7#askq98zBGy0q03XK~!i%?U_4E z!%!H88$lh4gO^2TC&3FSj^ce0+^ST;L7bfY4gLcKXK~e09Ti<297Irba&WSawRoZR z`A$yTr0vkg#FM~z;Nd$bZF9aiO;ehtEEY?$adfRvDwWzPi#Uz_*nvT~#XZMy3hwkD zp!o%S#;~};wBCKRu+Rqn$f_X|eFzp9!%tZ)BBBk!&d=2{(GpDvcG`!vr%oPMQ9jTu z!E4ee&4$GnzThEF>Se01aRzJI)ei@P*M}XVOc4*Ta$wuA#~u2(*EJAaI`fnzyjB~+ zLoWNHnfg>kxpT^ znpJtA$01oDgSAMg*g!vWp?OrD`5A0<`os>7bdIv`&U_>zfaXnCFI`Cr&=4EIG&X=~ zYyi{P0H(14Ok)F>#s)Br4PY7xP;`er>h4;{fJQwPCBVBo_A#t$oEX*BOHO|A_u{wu zjbG&hvnaPjj3PbYIu_82^xUJ~76xY&xe1jdP94WtE(aK)+@SFz-XxzmL4bR86=HBl z*}@;0#~kT#Q<`_D9(X6_@d@LK+?|`%?JDXnO*}zvUC*IBaR7t<$rl!1_==Z!!I4kG gSz@tRnj@9^1&f2f8>0Th=l}o!07*qoM6N<$f`1kN4*&oF literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/list-add.png b/dist/qt_themes/qdarkstyle/icons/48x48/list-add.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbe78011661fb22d94921dfe4e4ac7a513c445b GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCils0(?ST|Ns9FWQHEPTnD6>N`m}?|1&(@Zr}yvaTa()7BevL9R^{>`cCrWZG_FlPc_Qqsp@7)ylz&11c?VfMv zwKLG6LlU9Php8)pW57{hC(v7~dJRkfw}H_R!p}0_TMFt)^_Bl;T0K#TE&+GwOjV6BtjBuQOJad|wIjb#}*kqzt0LgxEaM-6$o2 z=&x45p4h;Y1Xd-)=2;yZn36!5t9VyzU`hhh39)&e#|EY(@H8Q|v}Z+k19b~oE2MTM zfvq8g7cs%nEf7L@3EYc~Z{TjMd@|}_35(dlO5_`oxS1e7QmK3`fgbf)g#4tswrYO> z)L!-RBIKW#O#({?b)9=(HiGwL<9r)uA(sN2mpITPxa+BKnGRJT{{*P%m>QvN8_ zO+Y`;SGzU?8-Vq-TRsDyfVaRy-~limLU>=s`=d}-sK?bi>YqhSp^Y=rn0iW$-Velx zFIUg1A0woj@uBw2<*k-KqE3}4o@Yuu+zRn7^|EPaKnrEoY#oW-rRC+j)mv>4&ogRj zmooeEH!6^?Gh)j5sd~Ob`8wz3b8NZ}sC~eF5>5(Xf_o8P(5I46U)KS5Pj_B xtGpu?ybXa(fgr_D(9kvaMy33=_*cgJrEMx@Osb~NtpPcd!PC{xWt~$(69B&7LxTVS literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/star.png b/dist/qt_themes/qdarkstyle/icons/48x48/star.png new file mode 100644 index 0000000000000000000000000000000000000000..546779e2a810e73169f65a79850aa07dffd70267 GIT binary patch literal 1055 zcmV+)1mOFLP)6O$xyr@ zPaa%KDJkUv50sKZ9we6sL?n6O3FSd@YsM`}W;l~^srh+0Yd71s*WUY_v)6V?^RNA| z*80}}|Nqumd+oK>5$Qv9Ve%pdW{JpR5kW-m7-JsgrR5bs4RC@ejsyLw?JpI;c8B=@ z+p6s^5r6^O5)xPZUG@p1(Wj>GIk{SuuZhTYRkzBsrau5L)o8Z>YgOIr zYWs8on5m3*19iX<;Ja#@;Y-)&6w=e@rZJ{qjOh}QTPd;C2k=yl@`g~`M%DJLnqDIS zrYVEJfDxhg;lNK7Gu4N-uPLOb#BF0tM^G@vbc)EGls*-qzpD}$EFw)JGOk3P^{RZy z5pz*QmW0Z!z^4-V+ePG_F{V2;5?BPhqjLNPMmcy#*|tjY7Fd{Oehly}g9yOM1pZSQ zxxWIVlM>jQQQ$66m%u+1xR+65Pnc7`1Cv$xxrp42&A1m|MC87RTs6iJ7i5h21~iMv zauJy)A|p%SZWfV-1dqJ{4ytT>fFnR{2|`{0)LQKx<>^3Drv}_F+GAkKKQuqZYHIuf zCZ%;=X9G35fX)BF{AQwC@WA}qQc30jFB~KQ7YTi3JsKYhoQu(H1Ll`YSO=VqA#4X0 zcr-tU=vF+yg-inmYyt`n;@`j)59YVve(wsvrmXydNCWWDA<_dZNoR=VT}E`3!D=<6 zGn6M*3mkR`>b-tBoVOhVa+o}qZK6lSHyOC}o~yJ~CWK11(*sobLj@cG-luS>^0E-oQ z-1W$FV0Hq}Y#ZZ(=4|$vKt1pyMmWG}O85v-JZGFv;pzrTIq;X2#QqquuRv=Be66;x z3;Vp9w}J-PMR6H~;@0;vFd+ly1mFt2Tl7v~Cwcyl2J{Ce0>eCV4ztNP?`r$dhd%tr Z_yd6az_?NMQuI%?&Bn5OO*L%Ib02GqV42dXl&d<$F%_{+N85o?4 zQWHy3QxwWGOEMJPJ$(aG^itV@;trlJjv*0;-<~t%Vo=~=cKEuuHadP)@WGQuU7r}S zO7(3kn;EC7l=k(^o8K==q_@k14TBON%sx1ZaXWETh=#i?0*QIL`njxgN@xNAL{>as literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/Hsepartoolbar.png b/dist/qt_themes/qdarkstyle/rc/Hsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..7f183c8b3ee5ffaa6157867cb88ebb7e67f9c0fa GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^>_BYK!3HFCsxJuxDYhhUcNd1u43!L(ckTxN0g7-I zctjR6FmMB9xrG@SX3dcR3bL1Y`ns~;XOR@p6Zv)R$U2~qrKgKyh{fsT1O>Ju$B!EW z@!}4{#Nd`-q4nn`YMg93@~{6$nhfv4z>`4eS;NZqID=!NmZu#9Lx(rZWlOyY_CP}z NJYD@<);T3K0RUVxGDiRa literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/Vmovetoolbar.png b/dist/qt_themes/qdarkstyle/rc/Vmovetoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..512edcecd69bd11ef3d58930ba8304473319e183 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^W%Wd+bj3AjN&xsQ+Rrz=y7dXn1bJS$(l?zvsn?)HIstmk1 U3t#Ex0qtY(boFyt=akR{0D|pGN&o-= literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/Vsepartoolbar.png b/dist/qt_themes/qdarkstyle/rc/Vsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..d9dc1561b473019a12091725e724a44d979dc238 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^_CU| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf9S(6$Q|-`GL0Lc{Yfl%)5R22v z2@<^xoY4VJd!B_UMqU2{D9-fNiI+30b a28PTOZq~oq5vPF0FnGH9xvXAmd+F5V%0wNv=peG!PC{xWt~$(69A|)Be?(o literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/branch_closed.png b/dist/qt_themes/qdarkstyle/rc/branch_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..d652159a365396a046329cfc7695c89ee54431ca GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S90ZA8lL>4nJ za0`PlBg3pY5H=O_B-6{JiOAS{|sjWh15M=978y+r}k{*WnkcFe(-;BX~D)* rS0)5haD*y~YzrxP=F!`JhM)Jr2M#8aN7~DQS{OWC{an^LB{Ts5zf35P literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/branch_open.png b/dist/qt_themes/qdarkstyle/rc/branch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..66f8e1ac619d242f3d5a31ffb11291c09ea40468 GIT binary patch literal 166 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 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_disabled.png b/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..cb63cc2fac47ad304451f864be5fb9b9085910ee GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7Jo-U3d z5v^~h`}!SnkZ7B~UO?mu^MY^z;cfGr%T7e}s1?W?8ZIpHm|nqi{YV9S;d_3jiRW9V zC@j#CiOINs*XRD1%4NQnC4ao1_;X|a8O{J^t^>=I&uJH^EA=Yy=q@QJXMe6{= z3nu?QmTiqn8yL4lU7L4ID46lSggggJ-lhEfrK>ewSvD~j#OXbEpLgByNx%V?Yugz2 z%=F`x=yC0fIn20j(F*mKC7cqgJZ$I97rnv0D^bF3N854ErU!Bp^;Wf}GDU{OUt^u0 zW>d#j^wD7Ns`t{1S6kg*n)>$7^lzH?%EjxII~|lJaHueWsWo@_*Zi9Q-(<7@f_{&8 zrO0b9HEPU+9v)SBw)%l|Fntmmjz{W9#jS ei>v=l+`}wZn5FJg^3NX_F$|urelF{r5}E*p0K`TB literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_focus.png b/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..671be273b06e2b721f494379ab61e527932ba69e GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI zppNSx%;=;sy8pirl$i(^Q{;p7B~mkolg-~Zb$e)}u@ ze@5oRhYp5nY;MQ?&){3o{PczlV|l~dUDN*uim-MX2VD+|d1jngsyJ2mc)FUftqnvzx5JtA;>!fgJt|n_5jQ7B^fH6Ii)cTP@1u pu!mvshZ3I`*Gv}|E|RNaU|1Y$kt#XS(go-!22WQ%mvv4FO#o$0SI__e literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked.png b/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..2159aca9a10f75729912579b33a1226e575799aa GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9Eo-U3d z5v^~hTl*b$5Mg-k8hGeCL!&lB&^xD7y>BB#3gn$qXZC6ymd#kPSfgCwOO2D=r^N+5 zJw7|dgetV6qbk!>#or&Sckj|)rDfLlx9!BzLz){NpZKh3z}$B1``V5SO@~m`&d1TB zFPXg)nog`1-usI20_&}gBemzbKX;_n9XqyBf99W!7jwS#7#6F4()FBFa_MYZPgcU( zS_U_U-aih`PlO_t6}*e$OX!)Ie`yQ*8keuHPS3X2n8Pqxfn#3m>Ec5MHB4$L|F3^% zND!}B?-loe_r`C{2jMH2Uo}`Q;Db^cY&se~TB4iwmri9$b1?Uu;sB%_cFATAov~jhym_YEdgAln?ixeQ z^=a2;y}eWCW~RA2fzc;$?>Dw)YxnzqlxvtK94R$eY;o}lF!UKbUHx3vIVCg!09=m0 AT>t<8 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_disabled.png b/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ade721e81ba47fa792d4586516b8744f8c49c8bb GIT binary patch literal 464 zcmV;>0WbcEP)z3Xli7-6*p9aNvlr>Itd;TFIVxd-y|OyrCsEBb@QA; zCyb(7HXkO*sBg@biZoF@2MSgIU*CL)>Rq?ji!Gh`NAd|iaAZN1hu>)c0000U^V1tLjO7h)cTN8vD8kxl9CSG-=9zI~sp3@KWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNQT>E=U)k3)21RpJh4PJd%48X!1Rk<{TbF5DteGD^~0|g!!@C>GY`iyW{mLQwXR9 zjuawUp;Cior+G8=rW1YKL<346a~6o?i6 z?{azNxS!7yQSaX@eYYe*y&Lw~I5fO96fyKs5_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNJl_8_?B`8_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00FK^L_t(|+U=W3lEWYj zMI&9@_Q}(`u2cpl>3<1~)?G61A!s1*ckDcfFZ2UV}LO?5Uq!7sp&5|Lr zfTKjnjPRZkWJYjL5i&cxRf5b8ZWSRb!H-Cg)!=(2=w1ph*!w+IAXfO}IR0~7*F_Qa z`pw#RYZBDEVegGY!&^fUrH_&@lDEd7sB!Nt!IH1UVjcpe@#iI>l*c;nh*$5U8tIw$ z+l1&g2_h;1+4GS90-h2W@Lz|3$D+sDcqIJ$Fn}zDEtSCPdH7ynL;@Qgz8UI~5CQ)& z2cR}RH8?i>>pVc&4v)?WjLjA8JfIhbwX>uih_phn;OPQd;F$0s0xau*=>@dHF(qg= zc(w$MhG(27gbHYZkCXt}4UYCaV^Kue4UWP@RDxz2^AQp>6MTdOw?k3H81~KwJrqSu zV2n!8tne%eQYe>aG`#0`e*H)qaweD|UsZtR<`t^3qj^g#n!V@I`OOz3vPZ3w_Z69r zWc!xbim@+B4kW+tRoToUXqTlkN(i|wpGAW8(Zqf-18CSiA59@;O!aKeLkRQXw z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac(A-+!@lDKp{;}7sn8e>&XcR z7pulY;Wn^IBG(*7A%~?b^VC!N=hHC=sm-IdEdjT~uc)I$ztaD0e F0ssj2CNKa1 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/down_arrow_disabled.png b/dist/qt_themes/qdarkstyle/rc/down_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5805d9842bb3c8bdf9ae741ebabc690a4929585a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAyZcdU741BJ9aT^vI=t|uoP zVCdoDDYjGKUczBuWT3#kjKjddz-flSK@mm~;ef4+85xf4WSF7(8A5T-G@y GGywodVJqnX literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/left_arrow_disabled.png b/dist/qt_themes/qdarkstyle/rc/left_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b9af8a34edb5f8dd767bf6afa303b89a31d38f GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9bR`<_$&i(E==bj5a^zeU&bwdtch>=_qAH5C#I(A02SZ= z-pqyvve{!vh3V|K2(Z;?j0;|Hq>tJ+4>OtTGCRJHZF@ZOcP8^q5Cr`I<~ScB9o=p= z&m^6bC_rXoz*@WDo;`Hvf?xzGIc?G2OIwY`1pwD|f5YrH(7gbIoJl|JS(+dUbvmTb zB5r&Bqu`aU1z`4E`<=%)mdf9?a};sgxR2RT5LuX#bWVMU#oQ*xD``&)6vecw1(rnna}5U zBv}}JUU#-zt!rHi$mjDrIL<6^D(>w}Oik4Xve{RW-j%cpG=ZjI)y&=*IB?)K*LCj$ zRDHh$oRrzj^z?Kq>70&LUiJM2-~*uKdfs9uz9g&qe#y)}0Tx})E2Z%}7S+9tjgq8G zz(UpczpGZOFDG$V%H`Y_mC6rh_9@YK{BbA$PyEhTe19x7TSPh3(2no@8jnJ}d` zxvz`)Xu-@3Q@U%O-8ttu@B6#&eeXFJcD1YLUFyZ`x^CY1#GHEIZf^VJ)fa|)EWFnC_vkwH{ z6N%(XrPA_FUeEIm3uZ8T)68avQmNeZ^mN!MezY4vBl-Klxl+0Oc_(iW1WUkMr#lwA61mWP^6gmcikThUVXxDm7!9M*?_AgI18~gF z1H*|#;zYYVZ2=^WVYb|CxN5a}7PC=xsG2|quMNcGX92#vbZHT|j#=*jKpN?%*2wG> z^-_116auGOL$e=c_Il3%1~2LHcaC7B3vd(Eku=gAhHwvQuxEgJEbHl{+%bXUhz^zO z1aMzw`&uyYd#6AxNnr@rTl>rgF}wdX0Kb}a^ohVmh_EiNtnd~J1gWB9;< zQeQOsw@G^iF9MGY79E(`tkvF|pP&B+z|Uqc0A~cJFP2I-+U4om@B3+mVcy`Fr2H#G zLmzjg?Ph4o^Sm*c%>u*JKeMaA-Ny3E)PG1ufSZlmvu)!&6#&$4$V4J>LSZIJL>K{la{0H2c zs~|?9C^x;rMaWb-8PX3|8pCWt!biMuy0?XQWQb<;X|43Tx`%u2d*Ay#=bm%m2uC>V zP+^=~UTj8M8r2nG5a!!_AedR2Z~X` z^C#k-|Ev48KfKp7anB!#d;YJu=VuP2fR+8R!0=+yodD>W_Zv61xCvYrMa;V91*W48 zlk+`pV9$aJo67F4y{x)QP|# zuvAI7%`!tkOxID(?!{Xg)et~F>Au&7WnfWmGWAJX(Q5Xad@h zW4pXoZt`faArQrMmE8|4geKr9vZClrczyyP>M$wW1;^C+m=Rbk24>RMfiB>Tz-(v& zg}`J5R?CJlfcYLbaD)NiLsho($9hS_#bPR2np!I<+q}LsH82yJKrt09X&4bjD(?9s z0J&awy%3nQz-?_<0DQpLhJ}c5s}PuT`K0>|VEpS=+R8ut=DfSL?<|gce#SPIk-hj& zt(8>gOaGp2U}Fbv$L{QRX+PHZKoq0E9FWc@-S;(`SC^H&KO$sSHiG-Rwc{`Y$)JXZ zz-et*7KJCUW)t9~eK8%t7hpJ_bZ7s|NY)%tmqqQ2WNlR=*;_}EZE9fVKruhU5e^-G Y1NpBZRoRadK>z>%07*qoM6N<$f;w}DFaQ7m literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/radio_unchecked.png b/dist/qt_themes/qdarkstyle/rc/radio_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4def65c64a9d55441f82fe66fc7f46e5b73a75 GIT binary patch literal 728 zcmV;}0w?{6P)@!=&7gwT^7eV48y+tYIRCxlLiT(zip~u_E}K!eZQ1UCJ)XWpcn*qFv|mj2Hymm zGOGZ1&1OGlqk`+ej=|zgCiDDE0Kzalw_mH}fqMq8tl7*>&(3Zg z<=pb}a>SKCQhxe=1 zDZv#_S~^K`0Q0>2NJI5nZ6eAi5Q&W)Tj`Fao}46Y)*j1A!XehJuV&-U1oWX;y{+O9Vm8?gbB$>af^ zw*ZW{XL~Faoy!4ZGMk^9n`^`d07#`$FMw5G<+u=%tPliCX7&)sr_<@k@^=LQ*e#cH zlGcEH(Ye>fV(~_l?|Kj7Dkc) literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/radio_unchecked_disabled.png b/dist/qt_themes/qdarkstyle/rc/radio_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6ece890e750b0685bbd818f22e5fbf999ccd35e1 GIT binary patch literal 760 zcmV6Hyq3pRX0tGI#@4O=(z(ra$opASN0&l!V!~ zGsFupMi4Yn7A{E9xN<|Zbl8%Z;>x%YH!O_WHWI)PKm&#gz*M7gJ{PpnM5bj5JNs=u!`ga zdVmk2x~L*MwQ&UK2QB~`Dl%3m6rLT6fN7e+lZKH~)f)mY2nNUV`F!P|tYujVfhklk ztLk(#78{?OoOB!Qf1;T{t^7JLns=NBjk1M8p$uFZv8+*G>eJ>Xz*wU-!A3(nlNkmc z35?D<&ckN1bxP&(QZkYFE+Y35$z-KmF0XlIJs*K-nw{NUU8}&yS;x70*z&)zv)PwG z&(~_T&+A|YycTzd!$Uw!g29Pa$^inZw}4*5Fa|v{UIP(HqgwGgaEIaP+*}D*M%BLn zkV52jtL1e>^_8ez^ev!pO8&g(E#tx$L?XTg094i2O?hBJARzl5{sneL_4H8%R5gO? zZYu(BRiyu@0>FU48{Yx~Mc}+;S&3GgZQD)(=Mi(Ony70 zgw)FKi^z1|aUM4cH~kt$W3lniTU)BCIV+pJ6jU9r-EjY4+jdG^H>WTlBDu5C=s2S%SwytG|&qy1B<|RZG49PACf*`UEpTkaXb%RO9HU}g)|IfP+T{SND8Rm6FUm; qM77uv3N6gc%>4ATZ<{v%H@^W&H{IQg@q%gq0000;(ZNqD1xa&r7l*n1_#$VNv$@8uKpD^(Yg!rs-u&mySz3x zZPmewoA|3(5ed=3lvIQo?lU4S?;e*cbV-``!^wBndk*Jwe%*6`Ofvc3g`y}Qe%Lrf zM~=<{C<7<~DB7nM*t{X(_-1F@|8?!;Zt4JTJ(y!=55OpZ_h7S5!fDy(A~R0{I738D zL8$7fp+~8t=)#MxT`%|Gok$E|orn3AV17^=sdPmu z9ZIFWq|WE0((KlQ>oIJr*0vn02W-QAB%)70FAq({4B!bfkMfUi~ek_$f*RST)55J#+#BE2=;@(#CR+jDgK2NURglS37FQ?Zk`&XaJb+PUn~Z%}G`mo&kx!C)voplk7DK$Im&m^!<{% gmtDJ=WHPAy0n)7IgxW`FVE_OC07*qoM6N<$f`lX-a{vGU literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/right_arrow.png b/dist/qt_themes/qdarkstyle/rc/right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0a4e6a7a8097818d9c0626c84f19f4d690dd31 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9wUkJ;l%oZHT?}(3D>Wp7T%b9XV|~Y(T_!;F44$rjF6*2UngIS-C?Eg; literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/sizegrip.png b/dist/qt_themes/qdarkstyle/rc/sizegrip.png new file mode 100644 index 0000000000000000000000000000000000000000..350583aaac4aa474ac449eaea2cc7ddd060276b9 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0A8dZe4lyHC-T!u_VYZ zn8D%MjWi%f)6>Nz(!sM1rC-2ha+zM<2rMwpeI*@Z@PO%TWH}e*?iSqXK(y9 XcW6R37#&FAr-gY z-rUH`puoZ4SQyZj9Qd}kRkgExspwA+*PdmovgYQ`l$1@M%Pi(EdF8VmvF&CX@A%e}M=bpY`_UHx3vIVCg!0H#+y$^ZZW literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/stylesheet-branch-more.png b/dist/qt_themes/qdarkstyle/rc/stylesheet-branch-more.png new file mode 100644 index 0000000000000000000000000000000000000000..62711409d7ed69ec98979394795822630458d9eb GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5PiX%b9eR9<JS%C8jVk7;fc! UBk#RM6lem2r>mdKI;Vst0ANBkrT_o{ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/stylesheet-vline.png b/dist/qt_themes/qdarkstyle/rc/stylesheet-vline.png new file mode 100644 index 0000000000000000000000000000000000000000..87536cce16aabb3710663f720f8d354b1bb0b757 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^fk14@;zM~Ln>~) zy|9s&!GMF=@x%h2gO1`OFspnaH4_oY}#FfpL8m Q-wTkir>mdKI;Vst0J6j{!2kdN literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/undock.png b/dist/qt_themes/qdarkstyle/rc/undock.png new file mode 100644 index 0000000000000000000000000000000000000000..88691d779507c9b809391396407f5cb4a6497c40 GIT binary patch literal 578 zcmV-I0=@l-P)WFU8GbZ8()Nlj2>E@cM*00E{+L_t(|+U=X$4#OY} zLz`&--S*43w`rPoNlWaQLS8pfd~hg*uq-oX%osV0`LJ!+SPR{}9r(JUC& zi*OVO>rs3r1nW_FCJ5_Yd@BU&U3e=9yOQ`b5bSE=k3zUrc5+?UXD9c4F9B>-qyH)% z1tH=BQxRVU!7FWl=67leWRLz4ahXo| zoe{&T7oZ-FMxDSsBBvjZ{}acq6e%f?_~rzJ_LzyflS`(bcuN3?R&llQTw-2U8((=NC3B QV*mgE07*qoM6N<$f{lRZzyJUM literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle/rc/up_arrow.png b/dist/qt_themes/qdarkstyle/rc/up_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..abcc7245212f19a5dbff1bb19647b1dd4bb05b6a GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAy| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;v6FKKb3EC1BH}5T^vI=t|uoP z;C)upuu) + + icons/index.theme + icons/16x16/connected.png + icons/16x16/disconnected.png + icons/16x16/connected_notification.png + icons/16x16/lock.png + icons/16x16/view-refresh.png + icons/48x48/bad_folder.png + icons/48x48/chip.png + icons/48x48/folder.png + icons/48x48/no_avatar.png + icons/48x48/list-add.png + icons/48x48/sd_card.png + icons/48x48/star.png + icons/256x256/plus_folder.png + + + rc/up_arrow_disabled.png + rc/Hmovetoolbar.png + rc/stylesheet-branch-end.png + rc/branch_closed-on.png + rc/stylesheet-vline.png + rc/branch_closed.png + rc/branch_open-on.png + rc/transparent.png + rc/right_arrow_disabled.png + rc/sizegrip.png + rc/close.png + rc/close-hover.png + rc/close-pressed.png + rc/down_arrow.png + rc/Vmovetoolbar.png + rc/left_arrow.png + rc/stylesheet-branch-more.png + rc/up_arrow.png + rc/right_arrow.png + rc/left_arrow_disabled.png + rc/Hsepartoolbar.png + rc/branch_open.png + rc/Vsepartoolbar.png + rc/down_arrow_disabled.png + rc/undock.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_focus.png + rc/checkbox_checked.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked.png + rc/radio_checked_disabled.png + rc/radio_checked_focus.png + rc/radio_checked.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_focus.png + rc/radio_unchecked.png + + + style.qss + + diff --git a/dist/qt_themes/qdarkstyle/style.qss b/dist/qt_themes/qdarkstyle/style.qss new file mode 100644 index 0000000..328ac94 --- /dev/null +++ b/dist/qt_themes/qdarkstyle/style.qss @@ -0,0 +1,1987 @@ +QToolTip { + border: 1px solid #76797C; + background-color: #5A7566; + color: white; + /*remove padding, for fix combobox tooltip.*/ + padding: 0; + opacity: 200; +} + +QWidget { + color: #eff0f1; + background-color: #31363b; + selection-background-color: #3daee9; + selection-color: #eff0f1; + background-clip: border; + border-image: none; + border: 0; + outline: 0; +} + +QWidget:item:hover { + background-color: #18465d; + color: #eff0f1; +} + +QWidget:item:selected { + background-color: #18465d; +} + +QCheckBox { + spacing: 6px; + outline: none; + color: #eff0f1; + margin: 0 2px 1px 0; +} + +QCheckBox:disabled { + color: #76797C; +} + +QCheckBox::indicator, +QGroupBox::indicator { + width: 16px; + height: 16px; +} + +QGroupBox::indicator { + margin-left: 2px; +} + +QCheckBox::indicator:unchecked, +QGroupBox::indicator:unchecked { + image: url(:/qss_icons/rc/checkbox_unchecked.png); +} + +QCheckBox::indicator:unchecked:hover, +QCheckBox::indicator:unchecked:focus, +QCheckBox::indicator:unchecked:pressed, +QGroupBox::indicator:unchecked:hover, +QGroupBox::indicator:unchecked:focus, +QGroupBox::indicator:unchecked:pressed { + border: none; + image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); +} + +QCheckBox::indicator:checked, +QGroupBox::indicator:checked { + image: url(:/qss_icons/rc/checkbox_checked.png); +} + +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:checked:focus, +QCheckBox::indicator:checked:pressed, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:checked:focus, +QGroupBox::indicator:checked:pressed { + border: none; + image: url(:/qss_icons/rc/checkbox_checked_focus.png); +} + +QCheckBox::indicator:indeterminate { + image: url(:/qss_icons/rc/checkbox_indeterminate.png); +} + +QCheckBox::indicator:indeterminate:focus, +QCheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:indeterminate:pressed { + image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); +} + +QCheckBox::indicator:checked:disabled, +QGroupBox::indicator:checked:disabled { + image: url(:/qss_icons/rc/checkbox_checked_disabled.png); +} + +QCheckBox::indicator:unchecked:disabled, +QGroupBox::indicator:unchecked:disabled { + image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); +} + +QRadioButton { + color: #eff0f1; + spacing: 3px; + padding: 0px; + border: none; + outline: none; + margin-bottom: 2px; +} + +QGroupBox QRadioButton { + padding-left: 0px; + padding-right: 7px; +} + +QRadioButton:disabled { + color: #76797C; +} + +QRadioButton::indicator { + width: 21px; + height: 21px; +} + +QRadioButton::indicator:unchecked { + image: url(:/qss_icons/rc/radio_unchecked.png); +} + +QRadioButton::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:focus, +QRadioButton::indicator:unchecked:pressed { + border: none; + outline: none; + image: url(:/qss_icons/rc/radio_unchecked_focus.png); +} + +QRadioButton::indicator:checked { + border: none; + outline: none; + image: url(:/qss_icons/rc/radio_checked.png); +} + +QRadioButton::indicator:checked:hover, +QRadioButton::indicator:checked:focus, +QRadioButton::indicator:checked:pressed { + border: none; + outline: none; + image: url(:/qss_icons/rc/radio_checked_focus.png); +} + +QRadioButton::indicator:checked:disabled { + outline: none; + image: url(:/qss_icons/rc/radio_checked_disabled.png); +} + +QRadioButton::indicator:unchecked:disabled { + image: url(:/qss_icons/rc/radio_unchecked_disabled.png); +} + +QMenuBar { + background-color: #31363b; + color: #eff0f1; +} + +QMenuBar::item { + background: transparent; +} + +QMenuBar::item:selected { + background: transparent; + border: 1px solid #76797C; +} + +QMenuBar::item:pressed { + border: 1px solid #18465d; + background-color: #3daee9; + color: #eff0f1; + margin-bottom: -1px; + padding-bottom: 1px; +} + +QMenu { + border: 1px solid #434242; + padding: 2px; + color: #eff0f1; +} + +QMenu::icon { + margin: 5px; +} + +QMenu::item { + padding: 5px 16px 5px 40px; + border: 1px solid transparent; + /* reserve space for selection border */ +} + +QMenu::item:selected { + color: #eff0f1; +} + +QMenu::item:disabled { + color: #54575B; +} + +QMenu::item:disabled:hover, +QMenu::item:disabled:selected { + background-color: #393e43; + color: #666; +} + +QMenu::separator, +QMenuBar::separator { + height: 1px; + background-color: #54575B; + margin: 2px 4px 2px 40px; +} + +QMenu::indicator { + margin: 0 -26px 0 8px; + width: 18px; + height: 18px; +} + +/* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ +QMenu::indicator:non-exclusive:unchecked { + image: url(:/qss_icons/rc/checkbox_unchecked.png); +} + +QMenu::indicator:non-exclusive:unchecked:selected { + image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); +} + +QMenu::indicator:non-exclusive:checked { + image: url(:/qss_icons/rc/checkbox_checked.png); +} + +QMenu::indicator:non-exclusive:checked:selected { + image: url(:/qss_icons/rc/checkbox_checked_disabled.png); +} + +/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +QMenu::indicator:exclusive:unchecked { + image: url(:/qss_icons/rc/radio_unchecked.png); +} + +QMenu::indicator:exclusive:unchecked:selected { + image: url(:/qss_icons/rc/radio_unchecked_disabled.png); +} + +QMenu::indicator:exclusive:checked { + image: url(:/qss_icons/rc/radio_checked.png); +} + +QMenu::indicator:exclusive:checked:selected { + image: url(:/qss_icons/rc/radio_checked_disabled.png); +} + +QMenu::right-arrow { + margin-right: 10px; + image: url(:/qss_icons/rc/right_arrow.png) +} + +QWidget:disabled { + color: #4f515b; + background-color: #31363b; +} + +QAbstractItemView { + alternate-background-color: #2c2f32; + color: #eff0f1; + border: 1px solid #3A3939; + border-radius: 2px; +} + +QAbstractItemView:disabled, +QAbstractItemView:read-only { + alternate-background-color: #232629; +} + +QWidget:focus { + border: 1px solid #3daee9; +} + +QTabWidget:focus, +QCheckBox:focus, +QRadioButton:focus, +QSlider:focus, +QTreeView:focus, +QMenu:focus, +QMenuBar:focus, +QTabBar:focus { + border: none; +} + +QLineEdit { + background-color: #232629; + padding: 5px; + border: 1px solid #54575B; + border-radius: 2px; + color: #eff0f1; +} + +QAbstractItemView QLineEdit { + padding: 0; +} + +QGroupBox { + border: 1px solid #54575B; + border-radius: 2px; + margin-top: 12px; + padding-top: 2px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top center; + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; +} + +QAbstractScrollArea { + border-radius: 2px; + border: 1px solid #54575B; + background-color: transparent; +} + +QScrollBar:horizontal { + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent #2A2929; + border-radius: 4px; + background-color: #2A2929; +} + +QScrollBar::handle:horizontal { + background-color: #605F5F; + min-width: 5px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal { + margin: 0 3px; + border-image: url(:/qss_icons/rc/right_arrow_disabled.png); + width: 10px; + height: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 0 3px; + border-image: url(:/qss_icons/rc/left_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::add-line:horizontal:on { + border-image: url(:/qss_icons/rc/right_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal:hover, +QScrollBar::sub-line:horizontal:on { + border-image: url(:/qss_icons/rc/left_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, +QScrollBar::down-arrow:horizontal { + background: none; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar:vertical { + background-color: #2A2929; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent #2A2929; + border-radius: 4px; +} + +QScrollBar::handle:vertical { + background-color: #605F5F; + min-height: 5px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0; + border-image: url(:/qss_icons/rc/up_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0; + border-image: url(:/qss_icons/rc/down_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, +QScrollBar::sub-line:vertical:on { + border-image: url(:/qss_icons/rc/up_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:vertical:on { + border-image: url(:/qss_icons/rc/down_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + background: none; +} + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +QTextEdit { + background-color: #232629; + color: #eff0f1; + border: 1px solid #54575B; +} + +QPlainTextEdit { + background-color: #232629; + color: #eff0f1; + border-radius: 2px; + border: 1px solid #54575B; +} + +QHeaderView::section { + background-color: #76797C; + color: #eff0f1; + padding: 5px; + border: 1px solid #76797C; +} + +QSizeGrip { + image: url(:/qss_icons/rc/sizegrip.png); + width: 12px; + height: 12px; +} + +QMainWindow::separator { + background-color: #31363b; + color: white; + padding-left: 4px; + spacing: 2px; + border: 1px dashed #76797C; +} + +QMainWindow::separator:hover { + background-color: #787876; + color: white; + padding-left: 4px; + border: 1px solid #76797C; + spacing: 2px; +} + +QFrame { + border-radius: 2px; + border: 1px solid #76797C; +} + +QFrame[frameShape="0"] { + border-radius: 2px; + border: 1px transparent #76797C; +} + +QStackedWidget { + border: 1px transparent black; +} + +QToolBar { + border: 1px transparent #393838; + background: 1px solid #31363b; + font-weight: bold; +} + +QToolBar::handle:horizontal { + image: url(:/qss_icons/rc/Hmovetoolbar.png); +} + +QToolBar::handle:vertical { + image: url(:/qss_icons/rc/Vmovetoolbar.png); +} + +QToolBar::separator:horizontal { + image: url(:/qss_icons/rc/Hsepartoolbar.png); +} + +QToolBar::separator:vertical { + image: url(:/qss_icons/rc/Vsepartoolbar.png); +} + +QToolButton#qt_toolbar_ext_button { + background: #58595a +} + +QPushButton { + color: #eff0f1; + border: 1px solid #54575B; + border-radius: 2px; + padding: 5px 0px 5px 0px; + outline: none; + min-width: 100px; + min-height: 13px; + background-color: #232629; +} + +QPushButton:disabled { + background-color: #31363b; + border-color: #454545; + color: #454545; +} + +QPushButton:focus { + background-color: #3daee9; + color: white; +} + +QPushButton:pressed { + background-color: #3daee9; + padding-top: -15px; + padding-bottom: -17px; +} + +QComboBox { + selection-background-color: #3daee9; + border: 1px solid #54575B; + border-radius: 2px; + padding: 0px 4px 0px 4px; + min-width: 60px; + min-height: 23px; + background-color: #232629; +} + +QPushButton:checked { + background-color: #76797C; + border-color: #6A6969; +} + +QComboBox:hover, +QPushButton:hover, +QAbstractSpinBox:hover, +QLineEdit:hover, +QTextEdit:hover, +QPlainTextEdit:hover, +QAbstractView:hover { + border: 1px solid #3daee9; + color: #eff0f1; +} + +QComboBox:on { + selection-background-color: #4a4a4a; +} + +QComboBox QAbstractItemView { + background-color: #232629; + border-radius: 2px; + border: 1px solid #76797C; + selection-background-color: #18465d; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + left: -6px; + width: 15px; + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QComboBox::down-arrow { + image: url(:/qss_icons/rc/down_arrow_disabled.png); +} + +QComboBox::down-arrow:on, +QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QAbstractSpinBox { + border: 1px solid #54575B; + background-color: #232629; + color: #eff0f1; + border-radius: 2px; + min-width: 52px; + min-height: 23px; +} + +QAbstractSpinBox:up-button { + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center right; + left: -2px; +} + +QAbstractSpinBox:down-button { + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center left; + right: -2px; +} + +QAbstractSpinBox::up-arrow, +QAbstractSpinBox::up-arrow:disabled, +QAbstractSpinBox::up-arrow:off { + image: url(:/qss_icons/rc/up_arrow_disabled.png); + width: 10px; + height: 10px; +} + +QAbstractSpinBox::up-arrow:hover { + image: url(:/qss_icons/rc/up_arrow.png); +} + +QAbstractSpinBox::down-arrow, +QAbstractSpinBox::down-arrow:disabled, +QAbstractSpinBox::down-arrow:off { + image: url(:/qss_icons/rc/down_arrow_disabled.png); + width: 10px; + height: 10px; +} + +QAbstractSpinBox::down-arrow:hover { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QLabel { + border: 0; + background: transparent; +} + +QTabWidget { + border: 0; +} + +QTabWidget { + padding-top: 1px; +} + +QTabWidget::pane { + border: 1px solid #76797C; + padding: 5px; + position: absolute; + top: -1px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +QTabBar { + qproperty-drawBase: 0; + border-radius: 3px; +} + +QTabBar::close-button { + image: url(:/qss_icons/rc/close.png); + background: transparent; +} + +QTabBar::close-button:hover { + image: url(:/qss_icons/rc/close-hover.png); + background: transparent; +} + +QTabBar::close-button:pressed { + image: url(:/qss_icons/rc/close-pressed.png); + background: transparent; +} + +/* TOP TABS */ +QTabBar::tab:top { + color: #eff0f1; + border: 1px solid #54575B; + background-color: #2a2f33; + padding: 4px 16px 5px; + min-width: 36px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +QTabBar::tab:top:selected { + border-color: #76797C; + background-color: #31363b; + border-bottom-color: #31363b; +} + +QTabBar::tab:top:!selected { + margin-top: 1px; + border-bottom-color: #76797C; +} + +QTabBar::tab:top:!selected:hover { + background-color: #3daee9; +} + +/* BOTTOM TABS */ +QTabBar::tab:bottom { + color: #eff0f1; + border: 1px solid #76797C; + border-top: 1px transparent black; + background-color: #31363b; + padding: 5px; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + min-width: 50px; +} + +QTabBar::tab:bottom:selected { + color: #eff0f1; + background-color: #54575B; + border: 1px solid #76797C; + border-top: 2px solid #3daee9; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:bottom:!selected:hover { + background-color: #3daee9; +} + +/* LEFT TABS */ +QTabBar::tab:left { + color: #eff0f1; + border: 1px solid #76797C; + border-left: 1px transparent black; + background-color: #31363b; + padding: 5px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + min-height: 50px; +} + +QTabBar::tab:left:selected { + color: #eff0f1; + background-color: #54575B; + border: 1px solid #76797C; + border-left: 2px solid #3daee9; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:left:!selected:hover { + background-color: #3daee9; +} + +/* RIGHT TABS */ +QTabBar::tab:right { + color: #eff0f1; + border: 1px solid #76797C; + border-right: 1px transparent black; + background-color: #31363b; + padding: 5px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; + min-height: 50px; +} + +QTabBar::tab:right:selected { + color: #eff0f1; + background-color: #54575B; + border: 1px solid #76797C; + border-right: 2px solid #3daee9; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +QTabBar::tab:right:!selected:hover { + background-color: #3daee9; +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(:/qss_icons/rc/right_arrow.png); +} + +QTabBar QToolButton::left-arrow:enabled { + image: url(:/qss_icons/rc/left_arrow.png); +} + +QTabBar QToolButton::right-arrow:disabled { + image: url(:/qss_icons/rc/right_arrow_disabled.png); +} + +QTabBar QToolButton::left-arrow:disabled { + image: url(:/qss_icons/rc/left_arrow_disabled.png); +} + +QDockWidget { + background: #31363b; + border: 1px solid #403F3F; + titlebar-close-icon: url(:/qss_icons/rc/close.png); + titlebar-normal-icon: url(:/qss_icons/rc/undock.png); +} + +QDockWidget::close-button, +QDockWidget::float-button { + border: 1px solid transparent; + border-radius: 2px; + background: transparent; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background: rgba(255, 255, 255, 10); +} + +QDockWidget::close-button:pressed, +QDockWidget::float-button:pressed { + padding: 1px -1px -1px 1px; + background: rgba(255, 255, 255, 10); +} + +QTreeView, +QListView { + border: 1px solid #54575B; + background-color: #232629; +} + +QTreeView:branch:selected, +QTreeView:branch:hover { + background: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-siblings:!adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-siblings:adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { + image: url(:/qss_icons/rc/branch_closed.png); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { + image: url(:/qss_icons/rc/branch_open.png); +} + +QTreeView::branch:has-children:!has-siblings:closed:hover, +QTreeView::branch:closed:has-children:has-siblings:hover { + image: url(:/qss_icons/rc/branch_closed-on.png); +} + +QTreeView::branch:open:has-children:!has-siblings:hover, +QTreeView::branch:open:has-children:has-siblings:hover { + image: url(:/qss_icons/rc/branch_open-on.png); +} + +QListView::item:!selected:hover, +QTreeView::item:!selected:hover { + background: #18465d; + outline: 0; + color: #eff0f1 +} + +QListView::item:selected:hover, +QTreeView::item:selected:hover { + background: #287399; + color: #eff0f1; +} + +QTreeView::indicator:checked, +QListView::indicator:checked { + image: url(:/qss_icons/rc/checkbox_checked.png); +} + +QTreeView::indicator:unchecked, +QListView::indicator:unchecked { + image: url(:/qss_icons/rc/checkbox_unchecked.png); +} + +QTreeView::indicator:indeterminate, +QListView::indicator:indeterminate { + image: url(:/qss_icons/rc/checkbox_indeterminate.png); +} + +QTreeView::indicator:checked:hover, +QTreeView::indicator:checked:focus, +QTreeView::indicator:checked:pressed, +QListView::indicator:checked:hover, +QListView::indicator:checked:focus, +QListView::indicator:checked:pressed { + image: url(:/qss_icons/rc/checkbox_checked_focus.png); +} + +QTreeView::indicator:unchecked:hover, +QTreeView::indicator:unchecked:focus, +QTreeView::indicator:unchecked:pressed, +QListView::indicator:unchecked:hover, +QListView::indicator:unchecked:focus, +QListView::indicator:unchecked:pressed { + image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); +} + +QTreeView::indicator:indeterminate:hover, +QTreeView::indicator:indeterminate:focus, +QTreeView::indicator:indeterminate:pressed, +QListView::indicator:indeterminate:hover, +QListView::indicator:indeterminate:focus, +QListView::indicator:indeterminate:pressed { + image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); +} + +QSlider::groove:horizontal { + border: 1px solid #565a5e; + height: 4px; + background: #565a5e; + margin: 0px; + border-radius: 2px; +} + +QSlider::handle:horizontal { + background: #232629; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: -8px 0; + border-radius: 9px; +} + +QSlider::groove:vertical { + border: 1px solid #565a5e; + width: 4px; + background: #565a5e; + margin: 0px; + border-radius: 3px; +} + +QSlider::handle:vertical { + background: #232629; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: 0 -8px; + border-radius: 9px; +} + +QToolButton { + background-color: #232629; + border: 1px solid #54575B; + border-radius: 2px; + margin: 3px; + padding: 5px; +} + +QToolButton[popupMode="1"] { + /* only for MenuButtonPopup */ + padding-right: 20px; + border: 1px #76797C; + border-radius: 5px; +} + +QToolButton[popupMode="2"] { + /* only for InstantPopup */ + padding-right: 10px; + border: 1px #76797C; +} + +QToolButton:hover, +QToolButton::menu-button:hover { + background-color: transparent; + border: 1px solid #3daee9; + padding: 5px; +} + +QToolButton:checked, +QToolButton:pressed, +QToolButton::menu-button:pressed { + background-color: #3daee9; + border: 1px solid #3daee9; + padding: 5px; +} + +/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +QToolButton::menu-indicator { + image: url(:/qss_icons/rc/down_arrow.png); + top: -7px; + left: -2px; +} + +/* the subcontrols below are used only in the MenuButtonPopup mode */ +QToolButton::menu-button { + border: 1px transparent #76797C; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + /* 16px width + 4px for border = 20px allocated above */ + width: 16px; + outline: none; +} + +QToolButton::menu-arrow { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QToolButton::menu-arrow:open { + border: 1px solid #76797C; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + left: 8px; +} + +QTableView { + border: 1px solid #54575B; + gridline-color: #31363b; + background-color: #232629; +} + +QTreeView:disabled { + background-color: #1f2225; +} + +QTableView, +QHeaderView { + border-radius: 0; +} + +QListView:focus { + border-color: #54575B; +} + +QTableView::item:pressed, +QListView::item:pressed, +QTreeView::item:pressed { + background: #18465d; + color: #eff0f1; +} + +QTableView::item:selected:active, +QTreeView::item:selected:active, +QListView::item:selected:active { + background: #287399; + color: #eff0f1; +} + +QHeaderView { + background-color: #403F3F; + border: 1px transparent; + border-radius: 0px; + margin: 0px; + padding: 0px; +} + +QHeaderView::section { + background-color: #232629; + color: #eff0f1; + padding: 0 5px; + border: 1px solid #434242; + border-bottom: 0; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical::first, +QHeaderView::section::vertical::only-one { + border-top: 1px solid #31363b; +} + +QHeaderView::section::vertical { + border-top: transparent; +} + +QHeaderView::section::horizontal, +QHeaderView::section::horizontal::first, +QHeaderView::section::horizontal::only-one { + border-left: transparent; +} + +QHeaderView::section::horizontal::last { + border-right: transparent; +} + +QHeaderView::section:checked { + color: white; + background-color: #334e5e; +} + +/* sort indicator */ +QHeaderView::down-arrow { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QHeaderView::up-arrow { + image: url(:/qss_icons/rc/up_arrow.png); +} + +QTableCornerButton::section { + background-color: #31363b; + border: 1px transparent #76797C; + border-radius: 0px; +} + +QToolBox { + padding: 5px; + border: 1px transparent black; +} + +QToolBox::tab { + color: #eff0f1; + background-color: #31363b; + border: 1px solid #76797C; + border-bottom: 1px transparent #31363b; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +QToolBox::tab:selected { + font: italic; + background-color: #31363b; + border-color: #3daee9; +} + +QStatusBar::item { + border: 0; +} + +QFrame[height="3"], +QFrame[width="3"] { + background-color: #76797C; +} + +QSplitter::handle { + border: 1px dashed #76797C; +} + +QSplitter::handle:hover { + background-color: #787876; + border: 1px solid #76797C; +} + +QSplitter::handle:horizontal { + width: 1px; +} + +QSplitter::handle:vertical { + height: 1px; +} + +QProgressBar { + border: 1px solid #76797C; + border-radius: 5px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #05B8CC; +} + +QDateEdit { + selection-background-color: #3daee9; + border: 1px solid #3375A3; + border-radius: 2px; + padding: 1px; + min-width: 75px; +} + +QDateEdit:on { + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QDateEdit QAbstractItemView { + background-color: #232629; + border-radius: 2px; + border: 1px solid #3375A3; + selection-background-color: #3daee9; +} + +QDateEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border-left-width: 0; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QDateEdit::down-arrow { + image: url(:/qss_icons/rc/down_arrow_disabled.png); +} + +QDateEdit::down-arrow:on, +QDateEdit::down-arrow:hover, +QDateEdit::down-arrow:focus { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QComboBox:disabled, +QPushButton:disabled, +QAbstractSpinBox:disabled, +QDateEdit:disabled, +QLineEdit:disabled, +QTextEdit:disabled, +QToolButton:disabled, +QPlainTextEdit:disabled { + background-color: #2b2e31; +} + + +QPushButton#TogglableStatusBarButton { + min-width: 0px; + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#TogglableStatusBarButton:checked { + color: #ffffff; +} + +QPushButton#TogglableStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton { + min-width: 0px; + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#RendererStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton:checked { + color: #e85c00; +} + +QPushButton#RendererStatusBarButton:!checked { + color: #00ccdd; +} + +QPushButton#GPUStatusBarButton { + min-width: 0px; + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#GPUStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#GPUStatusBarButton:checked { + color: #ff8040; +} + +QPushButton#GPUStatusBarButton:!checked { + color: #40dd40; +} + +QPushButton#DockingStatusBarButton { + min-width: 0px; + color: #ffffff; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#DockingStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#buttonRefreshDevices { + min-width: 23px; + min-height: 23px; + max-width: 23px; + max-height: 23px; + padding: 0px 0px; +} + +QSpinBox#spinboxLStickRange, +QSpinBox#spinboxRStickRange, +QSpinBox#vibrationSpinPlayer1, +QSpinBox#vibrationSpinPlayer2, +QSpinBox#vibrationSpinPlayer3, +QSpinBox#vibrationSpinPlayer4, +QSpinBox#vibrationSpinPlayer5, +QSpinBox#vibrationSpinPlayer6, +QSpinBox#vibrationSpinPlayer7, +QSpinBox#vibrationSpinPlayer8 { + min-width: 68px; +} + +QDialog#ConfigureVibration QGroupBox::indicator, +QGroupBox#motionGroup::indicator, +QGroupBox#vibrationGroup::indicator { + margin-left: 0px; +} + +QDialog#ConfigureVibration QGroupBox::title, +QGroupBox#motionGroup::title, +QGroupBox#vibrationGroup::title { + spacing: 2px; + padding-left: 1px; + padding-right: 1px; +} + +QWidget#bottomPerGameInput, +QWidget#topControllerApplet, +QWidget#bottomControllerApplet, +QGroupBox#groupPlayer1Connected:checked, +QGroupBox#groupPlayer2Connected:checked, +QGroupBox#groupPlayer3Connected:checked, +QGroupBox#groupPlayer4Connected:checked, +QGroupBox#groupPlayer5Connected:checked, +QGroupBox#groupPlayer6Connected:checked, +QGroupBox#groupPlayer7Connected:checked, +QGroupBox#groupPlayer8Connected:checked { + background-color: #232629; +} + +QWidget#topPerGameInput, +QWidget#middleControllerApplet { + background-color: #31363b; +} + +QWidget#topPerGameInput QComboBox, +QWidget#middleControllerApplet QComboBox { + width: 120px; +} + +QWidget#connectedControllers { + background: transparent; +} + +QWidget#closeButtons { + background: transparent; +} + +QWidget#playersSupported, +QWidget#controllersSupported, +QWidget#controllerSupported1, +QWidget#controllerSupported2, +QWidget#controllerSupported3, +QWidget#controllerSupported4, +QWidget#controllerSupported5, +QWidget#controllerSupported6 { + border: none; + background: transparent; +} + +QGroupBox#groupPlayer1Connected, +QGroupBox#groupPlayer2Connected, +QGroupBox#groupPlayer3Connected, +QGroupBox#groupPlayer4Connected, +QGroupBox#groupPlayer5Connected, +QGroupBox#groupPlayer6Connected, +QGroupBox#groupPlayer7Connected, +QGroupBox#groupPlayer8Connected { + border: 1px solid #76797c; + border-radius: 3px; + padding: 0px; + min-height: 98px; + max-height: 98px; + margin-top: 0px; +} + +QGroupBox#groupPlayer1Connected:unchecked, +QGroupBox#groupPlayer2Connected:unchecked, +QGroupBox#groupPlayer3Connected:unchecked, +QGroupBox#groupPlayer4Connected:unchecked, +QGroupBox#groupPlayer5Connected:unchecked, +QGroupBox#groupPlayer6Connected:unchecked, +QGroupBox#groupPlayer7Connected:unchecked, +QGroupBox#groupPlayer8Connected:unchecked { + border: 1px solid #54575b; +} + +QGroupBox#groupPlayer1Connected::title, +QGroupBox#groupPlayer2Connected::title, +QGroupBox#groupPlayer3Connected::title, +QGroupBox#groupPlayer4Connected::title, +QGroupBox#groupPlayer5Connected::title, +QGroupBox#groupPlayer6Connected::title, +QGroupBox#groupPlayer7Connected::title, +QGroupBox#groupPlayer8Connected::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 0px; + padding-right: 0px; + padding-top: 1px; + margin-left: -2px; + margin-right: -4px; + margin-bottom: 6px; +} + +QCheckBox#checkboxPlayer1Connected, +QCheckBox#checkboxPlayer2Connected, +QCheckBox#checkboxPlayer3Connected, +QCheckBox#checkboxPlayer4Connected, +QCheckBox#checkboxPlayer5Connected, +QCheckBox#checkboxPlayer6Connected, +QCheckBox#checkboxPlayer7Connected, +QCheckBox#checkboxPlayer8Connected { + spacing: 0px; +} + +QWidget#Player1LEDs, +QWidget#Player2LEDs, +QWidget#Player3LEDs, +QWidget#Player4LEDs, +QWidget#Player5LEDs, +QWidget#Player6LEDs, +QWidget#Player7LEDs, +QWidget#Player8LEDs { + background: transparent; +} + +QWidget#Player1LEDs QCheckBox, +QWidget#Player2LEDs QCheckBox, +QWidget#Player3LEDs QCheckBox, +QWidget#Player4LEDs QCheckBox, +QWidget#Player5LEDs QCheckBox, +QWidget#Player6LEDs QCheckBox, +QWidget#Player7LEDs QCheckBox, +QWidget#Player8LEDs QCheckBox { + spacing: 0px; + margin-bottom: 0px; + margin-right: 0px; +} + +QWidget#Player1LEDs QCheckBox::indicator, +QWidget#Player2LEDs QCheckBox::indicator, +QWidget#Player3LEDs QCheckBox::indicator, +QWidget#Player4LEDs QCheckBox::indicator, +QWidget#Player5LEDs QCheckBox::indicator, +QWidget#Player6LEDs QCheckBox::indicator, +QWidget#Player7LEDs QCheckBox::indicator, +QWidget#Player8LEDs QCheckBox::indicator { + width: 6px; + height: 6px; + margin-left: 0px; +} + +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer1Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer2Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer3Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer4Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer5Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer6Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer7Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer8Connected::indicator { + width: 12px; + height: 12px; +} + +QCheckBox#checkboxPlayer1Connected::indicator, +QCheckBox#checkboxPlayer2Connected::indicator, +QCheckBox#checkboxPlayer3Connected::indicator, +QCheckBox#checkboxPlayer4Connected::indicator, +QCheckBox#checkboxPlayer5Connected::indicator, +QCheckBox#checkboxPlayer6Connected::indicator, +QCheckBox#checkboxPlayer7Connected::indicator, +QCheckBox#checkboxPlayer8Connected::indicator { + width: 14px; + height: 14px; +} + +QGroupBox#groupPlayer1Connected::indicator, +QGroupBox#groupPlayer2Connected::indicator, +QGroupBox#groupPlayer3Connected::indicator, +QGroupBox#groupPlayer4Connected::indicator, +QGroupBox#groupPlayer5Connected::indicator, +QGroupBox#groupPlayer6Connected::indicator, +QGroupBox#groupPlayer7Connected::indicator, +QGroupBox#groupPlayer8Connected::indicator { + width: 16px; + height: 16px; +} + +QWidget#Player1LEDs QCheckBox::indicator:checked, +QWidget#Player2LEDs QCheckBox::indicator:checked, +QWidget#Player3LEDs QCheckBox::indicator:checked, +QWidget#Player4LEDs QCheckBox::indicator:checked, +QWidget#Player5LEDs QCheckBox::indicator:checked, +QWidget#Player6LEDs QCheckBox::indicator:checked, +QWidget#Player7LEDs QCheckBox::indicator:checked, +QWidget#Player8LEDs QCheckBox::indicator:checked, +QGroupBox#groupPlayer1Connected::indicator:checked, +QGroupBox#groupPlayer2Connected::indicator:checked, +QGroupBox#groupPlayer3Connected::indicator:checked, +QGroupBox#groupPlayer4Connected::indicator:checked, +QGroupBox#groupPlayer5Connected::indicator:checked, +QGroupBox#groupPlayer6Connected::indicator:checked, +QGroupBox#groupPlayer7Connected::indicator:checked, +QGroupBox#groupPlayer8Connected::indicator:checked, +QCheckBox#checkboxPlayer1Connected::indicator:checked, +QCheckBox#checkboxPlayer2Connected::indicator:checked, +QCheckBox#checkboxPlayer3Connected::indicator:checked, +QCheckBox#checkboxPlayer4Connected::indicator:checked, +QCheckBox#checkboxPlayer5Connected::indicator:checked, +QCheckBox#checkboxPlayer6Connected::indicator:checked, +QCheckBox#checkboxPlayer7Connected::indicator:checked, +QCheckBox#checkboxPlayer8Connected::indicator:checked, +QGroupBox#groupConnectedController::indicator:checked { + border-radius: 2px; + border: 1px solid #929192; + background: #39ff14; + image: none; +} + +QWidget#Player1LEDs QCheckBox::indicator:unchecked, +QWidget#Player2LEDs QCheckBox::indicator:unchecked, +QWidget#Player3LEDs QCheckBox::indicator:unchecked, +QWidget#Player4LEDs QCheckBox::indicator:unchecked, +QWidget#Player5LEDs QCheckBox::indicator:unchecked, +QWidget#Player6LEDs QCheckBox::indicator:unchecked, +QWidget#Player7LEDs QCheckBox::indicator:unchecked, +QWidget#Player8LEDs QCheckBox::indicator:unchecked, +QGroupBox#groupPlayer1Connected::indicator:unchecked, +QGroupBox#groupPlayer2Connected::indicator:unchecked, +QGroupBox#groupPlayer3Connected::indicator:unchecked, +QGroupBox#groupPlayer4Connected::indicator:unchecked, +QGroupBox#groupPlayer5Connected::indicator:unchecked, +QGroupBox#groupPlayer6Connected::indicator:unchecked, +QGroupBox#groupPlayer7Connected::indicator:unchecked, +QGroupBox#groupPlayer8Connected::indicator:unchecked, +QCheckBox#checkboxPlayer1Connected::indicator:unchecked, +QCheckBox#checkboxPlayer2Connected::indicator:unchecked, +QCheckBox#checkboxPlayer3Connected::indicator:unchecked, +QCheckBox#checkboxPlayer4Connected::indicator:unchecked, +QCheckBox#checkboxPlayer5Connected::indicator:unchecked, +QCheckBox#checkboxPlayer6Connected::indicator:unchecked, +QCheckBox#checkboxPlayer7Connected::indicator:unchecked, +QCheckBox#checkboxPlayer8Connected::indicator:unchecked, +QGroupBox#groupConnectedController::indicator:unchecked { + border-radius: 2px; + border: 1px solid #929192; + background: transparent; + image: none; +} + +QWidget#controllerPlayer1, +QWidget#controllerPlayer2, +QWidget#controllerPlayer3, +QWidget#controllerPlayer4, +QWidget#controllerPlayer5, +QWidget#controllerPlayer6, +QWidget#controllerPlayer7, +QWidget#controllerPlayer8 { + background: transparent; +} + +QDialog#QtSoftwareKeyboardDialog, +QStackedWidget#topOSK { + background: rgba(41, 41, 41, .9); +} + + +QDialog#OverlayDialog, +QStackedWidget#stackedDialog { + background: rgba(41, 41, 41, .7); +} + +QWidget#boxOSK, +QWidget#lineOSK, +QWidget#richDialog, +QWidget#lineDialog { + background: transparent; +} + +QStackedWidget#bottomOSK, +QWidget#contentDialog, +QWidget#contentRichDialog { + background: rgba(71, 69, 71, 1); +} + +QWidget#contentDialog, +QWidget#contentRichDialog { + margin: 5px; + border-radius: 6px; +} + +QWidget#buttonsDialog, +QWidget#buttonsRichDialog { + margin: 5px; + border-top: 2px solid rgba(255, 255, 255, .9); +} + +QWidget#legendOSKnum { + border-top: 1px solid rgba(255, 255, 255, 1); +} + +QStackedWidget#stackedDialog QTextBrowser QWidget { + background: transparent; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar { + background: #2a2929; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-line, +QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-line { + border-image: none; +} + +QWidget#inputOSK { + border-bottom: 3px solid rgba(255, 255, 255, .9); +} + +QWidget#inputOSK QLineEdit { + background: transparent; + border: none; + color: #ccc; + padding: 0px; +} + +QWidget#inputBoxOSK { + border: 2px solid rgba(255, 255, 255, .9); +} + +QWidget#inputBoxOSK QTextEdit { + background: transparent; + border: none; + color: #ccc; +} + +QWidget#richDialog QTextBrowser { + background: transparent; + border: none; + color: #fff; + padding: 35px 65px; +} + +QWidget#lineOSK QLabel#label_header { + color: #f0f0f0; +} + +QWidget#lineOSK QLabel#label_sub, +QWidget#lineOSK QLabel#label_characters, +QWidget#contentDialog QLabel#label_title, +QWidget#contentRichDialog QLabel#label_title_rich, +QWidget#boxOSK QLabel#label_characters_box { + color: #ccc; +} + +QWidget#buttonsDialog, +QWidget#buttonsRichDialog, +QWidget#mainOSK, +QWidget#headerOSK, +QWidget#normalOSK, +QWidget#shiftOSK, +QWidget#numOSK, +QWidget#subOSK, +QWidget#inputOSK, +QWidget#inputBoxOSK, +QWidget#charactersOSK, +QWidget#charactersBoxOSK, +QWidget#legendOSK, +QWidget#legendOSK QWidget, +QWidget#legendOSKshift, +QWidget#legendOSKshift QWidget, +QWidget#legendOSKnum, +QWidget#legendOSKnum QWidget { + background: transparent; +} + +QWidget#contentDialog QLabel, +QWidget#legendOSK QLabel, +QWidget#legendOSKshift QLabel, +QWidget#legendOSKnum QLabel { + color: rgba(255, 255, 255, 1); +} + +QWidget#contentDialog QLabel#label_dialog { + padding: 20px 65px; +} + +QWidget#contentDialog QLabel#label_title, +QWidget#contentRichDialog QLabel#label_title_rich { + padding: 0px 65px; +} + +QDialog#OverlayDialog QPushButton { + color: rgba(1, 253, 201, 1); + background: transparent; + border: none; + padding: 0px; + min-width: 0px; +} + +QDialog#OverlayDialog QPushButton:focus, +QDialog#OverlayDialog QPushButton:hover { + color: rgba(1, 253, 201, 1); + background: rgba(58, 61, 66, 1); + border: 5px solid rgba(56, 189, 225, 1); + border-radius: 6px; + outline: none; +} + +QDialog#OverlayDialog QPushButton:pressed { + color: rgba(240, 240, 240, 1); + background: rgba(150, 150, 150, 1); + border: 5px solid rgba(56, 189, 225, 1); + border-radius: 6px; + outline: none; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton { + color: rgba(255, 255, 255, 1); + background: rgba(80, 79, 80, 1); + border: 2px solid rgba(71, 69, 71, 1); + padding: 0px; + min-width: 0px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { + background: rgba(95, 94, 95, 1); + border: 2px solid rgba(71, 69, 71, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { + color: rgba(240, 240, 240, 1); + background: rgba(255, 255, 255, 1); + border: 2px solid rgba(71, 69, 71, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { + color: rgba(0, 0, 0, 1); + background: rgba(1, 253, 201, 1); + border: 2px solid rgba(71, 69, 71, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:focus, + +QDialog#QtSoftwareKeyboardDialog QPushButton:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover { + color: rgba(255, 255, 255, 1); + background: rgba(58, 61, 66, 1); + border: 5px solid rgba(56, 189, 225, 1); + border-radius: 6px; + outline: none; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { + color: rgba(240, 240, 240, 1); + background: rgba(150, 150, 150, 1); + border: 5px solid rgba(56, 189, 225, 1); + border-radius: 6px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { + image: url(:/overlay/osk_button_B_dark.png); + image-position: right; + qproperty-icon: url(:/overlay/osk_button_backspace_dark.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { + image: url(:/overlay/osk_button_Y_dark.png); + image-position: right; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { + color: rgba(44, 44, 44, 1); + image: url(:/overlay/osk_button_plus_dark.png); + image-position: right; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; + qproperty-icon: url(:/overlay/osk_button_shift_dark.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; + qproperty-icon: url(:/overlay/osk_button_shift_on_dark.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_parenthesis { + padding-bottom: 7px; +} + +QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { + background: transparent; + color: #ccc; +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_L, +QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { + image: url(:/overlay/button_L_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { + image: url(:/overlay/arrow_left_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_R, +QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { + image: url(:/overlay/button_R_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { + image: url(:/overlay/arrow_right_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, +QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { + image: url(:/overlay/button_press_stick_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_X, +QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { + image: url(:/overlay/button_X_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_A, +QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { + image: url(:/overlay/button_A_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { + color: rgba(144, 144, 144, 1); + background-color: rgba(95, 94, 95, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_at:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_slash:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_percent:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_1:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_2:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_3:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_4:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_5:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_6:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_7:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_8:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_9:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { + color: rgba(144, 144, 144, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { + image: url(:/overlay/osk_button_plus_dark_disabled.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { + image: url(:/overlay/osk_button_B_dark_disabled.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { + image: url(:/overlay/osk_button_Y_dark_disabled.png); +} + +QDialog#QtSoftwareKeyboardDialog QFrame, +QDialog#QtSoftwareKeyboardDialog QFrame[frameShape="0"], +QDialog#OverlayDialog QFrame, +QDialog#OverlayDialog QFrame[frameShape="0"] { + border-radius: 0px; + border: none; +} diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/LICENSE.rst b/dist/qt_themes/qdarkstyle_midnight_blue/LICENSE.rst new file mode 100644 index 0000000..e22b687 --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue/LICENSE.rst @@ -0,0 +1,405 @@ +License +======= + +The MIT License (MIT) - Code +---------------------------- + +Copyright (c) 2013-2019 Colin Duquesnoy + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Creative Commons Attribution International 4.0 - Images +------------------------------------------------------- + +QDarkStyle (c) 2013-2019 Colin Duquesnoy +QDarkStyle (c) 2019-2019 Daniel Cosmo Pizetta + +Creative Commons Corporation (“Creative Commons”) is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an “as-is” basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright and +certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + +- **Considerations for licensors:** Our public licenses are intended + for use by those authorized to give the public permission to use + material in ways otherwise restricted by copyright and certain other + rights. Our licenses are irrevocable. Licensors should read and + understand the terms and conditions of the license they choose before + applying it. Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the material as + expected. Licensors should clearly mark any material not subject to + the license. This includes other CC-licensed material, or material + used under an exception or limitation to copyright. `More + considerations for + licensors `__. + +- **Considerations for the public:** By using one of our public + licenses, a licensor grants the public permission to use the licensed + material under specified terms and conditions. If the licensor’s + permission is not necessary for any reason–for example, because of + any applicable exception or limitation to copyright–then that use is + not regulated by the license. Our licenses grant only permissions + under copyright and certain other rights that a licensor has + authority to grant. Use of the licensed material may still be + restricted for other reasons, including because others have copyright + or other rights in the material. A licensor may make special + requests, such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to respect + those requests where reasonable. `More considerations for the + public `__. + + +Creative Commons Attribution 4.0 International Public License +------------------------------------------------------------- + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of these +terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the Licensed +Material available under these terms and conditions. + +Section 1 – Definitions +~~~~~~~~~~~~~~~~~~~~~~~ + +a. **Adapted Material** means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material and + in which the Licensed Material is translated, altered, arranged, + transformed, or otherwise modified in a manner requiring permission + under the Copyright and Similar Rights held by the Licensor. For + purposes of this Public License, where the Licensed Material is a + musical work, performance, or sound recording, Adapted Material is + always produced where the Licensed Material is synched in timed + relation with a moving image. + +b. **Adapter's License** means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + +c. **Copyright and Similar Rights** means copyright and/or similar + rights closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or categorized. + For purposes of this Public License, the rights specified in Section + 2(b)(1)-(2) are not Copyright and Similar Rights. + +d. **Effective Technological Measures** means those measures that, in + the absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright Treaty + adopted on December 20, 1996, and/or similar international + agreements. + +e. **Exceptions and Limitations** means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + +f. **Licensed Material** means the artistic or literary work, database, + or other material to which the Licensor applied this Public License. + +g. **Licensed Rights** means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to all + Copyright and Similar Rights that apply to Your use of the Licensed + Material and that the Licensor has authority to license. + +h. **Licensor** means the individual(s) or entity(ies) granting rights + under this Public License. + +i. **Share** means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such as + reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the public + may access the material from a place and at a time individually + chosen by them. + +j. **Sui Generis Database Rights** means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, as + amended and/or succeeded, as well as other essentially equivalent + rights anywhere in the world. + +k. **You** means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + +Section 2 – Scope +~~~~~~~~~~~~~~~~~ + +a. **License grant.** + +1. Subject to the terms and conditions of this Public License, the + Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to exercise the + Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part; + and + + B. produce, reproduce, and Share Adapted Material. + +2. **Exceptions and Limitations.** For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public License + does not apply, and You do not need to comply with its terms and + conditions. + +3. **Term.** The term of this Public License is specified in Section + 6(a). + +4. **Media and formats; technical modifications allowed.** The Licensor + authorizes You to exercise the Licensed Rights in all media and + formats whether now known or hereafter created, and to make technical + modifications necessary to do so. The Licensor waives and/or agrees + not to assert any right or authority to forbid You from making + technical modifications necessary to exercise the Licensed Rights, + including technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, simply + making modifications authorized by this Section 2(a)(4) never + produces Adapted Material. + +5. **Downstream recipients.** + + A. **Offer from the Licensor – Licensed Material.** Every recipient + of the Licensed Material automatically receives an offer from the + Licensor to exercise the Licensed Rights under the terms and + conditions of this Public License. + + B. **No downstream restrictions.** You may not offer or impose any + additional or different terms or conditions on, or apply any + Effective Technological Measures to, the Licensed Material if doing + so restricts exercise of the Licensed Rights by any recipient of the + Licensed Material. + +6. **No endorsement.** Nothing in this Public License constitutes or may + be construed as permission to assert or imply that You are, or that + Your use of the Licensed Material is, connected with, or sponsored, + endorsed, or granted official status by, the Licensor or others + designated to receive attribution as provided in Section + 3(a)(1)(A)(i). + +b. **Other rights.** + +1. Moral rights, such as the right of integrity, are not licensed under + this Public License, nor are publicity, privacy, and/or other similar + personality rights; however, to the extent possible, the Licensor + waives and/or agrees not to assert any such rights held by the + Licensor to the limited extent necessary to allow You to exercise the + Licensed Rights, but not otherwise. + +2. Patent and trademark rights are not licensed under this Public + License. + +3. To the extent possible, the Licensor waives any right to collect + royalties from You for the exercise of the Licensed Rights, whether + directly or through a collecting society under any voluntary or + waivable statutory or compulsory licensing scheme. In all other cases + the Licensor expressly reserves any right to collect such royalties. + +Section 3 – License Conditions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + +a. **Attribution.** + +1. If You Share the Licensed Material (including in modified form), You + must: + + A. retain the following if it is supplied by the Licensor with the + Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any + others designated to receive attribution, in any reasonable manner + requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an + indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public + License, and include the text of, or the URI or hyperlink to, this + Public License. + +2. You may satisfy the conditions in Section 3(a)(1) in any reasonable + manner based on the medium, means, and context in which You Share the + Licensed Material. For example, it may be reasonable to satisfy the + conditions by providing a URI or hyperlink to a resource that + includes the required information. + +3. If requested by the Licensor, You must remove any of the information + required by Section 3(a)(1)(A) to the extent reasonably practicable. + +4. If You Share Adapted Material You produce, the Adapter's License You + apply must not prevent recipients of the Adapted Material from + complying with this Public License. + +Section 4 – Sui Generis Database Rights +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Where the Licensed Rights include Sui Generis Database Rights that apply +to Your use of the Licensed Material: + +a. for the avoidance of doubt, Section 2(a)(1) grants You the right to + extract, reuse, reproduce, and Share all or a substantial portion of + the contents of the database; + +b. if You include all or a substantial portion of the database contents + in a database in which You have Sui Generis Database Rights, then the + database in which You have Sui Generis Database Rights (but not its + individual contents) is Adapted Material; and + +c. You must comply with the conditions in Section 3(a) if You Share all + or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +a. Unless otherwise separately undertaken by the Licensor, to the + extent possible, the Licensor offers the Licensed Material as-is and + as-available, and makes no representations or warranties of any kind + concerning the Licensed Material, whether express, implied, + statutory, or other. This includes, without limitation, warranties of + title, merchantability, fitness for a particular purpose, + non-infringement, absence of latent or other defects, accuracy, or + the presence or absence of errors, whether or not known or + discoverable. Where disclaimers of warranties are not allowed in full + or in part, this disclaimer may not apply to You. + +b. To the extent possible, in no event will the Licensor be liable to + You on any legal theory (including, without limitation, negligence) + or otherwise for any direct, special, indirect, incidental, + consequential, punitive, exemplary, or other losses, costs, expenses, + or damages arising out of this Public License or use of the Licensed + Material, even if the Licensor has been advised of the possibility of + such losses, costs, expenses, or damages. Where a limitation of + liability is not allowed in full or in part, this limitation may not + apply to You. + +c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent possible, + most closely approximates an absolute disclaimer and waiver of all + liability. + +Section 6 – Term and Termination +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +a. This Public License applies for the term of the Copyright and Similar + Rights licensed here. However, if You fail to comply with this Public + License, then Your rights under this Public License terminate + automatically. + +b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + +1. automatically as of the date the violation is cured, provided it is + cured within 30 days of Your discovery of the violation; or + +2. upon express reinstatement by the Licensor. + +For the avoidance of doubt, this Section 6(b) does not affect any right +the Licensor may have to seek remedies for Your violations of this +Public License. + +c. For the avoidance of doubt, the Licensor may also offer the Licensed + Material under separate terms or conditions or stop distributing the + Licensed Material at any time; however, doing so will not terminate + this Public License. + +d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + +Section 7 – Other Terms and Conditions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +a. The Licensor shall not be bound by any additional or different terms + or conditions communicated by You unless expressly agreed. + +b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and independent + of the terms and conditions of this Public License. + +Section 8 – Interpretation +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +a. For the avoidance of doubt, this Public License does not, and shall + not be interpreted to, reduce, limit, restrict, or impose conditions + on any use of the Licensed Material that could lawfully be made + without permission under this Public License. + +b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + +c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + +d. Nothing in this Public License constitutes or may be interpreted as a + limitation upon, or waiver of, any privileges and immunities that + apply to the Licensor or You, including from the legal processes of + any jurisdiction or authority. + + Creative Commons is not a party to its public licenses. + Notwithstanding, Creative Commons may elect to apply one of its + public licenses to material it publishes and in those instances will + be considered the “Licensor.” Except for the limited purpose of + indicating that material is shared under a Creative Commons public + license or as otherwise permitted by the Creative Commons policies + published at + `creativecommons.org/policies `__, + Creative Commons does not authorize the use of the trademark + “Creative Commons” or any other trademark or logo of Creative + Commons without its prior written consent including, without + limitation, in connection with any unauthorized modifications to any + of its public licenses or any other arrangements, understandings, or + agreements concerning use of licensed material. For the avoidance of + doubt, this paragraph does not form part of the public licenses. + + Creative Commons may be contacted at creativecommons.org diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme b/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme new file mode 100644 index 0000000..20f9f6d --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme @@ -0,0 +1,14 @@ +[Icon Theme] +Name=qdarkstyle_midnight_blue +Comment=dark theme +Inherits=colorful +Directories=16x16,48x48,256x256 + +[16x16] +Size=16 + +[48x48] +Size=48 + +[256x256] +Size=256 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/Hmovetoolbar.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/Hmovetoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..cead99ed108a83715a939fc293dd7692008ac6b2 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!3HFSYrjteQfx`y?k)_Q87dhn@7xXk0~Fyb z@Q5sCVBi)8VMc~ob0mO*>?NMQuI%?&Bn5OO*L%Ib02GqV42dXl&d<$F%_{+N85o?4 zQWHy3QxwWGOEMJPJ$(aG^itV@;trlJjv*0;-<~t%Vo=~=cKEuuHadP)@WGQuU7r}S zO7(3kn;EC7l=k(^o8K==q_@k14TBON%sx1ZaXWETh=#i?0*QIL`njxgN@xNAL{>as literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/Hsepartoolbar.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/Hsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..7f183c8b3ee5ffaa6157867cb88ebb7e67f9c0fa GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^>_BYK!3HFCsxJuxDYhhUcNd1u43!L(ckTxN0g7-I zctjR6FmMB9xrG@SX3dcR3bL1Y`ns~;XOR@p6Zv)R$U2~qrKgKyh{fsT1O>Ju$B!EW z@!}4{#Nd`-q4nn`YMg93@~{6$nhfv4z>`4eS;NZqID=!NmZu#9Lx(rZWlOyY_CP}z NJYD@<);T3K0RUVxGDiRa literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/Vmovetoolbar.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/Vmovetoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..512edcecd69bd11ef3d58930ba8304473319e183 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^W%Wd+bj3AjN&xsQ+Rrz=y7dXn1bJS$(l?zvsn?)HIstmk1 U3t#Ex0qtY(boFyt=akR{0D|pGN&o-= literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/Vsepartoolbar.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/Vsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..d9dc1561b473019a12091725e724a44d979dc238 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^_CU| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf9S(6$Q|-`GL0Lc{Yfl%)5R22v z2@<^xoY4VJd!B_UMqU2{D9-fNiI+30b a28PTOZq~oq5vPF0FnGH9xvX2Y zFB~FoF6n8tTD=uT(Qdxx)a<0eU@)!M>o01x+Iiqws#D0Hbb*o{kH_P?{eC|=sA#T0 z5Cji_`{}&}Tmkb(#+V25=I;9fd4|K`+eV|YBWX1i)lngwb6(cvlI|H}x`)*t8USE4 z8hvOso1cMo{`ACwAyRVzQ|H{BFbtm@rN8jzwpy(<=iGDPbQ-|Ulw{$4NxE%}d9{e{ zQr+eI{&h(&fip89GV`C3){HS*i)t?2-tBh#sH0W z;0o{txRgHn0<45#I9^t(@FBCYv2oG!ysy9~YwgWmulKE}R!K=o$%*nC0efZw0)NMZ&S%`vY+%zRZlbP!x@4?Hw zJMm>Q^Ag+pTb?uLa{lMux%ZwKuvjb>i^XEGSS%Kc#bU8MTu9y!hT$i`$AAlDfF5^J z6(fKHq`;?2sc6voh#{aao?hUCg3GqH9R+xh1eU^7fU{cb|NF8ZqNnL>-afPk04yvl zOlMhk5qLa5h=^qMq*xga!@Aai*OgM&@(&ve01$@Z3&4-SkwN<*FM>(@8Ze`jx?u_^ zEC4_d1jil6xdI#;v>(zUn8g2@W!Y;kAtj8>f>bSs!(v zJSQ8c*${`AAl!wt};b1-R}MdPAa9YmrQYp z%6F?E2%hcr4@YyZk&93;^S|}(^*5`?vrpys`6Nkh_WFlAIoC-2LxK1^TI)vD;`>R} z!ra{4Q?Bb?He8rs`}^F^L`00&YOVDzj^oV4ar{>udDhm^EiW(s>HGdP&^EYDLQO~V zHQ)EA>knbb2)dv z0C~=Np7(YXMfdB@Z!E2ByWP&3&E};vO`iZ>-tAef_2<6te-K5{&^}QI<7{C8WPX1B zBN6$mz`vlBQjGCu%-BC>bi3W38;!;vB64QHtbzBHQeTWap9A@t)9rR|G#ZUZMdTUa zo`}4wlsbP9xmYX~i^XEGSS%Kc#bU8o9yb03nOZ1NxYy>({(Zd@U~gmV20(u| z9(gT~c;me`!~EvV+}y<2#`t64G6ER`1O3Zsg&D|&M$dcW8&{WWwY6;(09dZo*1Cm! z8T2TO=47@dWIA)qB6H(mw~)UQH{TWjV5L%7pDIjT7c3cIl9Q1-gfNSGEm)d5lE1N1 zsjUCGE=kymvkP|(Zik-((1`8uWe?5owd&P73~6O9N#0DSFycz5jNsZWNL!;%_9LI|Asndu{LHXFf%zv++M+p{yJMa(L| z0feyF)$&B)x=7cWjo{fRx~Yb%c(HWBWKV&ETS5qjAJm^X7MriCuSeBPJ>AnYrD{KfwBO_x^`2}>tr}J)8PNx6>002ovPDHLkV1k=O{7e7< literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..86bf434b8476d83c2ca1d531a58bd66e603ef377 GIT binary patch literal 1040 zcmV+r1n>KaP)pQmUd$h(julvh(!=P8Qet6OsgR_ zLlFu^7cNu;{{g8AMT!dQLJ`~+1VK=wSe$7>Lps+MS50QrO`FukV3ml*P1|UiX5Mj; zNt}6e(@tjIdr9g2EYErO-tW1;-Z>W>4u`|xa5x+ehr{7;I2`vE5;UaJ*>_a*ghE2W z7tqZR78VL3;0aVj<=rWhJ6Y@RXlPIk9zej0OK4QAuCPJ^(Gx)31l;ohwoAhVh{}81 zIC-4R-**;Gxls`kVoF*7X1?;724dB-C3u_I2FwRE|uUoC$tyodAGjW^@o3 z2YP}duvI5P)k7MBp9e;Yh5WRw$+{B&kjjh<_;?c_4+Td8*=m#E(HPIK9+ly#!uZUc z8m-GzVSFZ0=^O&C)O$p93tgaU5B^G`((%-tg2&Rx%3wO%qoQL#%HpmxCo?h<4Hnf) zf_He@OP<+2NEys60Zr9y79RjsvzdRS8jvrqb}XMqO-u2$*?TXy%i?|IMtIQiYBRy76* z{kBRT7~MyL31CmHePcVJaoY?0rWJ;Z7xI@w6H5g7eDOm5vWgA~%+}hgTe+F>Y{Acx zkfE@Hul5}cj}H$&*m1ja3`kns>(vjozfw_`{gKkevA@Do_dk(UbU&Xv_h)Cfp8@^e z;UzZ(U0Y@xuAJ%UBps+JLb>RhL%wm-KBCq7ipSe3ve~WQ>v&$$OOfJ^H$U68xOf7$1t;`$(2wSp*KW*4~dS07@4TWjJO8^X*1nBI@ zXA+!R!;1}t>AnE%aqpV z1A~>IEdS{4;Lx?vqxhRHQH|EOF6i%jHCm6S-krx<0)YsiaVnv%zQ9_Fr`}%p-8@^g zJ+=z9Mip@_ok?KmN~Goh+>9%w8%W#k9eA>0tv+vbH;a`9`5PhAl{MeGQo1)N=|CoH zjf=wffr$YjGV_k5%d3^r!$I0Z_qMRun8SVy>;oD6YX~V|3;2$7Hm;PGhtVDBausWD zP8yy72at@@5Iys@63?|3W}XkLIr8l;-fkXuNLGNu-AW`%Wj-qjr&|lr>rwQ^dT5Gw zn#YnPc_ugtVE7P1m~EA#_oHf!{n8a~y*k3go{vDC&W|(k)f1n_)ym1q$=OwY0?7`c Ur_iO;&Hw-a07*qoM6N<$f=`a~bpQYW literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7374637c5e805413b6886d2450d9968053c026d9 GIT binary patch literal 1025 zcmV+c1pfPpP)5SJ6%k_ z=DnNDWahn@YVU7(&%NiI|GDqJ`vDe<#bU8oEEbE!VzF2(mIn)oHn_Fx5P{Z_ShRzto zpWDIuWIOS9U37pucO^$={Uq>$!A&rL?Q^rGc!nVRsy92<=)_6KYuTF}YYaDX2SoTG zZq*Fh$4^1c;srhNNOtFePQ_z#vK0%Jk+r22{}7_bV@AON=|d4jnz5qIdVJ~0-w*vc zHF{%P-nz;`RovR8InWt{H6*q5AOdQdw4+|Ba2VPC0j{SR%UA2~3CzU|Dj|~eCCV&b zVb(7fk9O^~x1_+WUVIbeD`Lwj$(y86d?+e!EzK0-%W*rNdl`J2$7&Z3hAQ6y*@!8L zqq9Ri&viv!_sfM7J^D`W&z=9Q{-OvcfrlcdUW#B6zpA3I_@&)vy7bvXqJQoDvEQC` zLgzb-t>YIJ3IHMb8q9W!c}p{ZPq;)PSgjokh;#X}z+HWn%)YhJ@Y zDDZ8oMQ+D8o$kKzR{Yl%DkE!Y=hwd*+!1x$+QG zpFmiB0@=nQiAmfomQA@9ilv2?+FRHtNXCBy!m7!fEi#FNnq(#`YcoF>xD02$?>qON zxeyW(67tSSV=q7A@uQQr@3W0&N^w-nz=u~us2D^A_=Cudl}&8>(G4_Qu~czV4Zl(PQ511Q zG&&b-QH@t}i~D{x15bA>Qr_6ROfHu6Klg7>PnL=&C4hs6xS`!Ve> zGjCeqev;X|@4e@q@0pwT&b{DpI2;a#!{Kl^91e%W;dr!=@Plk&b_!!Y0!;xH(7~tG zR|GI14XpjxtLCTg7t@j9M(&!YIq_jZQ%!FK3h)pa?2c#wtR6t+|Gw>`s3=wsgda!V z0RY)TZ49F)fycvPK+_0 zZ{Fk(1jK|_6y*4m>lb%<)#6g;p&pc}v+3-Ot4DxhR8$K|_Ym4NAEn~`IlP~*UvE4} zv@ZWOm27GL5a>HGVuI&~Hs*!H-qDHoyD5H8+cs02dsl=*(Wq(@=q6i-njosY=T~xv zdkNYT**r30Gj9dnx>e3qdJWt&PfgCfW|gmip^(&juMpqb{-fv{emQ@< zr`YtV005cE+RLJP0(dMSD2jA*eh@(88l2mz?Di|UGu>w!T%~VhinZsB=(h@)kkrji zh?p1ft>{kwX#RXJd4^*4mrQB?Il-O=Hieeb=4Y}4;8iW&FI`!4k*(H4Eb5b?|V zF4eWZ4Y(Xs+J3*o!{W?eZW!6tZ}X7QjnE&J($!Sji~<*fiV7^-I;W7xarR=mVPE)t zX5w0Zvuu)R`?}%HFP|{$|2+lrVo*`QGy*S1jqU5t*}v1TE*#stm{g95-U%)o+q*bY zX9voupdz#`UZwSmF|Q{_>bf&Y^LH~zo~g6xjW@286`AN{xGHo0=BFo_9;+vv+F)*l zr^o8IHeD$oe753P)ldD+zZM5!9tO1o{zGMBY5oI6KZ#Y95B+WG`-ZS17B=41TU#vzh4u`|xa5x+ehr{7; dI2?{gjXQmzEi=bH?(F~o002ovPDHLkV1mIt>7oDt literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left.png new file mode 100644 index 0000000000000000000000000000000000000000..ef929fdf0495f068daa86237c84121b7943eb134 GIT binary patch literal 546 zcmV+-0^R+IP)zfNl)H7_+0Qw*W-M>3#_|0$_}} zs;c+)w~fpj17umYt*Vcp${f$Kw*ttr?3{=^17bj%X5I*3I2@i4kv-rrRn}fNz7@b= zFgWd;djT8`WnLR#G#Z_Xp_(CrLDUwS&*$%>C^`>(3kl&RGMmlbs_HiI0}xeh4dE?dt$nSkmw{5M zv8UBo*C+#P?VgBSKcLYVqHziHJb$99JHK_L?hqIX0Ki&%UqtQ#sA?mK)|V*H^V=fw z5WqR-4H2T1bhTRD1fGfrzMT=ImzT?BnWpJA;H7VDuorDInfzR@*O!1de+2+wu~>XB kisB;GYxy;#_P@J+0pK>C2{!7NY5)KL07*qoM6N<$g2?gk%>V!Z literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8923d6f4c3505a2c513d49e849db6115bf08ace GIT binary patch literal 1072 zcmV-01kd}4P)k7RCt{2n@?yYMHGj>Hxp8diXiGm)RQRQgvFzv=&Fc|e?U(n zih>?Q197H0QF@!5WV(}p2NB)i#e<7_S^~Nny$FKfK@h})AmTw04^ae{ZPxDRA=#z3 zY|JiHbrEyQ+HzW}0cH|Ffj;1kP91+7x(2RYgQ5d7dBkaovHBi-gwF z($bwk3e1Vf5O~$swW9|x8jTLrb-l&8-RdpxIbRnFp(IIeQPmT`<&IVR8Y9{c7>~y{ zsOmOwb&IXO#)%R@k|fuN$To0&=&_;$FdB`n06qe4?qa;C0HkSp$zU)zuBrzd%UjF4 ziUvTMrgLRk9s}-jEXCtZ&s8h{q%6y$z{5^FXz>sU0BdalJne*4M1mF%5dg5(j)9k3 ztXehL(m$(S0VGNCERef#5vjV$p*H~5+DBFOtrn}3nLndm09b4929C9iUlZ_=*QU+^ zj7Fo|f#bluV|89UbbJ^}lH^w4gsNWVSiKYv9d^L-^74(Ux~-~LIaY7QLq`A>7Z+j@c<5jWjK||EMdV}Pre<7s-);3;JOu85g@uJnMPv)Otr_1dKKL&0d=v~o znx=EcnD>A?94ngQArOExO$TLJz6~65tl)>63sndJQkLZg@MJTnyW6{{iiZFIthGzP zf*X&i?VIunz*_qpFln(mJKS8TyaBM*=D?dRR+KY;Mm{^heW3vnY;^XMPXN)j`G3h9 z09AdFf6sRBZ=Cj%w*-r#_&`-(Xt9PO@qUE%IzvTKyrHV88&}n#&vAUpdy5uDaYRI3 zcjKxW<#Gs-l+Mr3zXZJ749f00hz>%Kgt9EFcXoE30zPysiLDcYC9}D?dD4+7sb<1s-9oqe^gajLV)vkH4QfnT7TB^;XS}F z&G=py^a`P~Hk?c*KMn?idx76ua_9|0r|WQab@f{jc>p-sl1DEPI=>N3r_(Q0^%3B7 zOD>&5=;cma6vZdN6SN)`pt0DvsZYGceZz*aNf#R)PB003E*{cVhS9QfR^ zf;yr;IU&RP}4e3U)Jy3IITsWq(#xbwBWZ7vn_-0AOQd z09aXB`AI|$ipWlj?QKa!3jkm`oqo5s9R6}FZ+S-z0AOux?JM9RJ@?m>7yn;on#%M1 qGvJ7-R_uO)Tj@EanP!^lBGEs1+BIzV?hVEO0000=G`P)q$gGR9J=Omc46}Q5431Pmb=;YE5JGcnNK^JwgP-vUxeH@yAgW!AfUKI3f2kv>! z?|j_Lh5y|YTk!JS+{wLeaSIo`_9i*;yYr=($ko)jqQZ9G?Z#Xfa z9M+}DZxC`fpi-@0C&Cgin&cH?(R>#VIU7*kKYLAIwGEV#ydts5{{Bo* z%qvj2I(LP{(g7|^2_mtmI$1pAQ~}q{%v>VKhrp#tUWFKki-#O4U}AcDk8Y2?kLr~v zK~Yy_pM=#4*t_?RbG3iYGOFd2peT~>ad$dcGawAZ;-6!iZv&GlLDieZgDnFV7J}cT z^ae1WQ53P?-=7I=>;W=X29&Gy2N4eL zR;2HIyFU$#88A_;9TL^olAN;B<(Z0M1I7$c-St8PAQs#u)AaFG}sMU8h*eJIOI&c~zEv$z+v4g*i`Rw?HEu#x1&VBTIE0I+(j@wqCukeD0P;13qw8vw8t sH9rzKAkY`+2g>uVa~fiZA^scq3;bj?fgFFSZU6uP07*qoM6N<$f=(9y*#H0l literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f0704550378f5f9bd3a8c01920f9d25be5eb1d GIT binary patch literal 565 zcmV-50?Pe~P)_?X2v~B?lIQh$Mx%yCMmK3b((-3bFI;dy9fjH}K~F z|M_Qj-@^YMmKtz)xpQpD`wueIpPM-PyYCOABtOw?AM)Nm7aTEVt8vNLZ*_*evuA=c zF=c54v|6Rg;lX2xDKd7RPJm>UPoodPE+GN6^%puDtk8FU{2!$a)!L*#Ox(rix~dIW$hH#y{Rpt`hvR?q@UfUtPme~l;y zs*9aT!76Z&&~?~Ls6z4?oqhzMu$h&Kxr(p_;!c23a)a!%ZUg?S%FJp(0 z?pnP)_T711G{IP)^@RCt{2nq6pIMHI(>=k8i9X4Q5#Rq*?vR7!W#LhwVqHcZqne=Qq$}l zA2xlMyHOIDxp&n4Kb}9#IrE#@xo7TO=&7fk{?C%M3s|WN<1-c1yoex}XkW8je96VQ z{|W$w@%nbq&r$8vtC(iFlyNb3*2N$`RhXC=#F$C!#fn^w?`$9+%8%7ArxY~EF-~bf%f1g|YGy4&+DT#bR0l2Pm z{30?7hY$v1ma{D%S2zGFN3y3cX&nS^w&H>U&JMk}!T_Ku`CR^hDtFt4DC%$W5J(?T z7_aXK9*%_-)a&FSfE|z@tvv@?UdHl1c}N*RVYIeegb_Qc0PUn|NDaV-@#%XJ-s&>c zU6;2Kr2-&7TD!%l9PG-kVwO(*#FRLI{KR)Rif{;66SEBBuEkxc5(Th+tiD-HbQrkU zcEsSZ+4(0W2H>)>W7kHQDPVofGA=JSt5qTZE+3uVkfr@8aHZ{}xAN!Z9l*MgZ!c|& zd3a{j$%>13z1*x;egIT7 z>d)oh26kC-5k>v?_p6b60IE{R&5S8LXvKx#CJ!C}^iR~D2liOO&RG}Sb^hgMt>kf0#=E9TL`a~HH0?gRPK zHdMUkU8TGh@>_NA%wlHoPGCA_1p~o*5%YVt&5Ma{2Y!rMLI6!dBCF7NcFXS>)mwpI zZAYWDAtbg9Pm~9aw^eTgPT7t|XnGJ5{T-ev57dov2f`W4kn|uVeh|%-OJ7H7?g7qO zMyE$e96~B5@yX$>pNPla} zjgUV;EW};}K_xlXB$XGi2^MN+Wf{^2#6kFfA@XW(|l%OV=A-krJ$DgW|5owe0L(7%w7mChNSrb z%y%n|+QEjzY-p+jfUHsb`Uvbg2q62T0QF@39Oxf9l{MFw@~kCyl1A%82g?OK_b1?c*ip4fI}~cV1Zs|=`B(V7y*Wr zTk8tlpx=qNCB*=Uh!VSH;Svry@ur!roX{x*QL2Z%)%HV)`#-f53{iTB2A%d@;Biq1 zhhNFmAD+4mdOq%g1!?*`C|j*je>k;h#_P~jzh`x;^*uU_t{J@hI{?7v&BcRnI=U)j fUoiC4{&(XCWl)g;$Agj`00000NkvXXu0mjfGGFi~ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..341b2e54106485dedc82534001273fbeb481b0b8 GIT binary patch literal 1120 zcmV-m1fTnfP)CSO41K+=)W;!QuH zQ~(TAT91dy;U4)zTz2210P7kUX+0vUM}Zq+mhN~L*lxD~#A zq<&u@!3?l5W~J6VIGTVvc28}}lKmbSiWrh^^Wb0tHjIwl*6oDfB0LZ=R(5%*HV>93 z;O;#~Zq9@^P6H1|9XGqYwa6ZT>hbKQ3rk-Dk46nqSG&Bm$PR#NH5fc|s*bQT<|yJ% z^I!#lN^bW4PZTLc`+#<%uvd}K5{8<4qia$YiV~e4`s)qg zP%JDaUu&C^oq}q$upL}3B77Y+R8YLSG1~h@4(?iBCzoGD`6&_?1k{^Juv*AJ2X`%X zy7~+vCt}u>Nl0JTi&&g2F3NKF6!2%n5Cjj_f|FliZnF4qhTsWcwnzR{Avhbuv-SMR zt_Dv6=MyzZdJvqh!}E>&Z(%4;14|J@)0+h6H=>1!!q0&O&jZWJTGTm&RPMy*#`E6^ z@(MiWh@M$zExH>na z4gf^kcb$Aw&{j0==J4bJ0H9V2=Y}?yQKqAY3YKg10{}p6TW5V&UjqFx=2(T`4*=lQ zWbsn?-@2W^uQAKobHOVB01Jm+zL3cVJAgl23q5ROOTt?K01M61@2au`xEQmpk56U*<{O1yRODGS@`~-+|72#h=En;^fbK=< muKbNwK1{o&zWVCx+R*>gDKCq$x1GfR0000?^9wqP)M=`nxz!)>6#&9@ZwCxbSboJ zhvLQfBttPK!|A*zq|iBp4uO!(l$MSiGI#ILsnDgxLm^kwdl_OCktLQQ&O`D|65PA@ z8csjZ&)P6>uFv@<1u| z+$$hM0LTzWaU8e20&)%kup}at;w77Iga@PDG$+p(|OVK$>Zvjb)NB{sL@-j)1ahZ9_uE781Bs<2K z_a)~k1z@gjUu%6>ws~Pde%S%MOOj-8o8~~lGaw=XNsv4V!|*k(zWujK;VmHfDGb9G z!{N}~Jo@Goy#?pf>GY}A`fnA@ivT77XsvCfY5J$C=Jx@BOG|*7bWCSFrT_o{07*qo IM6N<$g3NpBYybcN literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..94b26096581a5fc354e40a1188ae9735a17dbf62 GIT binary patch literal 1062 zcmV+>1ljwEP)d}b)>grtQo+}TzY;+2(dCV zGvnFP+zr+YAff`@>%zg2k&!RsI3BX4+b_1KK$i(bG~I5uKZU_V*n?nw4IrYTJROMW ztsn@bZS9?4-2i6Znhx6_B0q{E-?sjL;c6EE5#{C2m|2Bk__nJYbT~7hGYg8+Yyg1I zq9~enl}8z826SM}bP&w^RTzdZIL>8LyaG)|ci%7!V8!?SXI&>#g#m!xggrut?|k2X z%4H%|835=_c&yVr?Q@kxl?DL%HDPa_=j(HGbC0`7plSoQdWQ1Wu)oo0ti^HssBQhq z4d|ddG9SpYY&DMKM{Ek$#QyC2)G|5<_v&-r9-cw3_<0_9bE?aXAdmQ3A|AEQ@lK=n!07*qoM6N<$g1tWKjQ{`u literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..0fbc6b04c58ea6a52786da33501454f91e7a4f05 GIT binary patch literal 553 zcmV+^0@nSBP)FbLS00h9JGxt4$51kEi|!< zytoLuI!ONlk>Ecd3eF-9LU1W*FfEdRL$^1$ICXFmgran)v^IGkhdYa7@+MpdeWn}k zp5KSN<2d-&OT$d6%+-FNOy$zx!e+bueUgA^xM_A8)2aRaV)OFC!iggQ_!8HP2c>tH zlH}OY09-9jZSTHLlB5tEV2~LY={IP)^@RCt{2n_q}jRUF5^-#fdjvFyGi`XFM2Xub$Lv+9Ge-dS>M z{-m*p_z(n@6!?^cU_`d0kOVyx^pAobq^Kvey}L5H&ea|&?2Z~lAU!M+qCv!J%WjNw ze?9CV>pgd=SB$djAjnVLN>EMcjYTH1L#53&b7_kKK(l$GvO7GC49*S=7uVa$qiqHN07TME zSnCNZTSi7!+eo3k1^|GFB>M&dHg?s!C$|?0{ifyHZvYnh2B_~7vh{hM_I-b)No^+# zXp&+Aciv|2mnNGhmka=a7@}0d?iu!ef}=-`w85bZa?ifOt%1RDh^QT;j8+I`Ik&G&ikc)Bs6oZU}tcAI~0u1Cs~LUX)bY zS^>g7ncW|T;ayX@tzz<`Wb%Ap>scA^3Bz#Sl;(1R9J=W)<1|7K@`XF?{5-R5dXj>9B3nABWyUav#^wF&Pv2a z(AGi@lG9F(VC8ucQLvW7LQd?0D3%s>LQF~vZ3JDT+#Q01%RGzS1nhP<%UI~EwwO1+ z&%B*t;9oCgSv1#q|3ijG&K=)wM&HW>xGalg90m^U^}aiQx3@nyU{VHWcIBS4I@t49 z02l~ctQ{C{u(??Y4*-ua(52d^lMgY=bcf0V2*YH_DC}Boz26QC0Kg37F+kj^ulJS% z0}=(2Pe1O@b^4b>1DH+%klEu}r@s^!FhO8I1+!=Mwcgpl004Z7*k?}N`r6=BXh4Dx z1{^f!U)JvpPJ{-4O%e0n``5KQ?~a58Ob~$J7?tXa@PI#SAv{3Ieg+>I?;g$4QY|sw zVF>u*oI4kOJJEF{3kv`Yy&CT53hm@EGHd1f1%kI#^A~7GqcXxF`vkU3Xe76^ h-Hd*g75={fegk)El~b(2fJOiS002ovPDHLkV1feM^dtZP literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6d52b5fa3781a4df135725024416e552a11bddae GIT binary patch literal 1139 zcmV-(1dRKMP)jPNJ?V0o1n91li+%nIqgrEp~C^uGmO4v(HTwIZu0VG3MK!l^Y-QPYYZAU(U z8eBUf>$pQ{^=ahk|pzlv7+N06Q|o(rTh$l0Vs;iX4(~ump0jy@-qOS7J^wV0*t+#h2rzJWc&>PNUatD5QE;cCE<4f zH-)Sni=GESK#E5q{=k-kH(zH>2moi2tqk5=8R*_)OU2^=%)x`OBeFPnz{@2-0FmK~ zi6<)k;ZECX9?k$(;KaKH#z)cgBYi1l^1SgZ08&7*+~rRy?bTN>nD#++{`j;6%)t}B zT&S+TfK5GBhoWAfU_RF=#?_e(=lUPN?o!x?B|tC-|FdeNb(MV2CD-Cjo&iKD9)4}h z#B0vK8U8Neposwx0mes;i(2WmzxAy=E9IhD0i+H7swRGVs(;0Il1AhM;M8ef)tY*z z2D-nJwj&!r?fqa?%(N{U3=ar; zFp!!7rVe9wl<#W#GZ}#Z$f)ud_^^@>^DZtojp8-{O0Dldj;5p6d>B07HURTl3!Geh zIr}0;o}6{4+Yl}{!Q@~5l)i1zvu8){`@^AT!$@s{KV>wppL*kg%R+j$jKnc`E}m6u zDqFhF3urZr#Q=y>-T_8BLu)VQyMD2!V;6f%fQ>5eiiTPr^@TrJ({O;rf0?=ACoCdn z;^(4#*VoqicZ9_mfL$QO0Aet|9SwAUZmsVYEn2j2#9s~PGV2o(qKyCm002ovPDHLk FV1j742e<$L literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f04522a603b0073fbcb7a988fa74abdacd14e7 GIT binary patch literal 544 zcmV+*0^j|KP)Ws^3hE%@uB(Hibg7fXF4hEl z862d4fk^Nl5CxYeZIgD87Pn9oM+awjhfabfDh*UL^zP?yNnP)9$D2W)?S*^Z-{+q9 zJvjK+%hEhFA8!3HWFtjahVAfskpM5vLk8!;%5zrgEv$6UItNTjaN~F`dQElr)Jy;X zhAjr=qb}85-#x$-g9&UoDF1u`N_B^d1IUC)^9v30E95&@#1l%(OGi~m>@_H zlAg_noqKKp6UG=}Xe(%RmRtiS2mwCQUM1YT=^6mZ6a<`>S+COAyzUy1AcPR-Bzsd? z-M;D?!1&7$un-fy3m&vDxCJDYTuS3IerbOefWIYOn+3p2vN<4*E~aTH6&!BB7Z3kd zf2006ZBzczN%)}`M~nUT%BQrg`2oViFyNP=+g~?UKW1sqcLYhW0TE`^{(Aj=)-7^O zKsFvd!s>(dT5p`$Sbo)$q1SjEOPy4Of^J&8&^8{p|;WF8oZSN%%|kCOjGmjDByw}auC8qH>$HykqF0fP_zZ~qQ^cSl8prw5o0h1n=R iUK(zPM@5DIFMvPFm6uy&so_rm0000 zBuX&SXCP$2>;cr}7Y5!Ci)|1&13=Sb5kTkt!r)rD_+}6^08#9B6M*mi_R?xW4RIt5 zV9hfhDsyphu78=Jjwq4_%*Ha6QNu6qIOSW=sv8>y0KhAg(ftd4d#TBi-kdRK04J8j zIw1;>&Evvaa6i-2uH8o)#F`v!m%dgo^CJh4s z5Q7pXJg11i%NB;#*vup)1E5_F3}gw>#TW9$<+jpD&wv`bny|zpZ}_F1LoeD$AZ-JH zTGtRiD6OhaMHd!-aAJ{ZaTg4jrEkEi>e$^19>yM2?1`rTIff9rNwxaH}qq{qKCJ?|O16Vis%k!HSY(sD7q$yQb3`kCU zqMxej-aDg*w@sK9PM6wSkH7if6yJY)ytng?Y58;wAkc%NH=RE`k2l;ZcKl@{g)|M& z4SqZ#Z2Yq)H)1P^ve}qVX+S*I-H3QoSls@LpoTbd22B45l8KqICG5*x6^m~OIRlsu08|B| n3h=(L6#O6-yFr5n4Gi%gkp(5TEJoOo00000NkvXXu0mjf;A;Bz literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..61d7574a4d25fea8baf95516dbe44e5b384a53c1 GIT binary patch literal 512 zcmV+b0{{JqP)|o3*lVbAQ0$RU%wt zWh-d4B(qzD>10c>vb3_W5=FRfVbTa&S&LU$ij|OsnP;(C&E4+l8a+kG4+5E&H}CuA zV+gdgw6y$Vr0K@dXtd?Me+~3P2wUUv_+yhfQIk!B!QiU*-T^&;D2j?K%dY$t1H<9) zdZ*KIz;>;?4Y)K-d#7r^7_$>Xm;jdm1$^}=a9Knq#+aQ`F<^|@Q`H0Dd?grapF>sK zRMmqtO>eC`x3f-Dnx=Pw=fK7a@de8KQlAx({Uk}=JLlg0wgF?z1K=t1v`!NLWH=PV8S*%=0{&&1R2P^?p@a zOZ=D-QPssAdlJX-Lu>6)dP@o9dA?DWGF05)suM!)G*91F2umgOOE;g5>6w6wJRw|oVEqMoFksH@rl0000`~c6R0fK@bE%5ClOG1VIo4;r)WPYGAGPDFEL9P(*Yi48tp1 zQAcGf2K9aa0)X!U>;|wCz{if`{ArANTy`y`8=$rJ0DO(??EAb{tNmw;`L)b?$~1sH z&-;pquC8;>amR6X7-N1et*9~v34&l-6h+?=(HA{-xmB%JFE*RaSA`aa5)24}V0#or zKM~PMOE~U)D@*KdwOT#fY&N3;%PZD^AP9CxQFM=pj#$F&)V1w#T#V!RWUJNsr-1SR z6lj3&`+J#r4!}p2a9TWw2+W)@fruUg_$&;=zX~X`7y~@d+ebw60QPscGcyxWoYO72 zM-frFu4k1><@nUp)bnB2I&=eE*FC6|ng{S%L>Pv@52MZm+v3wV zTI<6~sRtN9JOB_;%*>o>9%p9by6&Mt>+EJ|1~eLtV*nNb>`8?-B|ag?ggr{BC9U<* zKFiE76a#$UKOM*MeXMS4-_Q}TY4Hi2^&)M;P5^VAv&6s*yc6_&|2#AQ0AO2pdrtBF zkmTrI6Dk1CIF9qe81rP1i3CSt@f`m=C^(m_GUzR)oDYmK3&TjZA)S5ww?uT_5-wUiuv)Wi?Yg647Z(xD4?LRuh={&dSQl*_oM{mzzn{6Rzv-QcB$eV0#6XDLx_3gau|k)$948 zr`KS;ULUJeDvPj-Z=-zi0Ki0KJ5wA}N-fmu^|4-(Y&ZiZCnv|-?e;u?18YX_VP9V& z3Rx{r<2asZwOTLM>$t7~zV9Dk=6L|)-R&bLJ~>I+O!%W?!n54Ic>&jT4=JVQ0IZox zqb5Fu&4j-Jd^$Zn{V1UlBSB7*w;k$eTSLZx?Eet&4mNGJHQ-AOaD*LU rVytQt1VIo4K@bE%5ClOG-fLb1RDv!28%yT>00000NkvXXu0mjfkLkMz literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..18e8ecd8d34767ad737555393c39f9c6873dc9ba GIT binary patch literal 538 zcmV+#0_FXQP)^V*xB2qva_*B!ig9g7cPx(XsyLrnG_--l0v=xT5ML5Tr`)}#AZL$Ff;Fc zzw>xA0|f;I1^*e#8(6s-jg+LPKt%(kk=HL4Kjg{d@&r|{L}yD<3#b6tkM6P`TsyNb z2C6}$>PobLvH+#iWm&g1UXLn!YQUciC!ARfItj?2YtR*v!6`$rKN(K!i2*-oL?kQ$ zM?nITY|XHQv=~DqEY<2^_)iV^L3jtVd0-Gpq=H+?ObiMZ{2;pBPwvuA8*25&UCibH zhY+@{c!o%CmczJydUWj5YUkanyasH%9^MCg03ai=Up@CnBm)C8m>M2EXDgkz@$L-F z&N|;6d1!DCKv=)xsq@XlV7NSXVrAymbKkST91JXm&4v7O4zLgW(x zEKB(LT5k zI=)dUUt5k+Pm~7GR@o0pyt~J5jvX2u@2ixr{Suj|C^k__b*;1aGk~u*xa7+Lx%+0Z zSiBdiFhtM+N~!L3tM@yAuX$raIs^p%gNSe9z%%2AAH7g6mqRrn)DCz)ogVmS!#WQl zsR?g;zH1JHmwL9WSC*H5xD$pxAVdS=FQgx4mz4*Q(1g9k@1pC-Rk`P6t}Nwm1*h&m zLNOrmV(xL-#sVPYo{#`=_E~QEb@6I!J9cbk@xqPZR8}(wozR}jKFt^w1bEDST>#6H390{xCIEQ-m2X9gcyKV9~m9{>t?xhrJeL` z8DJ+fZ(nzvO0XeTot0DRvc3BLH9v|1AY zU}pHpSWo48>0+ySn?fnob%%YQ3UEe~&H*Iw;@!y3$@}hILVoeYV9#4~b942EEGGX^={|XANl-dqq!P3;ONog4{aQ9&I96m1PSOc~$Vste@mZDjPNbUkdyr7Mr-aS|z>%7OK)}`qoN&;+Kj2Rb+cT?$ zpRd+iRo8&H%1n^V0~qq|gf^zTFcHAgJSJ}gcEY2ar&2C0x&xYl0`JvH@}R?N zZ8i7|VAN0Z2+`H1y9b<;`}lv}D%G0Kby|nPU@#aA27|$1Fc=I5gQ3&>3n0o8p2LzV QasU7T07*qoM6N<$f-;cwv;Y7A literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..a7acd9b66813a6848692182e9120a84315e49bb1 GIT binary patch literal 530 zcmV+t0`2{YP)_e)ZW5To=?k*>NaRq3R3E@DR)QE+q+ z6>)HknS>-QSo{No3N8)`6|q~vZh|J4T_;8DP!t^6=KDG1&Yq^B=2~^RXZnu!``+L4 zz1$t-YdXcvh;CT4u$nM$MEhIFae-KaV4DV9L>^e z=m~`N&Ph4{5;*i*>60@z{rUFs)-e5snm|}@P09J?UbqS90$mINhrRrASZ_`J6@g$j znvt_5U_T&`|5+41mZ-?tQqYLb@2SApY;+mvDKOd#$ModKNU>m-a*;Y(zIq zS^x?I!?#Ez3c#bV8C}mVAX(6C*JQfidp5sAcuK-NfY5x5po%=hnkp800q?*og)VzF2(7K_DVu~;k?%l``*)WWVG%!ufRfTM73 zB|m;_5IP1Dfah0_Ae;f5J5TjUEk7~eZ!J#yF3IBh)dIrV=-P75Emhy?x1Rp(09Ely z)%Ov}-@T*wwb^G2h-g1#^(TO0CFADYvjVSm(p}->mDQCun44NpTUzP?>?vN|aVxj_ zDX_n_ML`{dD4g8|0Sur1ahJ39=XsE+=*m(@_4aR29g3Oa z0`=_vT48K8Esd!K@Yv}eM%LFd3&8U+%hnY7#fZFeV|MSgq_rjo>%jrvvlQ>|-EO21gzE);kqUCZo1NVgb12rI!VB zLBS0*HO+4qHG~pVa4}kO{iT<>SK3M<0l1~$fT(;0>pHhZ>#8hbRIEm6!}EZW}usK zRP`gT9JD!F-<|HNfU0=q-~;gjTAw(4% zsrT7>E2=|C#Kw0Iu(t2F{A8`&@U{UAmxED9brBc~jcnBTL7H#q03~{KRxTN%(>Dqe zzqT8`C2pxYCa?&MwvG}-HHjLZAmTvi5+(e?x=z;$6IZqzwN-<6DwxEu0P2OBdOh8x zhv1-LPf`PYwU!_MK5j_tLC7mFPhqrjPnidrcaG3UsUA@A{NTm7A(0*6m8-{qxoDF2 zIF0|TVr_Q(z0HrKJ3zH~-zyHTk42I)_mSM42 nEEbE!VzF2(7K_DV88rU_>&iA)V))lv00000NkvXXu0mjfGnnhU literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..390a80e21be4412ef66df1eacc4365cc991bc9e8 GIT binary patch literal 518 zcmV+h0{Q)kP);?q^q4HxG4pYt!acIaKGB8Y>6BJCEie?b2Nby1WKodV@@_jTx{q$Uw_iMZSc-sS!Ad_V8Q z%N>-Il$88utmwho-PW9?d_by`rE}Y>jc-NjI7JTm&1jxPpOESRGI!H&teq)RYwQmA zVRTlqb>QT0OFx_}UHrM)*czwaSRL?#XhB#z4;PT;L%^xbaoc_nE&LM!FKjId+dv%4 z1GB#63?ZN@Y{P5Bm!~RF3tBgk-U73EP&Tm1$a1k+jCWob-4R07*qo IM6N<$f)Z)>8UO$Q literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dd352cff39feecc6dba5e93c308c710ea4ded94f GIT binary patch literal 998 zcmV+LWk%02oz1 zT%DUfu@ySDqyT;p2B@3`%=$%@pfUGqW!PGB!=BI!YR5%+pJ?%g=XV{Pymjl+;@88} zGsF&1@q^kals7lNPfj-~uN()_VW=8T0cPuY@7k4f0);fUt4MYA(S5IRa=e+fw9E^z ze>&Xx$9?h%%49sMwk^R#BLbh_-_&D2%@_X4QeUP8*z?jy51NtYBFcDoL;=%U`)tcl z&BfKo3br}fsFr@uN@HdPc%)DrZRX4p@MJ=`)gvuwQT{gHvd{e*7JnO@x_`-}01wa9 z_T?tXTgptTOX0A6|F3BfJ{k42`^wcmUS6obUH zT~(tKtLF+o3`A&~*y7UKoM@9Go*xeOS6u}aEm}yXeSP_8T zf?4u{+SI1RM(Dc$qviRMAQylgk&s<8-#1C)>=4yYM@wO`-@*Gj3;5;mEs!(B7t^FC zHwdKbyT}V82Pbd-d1>*R%?`N94p8xf`S(ChCB(8auZbNcoE|NO??QCzOvjxk&DQh& zwJT?VQbIH<^PLFE53bU5uGVjbX@!xJDUlVW!{3Od`U6yEN< zn9u<-%m2?jfV91JG0^`5?naV2;2jvqDQ>%A+uj@whr{7;I2;a#!{Kl^9QQQ00WQ!O U`vgegPXGV_07*qoM6N<$f?-_a)&Kwi literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..37a6158cc4809ac39ff752acb50896dde7eddab4 GIT binary patch literal 1256 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 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..53e2c51f57dd54e918078ed8f78d6d1bbac2bded GIT binary patch literal 350 zcmV-k0iphhP)r1F+*b z?si@G87ja&$wg7j0Biu*$+GMg{uc-n$n#v6v8o=6$YoT4KR6eW)3pc?k(38d7yIiFU@YE)H|N}TYyp~< zW#+@SZC|4a5D`uL=KzlCx_(}zPRJPYBywhqd0MqjXbY~Irnw0z;3Y5&!}sSyMEAy+ wi;%;;1^T|91Nb1K7i;Ya7W1D-BoaY<0gQM{BKod;VgLXD07*qoM6N<$f)#d+B>(^b literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..06cdefa5f11ff97e8279e752341150f6b8dbda38 GIT binary patch literal 704 zcmV;x0zdtUP)8Pm_{ot z7AypXGfaXI0vC6)$<;)Xpu9{ z<#J~_oz54XxvOw={&ClJkNt7;08pCG=WklA)(M@ttI%3NsZ^S0Ts}9MOkR4PSJ0V# zSXvAC8)m*#E|(v}z#eoED+TPksg!D3%m-k%007ulN?o@(fawA_HPoz zb{dVwrtaW%DF6VH?+wJvf$q?CDj-YN$~aQ%R6uIyC!(jiL)WE%)Eq=~&-eYF@n8!a zBp!K0^vL)99aG`fFmvkW0lXfKMt70@;&kL}7C?#PG7!;+*=%-gFc@T=Bxzx*0LsYz zOhlJ^z1|O#gXB$y0efHj{?cD!=5Nfr5d^_k)AJZ#0m+*OFm)VfGYrE|re^`n7m)RW zbHn%j_lD-YOpo!N(_wSXv!ekP8+#&H~PwA=0PI&)W{_3Ujp9LCjZH4oqdfC)2S4a0D# mGgAm5gb+dqA%qa(Ain{*MXymegB2$L0000KP)R9J=W)GoZ0m$rjo+s(~U3jPRj z690pXZo0XMAt0#z1Fg{6MbJfDBpnn?K8K_#I3vS#XPNUsDvvL7@%ed_=P zR7e3-5P){tp44vORo9R!IL3r#}l zU>2QpC^!f@2qKO}94rnlF4{?#2x6PGkfFwIMK6jD4nh$`q#!5-+uFYSgDHx-;9MwE%x~ z)Z-7IfBuoPnu*-QFXx_p(wW;1N9(UIeCx#4k~<=|S?wPh>e8Cq2CW6GG!ZFZGLEjT zI8S`v_jG3OmfjVx4I-T3uI~FVum|nLN&y=#W^;ub7V`nvEdU^lWpl;zHb*dB04v`R zPxR%AIm2^ovatf<#Ah!iewsa5IAUQID+Mq>$rAPgmF|k zHaNJ~`@y)@ zPvx(eNKZil0IB-{02=pm#Sz`vsVHDW^0|SSa9ek1iVA3P$`iL(8UI#_3SedDC*Yy( z)KnC}E#@G?wP3b-M|XA_3UDZ~{t37j%vQ&ZgqsN29y?G^{>k10ombK7!AS#a1uzi- zlsx!XO)orGE|=9eNt#$HfQXor*&jV8Q+!*i{V+L+YcdR2e-tDr2mc)r^7GFp7fsJ& zd9oMk5cnOBC^?##v1?+L5zS$wX^E$W`1VN}Xd$;tS0=@f}vGreGZN_naer9G# zYi=8~zI*!;1aWuIA(tHI1PE&coPATD4s>P;A%qY@2qA3dckeNxI!uzUM+;{HxZt`*gkH_=hVWw)y zRHDW`j5-6Qp2^ng#7j{Dld1afG9Xc*IR5zhd<-eu0}2b=J?Y~tEL5WAwp)R3klGxK z>Pzkg1OT+D#zA?nG3!>~-9o8EV2nK*+HY1J3#1Z+0QOqh^YU(e)Uf~n!2%S35fkvl zy}(yy{zAY2B7j?)Xw0zy34nk)Mx1MJRBy5-bQNnZ10b>1%*VCxDo;w0Z)gC3;!3*~ zUgS;5H-U5mNZg6n!=t>-fvgi4?)zLm#OcG@)K-z^*#(xT6M(V6>;6*rB1rvy$>Z^O ae&!9eu~jR|G6!> z%vf=s*Et&ae*#o$kt-=g@1-Y-yS>jshynzKSP2`c>cg#9irv1)3A6@itOSAWwTe!6 zkIk<0IZ41pP?hL{AmpnecbJ+=`kEr>R{*FHUlk9gU+kLj^&cU00RXl7y6~I8iOhI$ z&_{SX6aY$eQ3M!I7v_3hN4G}-b;J}S0ZSd_*#CQlVl}mXfCwIJencE7tufRaQ zqRIuJib@%kLyKqjzH*vrj4{R-V~jDz7_)-!VCkn1iKF|Y00000NkvXXu0mjf+sRS) literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..90845a81fafcf040c07beedcd3d83c2b917c2fb9 GIT binary patch literal 372 zcmV-)0gL{LP)K@>*MolO%^)T{`iVrgk%Z)ss`Cqlwz(askT zEAa_zL^ewTYG-NVJJ?v;2#O$^U@#zp*=vynf4a@UZsDA%1}@({b75w{;c)zSBwx82 zzuA64%wVS4U%5Zo|F9J>xvF<>JrVH*U4DI^ia~Q8z*b=XO}{s~?T4MCVg>#na4_5K zge3`RIn5Jwcas6(b6q{>k00j1WapPv( z6pIOf!f_HcS~eN^Ch$D@Y literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..60aaeb7fb3be6102d91f46b1cf40f5e36627c0ea GIT binary patch literal 725 zcmV;`0xJE9P)L?rFSeD{>=%v!iDU|=}YT;92atmZ7n z<@oUIXzwSdxiyGf{&*8jyVl)2K!c>BSNl62?{S%13#SF7)0C6f1dgT}m!C5*oN<}G zT}})58-){DZMYBWd=J`6kOBZiwf8`7{CcSTKY|qipfK3nKh_a)2G0eEf>vHqMw@e^ z$NkQ+Ccp}iIB_8Z@*K}4e4u4C(`fDOOQtB%Wmu1*RNP_5qim4~jA z>!bjpss*52EspfuaUUF-5+#p3MeY?xx`%wkr+tKMB1-&Y1j@^q`Nk{BqtV>}p{(3^ za^b&A{fy4?>`c`^Nv;GcKxJj=ue+jrj3}L)e$@5d=Oq3M5EYPQ?l&ZA{Zi~UcFw!Z zt%ci1;K7BGM$t{6jIxMwdbZH{*=eRR#u#IaF~%5U%octDC(xqlE`lUt00000NkvXX Hu0mjfaCTIK literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end.png new file mode 100644 index 0000000000000000000000000000000000000000..08b5559b2153ee5685d38dadf7003f1e84705696 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(5C z#W5tJ_3hP-ybKCFM-H^FthX_1R_vK_?7I4SpnjD My85}Sb4q9e0HwuMq5uE@ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..027a8894a6c765e53f9e6b7d3534f193fd111cc5 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(HG z#W5tJ_3hP-ybJ~$%#P~H8yQW#(~Tt#P0aXLb)lQ>q(G!>2>yQudw)~KpHpb-(~7o*t4LfKZa067evu6{1-oD!M~Qw zO5gZ6ET&48=?ZfeIrwD%8;R%lAD+6uzro277tR)C^3<&%v&G&!HX~(}{ Q!e0>A)78&qol`;+02i)LzyJUM literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb3160bb8f03b4777b6183d1790b917051a8924 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(HG z#W5tJ_3c$hUIqgWmV?=*3etgB8x#c!eSf_9qbP0X(RSk1iLCVFrET>J4Gc^i3Jnck o8y@rQULWyE|HB=i2^;bljIMGR|8;QO0OT=vy85}Sb4q9e06PyZBme*a literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca8904498cb1f404f43e1579e4fc170c376552a GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx_iw z7srr_Id5-ny7l-=L&*A*MPu}QvDZkoFA|3 Ry8Hpe^>p=fS?83{1OU~)P#6FJ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2432dd4bd31ba4c8764f6363a4b1c1ab6e87c7 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(HG z#W5tJ_3c$hUIqgWmV?=*3WA9qD~$yTeSf_9qbP0X(RSk1iLCVFrET>J4Gc^i3Jnck o8y@rQULWyE|HB=i2^;blq+heE&Z#)T3FI+&y85}Sb4q9e03m}de*gdg literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..af0f8fa5a9402e2aad5d4190d54e06512ac0afde GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx|Ur z7srr_Id5-n!k8;lMp@A<9Ey&>)HGX+7QV?f|Xseb8JuBmIc Q`dNawp00i_>zopr0E5p{b^rhX literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a564e4471cbd1e971effea7ecce225df366765 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(EF z#W5tJ_3gQhf(!;cOos8x(yFUDf?icyoE1^MsdBq!Pud@4pgJVb!0dI6mG_Y1V-t{| Mr>mdKI;Vst0KnWK1^@s6 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbf71fc728383bfe909fc7fca4e9cedbf5cfbb4 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx_cu z7srr_Id3m)6l`!1IP5TQ)%up#QbAS`Oq#_hz2{nI%zVDP{5wZ~^qha4Oc{*6j9VI( zF+@28Gw3eRY!JI3;=rB3wSd)x^#ao@nn~-&Ok`=;=2pfIbT5OatDnm{r-UW|i`+@r literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc7e6d932811db33945680c2004e1387f652471 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(8D z#W5tJ_3b%BK?Vm7X2)l$4;!TZS5*iGy!(1G=g6Wp^VZBed;E5fJ`+$e68K^Kl6mL- Re5M^BF;7=Nmvv4FO#lqdCi4IQ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..adc6446c97432f5e14e9f2f17d586c81a0d8e20d GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXckesKB zV@SoEw-*dW8w?nZ1avL2N^sLR=GzbwCR5Xvvis#HBeNqm=f2)OU(5S&WA|nIKnC3f znhjzXL>#y?xE8RQuwG!A#gxJ5%ebXs8AFsqFs-DYu?Bu*X)u29{|wO844$rjF6*2U FngBP>P22zg literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..0037f175ad42495f04464466046beb7f86c6923e GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(8D z#W5tJ_3b%BK?Va37DqLy3B6W4f`S3>zW(1V*uAN0QOtY9W7=0PHG%RC?atLP7U7*<@c7bNnm5i~5EDZwfCXay5X7F_Nb6Mw< G&;$T*1WHx_ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2d085652788ae38ea1e8a409e4e43b5a8dbfa413 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(8D z#W5tJ_3b%BK?Va37DqLy2^|J=gaiZLef_^#uzOS0rYbY}eB*r_K($EV0duSdOKwd~ Q`W29%r>mdKI;Vst04}Q`-v9sr literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..803708fb4598eead78037f7165fe6d8bf4d2194c GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXckesKB zV@SoEw-*dW8w?nZ1a!4=r8tN&GkpvQlc{M-+5Pg9k=YTO_h0XxFXef-vHP-pAcO7# z%?7axA`aXcTnkuDST8WmV#;9jW!%!Rj3LS)m{!uySi>i>G@SjTI1%V-22WQ%mvv4F FO#t;YOwRxS literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more.png new file mode 100644 index 0000000000000000000000000000000000000000..31b6cee8730aa1cefc31b53fdbbcbe41b6ce0aa1 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(-Y z#W5tJ_3hPzyg=2?fhK%+1#d`|Z&0cDv3L5OFHS9jo~kS7NZ-~hX921P0tt4Vfjf%kaaiuTzT>%D@3B9@Br%w^H+%V z0@Ey}3`SqZEe*>Uq8x%5bQfqgh+PnI;LhM$z-od+dP4UbiTAHJJo+vj0MuZ)<$$lf givSL_1dNKAVb0O0ymRXtpz|3#UHx3vIVCg!066GXfdBvi literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b6049055892c3f942445f20b4835cba152a1d1 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP%y;P z#W5tJ_3hP-ybKCF%m*80bnpfl>zhh%5PH*~-1_LQwbjnfnG@bUE|GWN8924b1*iuI y8cG}jPrcGM`<>7zR+zH>=bn^bOb{6ds|QRvE7^BFe9L?pB;x7n=d#Wzp$Pyu_%i7L literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef752108d8d7e81fa573e02714eb32f63f38f4a GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx|y# z7srr_Id5-mOtY9W7=0PHG%RC?atLP7U7*<@c0t5}I|GNbqWDe2ch?h-zBXR~ o)UY|D(f+T1BOdj5jQh-dLy4pDy!9Cwpf?yiUHx3vIVCg!05Hv1)&Kwi literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..943c13d0b26df4c8627bd948daefa37dcbfd9beb GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP%y;P z#W5tJ_3c$hUIqmo=ZlUL8u+d#CcnDS*#59_QqSS{dry1o8w+2mb^R`Ss(00tcov{0 xAn;%pS-NIl(q?|K4E?@0mg}bb#6u*2GBQ>NIF-)1dH91wJYD@<);T3K0RUX!Fq8lQ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9f53ef1fa585f125a6c380cf97de6fbed0297ca1 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx_=) z7srr_Id5+roBxTRqkLzF`>gYE*&2C)kw4%`_yq!q<)8os-pc=WaT p0-%P?8IAUT1sw6H$79@Q=7aM&8n>JYy#@3KgQu&X%Q~loCICu4TRQ*% literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..9037ed3b3f0b467cfcd0262af53647898535e247 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP%y;P z#W5tJ_3hP-ybKCF%m*7J8W}Yux|7zR`_Ji$2}>(m>@C^Ru7mq=Wygjcz@CciFmsDxvXS3j3^P60ZA8lL>4nJ za0`PlBg3pY5H=O_B-6{JiOAS{|sjWh15M=978y+r}k{*WnkcFe(-;BX~D)* rS0)5haD*y~YzrxP=F!`JhM)Jr2M#8aN7~DQS{OWC{an^LB{Ts5zf35P literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..0861d0bc76cc16291e7c7efeee65c35164100e9b GIT binary patch literal 354 zcmV-o0iFJdP)&LUCO2bPp}mjGzwi?NB9Kv|=%Y`=yOc7f@#!B!1f4#;+1^Kk%dBWbg0E~^@tOeXubZx*hmz~_?l-PHC&p64BY zX%Dbb6<|Cb$8NWK8)Mv-bjb2=6F-Hn+U@r7a5#Lg@>lM_B1KW0O1c0t+mhz=t;T;wq_ybo(Pm|)U{Fo zfWctUi7`F{FSdJSSw61nS_iR4i9{liNc;)D08k8CPw`L?zyJUM07*qoM6N<$g8D^~ A9{>OV literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8850f7367b43a9f7e605b371b1426d5bbd1e3423 GIT binary patch literal 657 zcmV;C0&e|@P)jq>!iu3WdU&s&1<4SrO?2=*N)jFlPXy0Qjm}@;q-n zO0mcduq^8rfD2LU%tBSQ*Xy0H)oOoct&xZ!N8~0hQ{)B&LGT2?D26Q4QW05?vim?x zyH_k0uZ%{cw*amkm_Q^@Rh_lAswPBaUrrJE31H1}oYt&$cWXs0up^((Uo;G(0pMQ9 zZ~$Q1CJ4e$=ob-LbsXo@v>C&kilYbswA<~ibUMA6OeU`axG^?7ZKEeG{-cOw9mn}L zQ^*jpH2?rQosOT)W*ffmCjs0Y8gRH~m%i_>0Jt^bu@A%H@P4II`M#)J%ecpj zWmz@=d+(R3`f4y3Jg!!&TZ;^{uoJLXv)O!~$z(1AxQXqzK_!(+J#$@mxQskYW83y= r+qP57&Ot;(L_|bHL_|bHbVB?Cq`0i=X1ozi00000NkvXXu0mjfWUDL7 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c80243b6be0ce80de218423954ab4d1b40db0e GIT binary patch literal 375 zcmV--0f_#IP)^@R9J=WlCeqyK@>&L-K-H}E23oz8w0Rj=KgU4v8y>_dyOU8N06#$@8TZ=F|0!kQWGK2*54YoUR^B|8ecL0Ee zYJEuxnqX6(TQ8E<+ZT=Vysn`F0L-sM<*<<4fjt;O)QKBc!@5R6jL?L~@ zo_pqZ&cobiz!+nUF~%5Uj4{R-V~jEX3kh4GvAwffU=U?LLJCMlkSmvcAmym0MY!!x zjP`{o7J2|p?VVqNgJJ9JiK6mjsnYlTmA#g5B8U-sh{Y6o0D(#`upU8{f1@al_Juip zi0JfAwRIgWaWxKFpSh+G2xy4%4jDNWmR*AGR}=B4A?p4q9@?A9;rX)CwR6B^=9*+_ zU^f&Iz|HdPT;OO+6wUMd3nH;FJNvWZ__4wAb*TeRW-QA_Kf9wKlKpUA=z4JRbt3*T zOxCR;8vwxa%uIT*w`Zv8{ijkvS~HeK6%on(bJ*CDrFmsYD&=Z&eC%74ne+ArZ))$n z4h*n;$O;5G@@#Kjw7>3f#jRK@mX0(edA`CLFLZQ>Ix(PP>*oq88ADKTWP2VJm79KI zq(5I7^L~dnw{09O^fqy6IHeK zM+8m-fe3f}*5(@vcL&yrk*8=p&nxjfue{hfj4{R-V~jDz7-Nhv#+d)aFLe{HCa?(= QQUCw|07*qoM6N<$f=SLd(*OVf literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..eadb0962a570f7723054cfdb3b178de8a0a09146 GIT binary patch literal 367 zcmV-#0g(QQP)w^U`W^T8g;w@0)cFUgfzjB z0)huXArM#$hG*EKFc=)P7{EYxE@GFYA;A7966Q-r%;e6w=iC_x1OkD;e@8_H(P46H zXcc%DSQ$|>glNbZk9zS6lK-i;Q78sYWk#E2ngi%FmY6N7bwvep?sd)JV(Q2P>9@~j{Z=Gh&OpxM(QsSF3EAX~ zY#QWyWxd%ScjH~8Qvaor0f1?w=F-5=b{B9wM-cJc#P#I40c9}wcQTm)@zWdXrKwLWLTah>6>SL4syTeqfyKepbP+tKB^ z8Q^%spo)v=TALuCPLqfq5O*k_Jov87s5QJl1FDwB;)R~B=t*FvVNldzEzMTsZ?=X@ zUPZdfNBp{Z@UZ~^^P_u9`C{U%h~8{bYc=%*X`ClQrn9(w;>+maoadl5#R3vbXDgn?fX2^D#V(IzP^R9vl1>W}J2VBNI!%xd(ayP!XnbONnb-mlnt4 z|0?w?vOD#$d%a^AV~jDz7-Nhv#u#IaF&o4mJ71=UC|Epq00000NkvXXu0mjf?ioJd literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2b22e8d08d7b9bca349be80452b862a580b7bc02 GIT binary patch literal 369 zcmV-%0gnEOP)MBzWE z`~v-q%|=9mQlrsol^TtXT?tD_%)F}^W}ESLRwdq-yyoTP+;iT$;BYt`j{lC>1VPlk zQI!SYLqv5LQ&kZ}YoheJadRHTlxb^rGwLELKz*3u03zQx$8B2ACYYG=7ZpwmcMOn~ z95bN1Ofzl#)E;2W7U22nBz+5)&it3@NnnMtZxe)~&|&wK@?_*D)75Nvgp@yt0e zn_u;fVf8WDxTxwiQUHLtsME+Wx4@levhY4>U61PZ3smywcQ_ml$KT}>vd&n9NM!|a P00000NkvXXu0mjfP?4LO literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..269a0cbee85fb536ee632e6d2c3c49e8dcf615ba GIT binary patch literal 661 zcmV;G0&4wTfp%j!T%6@$@c&@(G;*5K$Z@Pf-dRp%+2`Tq~tQq89;L;ckYz{)oJbTI5~npb@hcfHd=H4hLAst`cs z<(j)OezG+1eK-l6YgiT(L3X$jgqF<fEHB6w}` zG&QfP%j?yF>#R<>LFWwh5jHws98=X*V4z`J1+5=~;`}}P^+!eI+UIO)IjoGKKf_1o zil@+t`rNAdUn(-ao=ug)%ooW^%x&r>Wct1Hh_#>l8s@1Y0&yr4J@`Wa=KNN$08qUGG|4Il@&z^16)T0i{uQq;}&-r|$^ v(V4q_y^djwF~%5Uj4{R-V~jDz>=J(fSTn4(pLU~*00000NkvXXu0mjf*SZn4u59cxbAs|-P77dQj5&9K4>zMUO&{9r u_6?R3@-D*Nj^+SviRjE2a~-JWAJIF(Ds=KIT)3P700002Ib literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..35f2ade589b637924fe1ba6885fa1a8ab7cf89f5 GIT binary patch literal 825 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXc1_q|r zo-U3d6?5LsHq5{5AklVzx7Eoz3r_`HF>PvH=reIU6SrvemBtV9GbX)aTN83fB~bhy zqf_jvoY372ix0bqw=GyBDtn4yvvBe825C!i^<1gr@lNkfPI$eplZ!G#}h> zYQt?2%f95VRePT^e47%~&yd4(;_TI&sv3srJsa0E^liTR#&c~LciyiHy^JARQ`P5u zE@ybBt}s(gR`coVw9P*=gD&1`$zBt+mh0TlY6j`fRZ9=ECBIpkd)xN>=Ub1vj$O>?G|4f_S*l_vdsZnQ?GHg z9tsm+InN-&5YZnuJ;<(ix2zjefz0twwg08t-v2y5=kuo5yTU!Y&oe8!#CcV+JSa@r zHTm>YxmWyd>*_6PZt;tqm-sEpaF1UU75kKf^~%ntGqHknzVw$CV+ouK4e{aAe2tD&H7}=@%Ur2HfxhJM!2K{=I1`4IA#)Iozn; zJ>|>qzp=TmVnALwe(Q$=$3*`#TBjkB*JFzul@N>a&k!cQea+S@O1TaS?83{1OU>qfeQct literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..512b0a3e4c761822a62859d3eed96b14f574d0d3 GIT binary patch literal 467 zcmV;^0WAKBP){y%|5A(0corT_4Ei=P>zuR57S>V5m zeg;{qDpp$24W7pI zv2KsO&|+NjHxvSd03kpK5CVh%A;83WVAB75T6uS%1GocZP-f{&F7B?VJqWHW3<943kb>A!xnU0z3&CB^ zfrm-Nn|*zGzFAyat}-J55_14%{PCqWm}`Rgpw%d!`_uEU=o8VUgC_z4p4I>W002ov JPDHLkV1ml)#h(BG literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..557383ec8893331617861d4c6c0e2cbf7c097909 GIT binary patch literal 845 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXc1_q}8 zo-U3d6?5LscJ!8ZlxVwub4`cT z<^)NH#TR*u9;vxr%($|qW1>ZaDuW<{FvGjAL2H<^82lLDFh}qPnQq>^IXS-k!d6C? zHLaEHN2&$nDivO;vmRbB{rAq^wPmi2X30radefAI zh6bKySoSN%IhXT7# z*+-pAmv3ZxuyXZofhDhme;&*@!5)6Z<4)}-mOq=?U!8w{>Ll}lIK5ywBPLIV^mXr! zPdC0PI*aMR(U9-_iY~tria#$u-e;SxKV5UOL)5FdNv}f~UGDJS7K_wB`e#X^^y{GO zJu!>95)R$vXm9J^JLQvb>+jl~ZlVXKn(wKrzIC6iwfgey)mjaWhu(Z+2Kx0$tH<)1 z+vo1R`0k_4_K)iVV*z);V&(^858T)f=pN|hYlv=;mSxz^U~a{b$Cy{baEIy63x*x6 zJ1!ETuw<{@g4_R}@09$Z?I7xK_AW4_-d+>_Zp!t27SM?guH3cIneShv`Ba_jyD-R! z`*tVJ68Ri-%AaZ3W{uLPPo+W`R)|UL{<()~`yC9BrM=!k-ecY-LYFzYo?X=UA9d-eO;_sdqy9BH5>Gx~WPe1+tNj`T* zLxacD?bq+GIu_+uxb#u~-H$5^cpI)7Z@%a36ri<#Zte9|3*O4a1LNG!rsBs`k24S6 zy_MFIU{n1(-`sAS_N$cJcX;%|V!uD$wo^F9r_}tO+474SY_sk8qMw~gwyQV_%pVM% Lu6{1-oD!M<{%?q| literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..0b90412f291b3685038d2a4dfb5d2a1fa1db9322 GIT binary patch literal 441 zcmV;q0Y?6bP)(c1vXwO+0S`~=`bK$Qhk_w%ms z9*1k@et4QxQYJ_nK!z1x>zhdEBEd-&5E4*j<`g?|7;6Ow>Db-43b>lQ&l|Q$Fz2!p3egJ|87uU5%>8pM=3zm5uOKhnPm2JJsA*NI3eCLDaUCF z!cV}8T*Y!jkhbj&$e&x?l^*UOr5hvLO8I3HdH|qUk*jl2gNcjdJq8EnDaO jdj6Lh1JsWi&5XVQeF1vToxTwd00000NkvXXu0mjf%V)BM literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7aee03cbb25cd4cc527b066a318c9c82e9783d0c GIT binary patch literal 823 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXc1_q{= zo-U3d6?5LsHuR1T6gmF?`OgI+vmAxbCR_~E>gD^z>b14|(S?J2U!7T2HA_l~bhV~= zEU#k}H}2AlD$tx;a-rd9;6+8li;B*iOWv2PnDV^#`_&nHzWe38%isNcUd#Qz&!0Z+ z{LaMIym0oyWxF<2m)T64q5MIbVKM_7qYYQ^8rD|~dJJ!jGZsg!&PjUe`gooAT}g-d zbr!jX^=uC#1*QoWy=k}<-o5f}y=mk=<1<(0Tc3$|FqeHt1%t%a1J)n?kER;@uDf7c zC;WHgbxF2bj^nyk9Une@{C@h^`Mdh}w|w4}1Tw6#e99+N<9oLsyuI|{q~x>b^{jcf z`C6U)Kb54cV4S6RNUI_4`xfS^rN6Bzm`}XB*{S|f`RS(rSvR)?_$~Kp>~25cuy00* z)E>TsQ=xY2uB>|es`p|sf5&m5;!}^-SIxL@H{~d^gXLVUNHblA9c5G9A8$M|=hkb^ z2hWzj(?4@!+O%V*4`#P{0~H8ryk565oB7LrrpfObdGGPv&^6L2+cxD=%X0V6yBxnS zFsUgLTM{xQ>rliy8F+r;;ya#`hWaRu}yd1NvjmO%d~i`4iP&(>v#3B z_I3N2d>Aeg?{U8N=B)btM`b^ye-*d?KibI2kg&|B zRCDXH*`I6qcGQ?}JLWUGOX{c?}PK} oUi;aYmGeD#V0Zi(51VuOXX)6q2in@tfFT70p00i_>zopr0R9euDF6Tf literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4c869b79028b02d7e08abe9b56be8c1828256d GIT binary patch literal 418 zcmV;T0bTxyP)Koo$#SD-ssSl}v>XuJT%BOr#xB`bqxsEG?% zLsH}nT)@NxuELLrx+|g2g&oo;KZ~|*?6;b{nauk-GfCfr|Bn0&)I0uJDBJ@Lpq5ge z1u(S~Z$50l?iHwZ{5yn)U1BK_0=?y+{rF3ub~`%PP+x#|Rqd|XOg@J0TN+s_oxw?o zLQ_QgK*drn%t;i@A`P_%h^ls1!<%s$i4D<*j2+h(fl+kDR{&OQT?1gvW|C&|I6)w0 z?^6?t3)Et^neh31y^4l)6D#gnyQS*-nk4CR&_4K}twWQ4K`xLBD{#7|%W-vwk=$;z#f6AkCP1f~Eb3eBtpY+KFVGZWihfu(q%a48~v$Mq!$WD=|4 z5>alA9NX5Wz!MN!if86_H6|X}JNtAV#jCVS zLW+ru;?4;x)pYs<7BjE&cyYl?(dSaYFN+%ozP_{7czf4&ZLR(7-+SJh&i`J0eRuY+ zeGP7lGgDWr3hew^5S~`u;^5D~!_>jJX zQns{gb7kQ7>uy=Q_qF-^8~Htb)eb=4uuPqNpTD(t`B|e%h7(KGHna5|XONjACi(a2 z&d>)O3;wLIw(irMSZhD;v-1`IqLn9g1l8A={=UQTH8|nIEe_$em2bo(*xJK#mogrg zI9h0!tz3O$-{Ykr6EyDR-#EU4X+_Q9>@BWa*&d3*wSEP#gNIES;BCM>Cy{^C9F#>GJ0@( zEG9zX%IaE&z5ma9U;Y%{pw-~ynq6|U)H3(*;}ZQF?JJm0L`YxkTO6l9x5?$@sEps8reQO zRKGEiiD8D|`SZSKR{e^(&s?|sSo%!C@BZ2XGY$s-+?k$#hb?4#X4eZ{iNE)D{q&hS zds)^^GxLV})$61SZ{N{tID0y0_T>zdwP)kY>>lY%3VP%L%nuBnu6{1-oD!M<`tNz^ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png new file mode 100644 index 0000000000000000000000000000000000000000..c21ab99bfb937bf60816e33ed71c4778169885a9 GIT binary patch literal 581 zcmV-L0=oT)P)T&6n^0%gls) z1Kf6TJP-uIBN5R6)&Z>4YKx^G1`AI}Bl~UW*+F=~W=XJPuyWIz#=WRIW_DS9&`8Z#Rr4b3a2Y^bcZDY() z9mct`7dg^e6TsVSi=P63D&(yLfVFm5r+HCIsl4{uC{~zXDbUVE#+Yx}@Zn7W3(=C3HHSyT0#7B%g`M{fc$J12|06R1XG&A2R{?zHb2Rh)6|m06-JKPNUKI3EF49g4+Xd23$9g^D+y9 zU^yF}-UM(A0G{V<%nQIdm)AbYW5upG5|Jm)xqYoQl~Th(4>yy7AXv`K-vDqVqml1e z;;x89nBUoO0QSN#e4Ph=yBQ@(@}=Ewf53Hz+(do1qf-DMNxlff@O@1+{}KHHS{a;V Ts6Y(Q00000NkvXXu0mjfz_A2x literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc29cee62b018ee488fdd4be201a13e61003431 GIT binary patch literal 1081 zcmV-91jhS`P)q$gGRCt{2o6Tz!Nf^eTYJ0lpYCv*O14~#(y?BU-hQ6tLS@AZT z!)C#Y$DnvfLkDbHu#=ey3z9#;54>b^6TP^5l8&bpc2|fDB8Vsw5AkZxN4*}>hMu0D zab~J!D%tc8=FnB|y#3TO)m=436_AmUv7ceR1i7xO*J`!P0A`5jG=ReZ%%LjlpAf(Y z#@OEgRt>{=dtdsl0rT_o7d1`01K@-Nk)vdTbAG*CF8|pr=s=e`X4|%-Y1%yi zhonjy4Tl(Gzgd=53xZ(1Q&2|(Y}n3a2#ixbN&#(g;?>1X_}{!FGel-<>+m{(|E?%R-@7Qb+0rY0DRxy)HH1t z+r9Q1C!@Bt&}IODnfL_}xy#GTpCoG>I==635|NuIo=L{F84!*0JLtOpM6$M#k;~;C zCyJ($F=;*EaQvcLt-g~fYLq0k6VZ`mOqu~LGrZmQw(o}&?QOHyGz0b(nE|Q=s3tQ& zwE)#*2B;RGn#=&z0#u{RN))Xd-XNkY0DeG^>y3Rt0Nygj?iz;idoSyKy&$Cr*tR_p zhT$_JDq;JtbROH&PMM!Pfa63|3d8W(!otE)8QO&na9vktjI9DVCqYlIoNG3le-w+w zZflx7A#6YxhSva`70ojMXD25ouZt#;@d#X%kVDzMWf<_IgdBr%Of-QE15^&B!XwST zp9f?Hs1~3a83vGq9LkVkz#9oU27)mrd~aa`i0Hm(jzQs^-xJLtY(PGrF9Y~jG*7<} z(Ld3>g%CEt^SoNK*(?HhDVnPfUUJTV@jS04nn=nhP^na2o2GdNz#@Q;GIDm{BY;KI zG|yBjmDe&7N?Q-`Jnstt2Y@p-H)oEGjY(Y(*xK5nm6erHW==q&0da;QbXa5)A=Ls@ zlNq2|fNC-WR0~i|W`Jq|s!21TWfCJ}?Ohcq+S?{*X$E|VUla<337MisNm4sw?0qt( z&46gX{SMLI+dWCWUcZzmdXbDt>jA5Y>syZFj7w8BA{@sVXN-A?;$+*}4KNJj5r9{* zqJy0ChkMC{*kCTrT%`H*c4(*Xx&}Uw*Ld^56I$9hd+BXK86^ zF|DHG5VyX*9$1zY0ysZ3S;L2j$SIXdrA`4|$M_%!g6Zk$=Zvu_?7eeC8=Ujma=HAV zTTtJ}<^W7ZyRLWLvAJlRe}O)Z&1Ga{>~FpTm~Kgr%6Yec00000NkvXXu0mjf#M1F{ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3c21492392589bfb8659d78d33356404e8e36a GIT binary patch literal 614 zcmV-s0-61ZP)3zAtjc0@g(#MluA_;+t@=12|_=B zpx{9~vUhM@I- z8s@!u|KIM+?9RY(m;BywK9Rg^RWgWN1mYq2?4r75M00PS7he7mVDwt*zA6t}frTV1 z%G|b_f7AppI+4DjqA!3w6`dJyD*58t+Ltg~FHKFIE|nuGQCR?@27A?e6MbHiV&_0a zMQ7e^tgeJ%?5Xx3D?O!h|)B&Wy?Q3it)RoEBN<^6umd?*wSIs%B6%mZNd zD4#}w7%H=aB`UzZ!*YG6K;h;Qynm5JZu#Z-0tm#~1qd>>=ZnxEK-g=yxFTOW1`uVr zT>yjn{?vQ{PLxh&fJKFGL5*vjp0S7wm%L1h5O$17x?%#wMqSsx8@R22kAsD3v3rZUK~SxmsK8Yp<`q z3yf&aB56@s7)hkXF;4#H8Ll&pO->J$Z8;_AW562GoEK|#G0D-rwb67ji8Mw(eSH7w z?787}RpN+=0jI+8l^s+!jOgucclAj)HUAa;0Jhk&K=5S;`~Uy|07*qoM6N<$f0R;w2oi7seM zJVg&%!HZ|bV-8ysq;wAp`xmUcc}xJJj$^v9U# zE`WVfrL~5A%ygxrJG7e3EIh0hRMmiEXZm9R?leVOYYBIBhl<(E!nE5(*H@r7eBqpB z(S)P=9f*D^m1ry!Y=0S#$4%){1&BtYzGu0WE?wt-Fy98S*M42o_y@Pwp~3*eF!a3U zf9!bY|8CQKgENzfoP6o>=?h1KYnFKrz*$>$I>3da&W=%Y-kc|Y#QyLMye+k@{kUBo z9sp)06S+3cHwfUJt@_CNNVb6r15h67zCc7nk0&NxOV-$QW+oFkCJZ^MFFWJh4Cu8N zN+lYTDXf*4B`xWw>T$-n8PI7jgo5oaWr}JgF534yW84hbFvHtwy?rCNXs?*Px*4#e z@C;BbKsBBLss*UVGeETf)p!P|7N8nkR-*E{;hviyz6wS+>RfMZ00xi&=(hlW_@$op zzIu@I3+OpJ(3OXO3gD6TztZg}PdjCP+5vnA@JJs1spF?F9+073*Z{*YbT%;x!YLVo z>Vj~}^qGG~qtRMxnsp&;zB%Wi_ zZ66lRAfpphIg|>IG&_DC;2EG=fNEqIz!GvOLxus*CFD@nwuE^A|1O$CpzXV&IfM-; ze&hccz`vq-8ij!Q^|pl&HXt33uUaNWL3kpXt8NHSOp`990M!Ci<7U8y*_Mp8cU8D(ub4@? z8Su(pc$Qn~k}0Z{xM*K?#<&?UYcJ?J_sbO3N_@IC;Ha8&#<&?Ux}n5;yDuCGO4QX7 z`ofVQF>X1kN1bsM1_Zc}0O6^vYVVq5-rG(l*fvYscZ{b4Tu3-$8`>_> zCS_P9x+o7w%@s-w5IXk+&}mKs1>xCV{<(y@4DWK$L5w%9_s2oHs|5tv9tLE XL!w5%9m2vM00000NkvXXu0mjf&({ST literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..13ca4a7a408900197b7ef4ba8ecd61590ca2ab5e GIT binary patch literal 576 zcmV-G0>Ax)@f11p^egEIi zzRAvm%Pu)TkzL$;V2!${&LB)C;-c&zvSzG!)#B8b3juDGz7;#sOEJ*QZVY<`? zF!}!LL&bas4iw3s7^xi2Pwge)I`Lui=BU-2pk-jfSo0{{iIFf!xmE-fMe@6a>6Ijm zLj^Cgk|}M7sC=?UUEnEzX+^2d0Gt@9Bx!zDe!~fJ>%DO96d)+Lq_(}2e!afC8w|7U z07KFhz|a9kq5^K0zo+*7-yZNx&>J!H9xAe&cCNcW@^>120o45ZJAt{F#-Y-J&eagQ@Y5CKx7SI)M{=}08Yvea?5%+*E$8pif4^J5wx5sZHV7+DrfF+eQA7Q zE90d6oTz*Rtg+&SYn>VskHOW(#f?d*R%_P0I%m(X_oyn!dZ*UxN`C>C6Q#_Cf9+NP O0000}b0K^TVLZ?hnRTg1KO3ME1CH{=W^8nDK zfd|c7))g?9{Gw}0Rn!^BQVhCQ8Ew^r2>aK+%Fq0Ke*a})eNb>?uXRuZ4|>8sm~mAH zKg%_~pFmgFoOHD!WV1E#&pR55puEE=VfOpNAjN>%>u(!$-Fd=5 zhxBeQW+wqR>J0Pf+->W`^o7J1(S+i!Kzc~mb*G`IE}kuV7I8SxzIo-Jb**d`&za@j7LK!yP-r&8e|cg?Q@A_G(l zP>l=&SV9hE$S~legdEDAEo=Y*k3@3_Jo}+&4q*fG1??t)QPDi*!>{L`Erj?hkZGPJ zXYM!ymT<0+Fkq46bRp9`E1FBnERet4I&Ktec!)PT2bS;yrGl-AgJx{{B}JER?%|K^u@Tz;Oq-qHW!!UO;?Q_8-S z=n1MTxemx**xkcSsmjT!3e3P2`(pF;QVqggngaI$Xp$?) k`wC#BoNIFt5fN*f-|6%;oEhcX%K!iX07*qoM6N<$f|3#L!~g&Q literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..12f83ceba33b1a48a2d28ebd02e8cf0a36dcab75 GIT binary patch literal 563 zcmV-30?hr1P)gz_*Cp=llS9AMIFl+gACGjBv#judRAWJP4Tcj^v+SO2m``2@w0 z!hfqSi=md#B1-ns01@t;_#%t|pocN)_hJJmPW!UyiiG~uLIKilx{Bx;a56&n38HIh zH(d=ghHk^p@1J}FmRMbV0S_atnN35jW}-Ml0nSyc8HiSN6#Wmo;0gik!LI}4xWe3p zR&F@#1_5jX%rI3L7eFedw)T#lJKqJ4;u+zQh}3iCru6&L@txsf$z5pWQYkG6d;pB2 zc=lRQW8yKswQ+G{V&!Yi=J1_fW2y`61hr<@`U%JamVQIIcQpV2002ovPDHLkV1h|* B{K5bL literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff4f662985b4387f88e349b14dd13f0cf98d688 GIT binary patch literal 1087 zcmV-F1i<@=P)B8ZQuQ7*=4j2w-R3x*qb z(5Q{Yn~!*-2OCTb>cRN9NGJjc7vN$HUeJWZc!c;$@SrBt(3nz-7!&1D`gx$@c6X~w zXW9YTU&3L&nf>-Z|L*P#lNrFp#bq@^j#`C=^s?w!J%LUD*bkr*z}kEY%YhjHQ2@gX z?oCu~d5o4r$$wq+PXjgtI*)3gy8w1e5Lq|~qbcUglVShUzctgcS21}5-9ZgBh?UlP z0ASQ;puw_pUCjVz{h>YCD!hShK?YyXkGjG^gv0ChzMlE{^3e<1db?oyu^%*rzcSNR zo#;vIThS-f;%fj(jnygeF}v5nYCvd6FONpvAoH<*reW^X zM7Sv?TX#OF2(bey z_6(Rp`z&p2uB$W_V&95B$rM#cY_wOI+t?Y9Im26SU;CwC)oz)+{$(PxI&ck8EkHG{ z0jdS4#x+2-0M)n#s1~3aU0SBlkX|+(xk7}q0Jg&EdZTj~z!)<+6IGjUJ6Z2@f|Mtq z^n7=E9-QVk5e70%@l2Hui~8`0l5E1FBnC=hS+zb{Vm0V1>l z_$(u57CsZ9wK&NK;%)x-G7?H#4;bt6PXh=72yVY{Z*B5>vDEbdz4$wSxPNg50OB(9 zO3by$Z=ovzcOs-(fNER=R0~jzYk+D2s&NfaEkHGP24qfRB&@wF!>ZjfL9;U;YApCl zrmJOYDkL`A$IWf*3>Y>RlFW57MHP}1%^x>~M$Bz21~9nSSSI3Y6@hl2WNmq;BGB$* zrWRw&+&93+fJEh%#{k|LLZvCJ=~+o87&c4)*)dKSP4_K>C2f}{;*iFkf#tkiK1K7# z)4zO<+vU@E1Kt0{fe8R$MljKFw$-jK>pUPHKHbWUVE$wk1ZHq^qT|esYz>?pnj*Rb zMvYu;dB)+Psa%fD?Zd*Z>*aWCZXCeKQjX2JxVWrtegQ6dG>^RSEz0#3jQH~}Z%R|`oypz{lv0kEw;PFu3f%)%&&dQBxC{~elH zb|D~X3ABCRUpFB!olb9#ZF#FK%T-nXGMFSu@&r5p2O#I8fvkf72!R&Y29t_7jt8FS rjgPH!_k90{Y|Shy%W`!-nmOJ9Bb0qej2bl$00000NkvXXu0mjfpE{@* literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3732d5406e03dfd7c53be3be83911975cb8f6eb1 GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXc1_q{g zo-U3d6?5LsKInHPK&0(|@GVhmEy05KY{%6nY!~QJIh5C-wxCEy(o=4i3(rxpQ83 zdB=Sq3ex1`*JGO2ujhgjDC}V5X zX3t47j5{W`?JAVHf4*K~?Vs+x$2yL`9~gcn1J@H~T()rGoiv(7#X;ymQm z6!eO7%eg{^-#_QrF)z}%#k}A|6iM`*z1oi%*vbYg>IKW{_$Vvv1h>4`1YB3_x%UoSGIdf Q0mdKI;Vst01fDMYXATM literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e30c690acb0ddf121384460874a589af06757a GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!J0|TRp zr;B4qMC;q@8~qLiNVGltZZ6_>s_FWLRu_*~To*%>j!8ezdZoj+>2PQP=aCyTHk4mz zS^E8elk7&7;|q1owpz?EcR?pX1ZKYufHZ5yo=pEJ#tioVoG`i*dhT0lR}dgLX{j{~o4*q=e}m*QSKVX+9}ZKdWYH-0|JO;JVYamp=-Q70&Sr*mTiI z?VZ;i<_~|)YjmCYA;rwM`p8vnv0w2=W+a6wIJW#w;He0@d}k^{gE&V7XQOt4fvuJ6 z1O9mz{F%;MMN7vw*$Ek*@JpX>kimGMH)?|8`Lb=-?0>PnZUnhE)N0@3n)Ck^mQM1k z`>bGcQZa$w{!Qv>EruO0+q_mSF7p1L*z;0YS9E^EbN2oN>u;^CU?})Bn?0fGE$7$B z)a)4f=f({)kH6AyS+x7j?MeB!U(a{cxOQ*mik*z_EZ?7Vkh^&QbA9t&DFz0XJJ;BM z@Eo`~f6lFz#S>b#@~myEvz1SA_?yvlE3jO0i&V|=x(STexsn^UFl6>HUSe8e$mYR4 z;h2Piu7eac1e);$3hObc@2wK+*Rr|JSy>mF)<>027{r#~5 zl9Q}r=6}8^ZCf5J$d#$t|MBb6{r>l&|MCB;R@wjH$L4ijZ^NeYB}~5}+$qqZ_W0`E zudh81?A$NGb%$B{g22@CL9blTJH#w#H2U*log8<=>5qGsckW@xpO#hsa%=d~Da$i^ zpZVz+vF2r|?EUL`Ws|HHb3(AI<$+7t>vgW$ZRp*|_WLW(hTX-yt2OLh7#1#=%fzt3 zd-vz}i(DK&OFZyTVqi;vp#qMMvdh^=1#=Q&89D?ScC5X4XXPsEzuQ-P1h8Znu}N(_ zv4yMU^PhWO$3N|IwK-YEZywtt=Fh=@K#b!u+}4TffXl^LJIR?H1@!6MDZ&VcOr@^~Vf;Jy6KA_-CYcbna(6 z#}8}1ZGOP{l)Ys?s{!Ycy#_2Y0ah9{8V<{h6eLQ&M?IW;{_(n&8`=wM^~{x~=r?-q zRyp?fpq&dooIADk;J z+#ohjSnxr^Y6h+9=FA-x&lg`W+3xhJb|LeGR)_G5hHLZ}m|WfN|FC4K^8_RIFL!e4 zc4+3Y2Lb6BNuLCkXx%+DbBEBZAFNZq->K&d?-uwVbAs()(BijBst-6+au58Q)ztav z#U%TSzm@Xt7uOu^;Q0IWtYP_jQAbXu6ppmM{Tm)CNPO-tI=R2ppzhYP_rF|&KmSyB zs%(FzJxeRdqWI&Yl?;+Jm9)6O>DUXat-Yy@KU*kw zIq>mMg$GN1UJ!oB6~UzVBHHY45zmhUf*$X`zI&v`YLR{KddL&bibAescCuz^H>cDe zdCiiyrSJHGor1x)=d|4Xm$-ym=d%X;3_fY&ay2t@mcCse vm3hV2?fIvF-{sTRy*MJ6zTv;g=1TTwra5{qZyWCihBAYvtDnm{r-UW|Cey0* literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ad7c72fe0129143f468e67175a73579c893c7c GIT binary patch literal 861 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXc1_ow+ zPZ!6KiaBp*pZ5!P6gjrvnAPjhr0&*T<;`C?pXjnEdqz(Z>rh+ZUBMLF-1*0NirGb$ z3ho*vF74|gvty>IguIjy|9klDmuX5x)p>{igk7FloWJjL>9cdsWDX>4v`KrR=eRMY z&c*#JPjejO9~lRk0}dN5{hOK1pxWTaQL{oTYk!PKY+3b+ZbqNQGi$m!?3rd%NX)f; zJg0GL_uLXjg?A!XZZ@=@b!>0Hc5sVC$DTOHJuff4SIyD=_c8k2hTfSnd%sH_a5}9M zpz?rSV!wx@{f-;|8%#ww9`o!`Q7GK((9PHOpy~dvw=DN%4Q8EP%5mc}ORT}?O}|Uu z{m#9uDPv$c^NzGqRC2-=OYSB5WzRmPmCR-YI(UiHRr|u?XR#|zaF=UW%FTJvemqjc z$059*(c+Bl_vi1p{W70NM0)?s&~oNi-)nLw{?z!B{?Du<+tOsFiE<5(!ydzg085U@y-Q5l z>$2AUmb|b>>TucByX?yC+p_PUZ*Xrlb%<&(xyF#mcqxK;39Cmk?*uW0UTO%|vBj9P zt@(XlLAgD<_^$rJpk#*!5dw> zB!91GqQvQE=}bZ57Uyc-ZQWip$3uRGVJ_Q>u3PLE*6^l%_%-=W*?rm8jXUoa8mz5c z=JiVJ(%pt4#nO`py1vIsHM^>Bw!STYyz%78H|IVv$TCZ0pJQ5Gr)wfBlvMPrIQ~qY zAX``0&ko0@8$u^;YEvrk5%%3`;&bIjLHVWke_qYAF6j~2y=CW<1dcdi4iAGsCI*Wf z)hjFpC*I57EeK8B8GNz)`?8g9;wCltzu3QQr4aM#@AWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNQT>E=U)k3)21RpJh4PJd%48X!1Rk<{TbF5DteGD^~0|g!!@C>GY`iyW{mLQwXR9 zjuawUp;Cior+G8=rW1YKL<346a~6o?i6 z?{azNxS!7yQSaX@eYYe*y&Lw~I5fO96fyKs5_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNJl_8_?B`8_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00FK^L_t(|+U=W3lEWYj zMI&9@_Q}(`u2cpl>3<1~)?G61A!s1*ckDcfFZ2UV}LO?5Uq!7sp&5|Lr zfTKjnjPRZkWJYjL5i&cxRf5b8ZWSRb!H-Cg)!=(2=w1ph*!w+IAXfO}IR0~7*F_Qa z`pw#RYZBDEVegGY!&^fUrH_&@lDEd7sB!Nt!IH1UVjcpe@#iI>l*c;nh*$5U8tIw$ z+l1&g2_h;1+4GS90-h2W@Lz|3$D+sDcqIJ$Fn}zDEtSCPdH7ynL;@Qgz8UI~5CQ)& z2cR}RH8?i>>pVc&4v)?WjLjA8JfIhbwX>uih_phn;OPQd;F$0s0xau*=>@dHF(qg= zc(w$MhG(27gbHYZkCXt}4UYCaV^Kue4UWP@RDxz2^AQp>6MTdOw?k3H81~KwJrqSu zV2n!8tne%eQYe>aG`#0`e*H)qaweD|UsZtR<`t^3qj^g#n!V@I`OOz3vPZ3w_Z69r zWc!xbim@+B4kW+tRoToUXqTlkN(i|wpGAW8(Zqf-18CSiA59@;O!aKeLkRQXw z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac(A-+!@lDKp{;}7sn8e>&XcR z7pulY;Wn^IBG(*7A%~?b^VC!N=hHC=sm-IdEdjT~uc)I$ztaD0e F0ssj2CNKa1 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/down_arrow_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/down_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5805d9842bb3c8bdf9ae741ebabc690a4929585a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAyZcdU741BJ9aT^vI=t|uoP zVCdoDDYjGKUczBuWT3#kjKjddz-flSK@mm~;ef4+85xf4WSF7(8A5T-G@y GGywodVJqnX literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/left_arrow_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/left_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b9af8a34edb5f8dd767bf6afa303b89a31d38f GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9tFm17;+ETtxolgQAz};<_Hrvc VWXkuQ^;aGw;_2$=vd$@?2>_|BBxwKu literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..204df80580df26847c6df00f5402f896bb859f95 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP*B^` z#W5tJ_3b%BMg|3*BL~DhEnf80+bTSke8-~_%HR<3-qPH1!=yrn2i*J|dW;9Nq~ACJ PwJ~_Q`njxgN@xNA$rB*z literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a4713c565e3f5fbcaa63a5027ec1912a6dcf59e0 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcprEa% zi(^Q|oVOPOIT;iLSPx$IF#B-(U*#T=PY!89I?=2^B|vcC|FK)omnlz5vr;(QPy!KS aVAylLOrP=Sj1{lzK_Z^6elF{r5}E+!%PDUF literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..ecda0c10ba2010abf01e6cc162e1043cf18c65c3 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP*BU$ z#W5tJ_3b%FMg|3*BO7>mPt3F8Y3zACQ6ghCL&Ju9#d$>us*f2Ch|BThGnKY=?2iNL OV(@hJb6Mw<&;$V2!y;G! literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..84397efdbf1d459f1197b6d01560fbcd9ff1804f GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcprDPX zi(^Q|oVOPkIT;iLSPow2Ic7Gu^^ZuAf-&c`wM;-2K=7bG`EBuKK~H1Z326>i5HSXZ Yd)cK$OqF#h>P8?DPgg&ebxsLQ0QW&7(*OVf literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5d864caba51c7871a04cd61cf15b812c131e59 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP*BU$ z#W5tJ_3b%FMg|3*BO7>mJ?0q9Y3g}AQ6ghCL&Ju9#d$>us*f2Ch|6*5F-f~baLxki OV(@hJb6Mw<&;$U!IUv*k literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..140552e4ffc02474a252e75fbca7f9a6dd569cf8 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcprDPX zi(^Q|oVOPkIT;iLSPow2aWk3W`&Xn$!I*Q}S|*?hAb3!p{I>YApr^6ygfs^$h!_LI Zz3kErO!8~?>Hh$Uc)I$ztaD0e0sz``Bu@YU literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a564e4471cbd1e971effea7ecce225df366765 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(EF z#W5tJ_3gQhf(!;cOos8x(yFUDf?icyoE1^MsdBq!Pud@4pgJVb!0dI6mG_Y1V-t{| Mr>mdKI;Vst0KnWK1^@s6 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbf71fc728383bfe909fc7fca4e9cedbf5cfbb4 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx_cu z7srr_Id3m)6l`!1IP5TQ)%up#QbAS`Oq#_hz2{nI%zVDP{5wZ~^qha4Oc{*6j9VI( zF+@28Gw3eRY!JI3;=rB3wSd)x^#ao@nn~-&Ok`=;=2pfIbT5OatDnm{r-UW|i`+@r literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc7e6d932811db33945680c2004e1387f652471 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(8D z#W5tJ_3b%BK?Vm7X2)l$4;!TZS5*iGy!(1G=g6Wp^VZBed;E5fJ`+$e68K^Kl6mL- Re5M^BF;7=Nmvv4FO#lqdCi4IQ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..adc6446c97432f5e14e9f2f17d586c81a0d8e20d GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXckesKB zV@SoEw-*dW8w?nZ1avL2N^sLR=GzbwCR5Xvvis#HBeNqm=f2)OU(5S&WA|nIKnC3f znhjzXL>#y?xE8RQuwG!A#gxJ5%ebXs8AFsqFs-DYu?Bu*X)u29{|wO844$rjF6*2U FngBP>P22zg literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..0037f175ad42495f04464466046beb7f86c6923e GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(8D z#W5tJ_3b%BK?Va37DqLy3B6W4f`S3>zW(1V*uAN0QOtY9W7=0PHG%RC?atLP7U7*<@c7bNnm5i~5EDZwfCXay5X7F_Nb6Mw< G&;$T*1WHx_ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2d085652788ae38ea1e8a409e4e43b5a8dbfa413 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(8D z#W5tJ_3b%BK?Va37DqLy2^|J=gaiZLef_^#uzOS0rYbY}eB*r_K($EV0duSdOKwd~ Q`W29%r>mdKI;Vst04}Q`-v9sr literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..803708fb4598eead78037f7165fe6d8bf4d2194c GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXckesKB zV@SoEw-*dW8w?nZ1a!4=r8tN&GkpvQlc{M-+5Pg9k=YTO_h0XxFXef-vHP-pAcO7# z%?7axA`aXcTnkuDST8WmV#;9jW!%!Rj3LS)m{!uySi>i>G@SjTI1%V-22WQ%mvv4F FO#t;YOwRxS literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1fd6ca696b356802c84099e109975853cbe1b7 GIT binary patch literal 1224 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 URTF31YybcN07*qoM6N<$f+#`}aR2}S literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..27788530d1c2ff6d0bd38cca1b220b4296dcd7eb GIT binary patch literal 1325 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 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8e8bc9a7c6d5190f40ec7dc0561d7b27ee0e54 GIT binary patch literal 1293 zcmV+o1@iidP)E+CA+N|*%1kQfrKFmZtiD2W8Flt37Cg8Rk8!q8mD^Dt`G-0w&a-d(3ua?**2|OdUY8!f{*Wsx_*o z<9_!TlQsIELMviVR?Ey4Wf4dT0Ln2dOP1gMr2N*f1r&JwQ#4|ZAUq3npm>7ao!?P6 zD?I3sJZd@PeD8s521*gGTUZNkSGg}{EMTJ7S89x$0d)`#o2)S(cCDFucTnOKOlfQz zbtm+2kHB)^zKD4xQ1yJvkOJ}=+j6bY!(V|iMRs-GbFZaN%y7u#P?h{0{#p^;0<>eh zW(Gek>qrc7rS`Ex4|ao;fi$Nh&ueHcwp3T3%tx367~mShQ7qT~BmxobRIPU!{H35P zh=dQKItLL=I|Gilbp}Syq68w5(9}D%GyaY{J!<9W_}7c*7r^KN#(ZB?J`1dKf1OBz z$Di$tGZ%qrB2)&drXPzBIH|kQtx@5!DV5yGX+02|%7MrM#;WKpr@^-e)xN>ixkHM4 z9;Ki@(H9rs?7aLq@CMKoxF`FPW@cRLMuZOrAx?k-vbvzbw`}07Awpj0Z(8p=%=+ zfL>2*1w%cB017vIFSx$Zsr4s-r973C0**04C{|KmmzYujLE3w5eF8*J#hmj}l6*t- zx*aY;E;aiT4WedlEbGbs0>a_uD4|rc?_B)Yb**z>Mra&1y~vhZ)fIgwN>vmV0*JAi z`UwcGfAJ=864c4>&RUU}E0`0iK{Hrh3 zTmE+Hb39@DMYl_2wZeR064A^5nj$|+#Ow{OulPM>I>g!0x))&;a4J|;K6_9Bu{!WK zU>b@y*j-*dU_o-|Q1qNHSrSR>SC#yR)@p%mz)d3ImtspDN7|CC!0Vr)#+(821pR?A z_Oigo?(VcC1Ht3Zc5=;bl$8h%5P2=Qw)|Xb*nmZ;({SNw)H(t@1Kbc5PoO(^Ad{lB zAjkiX3Y$Tv0__-G6s)N@pDujRvV8o`mhpDj{#Jx{W2Sagn!y}5wq6b6>ae88*b%$X z#*`SWdB7rK?}rE{h*--4HSWI#;>hS@lDFOWvL)05uVxYtv=}3`T{Yz=h6)_k*Q{`7 z%j9s_T8v2aYX(Jt4YVuLj&d5&rp|TKuM8*eqm6$7&ZORc@EJ*n00000NkvXXu0mjf DGeKIp literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aa0f1152bef9138524ee68559fa937e3fd6472d5 GIT binary patch literal 2736 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 Tag0vA00000NkvXXu0mjfhV3zm literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..763306bdcc791d41244d0669fb052681498b6422 GIT binary patch literal 963 zcmV;!13dhRP)h)CP`<=jGLa-;okGk@4J_G?>QH)cauSa=jZ1qTdmeH5jhA<0tLVT%RpU3F1A{& zg<7rl<4^&L#o~SuiAChGKJ#8S#spCmeZ3=qQmJ&4h`bFvmkl+5MG-kGB1@{;0GxAf zH?UVk4gu4^o-Fy3|(zXhBGR)L4&IKFaC0BdbN zNs@1Xdx1AR&wDitLpO+ccYfdZeINqr#+dz46g9d7%*HR0BsralFYZtrK;t-$f%kxd zbM7NHEc!nH#bWUR;5hKRsvh5=_&S8=d9MIhfdfGhJh3H!F{TWls;^fnl|P3d4nP=& zsff&HxnsI^VI5#@ZtgbVaS{0=m&?5~Eb)$&%jE^yyKrBrRJy+hz&UpW5LNv=48wHT z0D!9M82}M^ss{jgG>iIj1ma}EUuEur%>X6=j4?lr3IJFFP}Ra_0EKL_!H8^ib+rK? zBDa(Mh&}hf|7F(N9)M+ltgwv4^7(ux_e$rESqBi2UjU3TcZ>=^Ri`qy-WlsYh8HsT z@CX480f@-?9spHc%-knuW@c_2fxf8f(F|ar2cTN5t^ntOT@w=%FAiHh2!bQDi`)-U z6s`9L8&83s5n5|)epuqx+A&q_)R_R#O#$LKz6^W}+?piGht}F*98*ct^iA5Uzfh@E zKI@+B5m41m>6~sho3$N6NDu_Csp`wXigWIHx>gTcw`BW782&wo zvbA=s*=(K`k(YpfoO6#`e{m=&F0f0atgSUb}Kd= zMbUSg#c$h|TWfDllH^_BnQW*oB8$$sv%pfCrj2|)@6t5g?VQ^qB8O?W<(&)X+}hgO ziCV4p>sA_lJxqcicrfc^9_}X|xB~cb9G|;Z;6P6^-}m>5$T3wt2uzAdK~-;{y)$)H ly(l6J<#PGzAbGEE`xk5uU>P-3q3i$v002ovPDHLkV1gZkw|f8p literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..28b6a07842a993b4285ccf471b1fe23da4d00f97 GIT binary patch literal 2195 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 V00>-870Uns002ovPDHLkV1mIA8x{Zn literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..fc0b12f781fc6f09532fea42a57ccfad1412b0c1 GIT binary patch literal 1040 zcmV+r1n>KaP)b-KVq)|OBMJrF9MG``Ls%)sxL{0>Xh$_JOJ7w}nI0gJ;Qnvoe*iiJ20>^y5(&a_-J>Ww0y~+9`uW|OQ-3fekeYe-&rRduNF_Oun zk;~`fs}s!nE0z}>=KvR~{kwz%Xk;|hts{eu0l3=Jvjn^WU`4xGbr&)M?)sJofJTKI ziG3v>sY;*5GGm!pt6>0CTJj}eQ_>8eFp?#p1+e!CXA1QgnUceZZvuIZ2NsSBK4}7(#C7oBpJ@Y#u zy8?m2qU#IifLDM8RedTN9=x(X&#}?P@!6km9C+yAuZ@~!px!CVon@7e+6JD4i4G!9O-*Z0pCQrqTbTSnURmZzms-s6ba_By{19 zsoN@;j>Dd3Dvfb;pfrJ2C{ixq5Qr(n1i6IL8wrP|cT)H6j(-828(x}aCljOq0000< KMNUMnLSTZ-gy1;< literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d31f2b4b9d48ee036ba458abf951c2d6af90fc3b GIT binary patch literal 2294 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 M07*qoM6N<$f@ZTWivR!s literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..709e316336b08aa0302ea0fd4c549b921dd1b743 GIT binary patch literal 1022 zcmVQ)RM;j+Gibfr{a1$B;FW>SKMDq@4jtd1k{Jb_1mcK>laDqG(X%v0lylX*?A=r`eE4s>jHyK)^RQZKG4tY4bSfB6L0>tr11i6c;{g0 z)qmF>7S$jyBP!1&20Jd_6QHtfxZISbzeU-os-L84e|eXl9$Sd{9jR1>qTM2V1jI1T zreuG6JU7EEe8rSy4xwxW##UwyAetKN=miFVTC5!goj2%t0KVX{XHabi5*c%|eP!l% zAd=V0-Uh}&w^Z*r`tqUx7<&LfL_fURzxUe8&0U>pomKRG0E_hIeudirzOLhs051X4 zi9a9cE1J2h)PR2k7#DbIT`=-=9soA80}w>Mn97VHCg`^J+c-yqE>CUl-pz zD^>fA3$rC3K&b<;YJOfV08fcbxR14Y0O|(4UK?kX^q}YOxxUxWO~kx?;D1y2gZTg= zOajcNsaY-0pEdViWb6wBn z188~-K#^DI>hl!eUPVQB0th;i2at?}ra;aCzA9U~r`Yzs&gc&Jkoz%l#DBXsn70a4 zY(iS_l-ll{T(@0Pw~Szh5Es&GoAU!cVe#egwXPg^4sX`7CljAI=yHI6#<7P}p#nQS$T z2xqvZ9f_lX-xu>(*2SbU7=6|l?FF7+PCjtiTDqqr{xkPVEa+-h^VU#9I?XObwz|i6 sE#Lq#MPsO3z|oOZe_*_je(!Jn2OJ?@GFZm_F8}}l07*qoM6N<$g3vKp2q7ui1Q=i>s0 z!_a4dIbOv~2USjjtnFy1+~Gx!7;*y2YPV0Y$a@xeD1*!beh+dGwT`RL_nskUCp}#B ziJBH#sD{7D6001TAu6{bdqBT%b)Kw?&Bv9tAR#@LL`NWf~TW4h(I{O5K!$xUa`BSQ_an)Er zqlJH6XJpCgtm6& z-rTb%|K`7RiEtPH>CH37i-ew6XtHwx+k^Fuv-`WY z-vk6k@eDB8Mzvv?_nwSacV}-kR}j4+KfXedKiJ3sma(1i0e_||GbW(4zWH`hU1p=y zLcbnstZ5sH-CW?^7rx!&$~=n z2tPgBRP+8&4dxmrqt)Fa>by~^kM=b;NSlDtP}4+|FWabuXyPgFY~~j2=L>eCykny# zmlb#4l}?*B0h(tl#x_Y(^wr+y>l(rCMW%}Gwo{f`Rq3SZ9|6?`jL4>kdlC_Bj#;(&Jup*t-IW#W72y^0ei14Dj9eA7Pl@X0m*>%1t4If{(Np*)hV}b z#G`j@z>V#$HzBu-D#(3#v}<0<+wjlmsZ&jShiW@3=MB3Vep?^saiN zTa%gqWtyXG$%udV_XSNjy$h7PHEG@gMxjeE?BDucp}^%`q0p^KlK^#!)XZv)Z6x7j zG}HqmZB&4YR{H>-W)O5Qk{JFG@y(wrq?-s`bd*$6y3MtMX`$#Sz`h=Eh24v;*fl8$ zu+X@(OmS}P zVcoo>Tb4cnmeoSOFm7h2XzFAxo`GhA9bBT)90Lu66lqwt3b$`f^fR2W$ zSH(FP27LI}df_pbC>eLT9_MFor>ME5FMWo60Z~OCcQ8U_ur`{qt~OFIss3j{5q-i% z{~*>_lQISV7#a5lW0C5Ei0pLf_mtIcpD+ZUxj{v1AYt|V0_Pc`zs8K7O_?t1cX!z5 zlgDtbu1+-xy!fe=o7{(^{;LQUbv+MqhmA_8N?m`4D*H{qnXQ#)E%a+Z&&Qmgx1H-Q z+6+1@XN~(qNnP_Jz{7SIdLg^f6G z=5w(~Xw^U>WOWCFbjY|IclUW9hHT5h_{(!J@9sK#ju<`s6Y868$|lxOFyY}HWx;V>zs1#f;B7O>0|RY54CbI@ zMXN7Z-1TD=cNa@2Z1MYz^=GzLp3OS$05D}$Ykv2|e|-yN4RC{_QhC|*^*nfP+wu$9 z#2oY>R$3daQP=|HxvDOKK5Jdh+mOwH#f%6a@CQ$y3L&}{=Xs@GsBVbG3s$pxk(q7i zA&ugtHPN{UFDjIzsXiyL4`iQt*|$IIWK^^UN{TPfMRkE7_kgCGh9?A8v`0b>gK7XC z9G4$o-8j|f^F62NeHmm4;E*5(MD*{N=DSIiPIL6AOTM_8QfL-xk6C0GMmaD;gGnL`A9`xGAwOwpK{`NgZV!|e;Agj z?D*=&sp2!{i7*R`nJSbE6anMt-MP5{#6|drr5p#2t7#qTY^pvsQjX(Z$8}uC|0ezo X>KDm@)a|J<00000NkvXXu0mjfl(9N8 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/right_arrow.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0a4e6a7a8097818d9c0626c84f19f4d690dd31 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9wUkJ;l%oZHT?}(3D>Wp7T%b9XV|~Y(T_!;F44$rjF6*2UngIS-C?Eg; literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/sizegrip.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/sizegrip.png new file mode 100644 index 0000000000000000000000000000000000000000..350583aaac4aa474ac449eaea2cc7ddd060276b9 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0A8dZe4lyHC-T!u_VYZ zn8D%MjWi%f)6>Nz(!sM1rC-2ha+zM<2rMwpeI*@Z@PO%TWH}e*?iSqXK(y9 XcW6R37#&FAr-gY z-rUH`puoZ4SQyZj9Qd}kRkgExspwA+*PdmovgYQ`l$1@M%Pi(EdF8VmvF&CX@A%e}M=bpY`_UHx3vIVCg!0H#+y$^ZZW literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-branch-more.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-branch-more.png new file mode 100644 index 0000000000000000000000000000000000000000..62711409d7ed69ec98979394795822630458d9eb GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5PiX%b9eR9<JS%C8jVk7;fc! UBk#RM6lem2r>mdKI;Vst0ANBkrT_o{ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-vline.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-vline.png new file mode 100644 index 0000000000000000000000000000000000000000..87536cce16aabb3710663f720f8d354b1bb0b757 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^fk14@;zM~Ln>~) zy|9s&!GMF=@x%h2Ot|(&q3YoCcb^pu?z>Ewxn#c95_5TzV*y6mHizb*LfpWrmY|ePgg&ebxsLQ03N0-kN^Mx literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..520c34f98d32fd760ada0ebfa4e879e765a8fd9f GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx`4< z7srr_Id3m)6g*@g!gBGq$iqV!jU7TUjou5myNX=I)efWxcz!ZEyw9WYm|d>Y%lTJd z$e;OKb8p+*X)2+mvD2R3`&_sB@`--+lmBLDp8Qf5asKz(Hue**4d43j6 zgKa|^LlwhWhA#}W7+)}&FkfKKU|Ya`fyaS=fnsQ6p( o&!;cafm#tDq26uMvYnT=vHE@GQ1w1A={QKr)78&qol`;+03CWU0ssI2 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..738008f92e0f1f7ac64728e0579978c8f376e3fe GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx`r4 z7srr_Id3m)`+&fJn2=Z zH}T8)Q@8YQyyZW>#OL(>s(ts@O`rEYnm607CUDu3zSHmjCfdH=epA6g)_#8V-Tcjt z4foR+su<2Pd|{Zy_=3@d`2uqW+XD6rJP!N|Bpc)$j2UbjsG}gao1tI-dEEEeYvd9< mELCStKC`~~`tM0s9&zr~SFqr>z7F&{1B0ilpUXO@geCy(p>l!% literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..999b3c7d82aeecf6b222a5b2e5df751ed25029c5 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(NI z#W5tJ_3ib8oIurXiJfi*3)o7Q9FU!}f>&qh%xhz4_qbJyR^Kiifl`hCkq m%U_Z}tq4$Jw>b8W=355a&s^V6z1N-slJRu)b6Mw<&;$T{crMTY literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e40b7d19e8236d2fffe138ac4b702060b941ff GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx{eS z7srr_Id5+-6g=c0!TRv~WhUd7O=%g5T>g?3yB0`VbsP$C7HD8Dovvg2X1P+{r1IC3 zJ$|Kc{ldO&`Rjc~^CzeH$-X;&cj@z=VY5}^=c%ke&Ewhj{b<#^{H+xYHu|4m?!5j} zEt};>Cffq`3p@_|3nUxl9E=%k8`2o67|t?$VVK4Eg3*Ne0&@m+6kOvd`2Fe5>zc_= p|4XgzS?ROVCseX}{`4hc{C<*hHqS$ob^$%j;OXk;vd$@?2>|gKbQJ&q literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..c31b69deb6889e5bb202cb122620230308304f2f GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(NI z#W5tJ_3ib8oIurXiJfi*3)%_|*g0d?^6D&oTzy==<^3uS(csSkpDXU>pKVJN{l4X* l1A!i`M+Ud{1dJl&VLs7+qZ|~ z!)1vEu?2<+1EjX@zGI!_O^RF1wH&;1?+D@)1yOElG rxk#G9K`7Qi`~vGS2XU|w3=d}P^VC%1e<2&s2omsg^>bP0l+XkK_nAmg literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..2d240edb522554cf29391e3f04c1f54f344177a2 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(iP z#W5tJ_3h<_f(!~gEC=~zFEVn7e0?;-ll@AIQ<8A;>U(pmI2k6KxwoQrm#6NE-Tmto jJykV0YCbYCFkFh=b(4#|x-ZQNXcB{`tDnm{r-UW|6U8dS literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1df30f11ac9fa8a134dba2d94e16186a10912b GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpkSM) zi(^Q|oVV9E3N{4@uw3{n@-U)ZR$}(eCPC4Q9m!eDB8MVcW>|d)KGOL8&|L0sdb?SG zx)>V%YFvI$vM*-xCDq4?y-wUxv!+D<-($b;aGKrrlTRl<`El-s@8MI7-^#^f1UHx3vIVCg! E0Fk0mxc~qF literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..58cda1f805ab3d32b37f51b0f48701f3ff397170 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(TK z#W5tJH90|ob#a17Pg9`5fd;{20xx%NncvuWu+i_^yUO52&rcly0vB~|_k$V-INgd5 eYQR-LU|@(S;9}>={rv-I8iS{+pUXO@geCx8#4fe~ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9222b4fd8e5a3413e6ba209801935e5e318f070d GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpkS+~ zi(^Q|oVV9E@*Z*!U^!45<=_4U$qcg-cR716w4`=b1btE4+VjWw;j5;-r}Y?t zx)>J7FXip)zrJ-zpQoSnm&nT@UU~0-Km92ycWdQbz4no#d%o6PVKKp*VBlLXk$Nq@QW?t+u~%m?Wa}Ht?5qW7W#v ne;3;_{0s`P`oua(r8Sy!0~dRR?cWJN!x%hW{an^LB{Ts5`kgLL literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9c438faf42ea2772163e621b2b40309d4b48deab GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpkSS+ zi(^Q|oVV9E@*WD{VYy(et)TcUiJ660_@cr_R%2I#Bg;LQ?Mp>8E7#lX+;BIR38;tR zKv{_VoAu{|m%j7l<9=hjeBmX%`Nw~Lm45eY;nE0Mvx&44A)+AdoGgW-><#vIf(1&>gTe~DWM4fU@b>H literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0acbdcc012dc5a3bd643d991d2b26539325814 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(@a z#W5tJ_3ibIybKCFM-FfpN+kaUD%5qJ!MFST>suj`8lLKzn>H?dc;I(bi9-VeBNGdU kfC8A2@x^$Tzev1!#y8g1sT(fm1C3+wboFyt=akR{0P#vJF8}}l literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb4e24c88f75b80096abb4175d5d0658c898a0c1 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx^~h z7srr_Id3l*iXL(hak&`j;vyloVuAqc#0GAcrH5QKIApi%oOAfjt8(k#lUDsoceb@T z|GDz^w&+PchU-pmx^uK|a)pWKxAXp<%gQ+#Sx>zFJpY~ZNe26cj9(bm(ir=)Rn+X{ oKg!f&sONc2<#kFVdQ&MBb@08%S$`~Uy| literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..32f7e8ca6fc0ca2d61c4046b40b3e7168b42297b GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(xU z#W5tJ_3ibIybKBghaH+DI(QePrK*G_cU(yPUK#s4!LfGT<>yu>d#Ckq_oVO#TxMos s;Sf-8XkcIjF(!!Bx*e!n^kWzI%p?|rGydB*0u5#GboFyt=akR{048Sd}Dvpb2AZ}Xn>XL8f>zFT{i aeP?D-69|cY9KI0fLk3S*KbLh*2~7YgWo`NZ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..91c19d65c3ef4a5da1cb5a3e67fc6b27b7674273 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|)4e z#W5tJ_3d>>UIqo8qZe8g5}O1%R3=r&%l^xt0TsWbkzLb6Mw<&;$T#`z-4K literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4829918d63c54f83d4cb55527d212bbcdd1700c GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx_Np z7srr_Id5+-6l5}FaJk5-4kVDxqJ` zx9zH^wa9m$mOM#Ea`)}JVj=6WN0(G8?drUY_BwIsILP(am;cj}e4uX9Ah*Dj#`q+| vb^hn;i}oLLd)5gTe~DWM4f4MJ+J literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7f917374dc90572aae0276bece2798133c848b GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|)4e z#W5tJ_3d>>UIqo8qZe8g5}O2!6FC%Tnz~Gpep_q*eisLG>f3X-e9hEMbSmVV`8Wg= p92yuHnOHy!hTb~2=bevU>&Z-Kd3y4-^F5%E44$rjF6*2Ung9@HE1&=X literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d65773b487125abd4dbb5d6df3ae6637f92837a7 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx|Xs z7srr_Id5-oZ#WA>)$U~_3!2a zy?b)&cPk#Y^n7+^`SH|xVQaHTmsBFSDko cm6tCW^k1;DtVr9~05pQZ)78&qol`;+03$3ZtpET3 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe97c0de36796092d2c650479d6ef3c81493979e GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpkSe= zi(^Q|oVOP?@*Z*!U^!sh<#5H7+hxiJ(HhPYCtoq&8=cG>l1~fS3$N3=v6ls?0|+D> zbDOW-s-5>de9~*q+CG!etBb$?`^Tq$d$qmne3k8`xBKrhyKSy^2(_JDzopr0H4u7O#lD@ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..7426ae2de48142d5a884c8a481a47cc3331ab9a3 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(uT z#W5tJ_3hb(q6`8I3>TA?r3F+zXWiS}I8!As^p5{^J{8Yju@)1(W;1?T{61oHc*Bnj e4bMp>TN$60va+=PTCWH+gu&C*&t;ucLK6UH04kjT literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7acc6d33eaf0867894c597c964595d7b8584785b GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpkSq^ zi(^Q|oVOP?@*Z*!U^(ztpDB=CR$%f)rit1`${kbKVme#}Z8VMia=k0mVq!OJ=LBj3 zf(`7cQghBt&kp*vM0T6TmIWJ^-D!LN_oM8!`@8qo*m?H7-%=-aj%S0uG4mEZ&Glbb m>*TG`yn9U*qM4!LYc0dRYJQGwYkB{JggjmST-G@yGywoX!b5%l literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..6e3c12143322a0f9f1683e159d5399525a56d713 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|()X z#W5tJ_3c?jQ3geZ0~Z|GiY72RFYYd!Skce-M1h5?^XP{4&)6oZ?A3eY@&ARx&M iPm3zVNqJ3Dk<~TvU}f3T-S7!$5QC?ypUXO@geCwI-YcL0 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cac3a56c2838f5fe677f72dfc44a62470d18d774 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpkSG& zi(^Q|oVOP?@*Z*!U^!qL<=_4U$qcg-cR716w4`=b1byl2Rkaabr+4Ev3s4Ub z+-QE){P=O{+AW4BGn?(QXRRu#zOR4&{f7(je_wv~EXq51qrIE)TbiMRH?QY2-d$^Q iSEbz81=Y*&p<3RAgO6j^wjWX;vpik>T-G@yGywpoZAWJS literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b777784b8843e0e96dc34766540cc8bd3fedb1ba GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP|(KH z#W5tJ_3c?jQ3geZ0~Z|Gm=a$!?ubz5I8-g7#KP5ibi?{*Y?D;>>b>!Zmv-3qR)tY!TDKjUc2|mKfhkSV|M)Cmp@c2w`Jb$KgwLSxx&GFx2mN1i%r`W fF3W}JWN=8gbNR^6@iC$CB}l~6)z4*}Q$iB}OWH!o literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..8b241c4a47a979adf1664d33401f8dd5b4d7c7df GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP*BR# t#W5tJ_3c4MMj)?A;s5$P4+jwQJ)3|61EV|Rf({^u!PC{xWt~$(698qJ7wZ53 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3df7a5ed69103b590e8568cecfe35d47b0b32e GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcprE>^ wi(^Q|oVN!Vd4aq`3%>j3@|iCHGLb<;IkSTU17rWElYt;%Pgg&ebxsLQ0JobOwEzGB literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..8b241c4a47a979adf1664d33401f8dd5b4d7c7df GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP*BR# t#W5tJ_3c4MMj)?A;s5$P4+jwQJ)3|61EV|Rf({^u!PC{xWt~$(698qJ7wZ53 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3df7a5ed69103b590e8568cecfe35d47b0b32e GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcprE>^ wi(^Q|oVN!Vd4aq`3%>j3@|iCHGLb<;IkSTU17rWElYt;%Pgg&ebxsLQ0JobOwEzGB literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..8b241c4a47a979adf1664d33401f8dd5b4d7c7df GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP*BR# t#W5tJ_3c4MMj)?A;s5$P4+jwQJ)3|61EV|Rf({^u!PC{xWt~$(698qJ7wZ53 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3df7a5ed69103b590e8568cecfe35d47b0b32e GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcprE>^ wi(^Q|oVN!Vd4aq`3%>j3@|iCHGLb<;IkSTU17rWElYt;%Pgg&ebxsLQ0JobOwEzGB literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8b241c4a47a979adf1664d33401f8dd5b4d7c7df GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP*BR# t#W5tJ_3c4MMj)?A;s5$P4+jwQJ)3|61EV|Rf({^u!PC{xWt~$(698qJ7wZ53 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/transparent_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3df7a5ed69103b590e8568cecfe35d47b0b32e GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcprE>^ wi(^Q|oVN!Vd4aq`3%>j3@|iCHGLb<;IkSTU17rWElYt;%Pgg&ebxsLQ0JobOwEzGB literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/undock.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/undock.png new file mode 100644 index 0000000000000000000000000000000000000000..88691d779507c9b809391396407f5cb4a6497c40 GIT binary patch literal 578 zcmV-I0=@l-P)WFU8GbZ8()Nlj2>E@cM*00E{+L_t(|+U=X$4#OY} zLz`&--S*43w`rPoNlWaQLS8pfd~hg*uq-oX%osV0`LJ!+SPR{}9r(JUC& zi*OVO>rs3r1nW_FCJ5_Yd@BU&U3e=9yOQ`b5bSE=k3zUrc5+?UXD9c4F9B>-qyH)% z1tH=BQxRVU!7FWl=67leWRLz4ahXo| zoe{&T7oZ-FMxDSsBBvjZ{}acq6e%f?_~rzJ_LzyflS`(bcuN3?R&llQTw-2U8((=NC3B QV*mgE07*qoM6N<$f{lRZzyJUM literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/up_arrow.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/up_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..abcc7245212f19a5dbff1bb19647b1dd4bb05b6a GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAy| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;v6FKKb3EC1BH}5T^vI=t|uoP z;C)upuu)h7(gY#2QZoT z30juyT=+*61Tj9vbPp=vANZH(8>kyNE@-d4z3sida5u)Yn#@ek_syBfF-O(t3|TCh?|1!W&j1gRhqI=kTY+xm^Oegzx(wMWjc< z_x-nNn)a2j)?O2lwI=XN0f013Usp+pNUNVj4P5KswF0?>F=ii_Y$6ec;Z+fNRso-_ zgZC8xaL(0A7-ROFbGtbl7#dC?Y2UEc-Vl)$x=-{Wa6N1Hz(r&(j^ihTayJsFlMs<3 zRiz}>7!CurpcrYIzVdzlpmZ>W?nMj*A4;Ggv0swtz*TiVNs`8J=q_EO5RqRZq7_5x zdEU=q^9@yjFbvzkdd+tNw1Xhn&Hs*(3Pe%V0ycoLLU&$?;*Hrh#_Txf_L}5vv<2B? zq6aP_H&u1MAOgpW+Q_OkFa}m248tklc@;d4O7s<|g9EpcBw5Kj zoO5*&Eo01XKZ#m_0r1D=`Odj*W6YOfB`O7?D4GN|o5BkcTXhma5L9kQk3bYfli35Z zyyv(3!HW_>5PSu$lqA|!5?un;+6mxA6+DjPM}y!ek?06mYcGq)%hSS(62_QsRT94M zZ>4GaKJPdl@x0|S99TFBJdY$v9s&z=-xFiNa);ZYsTQB)3M^y^P8C%WB68Rx;CbF6 wZ~*)ek-1U8ixR3j3w&4APr%}+a{v4B2L`lzfwmJ`umAu607*qoM6N<$f)m|YfdBvi literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff644f2e812996b6b5ca5c294bd05c3d06ed2aa7 GIT binary patch literal 1690 zcmV;L24(q)P)f zAPBw%ECNURE`2yLF>!Ksc6P0I(ex*1G#UYe<^hhV>OvTXla*Clv34*I@a)FMM%ceN z06q*(rhjb!fQUReVz0xhy5M=kpXW506Lw{9B{*7?>&c5#5}Op>2!Y9zc>J3et!NV zYwcOwA?(RGc%FAcL`JrKt~G1z)cpMXNBtLuo&)j?UNpum0*4(oxB>hiNs>P}#Ez{X z2wqUtB@ubpA^fJb_H34A*N0u)769x|2vwSg5ddI+L8#h140#6hE6cLqi^y4EZB#6q z^SGG5mMT>gMb86^uI5E#YLt0!=zy-mFq~A?1sprUT6-qTvJYJI@1!V-p10O60gpI@ z-^`Ef@4Mu71_0oB-nWf0*Vsh}Ma`?~t7)44);0gg5$IKxW!J5>Q@~A!@FOBJ);JV2 zf2*i@DA)mA<(;qqJTxj+RsSs_XOblOW05^dn4c$z z?7E0Jjf03htg1^v5WFxdwy1d#Dctt=)mHY#uEH>UNmZ{=K_`?k-)gm7KD=$Ku>k=1 zzW*H&xrze>;9tg=GjSaMsdq65g5x5xq^d_9a@MscPHN{O$Z{KelRee28)Ay>Zt5>xGfGr4D zfkOpvt=&BA0sz>8umFtu%Dt<*`SG?^^DxFyxQH5!#u~8U8ZROn`8~C(b^uWnJ!7q1 z#_ii%VDq)8s_iI>o~yAmpymg0rZ%E+#&pqF=l!v^Ii2oxZ{xbF>7tx z_x-0GVuz~K2>8DLl!&b0X8x`*=3E@d?IL^R#VUu;>e3B#!4zZP~XeX%ZsWeUh-hW{Lz{QIfzuxI|J^-F{ zNW3TJy9$Ef4DbuwApEn@Xq>ow`SL${7Y9bbTKg0J2h0QH58G+n#^H%hr}NYP#bLh| zf7v0~x~k6XrTMOsBw4c7p2q=#h@9$Q8}<%g1)$$VG&8)$}|AzbZW7yw|5nG=zZhupjlyqP4)K$88Ud?bfLP}NUFWUha` z(Z8^|x_W1Fa`LTavw4Wk*Wd=wHpcv@u76Qisnylhk58UFdBs}$q=-BMd=9*2jQL@! k)%tX=>pRea4z$1YC5@3j+@Cc*@&Et;07*qoM6N<$g5g~`i2wiq literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..22694e31dd89335a63ce115a84441aed6856c5c8 GIT binary patch literal 838 zcmV-M1G)T(P)pGbtr%@uv6I)wi}ShrlYb`dM)y>NP>h2 zk4W$VNPGh&9R;rl5)y(^;n2lt=pYG?B;WfCgU*vS!!bwb$SVajTip>^*1i z%+3z{?;&pE_^5dz1~*U+0arIG<<)+IjJ!DsTm!zxXk30)dGZt>=1zzyw@{7&M}QS0 zSDfw_d^l&$04w{sk2Z+iY;ryG4tm-#L>K!ZF`P4JL|ABH9c~j)^a{}Er-YF!P6xmn zB3yAh18$>kTYK@Lv?a&{zxRe9OeB)ow~k%i=@pLXVk;bFcC%7mY7+pc*R0n860u$- z_TdXH`G3JT%J;o<2WW|U&3ZkUO1~pWB9(sQ*j7ggBVU+8Sd0P>6aa8+>s6oxGTBMO z$QPzSTHzW74;64F63Og)gz+d6BctXikOu+qvtjU#0>31xp%Q~bnLVdw?YeMPdWPdk z+A)lrc?Mw~|Bn74!fAjYxQfnht*_ndmOGL_n1mt?P{c1584g{Rz#EQjy-XxC9}t=w zQ$WQ35>bW#E8k*sVnK6BVHpPo;P2wzU@}Z=@yIzf82jMLDm?Is8j9 zAjtA?zEFyiyK4oE(c%Q~FbMv9qdZ@?t1kwV85>~?ZzYgOmFOs7j20(QZG)qFVRK_` z-W_mkD@9fj-?6P1iDddCB0Wh23XJ56_)a%?Q=(RlEYTDg z$(yDitA7jkO2ku{&k`gtl-+h})v7zNPvUwjTw(4{;BIVH%C{Bf@ShV0MD@Dc`F#+H z?@F!;b6b`2?LUQgl2G{3CLqEk-~-^O=xjgWUI~=5z!!lU(zw*G-2Z<31pAGHLH={# QVgLXD07*qoM6N<$f_bWS!~g&Q literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc97db707cc68e98cb24b4afe52065aa8e8b4d2 GIT binary patch literal 1724 zcmV;t21EIYP)FnkDBWdRE&3pRX>ZdgI|l33Q2aDlW`mYni344qCE48shig*XkigY_I1wp>M$ zrRPfb+Gg;7dG5LAIsc!|xsqkUsZMpO|7Xdd;FX1i^Jo8a_WP=u$H+O9JG*W3llRwd z-aG0B$I+Gf{8!FI?3)O$V|5!SZgc*pf2{xP)85=Z09UUrJ-PKc`%6@#J(unay0~5| zy&G2JL1-qG|GKfZ0$k|1bocBzJO6IEyxAQzy#=w7c@--e4bq zjkUrDMq~kZ2*v&m zr3wK;HVwF92`=VFh^7A^l&f z`o_2re478%3X6Ws!x#X-KLp@fvsPU9bH-7a2Zx8?AT{gdcTl?kJa9;V3RvBLf;%ZT zpN<}dc^DG_>_Jc?iv$cIHlL2#h^gXe-e7(0e6Pk@fo?@px!1+&Z30+_am+VrWtTtR z4%OHb&{3;exMPLuxKBc5|2_RN#pct|cEmW3y{M!oH4gzyKu0sl>^F^a8~CC_`aebF z+PYV00?foSGa^zIc*f!0hoW+Qy=7SCSxV_po|M!isPd8IYQWbgrD zHnntRvTi?9AkTnUJbT#+HGG&~uNG_F!Du4?ZNZj+FF4fr7!yf0tG{@EoPN7CF#x~j z5u0mzWp8k;T-=HlIYI~%t-!u{=dmAV9-vV#)Qw6O$92HACtioKC!ovx^A71-isW0h zLe;HyE^b9jjQ+U}z(1s|$@R6;?_6s4YAgWLiTukEYz;T_+lu5|&3ANE5PYw|QJ9Cl zbr3@q*m6jJP9x&Y&1YWmdycOO*fXyl=nD?%W1H{RTq>JTOA*IOFiN6PFaF-OzB2&d z=9PS_UR-spKTNa9bP_cMLV)130?}0Z(s7vwXnJK2u{j*q!3wolJbT%t_DBHHRQi(G zNX^x}F}f6_`Hq@i*;6EsI|R=K!q62M$9$t&syO71t!N^b60`vQzxo`YkBpKWwho6* zKs1%Ugf-4%FCxofn+Iss3ROjNz_vsB^H%Vt6Zw}9OBgr-9rFSg9S+$Mk)?I7u;P## znEXyc8Mcae^R!kF+DP_tt*?m+ola z3Pe z003=|sIvnsH*3Y)jy;C1MzvINfgsT5tsj6g>{Z=C^*blYd`FFHsUjlF41r*gTfMP9 z0B0gk+yFitaQ~k9da19-NzuAjSUC)Wz&&=`H+tid-oRh){b}njK^_5B z5&2%T7S6w@gVf*d{rSU-FMYKrh8GoiTHs^gE#0->ZM|Lo=(zhk)u~Q(vh-iC4k=6A S>t~Aq0000v-oD7@#eXQmUqZQrYdo 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 b|9<@f<_Uyz{zSKl00000NkvXXu0mjfC<8?v literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..58c0bf592c21eee06dcfb3e3df50c2ce617c450c GIT binary patch literal 1679 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 R$EW}R002ovPDHLkV1kuuN4x+4 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..15f55c05604635dc35d9ef1b8af8adf6f9edc1e7 GIT binary patch literal 447 zcmV;w0YLtVP)dks(p z_ZGkwKOYW{n`!HwmHC=Kj{D$Y61w0@s~N^z7@?J~9~8h9H*f~LWJ+J3$J+4&WPi3J?MZX!yjtgHfAItZ}e70T*1avY89M zH$W8}Sf)z%%5bMi7y>Vwgr#@FAYZOkV%BxPCgDaCI^pYE?oPben8jff6^os4LkC!@ zs8QN*HjOEzFLlIi>b9NG`UK)Q(k7c)TqZD@lOSho%T2>^)U2w}1FCKJbkNDE=H p1K+5#nFkQZ5q6_lJlFm0^9>c)^|Bb>meT+L002ovPDHLkV1jW1y{rHL literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..33a4588e8e422071a4f4a98c1aede1daeb3becec GIT binary patch literal 768 zcmV+b1ONPqP)6!@u5F&c~#4N+Tc- zJd{L0UU(>hfJNZJa{-IOgU14Nz=Nj(bisp%0(8QIX99G?gGT~Pz=J0OOu>T(0!+e# z;{r^>gTn%Bz=NX#Y{7$r0(8R%+l@OSJO@Cjhr{mi=gHrl+7QtVUke*e5srWjU;~kt z@iEQ_Fae*?Hx(xYSb{$Vc^n^GxBzSLqV5lS(TDi>LKi`+@crY%q;m=r-~v1pB)}DT zC_sQq@L*YhYw%!EfQ#?|m8^f9C$``faxm<7-eu`Beg)WsAM~P3@L*Vg>+oPufDiCs zNPsW!U_gLR@Ss_MZ}6Z|fRFH?Nr12Lph18wcu~?Cb)$CHz8hQhyP%!{`u7B#hYuSq zP;E@?33>sqc*P9HTmsyO-`!7u*Rv<+2fVzF_i5P^^cp_p6?yL0Vb|el*fjk)X yqxY`#rRMt1&RP%ztFHEiVR%_*-!jWw;QR#u%+9O6n5j7c0000Plo@#q)sdxCQ+8^NYIzpe)j?( zs1^Uv32>swLB3y0fG=EVqdW&qIm^$yU%>{xC%yUQ(X5sLWw_S>Cb+i%rnr{?Hn{Tu zwz$&(Rd8nkO!4UEAzX;ufxf@>yD>NzM3(p%I7VpY`^}p1LxIO2<2*mBdOg{L~U!Ak>F#HS6_ z-ZtE75_-bTCZQ*M0(90V;YJ6n@Z~FaCms%yX!WnyISH+Cp$$xfro>f0O!-ml8egd^ z>d^8E1{y35DShiwcA=&woxkiANLQ;rtsWX`eFwg+i^3kj+ dPV4@9eFE=T^_JdW17iRH002ovPDHLkV1m}ExoQ9a literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..58c2d06e4ff299371374eb50ef613541974ff3b7 GIT binary patch literal 738 zcmV<80v-K{P)(u9ILUNrm^qNcTV2%{Q9SR9yyoO>0nvQ zTGk?$lsy5{RqqV$3cOJ8bG62!ACH4!{P}8G6SGl`sNVv5Kuv%@6W#!K;ytx8CT61= zQNM*qj~HVOZYKLGDIg0T_&ZTNP4-q!z%+Of+T$?zlI*Y4B6u16`IF#N);pCEkOv+r zA|Nk3R6sxxc<@|6QF!oJfDU-@RDdpc@KAtGc<@YsZg}uWfC+f;M1U!H@IZh`cyL^R zX?Sp0fDL$XRDdmba8Q75_~zl@o|^C)Kp}hMaPxEgxl;!sy5Sp9zoir>2u*~hpt{K( zX9Spl&&W%a69O#3PXyUd_LeTd7Ci9qJly=4>@Rf@v!H@u7;K6_ZpWs2W z0N>z2qW~Y_L6ZPq;X#7{dpkU}J381po;R-<4Yw8Q6&N@ZbRE8aINVjDj*XlN`T#FV zy=4YtuA8E+!#6sE9n$c6&IG-Hhj-~b4QGNr!xugibRIq$+(&qy%A4`mc_jf=g@-E$ zu(!!kJEL&xWd6MT@GwI_)#2e10nWpB`fZR8sk}LVMwtQ@1s-4}Ina!T+XzQ!f}fI? z8-8kD&IR=UFQ9w6*0{Jf25!Vg^WV(K&dUw2J&(jraN~P@1z3*_6}py^kymK4y7M3* z;OzOWU!o)geghYRY8APYlgd-lE;3o&c~k55%dhKnPuE<{+j#cvy3V|1Eo*`6AFs^5 Ue};D~CjbBd07*qoM6N<$f=_@-H~;_u literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a566cdb922d0729e01dfd41f0954c4e2fb9f13 GIT binary patch literal 444 zcmV;t0YmB0^W@*BXXh#K-yf+HYhLtQi4N~X)a%>e z>;yp7iW7|x>1dtoX6v;C_{O0PyeL^5W$(Nn!5YrII~!b1YY9+>dktWMdkbKSdkJ8J zI}c!sI}K0;cNV}DZ(ZFsmy6^9;p4r3-UA1N$Pym{2WT4EdRQ~QFYu&7b)3Dcd<0wI zhtr$W*;WBu;ZWfStng(r0``FCJRB@LV2$e(4?@+;!>t1NzySi6c>2eqjBzmNfE6y$ z&;~CJPze_%L7=*MxYZ=|gqux5FZkCdxjG5gE}<2k)@{UdF6OU!pb9oM#oGuIrRTX9 z&g5cB?xvQwNnKHg(hkJ2S`s~$;h-fUx-Y|5>x%H70BI|BG>kX?$;8)!NJGQ87+5P)*S2~@vr-Ra;~GJ3#(eys+PH= z>;>4ajotXRMDko!zOO}-N8jFbz9jFjm9;PzRqw`4RE|+1LHRX_UIVw1JyA((vtIw; z6O0jhBi&a?0a@_C?+NlO-CH>Uv*1OwH9pumP4`!76TAri?6C7G>zT?3$O8`*5s()i zDj=W;JOnPFC_Dr#zyv%5D!>#x1Sr5HJOn1dG&}?(zy>@7BES|r1R%gBJa{g^HavJN zzy&;bD!>&ycqqU$d}BAhqav>WROI2fzwZR$Y500KZmP%$&;S~u+DrF%BftiH zM&49;A;1y*M1;rb-qHoQf=768)^C4I_m{c}x`ZF~+s9eYlqSFjcqmDLFYr);0H5H& zu>jxT!Jz;j;lYsrXYi``M~9sci)2|B;4?f}7T`NPSQHQfJXjJC3Ora45E48X77!Xd z7!(j9JQxxXDm)kv;0zwNM+fcUqIr$(;I1k!!NN??cleFHqit1&*q8~1059kfa~N|8 z@EyM19c*R5o0$oQ0FUx^D$m4BFl6|`GePg+cjJ4Ayqn6K^Xa^lfU3g7CH4S!lN{Z0 z4G(kP0H^T%&dI`g1>xZW0p7#!4O+nask{Y$MwtSZ1s*a4{Qd7d#1Q<9yxj0J^Kx#W z{|ngft=A{DF>pO`HUG(s?7ZCY#`8#h1vbyGUIA)}ONEZ5WaJfEtm!;R3HUnb{1kW! zoC7}uX%;z?GnFT_iY(T2-psoBd+xc#;sWu^J%-8~m=DiqZeZ}a_nUdaS-ERWPZ?}CEWJ=CBQ}vgqG7W` ldWYdT&5-{sN=iys?{=>iXFF#kZv(WR!PC{xWt~$(699*2LVW-L literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..30f728f022a5d5e8d2fc77aa48fc51eb0a62af20 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx`@C z7srr_Id88SdL4BTX?(C#Z|5JEXP0PuxaIY(xl5uw zk7t_}2dUW3x_Q^cH~;HKNrj~)M(00wFDY&>n)l7{Sa+e!{r&A5>sC#f^!0yS+@y17 za>CosGAOoW&$nYQ3}!#e5Pg|vgU;#Cid`0!tD4gq_Pw9HB)s4398m8~5VJ6MJZ|fRmpj#L`UHx3vIVCg!0K#BP AKL7v# literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1572ca2fea6b12cad569915e5a52593debcafe04 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXcpx{4G z7srr_Id89R^g0|Mar9$xzR*EFzg@qXngR}Pyt(DUi{c$W7$&j5@ZPao#4CEqgIk_8 z%<7K2EHe};9&3Hq^83m4?7#H+=?|aibg}@AgMcqhzhB2qOHI49M45kaU_fZ={de|! z20HrRo*r5jd$Rlfm~$l2sA11JpI14@D`l22fAO($xKPAxyGG}cg5-i5yylbU z>E4pKEn>I3?{G@P*P4IRe$N$N{w?g%ZqKcGS10Yx{`|(`ACt!)4n~+O8EQYW&KEJ| TubHcF3KH{l^>bP0l+XkK-2;y6 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..cb592f5988fbd285ce33aea807adbe1e1f79e3c9 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP_W6< z#W5tJ_3fpNyoVe_njhYuE-D}toYI=(m#lDlO zpX=|xshio@c=Mqzla*YoLuQ+8JIk#Z#$0yYz4;NFjF~LM;vkvj-nHx=^V40YFO*4; z-~3B;N&R%o8upfR2aKJc&zRxwt?`fZ?3puN)y#2EW!W9Fd1ZjEVeoYIb6Mw<&;$Ve CRYv{* literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6465169d60c8b1e685c91816d5b20221af925a GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXc1_nk} zPZ!6KiaBquZPa54lsNkFbF7-vLIJM1ZaX_W*e`r!n3t>^sByDy`$vwdr7h=}GpGgs4O({I=xvl~>2~d-Y3hHOJpOPn!W_#G a`;qm+B$v)9iw_2a#5`U7T-G@yGywp$jg1lj literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..6962440acefac06f4e4541df6b851078e0c3dccb GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3**C5OoFy%!JP_V|+ z#W5tJ_3b4?z9t6|*NeZ8>k0^!9ro*)*c2;Jmbh?ZG4Hf@$5LXLYqSKCosRo__WQnk z=XwbNLBW$}>io@jT~EB86wjaV&wN3~JJTD?E6QXUF5c;%fBPk;z`pknCn@j+?7CUH wQjH@oidQ1~!Q2Is&8?qnQvSCnDJk9bJ@ZC_pF>Vc6X*^GPgg&ebxsLQ01HM*@Bjb+ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cb028272b8740997652165e1757bd5fc628bf432 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXc1_nkZ zPZ!6KiaBquDf%%7inKob%;ur7sHx$=M#f28-x#=8X!kW7+0c+Cc0tyJgULdLb4OmI z>;exjP9{d*^j~_@_DB{Kd(QYj`FWp3@tGbLpe+!v#p%c29LK{ayZomv^I7!C=3mKL z*@Wj`(pL9$PxP$ylEot^4a)w$eX=A z{>$zk)~VHcJ>{o;O{M3pz9{LXiKz^p?0l*JTqf{cUX#}lwo>}R!M&}*liyulW90BB zMt0WAlS?PAk6iZ1hF6<;Pptf2{jLr2OT0bh^{&n`HNU*}(WdEjj4E|4FlRC}Z2Q49 W^_)X^PS1aKkf5ilpUXO@geCyc!-skR literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock.png new file mode 100644 index 0000000000000000000000000000000000000000..616da991a524c4d8deef040ac1fa07249e472461 GIT binary patch literal 510 zcmVKcZzGltOSS&dd6b#MU4 z3MA!iBc8MP zj;iQ=uBTE{N~vny{qZ1{43KQc3D7l7vlItFpX7!2 zMhtk`uaxoyzG$<6H-^^=9BMir@g=HBGw@YCHi*Boa9Q&k+E~YPI?p)Od1n za9#J+vaB1DNdTJwj1WOdvI`*BXf&=ue76!l0Z{FM^DegZn*aa+07*qoM6N<$g2qMN A1poj5 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..511036bf2d0d9e5b791d3b22dd2913035d49e4c0 GIT binary patch literal 875 zcmV-x1C;!UP)HN$)24FIb`h)3me`G>C7 zen|`<2!iWT6fFZd+A`QvkeSC)dKw3CerIQA&iDP9TCMgjrCuUke*#iU#mq0zy7)mu zM5CVP)uohoP1cDGKuUQ7K+$C3eKG`K(f9pxrV4ZfAf-G7;IXNK8VnK9lTxWPY(hM4 z1Oxz#6w`%>M#C_?V?sMFfNLfSWq=W1aRL0RTiix`>1>Fc&fLWw`#0sJ{Gzq`A;xUjJBGpTdOR&xgTS|bqA=SrnAp0#e=9PlmcB3Z!9nl zT?Ysu?lbc<69xN)h*Y&&eQ8QR_MM@%wKXmj3eTI(<`#ep-TE13i0p(({RH zu~Ph{00Kw*p~F=TNMBR002ovPDHLkV1na_ BdX)eG literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b3d25b23918af06aba3cfa80df203670dd1752 GIT binary patch literal 541 zcmV+&0^!j&bB!18yi3yF(0r%g z-MxF?&+qqp_wEP(yTt3^!|CZ*^!LCjFb9lv=~WeUlbDe&6^obm0^FD%0*Nk-ovKJo zCYun3Thz_Wdue+nhVCU2?fV~Be(lakqS#v@Kk}#!_=!aY`7YPhtsJ!gh*a7jq_Up0VaC^4e z*7an=zpKsyBY$!k3E(gg0FM7cdAI0VbWWM6ETD@vfQav}EA-E>56}k)9ia2B=Oxv3 zGnH{|-9WWD2xSEX-3$|;Ld?jA0ZL>|g|DBt-}#AcSpoUf z3v-|ztq<(^4YmOyjmR=k>(*VAS6}u&p7@Qo4-P-7$3I8o6Ytf~I4}wf2JlsZiYm+H fy{)$a-s_7iJ>Px-gj^~i00000NkvXXu0mjfmO1+y literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..638ec8104a22086306c8b407d7121974e529a4b0 GIT binary patch literal 910 zcmV;919AL`P)FUT$nCF;VIeUCt z=X@^Tz571j^WE7w5AS&o;Ns%qWXP^SOQ5^18Y}%o=myXVpxVAITciQZFk>{0+Tk~e z(dA;3Z3S?kz4JKdXoP_VJ33MjkRpwHUrdZWDm2GqRooYh^n&RYfGt)vHh_9&>hbQ{ z^KoHrcG_ryr8A%{6g|PraR8bvdmBeq(>QE&CYTPOCD2`0Lo06q>?n)14T6Bw53b#t ze@!s`3sz&L9~E}+0Kh=Qn)kmj9l+Yvz9KR5ZskARS_Utw(0Q-2AX4-`pPY=@?k()# z4@S7i$2#woaupZD4M4R4)wltuHlP|e0M!Om|7NEZPk0JcgS$%lYB=3GxQ5r1apdnGzSU8h>` zFVGf>3=(h`3Jx9s7-$4(Pko_ipJW}w0Q`aIDP{~v7G5VFVjl7b!iS{_=mOXuIJpzV zH>3($z(b_nJQNPsONi?N(8zNUfJiZ`FwnUAlg>+M>jEI4Q=*Vv7$o9L7r;Nf#4X~> z{DKI3ngx6S$TWc{USxvELW}7Dl8JkE8l8gp16=^J64FI+d@Jk*pxS_H+yGP?P>maa zY6Gfq15j;1HEsZ^4XDNqK(ztYSlJ(-iruAFeAhubf52&Hz)b#tqXJ;YX#SXE0w5rj zM(uF^xKjeilE%G8`-YtmKo&&j3hfuJq`QD={%n?x72GWSKL+r7yL@Kz>d@=)@$bbZ z>z10!aIcl(eR49^RBlnDYrvOs7bz2q5~4m=#a~KD8}ciU0rr literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..ae6dc4a60656753776abac0f108c218eec1909a6 GIT binary patch literal 519 zcmV+i0{H!jP); z8pNf8bWmujL-7fmEc6Ln1Q8rfl+Kn81&xAQ9BP~6P}4uQNt3pk!G6Eqz2xLOD2S16;)Yz z&&>fK^f@#TGcPOwDrx^E5wDv=zfDxbp6l|QZN0RUsA$}3Zkr7JjrsshH865?KPC8i z1>lDJqj7D=au#C4XZX~|nam9~Hp(3Xh>1HHY#g=%BSO-88iFAh5OcFvILU14yTQCu zfa(^AiW&xUyp_3QF_vMJ&XG#_Tmt~u>)7}Q#P~yS(P?GJ#-_5u0;o&$8=^=w3hq^M{%t(&vv$eRo> zrM(1D1BGJL0|3r~aa{jL4Aiw>QPExj4EMwewDl}YXHH_P8DOT1UYG+YG2zl_a1B7f zE4vGQhWB4(qa%aQW^(*B5rRgVinId}ROt002ov JPDHLkV1l-Z=QaQU literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d06dd1eac87a9b595209a2bbbc72b25b0abf0ced GIT binary patch literal 877 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9DruR)kGV9JXc1_ow% zPZ!6KiaBp**=7U>iX8v{TrEK7sN%Dqjj}r1nkOyWvGX^h)eg^tYgq#|IdX%&+|^gB zi7j<3dGR7hTrkS@qj?JE3{O|qz z>i5=nWDX>4WRVQweXyiBc9V{KM}eFJk3;(|9n~<#Co>H7tz35*2>pI(9(l6C!>HP; z;WLV9D;+opLJO8C`RqIGowqE&W1B3n1Z?zQ+FT@_WJ`YP*zT`IfeN$H-~Q8T;GW8{U<^{eN)- z8m|DwY8P&VoF=BU0G)S^xzojYYdl}e3E$$ zbPt$-nZgy!uf&`#&NOG=u&u0>Q=Q{RczK=C=Qu}x<`d18j%6kH^kd)tUMP?q{39&) z;+0F5Nwbm@`tua!YNi|!_j=5{Ug~GiT(1kEE3e&Q^3yWrU3R=pPL8392D%{2X&9B;O=o_po7glD2yY#dw8_2@X=T~hl56cvA!a4>4^)ycf5zqM}- zuXKP!_ev2f)55&x3?8xzYdLE)a}XXx@+%VavQK@3Cg1hlAMdiPzRK(v&A9Vbql4su zo}aHaDo9QcpQ{vWd&4iiflHKAO0V(@FMA?uNJrtuu>BwW;u-(XTB@F9?)~0{+3eQS z!w+sga``j;e#-UGV(xoecl`+PIZ_=hd!?4mfNQPaB`%2{tCZK>W;j$V+Zm#Gj9a!a zmW@NmoZ-*KiEAP`BHS!${M~b=Gu}Uz?0sO{3*H+IGuyisyW79+cpJ$s68`JG!3Pib zLvD%*yDSVpxP;fdcX}ap^6Aunjtt2L+hz9&UrtaIoPTNNl6Us&s)Khjo-7jTnXF)8 wb#%>S_6-7jq3h};ZNFu5e~Q$Z#_(CZ)!~v*UDS#wVE$q7boFyt=akR{0MpfWqyPW_ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..e9142ded2c4a3d70745aabacc28239ef3dca9999 GIT binary patch literal 523 zcmV+m0`&cfP){4i2J=xJbp+PAYu@7eNY+_7RFhL1RIOB5Lk&C@E>{Z4(>KVE^gn=H&d}J@?*2 zfd4LP^l~VA-eY!&T`qFgZWzT*P`<-vSt|04!$?N?pVU%&`?Va3dg&!&*B2qUk93o$YW4sC N002ovPDHLkV1gPb;q(9i literal 0 HcmV?d00001 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a597420f366b8311cf13b425883604a72e282334 GIT binary patch literal 880 zcmV-$1CRWPP)5euiWVSpAdjcCj!(%x3{~0oW>UONu1`b4)ZPT3Sc4chCLw znk*GSD3LlYK;r-+GIbP^vB9x?GWx301W|8gE1rr8&`WIGiwA&+0L@s5bhOfhx>i6a zmOdc_W*`yZI#aU2C*4*;%>h{blkNQX_Xhxb8)9w!$k3LygXMcd&A*^sEDWIeE*=0P zE8hR3<^Wc9`=-Rrdp-AXR|CB0!r?twM-k8Gd@k7|-CM{IPNdo6V~6)<*~OJ%0?=(h zHzokx26STr&}~3Bz7L>kBNVmJZ%?R9^@ZiT9l}@ zCOo^gaBunyF~%9#q1uQG^EUWGJ{f&i%a^Kjf{sqL;w@msQ$t`p*L3j!&>=u?!@a3K zl_IVISc!+{nP^a@@EQq#X*iTf9abga2w-<#Y9AAisuHY&fB-!SU3|1nMR7*}%gb~F z3?*U`bcojCH5G;3Zh=!OgybP5zT5)XsBd|d_^SDZ2yx(m3M0UBClk$hNvlw;Ie_d~ zw@jl`5i33cproR-C%$imO#r$L=*9$~+kkFN0J;t6#sr|-fNo3xx((>Y1fbi1Zt6K7 zpo{(0-uSM8rSbv4t$?}m0bd2cL{sHsehMHXT3ScS2b*aRkfCIQV|kZz!+ux+B?5XY zofqEhE1>FO>CG6x>T&tt9~#b0T>j-X+3~8m0nb`he99$zIvZWoZ4bycTBH#$=$neV zZUMYjAtVa{Z&cKE1R(6vEdWIoV)a764+wEjMQuj_-^b(c!Pp3A16E(1ENAzK6n0UQHhsWh`f2EcSM$Tz> + + icons/index.theme + ../qdarkstyle/icons/16x16/lock.png + ../qdarkstyle/icons/16x16/view-refresh.png + ../qdarkstyle/icons/48x48/bad_folder.png + ../qdarkstyle/icons/48x48/chip.png + ../qdarkstyle/icons/48x48/folder.png + ../qdarkstyle/icons/48x48/no_avatar.png + ../qdarkstyle/icons/48x48/list-add.png + ../qdarkstyle/icons/48x48/sd_card.png + ../qdarkstyle/icons/48x48/star.png + ../qdarkstyle/icons/256x256/plus_folder.png + + + rc/arrow_down.png + rc/arrow_down@2x.png + rc/arrow_down_disabled.png + rc/arrow_down_disabled@2x.png + rc/arrow_down_focus.png + rc/arrow_down_focus@2x.png + rc/arrow_down_pressed.png + rc/arrow_down_pressed@2x.png + rc/arrow_left.png + rc/arrow_left@2x.png + rc/arrow_left_disabled.png + rc/arrow_left_disabled@2x.png + rc/arrow_left_focus.png + rc/arrow_left_focus@2x.png + rc/arrow_left_pressed.png + rc/arrow_left_pressed@2x.png + rc/arrow_right.png + rc/arrow_right@2x.png + rc/arrow_right_disabled.png + rc/arrow_right_disabled@2x.png + rc/arrow_right_focus.png + rc/arrow_right_focus@2x.png + rc/arrow_right_pressed.png + rc/arrow_right_pressed@2x.png + rc/arrow_up.png + rc/arrow_up@2x.png + rc/arrow_up_disabled.png + rc/arrow_up_disabled@2x.png + rc/arrow_up_focus.png + rc/arrow_up_focus@2x.png + rc/arrow_up_pressed.png + rc/arrow_up_pressed@2x.png + rc/base_icon.png + rc/base_icon@2x.png + rc/base_icon_disabled.png + rc/base_icon_disabled@2x.png + rc/base_icon_focus.png + rc/base_icon_focus@2x.png + rc/base_icon_pressed.png + rc/base_icon_pressed@2x.png + rc/branch_closed.png + rc/branch_closed@2x.png + rc/branch_closed_disabled.png + rc/branch_closed_disabled@2x.png + rc/branch_closed_focus.png + rc/branch_closed_focus@2x.png + rc/branch_closed_pressed.png + rc/branch_closed_pressed@2x.png + rc/branch_end.png + rc/branch_end@2x.png + rc/branch_end_disabled.png + rc/branch_end_disabled@2x.png + rc/branch_end_focus.png + rc/branch_end_focus@2x.png + rc/branch_end_pressed.png + rc/branch_end_pressed@2x.png + rc/branch_line.png + rc/branch_line@2x.png + rc/branch_line_disabled.png + rc/branch_line_disabled@2x.png + rc/branch_line_focus.png + rc/branch_line_focus@2x.png + rc/branch_line_pressed.png + rc/branch_line_pressed@2x.png + rc/branch_more.png + rc/branch_more@2x.png + rc/branch_more_disabled.png + rc/branch_more_disabled@2x.png + rc/branch_more_focus.png + rc/branch_more_focus@2x.png + rc/branch_more_pressed.png + rc/branch_more_pressed@2x.png + rc/branch_open.png + rc/branch_open@2x.png + rc/branch_open_disabled.png + rc/branch_open_disabled@2x.png + rc/branch_open_focus.png + rc/branch_open_focus@2x.png + rc/branch_open_pressed.png + rc/branch_open_pressed@2x.png + rc/checkbox_checked.png + rc/checkbox_checked@2x.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_disabled@2x.png + rc/checkbox_checked_focus.png + rc/checkbox_checked_focus@2x.png + rc/checkbox_checked_pressed.png + rc/checkbox_checked_pressed@2x.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate@2x.png + rc/checkbox_indeterminate_disabled.png + rc/checkbox_indeterminate_disabled@2x.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_indeterminate_focus@2x.png + rc/checkbox_indeterminate_pressed.png + rc/checkbox_indeterminate_pressed@2x.png + rc/checkbox_unchecked.png + rc/checkbox_unchecked@2x.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_disabled@2x.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked_focus@2x.png + rc/checkbox_unchecked_pressed.png + rc/checkbox_unchecked_pressed@2x.png + rc/line_horizontal.png + rc/line_horizontal@2x.png + rc/line_horizontal_disabled.png + rc/line_horizontal_disabled@2x.png + rc/line_horizontal_focus.png + rc/line_horizontal_focus@2x.png + rc/line_horizontal_pressed.png + rc/line_horizontal_pressed@2x.png + rc/line_vertical.png + rc/line_vertical@2x.png + rc/line_vertical_disabled.png + rc/line_vertical_disabled@2x.png + rc/line_vertical_focus.png + rc/line_vertical_focus@2x.png + rc/line_vertical_pressed.png + rc/line_vertical_pressed@2x.png + rc/radio_checked.png + rc/radio_checked@2x.png + rc/radio_checked_disabled.png + rc/radio_checked_disabled@2x.png + rc/radio_checked_focus.png + rc/radio_checked_focus@2x.png + rc/radio_checked_pressed.png + rc/radio_checked_pressed@2x.png + rc/radio_unchecked.png + rc/radio_unchecked@2x.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_disabled@2x.png + rc/radio_unchecked_focus.png + rc/radio_unchecked_focus@2x.png + rc/radio_unchecked_pressed.png + rc/radio_unchecked_pressed@2x.png + rc/toolbar_move_horizontal.png + rc/toolbar_move_horizontal@2x.png + rc/toolbar_move_horizontal_disabled.png + rc/toolbar_move_horizontal_disabled@2x.png + rc/toolbar_move_horizontal_focus.png + rc/toolbar_move_horizontal_focus@2x.png + rc/toolbar_move_horizontal_pressed.png + rc/toolbar_move_horizontal_pressed@2x.png + rc/toolbar_move_vertical.png + rc/toolbar_move_vertical@2x.png + rc/toolbar_move_vertical_disabled.png + rc/toolbar_move_vertical_disabled@2x.png + rc/toolbar_move_vertical_focus.png + rc/toolbar_move_vertical_focus@2x.png + rc/toolbar_move_vertical_pressed.png + rc/toolbar_move_vertical_pressed@2x.png + rc/toolbar_separator_horizontal.png + rc/toolbar_separator_horizontal@2x.png + rc/toolbar_separator_horizontal_disabled.png + rc/toolbar_separator_horizontal_disabled@2x.png + rc/toolbar_separator_horizontal_focus.png + rc/toolbar_separator_horizontal_focus@2x.png + rc/toolbar_separator_horizontal_pressed.png + rc/toolbar_separator_horizontal_pressed@2x.png + rc/toolbar_separator_vertical.png + rc/toolbar_separator_vertical@2x.png + rc/toolbar_separator_vertical_disabled.png + rc/toolbar_separator_vertical_disabled@2x.png + rc/toolbar_separator_vertical_focus.png + rc/toolbar_separator_vertical_focus@2x.png + rc/toolbar_separator_vertical_pressed.png + rc/toolbar_separator_vertical_pressed@2x.png + rc/transparent.png + rc/transparent@2x.png + rc/transparent_disabled.png + rc/transparent_disabled@2x.png + rc/transparent_focus.png + rc/transparent_focus@2x.png + rc/transparent_pressed.png + rc/transparent_pressed@2x.png + rc/window_close.png + rc/window_close@2x.png + rc/window_close_disabled.png + rc/window_close_disabled@2x.png + rc/window_close_focus.png + rc/window_close_focus@2x.png + rc/window_close_pressed.png + rc/window_close_pressed@2x.png + rc/window_grip.png + rc/window_grip@2x.png + rc/window_grip_disabled.png + rc/window_grip_disabled@2x.png + rc/window_grip_focus.png + rc/window_grip_focus@2x.png + rc/window_grip_pressed.png + rc/window_grip_pressed@2x.png + rc/window_minimize.png + rc/window_minimize@2x.png + rc/window_minimize_disabled.png + rc/window_minimize_disabled@2x.png + rc/window_minimize_focus.png + rc/window_minimize_focus@2x.png + rc/window_minimize_pressed.png + rc/window_minimize_pressed@2x.png + rc/window_undock.png + rc/window_undock@2x.png + rc/window_undock_disabled.png + rc/window_undock_disabled@2x.png + rc/window_undock_focus.png + rc/window_undock_focus@2x.png + rc/window_undock_pressed.png + rc/window_undock_pressed@2x.png + + + style.qss + + diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss new file mode 100644 index 0000000..eb0889b --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss @@ -0,0 +1,2918 @@ +/* --------------------------------------------------------------------------- + + Created by the qtsass compiler v0.1.1 + + The definitions are in the "qdarkstyle.qss._styles.scss" module + + WARNING! All changes made in this file will be lost! + +--------------------------------------------------------------------------- */ +/* QDarkStyleSheet ----------------------------------------------------------- + +This is the main style sheet, the palette has nine colors. + +It is based on three selecting colors, three greyish (background) colors +plus three whitish (foreground) colors. Each set of widgets of the same +type have a header like this: + + ------------------ + GroupName -------- + ------------------ + +And each widget is separated with a header like this: + + QWidgetName ------ + +This makes more easy to find and change some css field. The basic +configuration is described bellow. + + BACKGROUND ----------- + + Light (unpressed) + Normal (border, disabled, pressed, checked, toolbars, menus) + Dark (background) + + FOREGROUND ----------- + + Light (texts/labels) + Normal (not used yet) + Dark (disabled texts) + + SELECTION ------------ + + Light (selection/hover/active) + Normal (selected) + Dark (selected disabled) + +If a stranger configuration is required because of a bugfix or anything +else, keep the comment on the line above so nobody changes it, including the +issue number. + +*/ +/* + +See Qt documentation: + + - https://doc.qt.io/qt-5/stylesheet.html + - https://doc.qt.io/qt-5/stylesheet-reference.html + - https://doc.qt.io/qt-5/stylesheet-examples.html + +--------------------------------------------------------------------------- */ +/* QWidget ---------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QWidget { + background-color: #19232D; + border: 0px solid #32414B; + padding: 0px; + color: #F0F0F0; + selection-background-color: #1464A0; + selection-color: #F0F0F0; +} + +QWidget:disabled { + background-color: #19232D; + color: #787878; + selection-background-color: #14506E; + selection-color: #787878; +} + +QWidget::item:selected { + background-color: #1464A0; +} + +QWidget::item:hover { + background-color: #148CD2; + color: #32414B; +} + +/* QMainWindow ------------------------------------------------------------ + +This adjusts the splitter in the dock widget, not qsplitter +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmainwindow + +--------------------------------------------------------------------------- */ +QMainWindow::separator { + background-color: #32414B; + border: 0px solid #19232D; + spacing: 0px; + padding: 2px; +} + +QMainWindow::separator:hover { + background-color: #505F69; + border: 0px solid #148CD2; +} + +QMainWindow::separator:horizontal { + width: 5px; + margin-top: 2px; + margin-bottom: 2px; + image: url(":/qss_icons/rc/toolbar_separator_vertical.png"); +} + +QMainWindow::separator:vertical { + height: 5px; + margin-left: 2px; + margin-right: 2px; + image: url(":/qss_icons/rc/toolbar_separator_horizontal.png"); +} + +/* QToolTip --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtooltip + +--------------------------------------------------------------------------- */ +QToolTip { + background-color: #148CD2; + border: 1px solid #19232D; + color: #19232D; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Remove opacity, fix #174 - may need to use RGBA */ +} + +/* QStatusBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qstatusbar + +--------------------------------------------------------------------------- */ +QStatusBar { + background: #32414B; + /* Fixes #205, white vertical borders separating items */ +} + +QStatusBar::item { + border: none; +} + +QStatusBar QToolTip { + background-color: #148CD2; + border: 1px solid #19232D; + color: #19232D; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Reducing transparency to read better */ + opacity: 230; +} + +QStatusBar QLabel { + /* Fixes Spyder #9120, #9121 */ + background: transparent; + padding: 0px; +} + +/* QCheckBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcheckbox + +--------------------------------------------------------------------------- */ +QCheckBox { + background-color: #19232D; + color: #F0F0F0; + spacing: 4px; + outline: none; + padding-top: 2px; + padding-bottom: 2px; +} + +QCheckBox:focus { + border: none; +} + +QCheckBox QWidget:disabled { + background-color: #19232D; + color: #787878; +} + +QCheckBox::indicator { + margin-left: 4px; + height: 16px; + width: 16px; +} + +QCheckBox::indicator:unchecked { + image: url(":/qss_icons/rc/checkbox_unchecked.png"); +} + +QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); +} + +QCheckBox::indicator:unchecked:disabled { + image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); +} + +QCheckBox::indicator:checked { + image: url(":/qss_icons/rc/checkbox_checked.png"); +} + +QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_checked_focus.png"); +} + +QCheckBox::indicator:checked:disabled { + image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); +} + +QCheckBox::indicator:indeterminate { + image: url(":/qss_icons/rc/checkbox_indeterminate.png"); +} + +QCheckBox::indicator:indeterminate:disabled { + image: url(":/qss_icons/rc/checkbox_indeterminate_disabled.png"); +} + +QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed { + image: url(":/qss_icons/rc/checkbox_indeterminate_focus.png"); +} + +/* QGroupBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox + +--------------------------------------------------------------------------- */ +QGroupBox { + font-weight: bold; + border: 1px solid #32414B; + border-radius: 4px; + margin-top: 12px; + padding: 2px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 3px; + padding-right: 5px; + padding-top: 2px; +} + +QGroupBox::indicator { + margin-left: 2px; + height: 16px; + width: 16px; +} + +QGroupBox::indicator:unchecked { + border: none; + image: url(":/qss_icons/rc/checkbox_unchecked.png"); +} + +QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); +} + +QGroupBox::indicator:unchecked:disabled { + image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); +} + +QGroupBox::indicator:checked { + border: none; + image: url(":/qss_icons/rc/checkbox_checked.png"); +} + +QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_checked_focus.png"); +} + +QGroupBox::indicator:checked:disabled { + image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); +} + +/* QRadioButton ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qradiobutton + +--------------------------------------------------------------------------- */ +QRadioButton { + background-color: #19232D; + color: #F0F0F0; + spacing: 4px; + padding: 0px; + border: none; + outline: none; +} + +QGroupBox QRadioButton { + padding-left: 0px; + padding-right: 7px; +} + +QRadioButton:focus { + border: none; +} + +QRadioButton:disabled { + background-color: #19232D; + color: #787878; + border: none; + outline: none; +} + +QRadioButton QWidget { + background-color: #19232D; + color: #F0F0F0; + spacing: 0px; + padding: 0px; + outline: none; + border: none; +} + +QRadioButton::indicator { + border: none; + outline: none; + height: 16px; + width: 16px; +} + +QRadioButton::indicator:unchecked { + image: url(":/qss_icons/rc/radio_unchecked.png"); +} + +QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:focus, QRadioButton::indicator:unchecked:pressed { + border: none; + outline: none; + image: url(":/qss_icons/rc/radio_unchecked_focus.png"); +} + +QRadioButton::indicator:unchecked:disabled { + image: url(":/qss_icons/rc/radio_unchecked_disabled.png"); +} + +QRadioButton::indicator:checked { + border: none; + outline: none; + image: url(":/qss_icons/rc/radio_checked.png"); +} + +QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { + border: none; + outline: none; + image: url(":/qss_icons/rc/radio_checked_focus.png"); +} + +QRadioButton::indicator:checked:disabled { + outline: none; + image: url(":/qss_icons/rc/radio_checked_disabled.png"); +} + +/* QMenuBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenubar + +--------------------------------------------------------------------------- */ +QMenuBar { + background-color: #32414B; + color: #F0F0F0; +} + +QMenuBar::item { + background: transparent; +} + +QMenuBar::item:selected { + background: transparent; + border: 0px solid #32414B; +} + +QMenuBar::item:pressed { + border: 0px solid #32414B; + background-color: #148CD2; + color: #F0F0F0; + margin-bottom: 0px; + padding-bottom: 0px; +} + + +/* QMenu ------------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenu + +--------------------------------------------------------------------------- */ +QMenu { + border: 0px solid #32414B; + color: #F0F0F0; + margin: 0px; +} + +QMenu::separator { + height: 1px; + background-color: #505F69; + color: #F0F0F0; +} + +QMenu::icon { + margin: 0px; + padding-left: 8px; +} + +QMenu::item { + background-color: #32414B; + padding: 4px 24px 4px 24px; + /* Reserve space for selection border */ + border: 1px transparent #32414B; +} + +QMenu::item:selected { + color: #F0F0F0; +} + +QMenu::indicator { + width: 12px; + height: 12px; + padding-left: 6px; + /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ + /* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +} + +QMenu::indicator:non-exclusive:unchecked { + image: url(":/qss_icons/rc/checkbox_unchecked.png"); +} + +QMenu::indicator:non-exclusive:unchecked:selected { + image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); +} + +QMenu::indicator:non-exclusive:checked { + image: url(":/qss_icons/rc/checkbox_checked.png"); +} + +QMenu::indicator:non-exclusive:checked:selected { + image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); +} + +QMenu::indicator:exclusive:unchecked { + image: url(":/qss_icons/rc/radio_unchecked.png"); +} + +QMenu::indicator:exclusive:unchecked:selected { + image: url(":/qss_icons/rc/radio_unchecked_disabled.png"); +} + +QMenu::indicator:exclusive:checked { + image: url(":/qss_icons/rc/radio_checked.png"); +} + +QMenu::indicator:exclusive:checked:selected { + image: url(":/qss_icons/rc/radio_checked_disabled.png"); +} + +QMenu::right-arrow { + margin: 5px; + image: url(":/qss_icons/rc/arrow_right.png"); + height: 12px; + width: 12px; +} + +/* QAbstractItemView ------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QAbstractItemView { + alternate-background-color: #1f2933; + color: #F0F0F0; + border: 1px solid #32414B; + border-radius: 4px; +} + +QAbstractItemView QLineEdit { + padding: 2px; +} + +/* QAbstractScrollArea ---------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QAbstractScrollArea { + background-color: #19232D; + border: 1px solid #32414B; + border-radius: 4px; + /* fix #159 */ + min-height: 1.25em; + /* fix #159 */ + color: #F0F0F0; +} + + +QAbstractScrollArea:disabled { + color: #787878; +} + +/* QScrollArea ------------------------------------------------------------ + +--------------------------------------------------------------------------- */ +QScrollArea QWidget QWidget:disabled { + background-color: #19232D; +} + +/* QScrollBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qscrollbar + +--------------------------------------------------------------------------- */ +QScrollBar:horizontal { + height: 16px; + margin: 2px 16px 2px 16px; + border: 1px solid #32414B; + border-radius: 4px; + background-color: #19232D; +} + +QScrollBar:vertical { + background-color: #19232D; + width: 16px; + margin: 16px 2px 16px 2px; + border: 1px solid #32414B; + border-radius: 4px; +} + +QScrollBar::handle:horizontal { + background-color: #787878; + border: 1px solid #32414B; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:hover { + background-color: #148CD2; + border: 1px solid #148CD2; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:focus { + border: 1px solid #1464A0; +} + +QScrollBar::handle:vertical { + background-color: #787878; + border: 1px solid #32414B; + min-height: 8px; + border-radius: 4px; +} + +QScrollBar::handle:vertical:hover { + background-color: #148CD2; + border: 1px solid #148CD2; + border-radius: 4px; + min-height: 8px; +} + +QScrollBar::handle:vertical:focus { + border: 1px solid #1464A0; +} + +QScrollBar::add-line:horizontal { + margin: 0px 0px 0px 0px; + border-image: url(":/qss_icons/rc/arrow_right_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { + border-image: url(":/qss_icons/rc/arrow_right.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(":/qss_icons/rc/arrow_down_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { + border-image: url(":/qss_icons/rc/arrow_down.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 0px 3px 0px 3px; + border-image: url(":/qss_icons/rc/arrow_left_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { + border-image: url(":/qss_icons/rc/arrow_left.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url(":/qss_icons/rc/arrow_up_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { + border-image: url(":/qss_icons/rc/arrow_up.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { + background: none; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { + background: none; +} + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: none; +} + +/* QTextEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-specific-widgets + +--------------------------------------------------------------------------- */ +QTextEdit { + background-color: #19232D; + color: #F0F0F0; + border-radius: 4px; + border: 1px solid #32414B; +} + +QTextEdit:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QTextEdit:focus { + border: 1px solid #1464A0; +} + +QTextEdit:selected { + background: #1464A0; + color: #32414B; +} + +/* QPlainTextEdit --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QPlainTextEdit { + background-color: #19232D; + color: #F0F0F0; + border-radius: 4px; + border: 1px solid #32414B; +} + +QPlainTextEdit:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QPlainTextEdit:focus { + border: 1px solid #1464A0; +} + +QPlainTextEdit:selected { + background: #1464A0; + color: #32414B; +} + +/* QSizeGrip -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsizegrip + +--------------------------------------------------------------------------- */ +QSizeGrip { + background: transparent; + width: 12px; + height: 12px; + image: url(":/qss_icons/rc/window_grip.png"); +} + +/* QStackedWidget --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QStackedWidget { + padding: 2px; + border: 1px solid #32414B; + border: 1px solid #19232D; +} + +/* QToolBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbar + +--------------------------------------------------------------------------- */ +QToolBar { + background-color: #32414B; + border-bottom: 1px solid #19232D; + padding: 2px; + font-weight: bold; + spacing: 2px; +} + +QToolBar QToolButton { + background-color: #32414B; + border: 1px solid #32414B; +} + +QToolBar QToolButton:hover { + border: 1px solid #148CD2; +} + +QToolBar QToolButton:checked { + border: 1px solid #19232D; + background-color: #19232D; +} + +QToolBar QToolButton:checked:hover { + border: 1px solid #148CD2; +} + +QToolBar::handle:horizontal { + width: 16px; + image: url(":/qss_icons/rc/toolbar_move_horizontal.png"); +} + +QToolBar::handle:vertical { + height: 16px; + image: url(":/qss_icons/rc/toolbar_move_vertical.png"); +} + +QToolBar::separator:horizontal { + width: 16px; + image: url(":/qss_icons/rc/toolbar_separator_horizontal.png"); +} + +QToolBar::separator:vertical { + height: 16px; + image: url(":/qss_icons/rc/toolbar_separator_vertical.png"); +} + +QToolButton#qt_toolbar_ext_button { + background: #32414B; + border: 0px; + color: #F0F0F0; + image: url(":/qss_icons/rc/arrow_right.png"); +} + +/* QAbstractSpinBox ------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractSpinBox { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; + min-height: 19px; +} + +QAbstractSpinBox:up-button { + background-color: #505F69; + subcontrol-origin: border; + subcontrol-position: top right; + border-left: 1px solid #32414B; + border-top: 1px solid #32414B; + border-right: 1px solid #32414B; + border-top-right-radius: 4px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 0px; + width: 12px; + margin-bottom: 0px; +} + +QAbstractSpinBox::up-arrow, QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off { + image: url(":/qss_icons/rc/up_arrow.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::up-arrow:hover { + image: url(":/qss_icons/rc/arrow_up.png"); +} + +QAbstractSpinBox:down-button { + background-color: #505F69; + subcontrol-origin: border; + subcontrol-position: bottom right; + border-left: 1px solid #32414B; + border-right: 1px solid #32414B; + border-bottom: 1px solid #32414B; + border-top: 1px solid #32414B; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-bottom-right-radius: 4px; + margin: 0px; + width: 12px; + margin-top: 0px; +} + +QAbstractSpinBox::down-arrow, QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off { + image: url(":/qss_icons/rc/down_arrow.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::down-arrow:hover { + image: url(":/qss_icons/rc/arrow_down.png"); +} + +QAbstractSpinBox:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QAbstractSpinBox:focus { + border: 1px solid #1464A0; +} + +QAbstractSpinBox:selected { + background: #1464A0; + color: #32414B; +} + +/* ------------------------------------------------------------------------ */ +/* DISPLAYS --------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QLabel ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe + +--------------------------------------------------------------------------- */ +QLabel { + background: transparent; + border: 0px solid #32414B; + padding: 2px; + margin: 0px; + color: #F0F0F0; +} + +QLabel:disabled { + border: 0px solid #32414B; + color: #787878; +} + +/* QTextBrowser ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QTextBrowser { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; +} + +QTextBrowser:disabled { + background-color: #19232D; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; +} + +QTextBrowser:hover, QTextBrowser:!hover, QTextBrowser:selected, QTextBrowser:pressed { + border: 1px solid #32414B; +} + +/* QGraphicsView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QGraphicsView { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; +} + +QGraphicsView:disabled { + background-color: #19232D; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; +} + +QGraphicsView:hover, QGraphicsView:!hover, QGraphicsView:selected, QGraphicsView:pressed { + border: 1px solid #32414B; +} + +/* QCalendarWidget -------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCalendarWidget { + border: 1px solid #32414B; + border-radius: 4px; +} + +QCalendarWidget:disabled { + background-color: #19232D; + color: #787878; +} + +/* QLCDNumber ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QLCDNumber { + background-color: #19232D; + color: #F0F0F0; +} + +QLCDNumber:disabled { + background-color: #19232D; + color: #787878; +} + +/* QProgressBar ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qprogressbar + +--------------------------------------------------------------------------- */ +QProgressBar { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; + text-align: center; +} + +QProgressBar:disabled { + background-color: #19232D; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #1464A0; + color: #19232D; + border-radius: 4px; +} + +QProgressBar::chunk:disabled { + background-color: #14506E; + color: #787878; + border-radius: 4px; +} + +/* ------------------------------------------------------------------------ */ +/* BUTTONS ---------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QPushButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qpushbutton + +--------------------------------------------------------------------------- */ +QPushButton { + background-color: #505F69; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; + padding: 3px 0px 3px 0px; + outline: none; + /* Issue #194 - Special case of QPushButton inside dialogs, for better UI */ + min-width: 80px; + min-height: 13px; +} + +QPushButton:disabled { + background-color: #32414B; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; + padding: 3px 0px 3px 0px; +} + +QPushButton:checked { + background-color: #32414B; + border: 1px solid #32414B; + border-radius: 4px; + padding: 3px 0px 3px 0px; + outline: none; +} + +QPushButton:checked:disabled { + background-color: #19232D; + border: 1px solid #32414B; + color: #787878; + border-radius: 4px; + padding: 3px 0px 3px 0px; + outline: none; +} + +QPushButton:checked:selected { + background: #1464A0; + color: #32414B; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + bottom: 4px; +} + +QPushButton:pressed { + background-color: #19232D; + border: 1px solid #19232D; +} + +QPushButton:pressed:hover { + border: 1px solid #148CD2; +} + +QPushButton:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QPushButton:selected { + background: #1464A0; + color: #32414B; +} + +QPushButton:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QPushButton:focus { + border: 1px solid #1464A0; +} + +/* QToolButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbutton + +--------------------------------------------------------------------------- */ +QToolButton { + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; + margin: 0px; + padding: 2px; + /* The subcontrols below are used only in the DelayedPopup mode */ + /* The subcontrols below are used only in the MenuButtonPopup mode */ + /* The subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +} + +QToolButton:checked { + background-color: transparent; + border: 1px solid #1464A0; +} + +QToolButton:checked:disabled { + border: 1px solid #14506E; +} + +QToolButton:pressed { + margin: 1px; + background-color: transparent; + border: 1px solid #1464A0; +} + +QToolButton:disabled { + border: none; +} + +QToolButton:hover { + border: 1px solid #148CD2; +} + +QToolButton[popupMode="0"] { + /* Only for DelayedPopup */ + padding-right: 2px; +} + +QToolButton[popupMode="1"] { + /* Only for MenuButtonPopup */ + padding-right: 20px; +} + +QToolButton[popupMode="1"]::menu-button { + border: none; +} + +QToolButton[popupMode="1"]::menu-button:hover { + border: none; + border-left: 1px solid #148CD2; + border-radius: 0; +} + +QToolButton[popupMode="2"] { + /* Only for InstantPopup */ + padding-right: 2px; +} + +QToolButton::menu-button { + padding: 2px; + border-radius: 4px; + border: 1px solid #32414B; + width: 12px; + outline: none; +} + +QToolButton::menu-button:hover { + border: 1px solid #148CD2; +} + +QToolButton::menu-button:checked:hover { + border: 1px solid #148CD2; +} + +QToolButton::menu-indicator { + image: url(":/qss_icons/rc/arrow_down.png"); + height: 8px; + width: 8px; + top: 0; + /* Exclude a shift for better image */ + left: -2px; + /* Shift it a bit */ +} + +QToolButton::menu-arrow { + image: url(":/qss_icons/rc/arrow_down.png"); + height: 8px; + width: 8px; +} + +QToolButton::menu-arrow:hover { + image: url(":/qss_icons/rc/arrow_down_focus.png"); +} + +/* QCommandLinkButton ----------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCommandLinkButton { + background-color: transparent; + border: 1px solid #32414B; + color: #F0F0F0; + border-radius: 4px; + padding: 0px; + margin: 0px; +} + +QCommandLinkButton:disabled { + background-color: transparent; + color: #787878; +} + +/* ------------------------------------------------------------------------ */ +/* INPUTS - NO FIELDS ----------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QComboBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QComboBox { + background-color: #0f1922; + border: 1px solid #32414B; + border-radius: 4px; + selection-background-color: #1464A0; + padding: 0px 4px 0px 4px; + min-width: 60px; + min-height: 19px; +} + +QComboBox QAbstractItemView { + border: 1px solid #32414B; + border-radius: 0; + background-color: #0f1922; + selection-background-color: #1464A0; +} + +QComboBox QAbstractItemView:hover { + background-color: #19232D; + color: #F0F0F0; +} + +QComboBox QAbstractItemView:selected { + background: #1464A0; + color: #32414B; +} + +QComboBox QAbstractItemView:alternate { + background: #19232D; +} + +QComboBox:disabled { + background-color: #19232D; + color: #787878; +} + +QComboBox:hover { + border: 1px solid #148CD2; +} + +QComboBox:focus { + border: 1px solid #1464A0; +} + +QComboBox:on { + selection-background-color: #1464A0; +} + +QComboBox::indicator { + border: none; + border-radius: 0; + background-color: transparent; + selection-background-color: transparent; + color: transparent; + selection-color: transparent; + /* Needed to remove indicator - fix #132 */ +} + +QComboBox::indicator:alternate { + background: #19232D; +} + +QComboBox::item:alternate { + background: #19232D; +} + +QComboBox::item:selected { + border: 0px solid transparent; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #32414B; +} + +QComboBox::down-arrow { + image: url(":/qss_icons/rc/down_arrow.png"); + background-color: #505F69; + padding: 6px 2px; + border: 1px solid #32414B; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 8px; + width: 8px; +} + +QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { + image: url(":/qss_icons/rc/arrow_down.png"); +} + +/* QSlider ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qslider + +--------------------------------------------------------------------------- */ +QSlider:disabled { + background: #19232D; +} + +QSlider:focus { + border: none; +} + +QSlider::groove:horizontal { + background: #32414B; + border: 1px solid #32414B; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::groove:vertical { + background: #32414B; + border: 1px solid #32414B; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical { + background: #1464A0; + border: 1px solid #32414B; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical :disabled { + background: #14506E; +} + +QSlider::sub-page:horizontal { + background: #1464A0; + border: 1px solid #32414B; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal:disabled { + background: #14506E; +} + +QSlider::handle:horizontal { + background: #787878; + border: 1px solid #32414B; + width: 8px; + height: 8px; + margin: -8px 0px; + border-radius: 4px; +} + +QSlider::handle:horizontal:hover { + background: #148CD2; + border: 1px solid #148CD2; +} + +QSlider::handle:horizontal:focus { + border: 1px solid #1464A0; +} + +QSlider::handle:vertical { + background: #787878; + border: 1px solid #32414B; + width: 8px; + height: 8px; + margin: 0 -8px; + border-radius: 4px; +} + +QSlider::handle:vertical:hover { + background: #148CD2; + border: 1px solid #148CD2; +} + +QSlider::handle:vertical:focus { + border: 1px solid #1464A0; +} + +/* QLineEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlineedit + +--------------------------------------------------------------------------- */ +QLineEdit { + background-color: #19232D; + padding-top: 2px; + /* This QLineEdit fix 103, 111 */ + padding-bottom: 2px; + /* This QLineEdit fix 103, 111 */ + padding-left: 4px; + padding-right: 4px; + border-style: solid; + border: 1px solid #32414B; + border-radius: 4px; + color: #F0F0F0; +} + +QLineEdit:disabled { + background-color: #19232D; + color: #787878; +} + +QLineEdit:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QLineEdit:focus { + border: 1px solid #1464A0; +} + +QLineEdit:selected { + background-color: #1464A0; + color: #32414B; +} + +/* QTabWiget -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabWidget { + padding: 2px; + selection-background-color: #32414B; +} + +QTabWidget QWidget { + /* Fixes #189 */ + border-radius: 4px; +} + +QTabWidget::pane { + border: 1px solid #32414B; + border-radius: 4px; + margin: 0px; + /* Fixes double border inside pane with pyqt5 */ + padding: 0px; +} + +QTabWidget::pane:selected { + background-color: #32414B; + border: 1px solid #1464A0; +} + +/* QTabBar ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabBar { + qproperty-drawBase: 0; + border-radius: 4px; + margin: 0px; + padding: 2px; + border: 0; + /* left: 5px; move to the right by 5px - removed for fix */ +} + +QTabBar::close-button { + border: 0; + margin: 2px; + padding: 2px; + image: url(":/qss_icons/rc/window_close.png"); +} + +QTabBar::close-button:hover { + image: url(":/qss_icons/rc/window_close_focus.png"); +} + +QTabBar::close-button:pressed { + image: url(":/qss_icons/rc/window_close_pressed.png"); +} + +/* QTabBar::tab - selected ------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabBar::tab { + /* !selected and disabled ----------------------------------------- */ + /* selected ------------------------------------------------------- */ +} + +QTabBar::tab:top:selected:disabled { + border-bottom: 3px solid #14506E; + color: #787878; + background-color: #32414B; +} + +QTabBar::tab:bottom:selected:disabled { + border-top: 3px solid #14506E; + color: #787878; + background-color: #32414B; +} + +QTabBar::tab:left:selected:disabled { + border-right: 3px solid #14506E; + color: #787878; + background-color: #32414B; +} + +QTabBar::tab:right:selected:disabled { + border-left: 3px solid #14506E; + color: #787878; + background-color: #32414B; +} + +QTabBar::tab:top:!selected:disabled { + border-bottom: 3px solid #19232D; + color: #787878; + background-color: #19232D; +} + +QTabBar::tab:bottom:!selected:disabled { + border-top: 3px solid #19232D; + color: #787878; + background-color: #19232D; +} + +QTabBar::tab:left:!selected:disabled { + border-right: 3px solid #19232D; + color: #787878; + background-color: #19232D; +} + +QTabBar::tab:right:!selected:disabled { + border-left: 3px solid #19232D; + color: #787878; + background-color: #19232D; +} + +QTabBar::tab:top:!selected { + border-bottom: 2px solid #19232D; + margin-top: 2px; +} + +QTabBar::tab:bottom:!selected { + border-top: 2px solid #19232D; + margin-bottom: 3px; +} + +QTabBar::tab:left:!selected { + border-left: 2px solid #19232D; + margin-right: 2px; +} + +QTabBar::tab:right:!selected { + border-right: 2px solid #19232D; + margin-left: 2px; +} + +QTabBar::tab:top { + background-color: #32414B; + color: #F0F0F0; + min-width: 36px; + margin-left: 2px; + padding-left: 8px; + padding-right: 8px; + padding-top: 2px; + padding-bottom: 2px; + border-bottom: 3px solid #32414B; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +QTabBar::tab:top:selected { + background-color: #505F69; + color: #F0F0F0; + border-bottom: 3px solid #1464A0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +QTabBar::tab:top:!selected:hover { + border: 1px solid #148CD2; + border-bottom: 3px solid #148CD2; + /* Fixes spyder-ide/spyder#9766 */ + padding-left: 4px; + padding-right: 4px; +} + +QTabBar::tab:bottom { + color: #F0F0F0; + min-width: 36px; + border-top: 3px solid #32414B; + background-color: #32414B; + margin-left: 2px; + padding-left: 8px; + padding-right: 8px; + padding-top: 2px; + padding-bottom: 2px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +QTabBar::tab:bottom:selected { + color: #F0F0F0; + background-color: #505F69; + border-top: 3px solid #1464A0; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +QTabBar::tab:bottom:!selected:hover { + border: 1px solid #148CD2; + border-top: 3px solid #148CD2; + /* Fixes spyder-ide/spyder#9766 */ + padding-left: 4px; + padding-right: 4px; +} + +QTabBar::tab:left { + color: #F0F0F0; + background-color: #32414B; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + min-height: 5px; +} + +QTabBar::tab:left:selected { + color: #F0F0F0; + background-color: #505F69; + border-right: 3px solid #1464A0; +} + +QTabBar::tab:left:!selected:hover { + border: 1px solid #148CD2; + border-right: 3px solid #148CD2; + padding: 0px; +} + +QTabBar::tab:right { + color: #F0F0F0; + background-color: #32414B; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + min-height: 5px; +} + +QTabBar::tab:right:selected { + color: #F0F0F0; + background-color: #505F69; + border-left: 3px solid #1464A0; +} + +QTabBar::tab:right:!selected:hover { + border: 1px solid #148CD2; + border-left: 3px solid #148CD2; + padding: 0px; +} + +QTabBar QToolButton { + /* Fixes #136 */ + background-color: #32414B; + height: 12px; + width: 12px; +} + +QTabBar QToolButton:pressed { + background-color: #32414B; +} + +QTabBar QToolButton:pressed:hover { + border: 1px solid #148CD2; +} + +QTabBar QToolButton::left-arrow:enabled { + image: url(":/qss_icons/rc/arrow_left.png"); +} + +QTabBar QToolButton::left-arrow:disabled { + image: url(":/qss_icons/rc/arrow_left_disabled.png"); +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(":/qss_icons/rc/arrow_right.png"); +} + +QTabBar QToolButton::right-arrow:disabled { + image: url(":/qss_icons/rc/arrow_right_disabled.png"); +} + +/* QDockWiget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QDockWidget { + outline: 1px solid #32414B; + background-color: #19232D; + border: 1px solid #32414B; + border-radius: 4px; + titlebar-close-icon: url(":/qss_icons/rc/window_close.png"); + titlebar-normal-icon: url(":/qss_icons/rc/window_undock.png"); +} + +QDockWidget::title { + /* Better size for title bar */ + padding: 6px; + spacing: 4px; + border: none; + background-color: #32414B; +} + +QDockWidget::close-button { + background-color: #32414B; + border-radius: 4px; + border: none; +} + +QDockWidget::close-button:hover { + image: url(":/qss_icons/rc/window_close_focus.png"); +} + +QDockWidget::close-button:pressed { + image: url(":/qss_icons/rc/window_close_pressed.png"); +} + +QDockWidget::float-button { + background-color: #32414B; + border-radius: 4px; + border: none; +} + +QDockWidget::float-button:hover { + image: url(":/qss_icons/rc/window_undock_focus.png"); +} + +QDockWidget::float-button:pressed { + image: url(":/qss_icons/rc/window_undock_pressed.png"); +} + +/* QTreeView QListView QTableView ----------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtreeview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlistview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtableview + +--------------------------------------------------------------------------- */ + +QTreeView:branch:has-children:!has-siblings:closed, QTreeView:branch:closed:has-children:has-siblings { + border-image: none; + image: url(":/qss_icons/rc/branch_closed.png"); +} + +QTreeView:branch:open:has-children:!has-siblings, QTreeView:branch:open:has-children:has-siblings { + border-image: none; + image: url(":/qss_icons/rc/branch_open.png"); +} + +QTreeView:branch:has-children:!has-siblings:closed:hover, QTreeView:branch:closed:has-children:has-siblings:hover { + image: url(":/qss_icons/rc/branch_closed_focus.png"); +} + +QTreeView:branch:open:has-children:!has-siblings:hover, QTreeView:branch:open:has-children:has-siblings:hover { + image: url(":/qss_icons/rc/branch_open_focus.png"); +} + +QTreeView::indicator:checked, +QListView::indicator:checked { + image: url(":/qss_icons/rc/checkbox_checked.png"); +} + +QTreeView::indicator:checked:hover, QTreeView::indicator:checked:focus, QTreeView::indicator:checked:pressed, +QListView::indicator:checked:hover, +QListView::indicator:checked:focus, +QListView::indicator:checked:pressed { + image: url(":/qss_icons/rc/checkbox_checked_focus.png"); +} + +QTreeView::indicator:unchecked, +QListView::indicator:unchecked { + image: url(":/qss_icons/rc/checkbox_unchecked.png"); +} + +QTreeView::indicator:unchecked:hover, QTreeView::indicator:unchecked:focus, QTreeView::indicator:unchecked:pressed, +QListView::indicator:unchecked:hover, +QListView::indicator:unchecked:focus, +QListView::indicator:unchecked:pressed { + image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); +} + +QTreeView::indicator:indeterminate, +QListView::indicator:indeterminate { + image: url(":/qss_icons/rc/checkbox_indeterminate.png"); +} + +QTreeView::indicator:indeterminate:hover, QTreeView::indicator:indeterminate:focus, QTreeView::indicator:indeterminate:pressed, +QListView::indicator:indeterminate:hover, +QListView::indicator:indeterminate:focus, +QListView::indicator:indeterminate:pressed { + image: url(":/qss_icons/rc/checkbox_indeterminate_focus.png"); +} + +QTreeView, +QListView, +QTableView, +QColumnView { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + gridline-color: #32414B; + border-radius: 4px; +} + +QTreeView:disabled, +QListView:disabled, +QTableView:disabled, +QColumnView:disabled { + background-color: #19232D; + color: #787878; +} + +QTreeView:selected, +QListView:selected, +QTableView:selected, +QColumnView:selected { + background-color: #1464A0; + color: #32414B; +} + +QTreeView:hover, +QListView:hover, +QTableView:hover, +QColumnView:hover { + background-color: #19232D; + border: 1px solid #148CD2; +} + +QTreeView::item:pressed, +QListView::item:pressed, +QTableView::item:pressed, +QColumnView::item:pressed { + background-color: #1464A0; +} + +QTreeView::item:selected:hover, +QListView::item:selected:hover, +QTableView::item:selected:hover, +QColumnView::item:selected:hover { + background: #1464A0; + color: #19232D; +} + +QTreeView::item:selected:active, +QListView::item:selected:active, +QTableView::item:selected:active, +QColumnView::item:selected:active { + background-color: #1464A0; +} + +QTreeView::item:!selected:hover, +QListView::item:!selected:hover, +QTableView::item:!selected:hover, +QColumnView::item:!selected:hover { + outline: 0; + color: #148CD2; + background-color: #32414B; +} + +QTableCornerButton::section { + background-color: #19232D; + border: 1px transparent #32414B; + border-radius: 0px; +} + +/* QHeaderView ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qheaderview + +--------------------------------------------------------------------------- */ +QHeaderView { + background-color: #19232D; + border: 0px transparent #19232D; + padding: 0px; + margin: 0px; + border-radius: 0px; +} + +QHeaderView:disabled { + background-color: #19232D; + border: 1px transparent #19232D; + padding: 2px; +} + +QHeaderView::section { + background-color: #19232D; + color: #F0F0F0; + padding: 2px; + border-radius: 0px; + text-align: left; +} + +QHeaderView::section:checked { + color: #F0F0F0; + background-color: #1464A0; +} + +QHeaderView::section:checked:disabled { + color: #787878; + background-color: #14506E; +} + +QHeaderView::section::horizontal { + padding-left: 4px; + padding-right: 4px; + border-left: 1px solid #32414B; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { + border-left: 1px solid #19232D; +} + +QHeaderView::section::horizontal:disabled { + color: #787878; +} + +QHeaderView::section::vertical { + padding-left: 4px; + padding-right: 4px; + border-top: 1px solid #32414B; +} + +QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { + border-top: 1px solid #32414B; +} + +QHeaderView::section::vertical:disabled { + color: #787878; +} + +QHeaderView::down-arrow { + /* Those settings (border/width/height/background-color) solve bug */ + /* transparent arrow background and size */ + background-color: #19232D; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url(":/qss_icons/rc/arrow_down.png"); +} + +QHeaderView::up-arrow { + background-color: #19232D; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url(":/qss_icons/rc/arrow_up.png"); +} + +/* QToolBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbox + +--------------------------------------------------------------------------- */ +QToolBox { + padding: 0px; + border: 0px; + border: 1px solid #32414B; +} + +QToolBox:selected { + padding: 0px; + border: 2px solid #1464A0; +} + +QToolBox::tab { + background-color: #19232D; + border: 1px solid #32414B; + color: #F0F0F0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QToolBox::tab:disabled { + color: #787878; +} + +QToolBox::tab:selected { + background-color: #505F69; + border-bottom: 2px solid #1464A0; +} + +QToolBox::tab:selected:disabled { + background-color: #32414B; + border-bottom: 2px solid #14506E; +} + +QToolBox::tab:!selected { + background-color: #32414B; + border-bottom: 2px solid #32414B; +} + +QToolBox::tab:!selected:disabled { + background-color: #19232D; +} + +QToolBox::tab:hover { + border-color: #148CD2; + border-bottom: 2px solid #148CD2; +} + +QToolBox QScrollArea QWidget QWidget { + padding: 0px; + border: 0px; + background-color: #19232D; +} + +/* QFrame ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe +https://doc.qt.io/qt-5/qframe.html#-prop +https://doc.qt.io/qt-5/qframe.html#details +https://stackoverflow.com/questions/14581498/qt-stylesheet-for-hline-vline-color + +--------------------------------------------------------------------------- */ +/* (dot) .QFrame fix #141, #126, #123 */ +.QFrame { + border-radius: 4px; + border: 1px solid #32414B; + /* No frame */ + /* HLine */ + /* HLine */ +} + +.QFrame[frameShape="0"] { + border-radius: 4px; + border: 1px transparent #32414B; +} + +.QFrame[frameShape="4"] { + max-height: 2px; + border: none; + background-color: #32414B; +} + +.QFrame[frameShape="5"] { + max-width: 2px; + border: none; + background-color: #32414B; +} + +/* QSplitter -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsplitter + +--------------------------------------------------------------------------- */ +QSplitter { + background-color: #32414B; + spacing: 0px; + padding: 0px; + margin: 0px; +} + +QSplitter::handle { + background-color: #32414B; + border: 0px solid #19232D; + spacing: 0px; + padding: 1px; + margin: 0px; +} + +QSplitter::handle:hover { + background-color: #787878; +} + +QSplitter::handle:horizontal { + width: 5px; + image: url(":/qss_icons/rc/line_vertical.png"); +} + +QSplitter::handle:vertical { + height: 5px; + image: url(":/qss_icons/rc/line_horizontal.png"); +} + +/* QDateEdit, QDateTimeEdit ----------------------------------------------- + +--------------------------------------------------------------------------- */ +QDateEdit, QDateTimeEdit { + selection-background-color: #1464A0; + border-style: solid; + border: 1px solid #32414B; + border-radius: 4px; + /* This fixes 103, 111 */ + padding-top: 2px; + /* This fixes 103, 111 */ + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + min-width: 10px; +} + +QDateEdit:on, QDateTimeEdit:on { + selection-background-color: #1464A0; +} + +QDateEdit::drop-down, QDateTimeEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #32414B; +} + +QDateEdit::down-arrow, QDateTimeEdit::down-arrow { + image: url(":/qss_icons/rc/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus, QDateTimeEdit::down-arrow:on, QDateTimeEdit::down-arrow:hover, QDateTimeEdit::down-arrow:focus { + image: url(":/qss_icons/rc/arrow_down.png"); +} + +QDateEdit QAbstractItemView, QDateTimeEdit QAbstractItemView { + background-color: #19232D; + border-radius: 4px; + border: 1px solid #32414B; + selection-background-color: #1464A0; +} + +/* QAbstractView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractView:hover { + border: 1px solid #148CD2; + color: #F0F0F0; +} + +QAbstractView:selected { + background: #1464A0; + color: #32414B; +} + +/* PlotWidget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +PlotWidget { + /* Fix cut labels in plots #134 */ + padding: 0px; +} + + +QPushButton#TogglableStatusBarButton { + min-width: 0px; + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#TogglableStatusBarButton:checked { + color: #ffffff; +} + +QPushButton#TogglableStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton { + min-width: 0px; + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#RendererStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton:checked { + color: #e85c00; +} + +QPushButton#RendererStatusBarButton:!checked { + color: #00ccdd; +} + +QPushButton#GPUStatusBarButton { + min-width: 0px; + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#GPUStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#GPUStatusBarButton:checked { + color: #ff8040; +} + +QPushButton#GPUStatusBarButton:!checked { + color: #40dd40; +} + +QPushButton#DockingStatusBarButton { + min-width: 0px; + color: #ffffff; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#DockingStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#buttonRefreshDevices { + min-width: 19px; + min-height: 19px; + max-width: 19px; + max-height: 19px; + padding: 0px 0px; +} + +QPushButton#button_reset_defaults { + padding: 3px 6px; +} + +QSpinBox#spinboxLStickRange, +QSpinBox#spinboxRStickRange, +QSpinBox#vibrationSpinPlayer1, +QSpinBox#vibrationSpinPlayer2, +QSpinBox#vibrationSpinPlayer3, +QSpinBox#vibrationSpinPlayer4, +QSpinBox#vibrationSpinPlayer5, +QSpinBox#vibrationSpinPlayer6, +QSpinBox#vibrationSpinPlayer7, +QSpinBox#vibrationSpinPlayer8 { + min-width: 68px; +} + +QDialog#ConfigureVibration QGroupBox::indicator, +QGroupBox#motionGroup::indicator, +QGroupBox#vibrationGroup::indicator { + margin-left: 0px; +} + +QDialog#ConfigureVibration QGroupBox, +QWidget#bottomPerGameInput QGroupBox#motionGroup, +QWidget#bottomPerGameInput QGroupBox#vibrationGroup, +QWidget#bottomPerGameInput QGroupBox#inputConfigGroup { + padding: 0px; +} + +QDialog#ConfigureVibration QGroupBox::title, +QGroupBox#motionGroup::title, +QGroupBox#vibrationGroup::title { + spacing: 2px; + padding-left: 1px; + padding-right: 1px; +} + +QListWidget#selectorList { + background-color: #0f1922; +} + +QSpinBox, +QLineEdit, +QTreeView#hotkey_list, +QScrollArea#scrollArea QTreeView { + background-color: #0f1922; +} + +QWidget#bottomPerGameInput, +QWidget#topControllerApplet, +QWidget#bottomControllerApplet, +QGroupBox#groupPlayer1Connected:checked, +QGroupBox#groupPlayer2Connected:checked, +QGroupBox#groupPlayer3Connected:checked, +QGroupBox#groupPlayer4Connected:checked, +QGroupBox#groupPlayer5Connected:checked, +QGroupBox#groupPlayer6Connected:checked, +QGroupBox#groupPlayer7Connected:checked, +QGroupBox#groupPlayer8Connected:checked { + background-color: #0f1922; +} + +QWidget#topPerGameInput, +QWidget#middleControllerApplet { + background-color: #19232d; +} + +QWidget#topPerGameInput QComboBox, +QWidget#middleControllerApplet QComboBox { + width: 120px; +} + +QWidget#connectedControllers { + background: transparent; +} + +QWidget#closeButtons { + background: transparent; +} + +QWidget#playersSupported, +QWidget#controllersSupported, +QWidget#controllerSupported1, +QWidget#controllerSupported2, +QWidget#controllerSupported3, +QWidget#controllerSupported4, +QWidget#controllerSupported5, +QWidget#controllerSupported6 { + border: none; + background: transparent; +} + +QGroupBox#groupPlayer1Connected, +QGroupBox#groupPlayer2Connected, +QGroupBox#groupPlayer3Connected, +QGroupBox#groupPlayer4Connected, +QGroupBox#groupPlayer5Connected, +QGroupBox#groupPlayer6Connected, +QGroupBox#groupPlayer7Connected, +QGroupBox#groupPlayer8Connected { + border: 1px solid #76797c; + border-radius: 3px; + padding: 0px; + min-height: 98px; + max-height: 98px; + margin-top: 0px; +} + + +QGroupBox#groupPlayer1Connected:unchecked, +QGroupBox#groupPlayer2Connected:unchecked, +QGroupBox#groupPlayer3Connected:unchecked, +QGroupBox#groupPlayer4Connected:unchecked, +QGroupBox#groupPlayer5Connected:unchecked, +QGroupBox#groupPlayer6Connected:unchecked, +QGroupBox#groupPlayer7Connected:unchecked, +QGroupBox#groupPlayer8Connected:unchecked { + border: 1px solid #32414b; +} + +QGroupBox#groupPlayer1Connected::title, +QGroupBox#groupPlayer2Connected::title, +QGroupBox#groupPlayer3Connected::title, +QGroupBox#groupPlayer4Connected::title, +QGroupBox#groupPlayer5Connected::title, +QGroupBox#groupPlayer6Connected::title, +QGroupBox#groupPlayer7Connected::title, +QGroupBox#groupPlayer8Connected::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 0px; + padding-right: 0px; + padding-top: 1px; + margin-left: -2px; + margin-right: -4px; + margin-bottom: 6px; +} + +QCheckBox#checkboxPlayer1Connected, +QCheckBox#checkboxPlayer2Connected, +QCheckBox#checkboxPlayer3Connected, +QCheckBox#checkboxPlayer4Connected, +QCheckBox#checkboxPlayer5Connected, +QCheckBox#checkboxPlayer6Connected, +QCheckBox#checkboxPlayer7Connected, +QCheckBox#checkboxPlayer8Connected { + spacing: 0px; +} + +QWidget#connectedControllers QLabel { + padding: 0px; +} + +QWidget#Player1LEDs, +QWidget#Player2LEDs, +QWidget#Player3LEDs, +QWidget#Player4LEDs, +QWidget#Player5LEDs, +QWidget#Player6LEDs, +QWidget#Player7LEDs, +QWidget#Player8LEDs { + background: transparent; +} + +QWidget#Player1LEDs QCheckBox, +QWidget#Player2LEDs QCheckBox, +QWidget#Player3LEDs QCheckBox, +QWidget#Player4LEDs QCheckBox, +QWidget#Player5LEDs QCheckBox, +QWidget#Player6LEDs QCheckBox, +QWidget#Player7LEDs QCheckBox, +QWidget#Player8LEDs QCheckBox, +QCheckBox#checkboxPlayer1Connected, +QCheckBox#checkboxPlayer2Connected, +QCheckBox#checkboxPlayer3Connected, +QCheckBox#checkboxPlayer4Connected, +QCheckBox#checkboxPlayer5Connected, +QCheckBox#checkboxPlayer6Connected, +QCheckBox#checkboxPlayer7Connected, +QCheckBox#checkboxPlayer8Connected { + spacing: 0px; + padding-top: 0px; + padding-bottom: 0px; + background: transparent; +} + +QWidget#Player1LEDs QCheckBox::indicator, +QWidget#Player2LEDs QCheckBox::indicator, +QWidget#Player3LEDs QCheckBox::indicator, +QWidget#Player4LEDs QCheckBox::indicator, +QWidget#Player5LEDs QCheckBox::indicator, +QWidget#Player6LEDs QCheckBox::indicator, +QWidget#Player7LEDs QCheckBox::indicator, +QWidget#Player8LEDs QCheckBox::indicator { + width: 6px; + height: 6px; + margin-left: 0px; +} + +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer1Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer2Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer3Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer4Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer5Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer6Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer7Connected::indicator, +QWidget#bottomPerGameInput QCheckBox#checkboxPlayer8Connected::indicator { + width: 12px; + height: 12px; +} + +QCheckBox#checkboxPlayer1Connected::indicator, +QCheckBox#checkboxPlayer2Connected::indicator, +QCheckBox#checkboxPlayer3Connected::indicator, +QCheckBox#checkboxPlayer4Connected::indicator, +QCheckBox#checkboxPlayer5Connected::indicator, +QCheckBox#checkboxPlayer6Connected::indicator, +QCheckBox#checkboxPlayer7Connected::indicator, +QCheckBox#checkboxPlayer8Connected::indicator { + width: 14px; + height: 14px; + margin-left: 0px; +} + +QWidget#Player1LEDs QCheckBox::indicator:checked, +QWidget#Player2LEDs QCheckBox::indicator:checked, +QWidget#Player3LEDs QCheckBox::indicator:checked, +QWidget#Player4LEDs QCheckBox::indicator:checked, +QWidget#Player5LEDs QCheckBox::indicator:checked, +QWidget#Player6LEDs QCheckBox::indicator:checked, +QWidget#Player7LEDs QCheckBox::indicator:checked, +QWidget#Player8LEDs QCheckBox::indicator:checked, +QGroupBox#groupPlayer1Connected::indicator:checked, +QGroupBox#groupPlayer2Connected::indicator:checked, +QGroupBox#groupPlayer3Connected::indicator:checked, +QGroupBox#groupPlayer4Connected::indicator:checked, +QGroupBox#groupPlayer5Connected::indicator:checked, +QGroupBox#groupPlayer6Connected::indicator:checked, +QGroupBox#groupPlayer7Connected::indicator:checked, +QGroupBox#groupPlayer8Connected::indicator:checked, +QCheckBox#checkboxPlayer1Connected::indicator:checked, +QCheckBox#checkboxPlayer2Connected::indicator:checked, +QCheckBox#checkboxPlayer3Connected::indicator:checked, +QCheckBox#checkboxPlayer4Connected::indicator:checked, +QCheckBox#checkboxPlayer5Connected::indicator:checked, +QCheckBox#checkboxPlayer6Connected::indicator:checked, +QCheckBox#checkboxPlayer7Connected::indicator:checked, +QCheckBox#checkboxPlayer8Connected::indicator:checked, +QGroupBox#groupConnectedController::indicator:checked { + border-radius: 2px; + border: 1px solid #929192; + background: #39ff14; + image: none; +} + +QWidget#Player1LEDs QCheckBox::indicator:unchecked, +QWidget#Player2LEDs QCheckBox::indicator:unchecked, +QWidget#Player3LEDs QCheckBox::indicator:unchecked, +QWidget#Player4LEDs QCheckBox::indicator:unchecked, +QWidget#Player5LEDs QCheckBox::indicator:unchecked, +QWidget#Player6LEDs QCheckBox::indicator:unchecked, +QWidget#Player7LEDs QCheckBox::indicator:unchecked, +QWidget#Player8LEDs QCheckBox::indicator:unchecked, +QGroupBox#groupPlayer1Connected::indicator:unchecked, +QGroupBox#groupPlayer2Connected::indicator:unchecked, +QGroupBox#groupPlayer3Connected::indicator:unchecked, +QGroupBox#groupPlayer4Connected::indicator:unchecked, +QGroupBox#groupPlayer5Connected::indicator:unchecked, +QGroupBox#groupPlayer6Connected::indicator:unchecked, +QGroupBox#groupPlayer7Connected::indicator:unchecked, +QGroupBox#groupPlayer8Connected::indicator:unchecked, +QCheckBox#checkboxPlayer1Connected::indicator:unchecked, +QCheckBox#checkboxPlayer2Connected::indicator:unchecked, +QCheckBox#checkboxPlayer3Connected::indicator:unchecked, +QCheckBox#checkboxPlayer4Connected::indicator:unchecked, +QCheckBox#checkboxPlayer5Connected::indicator:unchecked, +QCheckBox#checkboxPlayer6Connected::indicator:unchecked, +QCheckBox#checkboxPlayer7Connected::indicator:unchecked, +QCheckBox#checkboxPlayer8Connected::indicator:unchecked, +QGroupBox#groupConnectedController::indicator:unchecked { + border-radius: 2px; + border: 1px solid #929192; + background: #19232d; + image: none; +} + +QWidget#controllerPlayer1, +QWidget#controllerPlayer2, +QWidget#controllerPlayer3, +QWidget#controllerPlayer4, +QWidget#controllerPlayer5, +QWidget#controllerPlayer6, +QWidget#controllerPlayer7, +QWidget#controllerPlayer8 { + background: transparent; +} + +QDialog#QtSoftwareKeyboardDialog, +QStackedWidget#topOSK { + background: rgba(15, 25, 34, .9); +} + +QDialog#OverlayDialog, +QStackedWidget#stackedDialog { + background: rgba(15, 25, 34, .7); +} + +QWidget#boxOSK, +QWidget#lineOSK, +QWidget#richDialog, +QWidget#lineDialog { + background: transparent; +} + +QStackedWidget#bottomOSK, +QWidget#contentDialog, +QWidget#contentRichDialog { + background: rgba(31, 41, 51, 1); +} + +QWidget#contentDialog, +QWidget#contentRichDialog { + margin: 5px; + border-radius: 6px; +} + +QWidget#buttonsDialog, +QWidget#buttonsRichDialog { + margin: 5px; + border-top: 2px solid rgba(255, 255, 255, .9); +} + +QWidget#legendOSKnum { + border-top: 1px solid rgba(255, 255, 255, 1); +} + +QStackedWidget#stackedDialog QTextBrowser QWidget { + background: transparent; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar { + background: #19232d; + border: none; +} + +QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-line, +QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-line { + border-image: none; +} + +QWidget#mainOSK QStackedWidget, +QDialog#OverlayDialog QStackedWidget { + border: none; + padding: 0px; +} + +QWidget#inputOSK { + border-bottom: 3px solid rgba(255, 255, 255, .9); +} + +QWidget#inputOSK QLineEdit { + background: transparent; + border: none; + color: #ccc; + padding: 0px; +} + +QWidget#inputBoxOSK { + border: 2px solid rgba(255, 255, 255, .9); +} + +QWidget#inputBoxOSK QTextEdit { + background: transparent; + border: none; + color: #ccc; +} + +QWidget#richDialog QTextBrowser { + background: transparent; + border: none; + color: #fff; + padding: 35px 65px; +} + +QWidget#lineOSK QLabel#label_header { + color: #f0f0f0; +} + +QWidget#lineOSK QLabel#label_sub, +QWidget#lineOSK QLabel#label_characters, +QWidget#contentDialog QLabel#label_title, +QWidget#contentRichDialog QLabel#label_title_rich, +QWidget#boxOSK QLabel#label_characters_box { + color: #ccc; +} + +QWidget#buttonsDialog, +QWidget#buttonsRichDialog, +QWidget#mainOSK, +QWidget#headerOSK, +QWidget#normalOSK, +QWidget#shiftOSK, +QWidget#numOSK, +QWidget#subOSK, +QWidget#inputOSK, +QWidget#inputBoxOSK, +QWidget#charactersOSK, +QWidget#charactersBoxOSK, +QWidget#legendOSK, +QWidget#legendOSK QWidget, +QWidget#legendOSKshift, +QWidget#legendOSKshift QWidget, +QWidget#legendOSKnum, +QWidget#legendOSKnum QWidget { + background: transparent; +} + +QWidget#contentDialog QLabel, +QWidget#legendOSK QLabel, +QWidget#legendOSKshift QLabel, +QWidget#legendOSKnum QLabel { + color: rgba(255, 255, 255, 1); +} + +QWidget#contentDialog QLabel#label_dialog { + padding: 20px 65px; +} + +QWidget#contentDialog QLabel#label_title, +QWidget#contentRichDialog QLabel#label_title_rich { + padding: 0px 65px; +} + +QDialog#OverlayDialog QPushButton { + color: rgba(1, 253, 201, 1); + background: transparent; + border: none; + padding: 0px; + min-width: 0px; +} + +QDialog#OverlayDialog QPushButton:focus, +QDialog#OverlayDialog QPushButton:hover { + color: rgba(1, 253, 201, 1); + background: rgba(18, 33, 46, 1); + border: 5px solid rgba(56, 189, 225, 1); + border-radius: 6px; + outline: none; +} + +QDialog#OverlayDialog QPushButton:pressed { + color: rgba(240, 240, 240, 1); + background: rgba(110, 122, 130, 1); + border: 5px solid rgba(56, 189, 225, 1); + border-radius: 6px; + outline: none; +} + +QDialog#QtSoftwareKeyboardDialog QLabel { + padding: 0px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton { + color: rgba(255, 255, 255, 1); + background: rgba(40, 51, 60, 1); + border: 2px solid rgba(31, 41, 51, 1); + border-radius: 0px; + padding: 0px; + min-width: 0px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { + background: rgba(55, 66, 75, 1); + border: 2px solid rgba(31, 41, 51, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { + color: rgba(240, 240, 240, 1); + background: rgba(255, 255, 255, 1); + border: 2px solid rgba(31, 41, 51, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { + color: rgba(0, 0, 0, 1); + background: rgba(1, 253, 201, 1); + border: 2px solid rgba(31, 41, 51, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:focus, + +QDialog#QtSoftwareKeyboardDialog QPushButton:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover { + color: rgba(255, 255, 255, 1); + background: rgba(18, 33, 46, 1); + border: 5px solid rgba(56, 189, 225, 1); + border-radius: 6px; + outline: none; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:pressed, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { + color: rgba(240, 240, 240, 1); + background: rgba(110, 122, 130, 1); + border: 5px solid rgba(56, 189, 225, 1); + border-radius: 6px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { + image: url(:/overlay/osk_button_B_dark.png); + image-position: right; + qproperty-icon: url(:/overlay/osk_button_backspace_dark.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { + image: url(:/overlay/osk_button_Y_dark.png); + image-position: right; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { + color: rgba(44, 44, 44, 1); + image: url(:/overlay/osk_button_plus_dark.png); + image-position: right; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; + qproperty-icon: url(:/overlay/osk_button_shift_dark.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; + qproperty-icon: url(:/overlay/osk_button_shift_on_dark.png); + qproperty-iconSize: 36px; +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_parenthesis { + padding-bottom: 7px; +} + +QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { + background: transparent; + color: #ccc; +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_L, +QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { + image: url(:/overlay/button_L_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { + image: url(:/overlay/arrow_left_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_R, +QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { + image: url(:/overlay/button_R_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { + image: url(:/overlay/arrow_right_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, +QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { + image: url(:/overlay/button_press_stick_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_X, +QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { + image: url(:/overlay/button_X_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QWidget#button_A, +QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, +QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { + image: url(:/overlay/button_A_dark.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { + color: rgba(144, 144, 144, 1); + background-color: rgba(55, 66, 75, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_at:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_slash:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_percent:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_1:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_2:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_3:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_4:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_5:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_6:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_7:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_8:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_9:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { + color: rgba(144, 144, 144, 1); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { + image: url(:/overlay/osk_button_plus_dark_disabled.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { + image: url(:/overlay/osk_button_B_dark_disabled.png); +} + +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { + image: url(:/overlay/osk_button_Y_dark_disabled.png); +} diff --git a/dist/yuzu.bmp b/dist/yuzu.bmp new file mode 100644 index 0000000000000000000000000000000000000000..66f2f696f015f4c8e68c4859e8a1bda57fd5c05c GIT binary patch literal 262282 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 literal 0 HcmV?d00001 diff --git a/dist/yuzu.ico b/dist/yuzu.ico new file mode 100644 index 0000000000000000000000000000000000000000..df3be8464fcb3c0fb10308472ed527dbcdc10d61 GIT binary patch literal 23159 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 literal 0 HcmV?d00001 diff --git a/dist/yuzu.manifest b/dist/yuzu.manifest new file mode 100644 index 0000000..f2c8639 --- /dev/null +++ b/dist/yuzu.manifest @@ -0,0 +1,58 @@ + + + + + + + + + + true/pm + + + + PerMonitorV2 + + + + true + + + true + + + + + + + + + + + + + + + + + + diff --git a/dist/yuzu.svg b/dist/yuzu.svg new file mode 100644 index 0000000..93171d1 --- /dev/null +++ b/dist/yuzu.svg @@ -0,0 +1 @@ +Artboard 1 \ No newline at end of file diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt new file mode 100644 index 0000000..d49a2e4 --- /dev/null +++ b/externals/CMakeLists.txt @@ -0,0 +1,316 @@ +# SPDX-FileCopyrightText: 2016 Citra Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +# Dynarmic has cmake_minimum_required(3.12) and we may want to override +# some of its variables, which is only possible in 3.13+ +set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) + +# Disable tests in all externals supporting the standard option name +set(BUILD_TESTING OFF) + +# Build only static externals +set(BUILD_SHARED_LIBS OFF) + +# Skip install rules for all externals +set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON) + +# Xbyak (also used by Dynarmic, so needs to be added first) +if ((ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) AND NOT TARGET xbyak::xbyak) + add_subdirectory(xbyak) +endif() + +# Oaknut (also used by Dynarmic, so needs to be added first) +if (ARCHITECTURE_arm64 AND NOT TARGET merry::oaknut) + add_subdirectory(oaknut) +endif() + +# Dynarmic +if ((ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) AND NOT TARGET dynarmic::dynarmic) + set(DYNARMIC_IGNORE_ASSERTS ON) + add_subdirectory(dynarmic) + add_library(dynarmic::dynarmic ALIAS dynarmic) +endif() + +# getopt +if (MSVC) + add_subdirectory(getopt) +endif() + +# Glad +add_subdirectory(glad) + +# mbedtls +add_subdirectory(mbedtls) +target_include_directories(mbedtls PUBLIC ./mbedtls/include) +if (NOT MSVC) + target_compile_options(mbedcrypto PRIVATE + -Wno-unused-but-set-variable + -Wno-string-concatenation) +endif() + +# MicroProfile +add_library(microprofile INTERFACE) +target_include_directories(microprofile INTERFACE ./microprofile) + +# GCC bugs +if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12" AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND MINGW) + target_compile_options(microprofile INTERFACE "-Wno-array-bounds") +endif() + +# libusb +if (ENABLE_LIBUSB AND NOT TARGET libusb::usb) + add_subdirectory(libusb) +endif() + +# SDL2 +if (YUZU_USE_EXTERNAL_SDL2) + if (NOT WIN32) + # Yuzu itself needs: Atomic Audio Events Joystick Haptic Sensor Threads Timers + # Since 2.0.18 Atomic+Threads required for HIDAPI/libusb (see https://github.com/libsdl-org/SDL/issues/5095) + # Yuzu-cmd also needs: Video (depends on Loadso/Dlopen) + # CPUinfo also required for SDL Audio, at least until 2.28.0 (see https://github.com/libsdl-org/SDL/issues/7809) + set(SDL_UNUSED_SUBSYSTEMS + File Filesystem + Locale Power Render) + foreach(_SUB ${SDL_UNUSED_SUBSYSTEMS}) + string(TOUPPER ${_SUB} _OPT) + set(SDL_${_OPT} OFF) + endforeach() + + set(HIDAPI ON) + endif() + if (APPLE) + set(SDL_FILE ON) + endif() + + add_subdirectory(SDL) +endif() + +# ENet +if (NOT TARGET enet::enet) + add_subdirectory(enet) + target_include_directories(enet INTERFACE ./enet/include) + add_library(enet::enet ALIAS enet) +endif() + +# Cubeb +if (ENABLE_CUBEB AND NOT TARGET cubeb::cubeb) + set(BUILD_TESTS OFF) + set(BUILD_TOOLS OFF) + add_subdirectory(cubeb) + add_library(cubeb::cubeb ALIAS cubeb) + if (NOT MSVC) + if (TARGET speex) + target_compile_options(speex PRIVATE -Wno-sign-compare) + endif() + target_compile_options(cubeb PRIVATE -Wno-implicit-const-int-float-conversion) + endif() +endif() + +# DiscordRPC +if (USE_DISCORD_PRESENCE AND NOT TARGET DiscordRPC::discord-rpc) + set(BUILD_EXAMPLES OFF) + add_subdirectory(discord-rpc) + target_include_directories(discord-rpc INTERFACE ./discord-rpc/include) + add_library(DiscordRPC::discord-rpc ALIAS discord-rpc) +endif() + +# Sirit +add_subdirectory(sirit) + +# httplib +if (ENABLE_WEB_SERVICE AND NOT TARGET httplib::httplib) + set(HTTPLIB_REQUIRE_OPENSSL ON) + add_subdirectory(cpp-httplib) +endif() + +# cpp-jwt +if (ENABLE_WEB_SERVICE AND NOT TARGET cpp-jwt::cpp-jwt) + set(CPP_JWT_BUILD_EXAMPLES OFF) + set(CPP_JWT_BUILD_TESTS OFF) + set(CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF) + add_subdirectory(cpp-jwt) +endif() + +# Opus +if (NOT TARGET Opus::opus) + set(OPUS_BUILD_TESTING OFF) + set(OPUS_BUILD_PROGRAMS OFF) + set(OPUS_INSTALL_PKG_CONFIG_MODULE OFF) + set(OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF) + add_subdirectory(opus) +endif() + +# FFMpeg +if (YUZU_USE_BUNDLED_FFMPEG) + add_subdirectory(ffmpeg) + set(FFmpeg_PATH "${FFmpeg_PATH}" PARENT_SCOPE) + set(FFmpeg_LDFLAGS "${FFmpeg_LDFLAGS}" PARENT_SCOPE) + set(FFmpeg_LIBRARIES "${FFmpeg_LIBRARIES}" PARENT_SCOPE) + set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE) +endif() + +# Vulkan-Headers +if (YUZU_USE_EXTERNAL_VULKAN_HEADERS) + add_subdirectory(Vulkan-Headers) +endif() + +# Vulkan-Utility-Libraries +if (YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES) + add_subdirectory(Vulkan-Utility-Libraries) +endif() + +# TZDB (Time Zone Database) +add_subdirectory(nx_tzdb) + +# VMA +if (NOT TARGET GPUOpen::VulkanMemoryAllocator) + add_subdirectory(VulkanMemoryAllocator) +endif() + +if (NOT TARGET LLVM::Demangle) + add_library(demangle demangle/ItaniumDemangle.cpp) + target_include_directories(demangle PUBLIC ./demangle) + if (NOT MSVC) + target_compile_options(demangle PRIVATE -Wno-deprecated-declarations) # std::is_pod + endif() + add_library(LLVM::Demangle ALIAS demangle) +endif() + +add_library(stb stb/stb_dxt.cpp) +target_include_directories(stb PUBLIC ./stb) + +if (NOT TARGET stb::headers) + add_library(stb::headers ALIAS stb) +endif() + +add_library(tz tz/tz/tz.cpp) +target_include_directories(tz PUBLIC ./tz) + +add_library(bc_decoder bc_decoder/bc_decoder.cpp) +target_include_directories(bc_decoder PUBLIC ./bc_decoder) + +if (NOT TARGET RenderDoc::API) + add_library(renderdoc INTERFACE) + target_include_directories(renderdoc SYSTEM INTERFACE ./renderdoc) + add_library(RenderDoc::API ALIAS renderdoc) +endif() + +if (ANDROID) + if (ARCHITECTURE_arm64) + add_subdirectory(libadrenotools) + endif() +endif() + +if (UNIX AND NOT APPLE AND NOT TARGET gamemode::headers) + add_library(gamemode INTERFACE) + target_include_directories(gamemode INTERFACE gamemode) + add_library(gamemode::headers ALIAS gamemode) +endif() + +# Breakpad +# https://github.com/microsoft/vcpkg/blob/master/ports/breakpad/CMakeLists.txt +if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client) + set(BREAKPAD_WIN32_DEFINES + NOMINMAX + UNICODE + WIN32_LEAN_AND_MEAN + _CRT_SECURE_NO_WARNINGS + _CRT_SECURE_NO_DEPRECATE + _CRT_NONSTDC_NO_DEPRECATE + ) + + # libbreakpad + add_library(libbreakpad STATIC) + file(GLOB_RECURSE LIBBREAKPAD_SOURCES breakpad/src/processor/*.cc) + file(GLOB_RECURSE LIBDISASM_SOURCES breakpad/src/third_party/libdisasm/*.c) + list(FILTER LIBBREAKPAD_SOURCES EXCLUDE REGEX "_unittest|_selftest|synth_minidump|/tests|/testdata|/solaris|microdump_stackwalk|minidump_dump|minidump_stackwalk") + if (WIN32) + list(FILTER LIBBREAKPAD_SOURCES EXCLUDE REGEX "/linux|/mac|/android") + target_compile_definitions(libbreakpad PRIVATE ${BREAKPAD_WIN32_DEFINES}) + target_include_directories(libbreakpad PRIVATE "${CMAKE_GENERATOR_INSTANCE}/DIA SDK/include") + elseif (APPLE) + list(FILTER LIBBREAKPAD_SOURCES EXCLUDE REGEX "/linux|/windows|/android") + else() + list(FILTER LIBBREAKPAD_SOURCES EXCLUDE REGEX "/mac|/windows|/android") + endif() + target_sources(libbreakpad PRIVATE ${LIBBREAKPAD_SOURCES} ${LIBDISASM_SOURCES}) + target_include_directories(libbreakpad + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/breakpad/src + ${CMAKE_CURRENT_SOURCE_DIR}/breakpad/src/third_party/libdisasm + ) + + # libbreakpad_client + add_library(libbreakpad_client STATIC) + file(GLOB LIBBREAKPAD_COMMON_SOURCES breakpad/src/common/*.cc breakpad/src/common/*.c breakpad/src/client/*.cc) + + if (WIN32) + file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES breakpad/src/client/windows/*.cc breakpad/src/common/windows/*.cc) + list(FILTER LIBBREAKPAD_COMMON_SOURCES EXCLUDE REGEX "language.cc|path_helper.cc|stabs_to_module.cc|stabs_reader.cc|minidump_file_writer.cc") + target_include_directories(libbreakpad_client PRIVATE "${CMAKE_GENERATOR_INSTANCE}/DIA SDK/include") + target_compile_definitions(libbreakpad_client PRIVATE ${BREAKPAD_WIN32_DEFINES}) + elseif (APPLE) + target_compile_definitions(libbreakpad_client PRIVATE HAVE_MACH_O_NLIST_H) + file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES breakpad/src/client/mac/*.cc breakpad/src/common/mac/*.cc) + list(APPEND LIBBREAKPAD_CLIENT_SOURCES breakpad/src/common/mac/MachIPC.mm) + else() + target_compile_definitions(libbreakpad_client PUBLIC -DHAVE_A_OUT_H) + file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES breakpad/src/client/linux/*.cc breakpad/src/common/linux/*.cc) + endif() + list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${LIBBREAKPAD_COMMON_SOURCES}) + list(FILTER LIBBREAKPAD_CLIENT_SOURCES EXCLUDE REGEX "/sender|/tests|/unittests|/testcases|_unittest|_test") + target_sources(libbreakpad_client PRIVATE ${LIBBREAKPAD_CLIENT_SOURCES}) + target_include_directories(libbreakpad_client PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/breakpad/src) + + if (WIN32) + target_link_libraries(libbreakpad_client PRIVATE wininet.lib) + elseif (APPLE) + find_library(CoreFoundation_FRAMEWORK CoreFoundation) + target_link_libraries(libbreakpad_client PRIVATE ${CoreFoundation_FRAMEWORK}) + else() + find_library(PTHREAD_LIBRARIES pthread) + target_compile_definitions(libbreakpad_client PRIVATE HAVE_GETCONTEXT=1) + if (PTHREAD_LIBRARIES) + target_link_libraries(libbreakpad_client PRIVATE ${PTHREAD_LIBRARIES}) + endif() + endif() + + # Host tools for symbol processing + if (LINUX) + find_package(ZLIB REQUIRED) + + add_executable(minidump_stackwalk breakpad/src/processor/minidump_stackwalk.cc) + target_link_libraries(minidump_stackwalk PRIVATE libbreakpad libbreakpad_client) + + add_executable(dump_syms + breakpad/src/common/dwarf_cfi_to_module.cc + breakpad/src/common/dwarf_cu_to_module.cc + breakpad/src/common/dwarf_line_to_module.cc + breakpad/src/common/dwarf_range_list_handler.cc + breakpad/src/common/language.cc + breakpad/src/common/module.cc + breakpad/src/common/path_helper.cc + breakpad/src/common/stabs_reader.cc + breakpad/src/common/stabs_to_module.cc + breakpad/src/common/dwarf/bytereader.cc + breakpad/src/common/dwarf/dwarf2diehandler.cc + breakpad/src/common/dwarf/dwarf2reader.cc + breakpad/src/common/dwarf/elf_reader.cc + breakpad/src/common/linux/crc32.cc + breakpad/src/common/linux/dump_symbols.cc + breakpad/src/common/linux/elf_symbols_to_module.cc + breakpad/src/common/linux/elfutils.cc + breakpad/src/common/linux/file_id.cc + breakpad/src/common/linux/linux_libc_support.cc + breakpad/src/common/linux/memory_mapped_file.cc + breakpad/src/common/linux/safe_readlink.cc + breakpad/src/tools/linux/dump_syms/dump_syms.cc) + target_link_libraries(dump_syms PRIVATE libbreakpad_client ZLIB::ZLIB) + endif() +endif() + +# SimpleIni +if (NOT TARGET SimpleIni::SimpleIni) + add_subdirectory(simpleini) +endif() diff --git a/externals/FidelityFX-FSR/ffx-fsr/ffx_a.h b/externals/FidelityFX-FSR/ffx-fsr/ffx_a.h new file mode 100644 index 0000000..d04bff5 --- /dev/null +++ b/externals/FidelityFX-FSR/ffx-fsr/ffx_a.h @@ -0,0 +1,2656 @@ +//============================================================================================================================== +// +// [A] SHADER PORTABILITY 1.20210629 +// +//============================================================================================================================== +// FidelityFX Super Resolution Sample +// +// Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +//------------------------------------------------------------------------------------------------------------------------------ +// MIT LICENSE +// =========== +// Copyright (c) 2014 Michal Drobot (for concepts used in "FLOAT APPROXIMATIONS"). +// ----------- +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// ----------- +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +// Software. +// ----------- +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +//------------------------------------------------------------------------------------------------------------------------------ +// ABOUT +// ===== +// Common central point for high-level shading language and C portability for various shader headers. +//------------------------------------------------------------------------------------------------------------------------------ +// DEFINES +// ======= +// A_CPU ..... Include the CPU related code. +// A_GPU ..... Include the GPU related code. +// A_GLSL .... Using GLSL. +// A_HLSL .... Using HLSL. +// A_HLSL_6_2 Using HLSL 6.2 with new 'uint16_t' and related types (requires '-enable-16bit-types'). +// A_NO_16_BIT_CAST Don't use instructions that are not availabe in SPIR-V (needed for running A_HLSL_6_2 on Vulkan) +// A_GCC ..... Using a GCC compatible compiler (else assume MSVC compatible compiler by default). +// ======= +// A_BYTE .... Support 8-bit integer. +// A_HALF .... Support 16-bit integer and floating point. +// A_LONG .... Support 64-bit integer. +// A_DUBL .... Support 64-bit floating point. +// ======= +// A_WAVE .... Support wave-wide operations. +//------------------------------------------------------------------------------------------------------------------------------ +// To get #include "ffx_a.h" working in GLSL use '#extension GL_GOOGLE_include_directive:require'. +//------------------------------------------------------------------------------------------------------------------------------ +// SIMPLIFIED TYPE SYSTEM +// ====================== +// - All ints will be unsigned with exception of when signed is required. +// - Type naming simplified and shortened "A<#components>", +// - H = 16-bit float (half) +// - F = 32-bit float (float) +// - D = 64-bit float (double) +// - P = 1-bit integer (predicate, not using bool because 'B' is used for byte) +// - B = 8-bit integer (byte) +// - W = 16-bit integer (word) +// - U = 32-bit integer (unsigned) +// - L = 64-bit integer (long) +// - Using "AS<#components>" for signed when required. +//------------------------------------------------------------------------------------------------------------------------------ +// TODO +// ==== +// - Make sure 'ALerp*(a,b,m)' does 'b*m+(-a*m+a)' (2 ops). +//------------------------------------------------------------------------------------------------------------------------------ +// CHANGE LOG +// ========== +// 20200914 - Expanded wave ops and prx code. +// 20200713 - Added [ZOL] section, fixed serious bugs in sRGB and Rec.709 color conversion code, etc. +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// COMMON +//============================================================================================================================== +#define A_2PI 6.28318530718 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// CPU +// +// +//============================================================================================================================== +#ifdef A_CPU + // Supporting user defined overrides. + #ifndef A_RESTRICT + #define A_RESTRICT __restrict + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifndef A_STATIC + #define A_STATIC static + #endif +//------------------------------------------------------------------------------------------------------------------------------ + // Same types across CPU and GPU. + // Predicate uses 32-bit integer (C friendly bool). + typedef uint32_t AP1; + typedef float AF1; + typedef double AD1; + typedef uint8_t AB1; + typedef uint16_t AW1; + typedef uint32_t AU1; + typedef uint64_t AL1; + typedef int8_t ASB1; + typedef int16_t ASW1; + typedef int32_t ASU1; + typedef int64_t ASL1; +//------------------------------------------------------------------------------------------------------------------------------ + #define AD1_(a) ((AD1)(a)) + #define AF1_(a) ((AF1)(a)) + #define AL1_(a) ((AL1)(a)) + #define AU1_(a) ((AU1)(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ASL1_(a) ((ASL1)(a)) + #define ASU1_(a) ((ASU1)(a)) +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AU1_AF1(AF1 a){union{AF1 f;AU1 u;}bits;bits.f=a;return bits.u;} +//------------------------------------------------------------------------------------------------------------------------------ + #define A_TRUE 1 + #define A_FALSE 0 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// CPU/GPU PORTING +// +//------------------------------------------------------------------------------------------------------------------------------ +// Get CPU and GPU to share all setup code, without duplicate code paths. +// This uses a lower-case prefix for special vector constructs. +// - In C restrict pointers are used. +// - In the shading language, in/inout/out arguments are used. +// This depends on the ability to access a vector value in both languages via array syntax (aka color[2]). +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR ARGUMENT/RETURN/INITIALIZATION PORTABILITY +//============================================================================================================================== + #define retAD2 AD1 *A_RESTRICT + #define retAD3 AD1 *A_RESTRICT + #define retAD4 AD1 *A_RESTRICT + #define retAF2 AF1 *A_RESTRICT + #define retAF3 AF1 *A_RESTRICT + #define retAF4 AF1 *A_RESTRICT + #define retAL2 AL1 *A_RESTRICT + #define retAL3 AL1 *A_RESTRICT + #define retAL4 AL1 *A_RESTRICT + #define retAU2 AU1 *A_RESTRICT + #define retAU3 AU1 *A_RESTRICT + #define retAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define inAD2 AD1 *A_RESTRICT + #define inAD3 AD1 *A_RESTRICT + #define inAD4 AD1 *A_RESTRICT + #define inAF2 AF1 *A_RESTRICT + #define inAF3 AF1 *A_RESTRICT + #define inAF4 AF1 *A_RESTRICT + #define inAL2 AL1 *A_RESTRICT + #define inAL3 AL1 *A_RESTRICT + #define inAL4 AL1 *A_RESTRICT + #define inAU2 AU1 *A_RESTRICT + #define inAU3 AU1 *A_RESTRICT + #define inAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define inoutAD2 AD1 *A_RESTRICT + #define inoutAD3 AD1 *A_RESTRICT + #define inoutAD4 AD1 *A_RESTRICT + #define inoutAF2 AF1 *A_RESTRICT + #define inoutAF3 AF1 *A_RESTRICT + #define inoutAF4 AF1 *A_RESTRICT + #define inoutAL2 AL1 *A_RESTRICT + #define inoutAL3 AL1 *A_RESTRICT + #define inoutAL4 AL1 *A_RESTRICT + #define inoutAU2 AU1 *A_RESTRICT + #define inoutAU3 AU1 *A_RESTRICT + #define inoutAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define outAD2 AD1 *A_RESTRICT + #define outAD3 AD1 *A_RESTRICT + #define outAD4 AD1 *A_RESTRICT + #define outAF2 AF1 *A_RESTRICT + #define outAF3 AF1 *A_RESTRICT + #define outAF4 AF1 *A_RESTRICT + #define outAL2 AL1 *A_RESTRICT + #define outAL3 AL1 *A_RESTRICT + #define outAL4 AL1 *A_RESTRICT + #define outAU2 AU1 *A_RESTRICT + #define outAU3 AU1 *A_RESTRICT + #define outAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define varAD2(x) AD1 x[2] + #define varAD3(x) AD1 x[3] + #define varAD4(x) AD1 x[4] + #define varAF2(x) AF1 x[2] + #define varAF3(x) AF1 x[3] + #define varAF4(x) AF1 x[4] + #define varAL2(x) AL1 x[2] + #define varAL3(x) AL1 x[3] + #define varAL4(x) AL1 x[4] + #define varAU2(x) AU1 x[2] + #define varAU3(x) AU1 x[3] + #define varAU4(x) AU1 x[4] +//------------------------------------------------------------------------------------------------------------------------------ + #define initAD2(x,y) {x,y} + #define initAD3(x,y,z) {x,y,z} + #define initAD4(x,y,z,w) {x,y,z,w} + #define initAF2(x,y) {x,y} + #define initAF3(x,y,z) {x,y,z} + #define initAF4(x,y,z,w) {x,y,z,w} + #define initAL2(x,y) {x,y} + #define initAL3(x,y,z) {x,y,z} + #define initAL4(x,y,z,w) {x,y,z,w} + #define initAU2(x,y) {x,y} + #define initAU3(x,y,z) {x,y,z} + #define initAU4(x,y,z,w) {x,y,z,w} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS +//------------------------------------------------------------------------------------------------------------------------------ +// TODO +// ==== +// - Replace transcendentals with manual versions. +//============================================================================================================================== + #ifdef A_GCC + A_STATIC AD1 AAbsD1(AD1 a){return __builtin_fabs(a);} + A_STATIC AF1 AAbsF1(AF1 a){return __builtin_fabsf(a);} + A_STATIC AU1 AAbsSU1(AU1 a){return AU1_(__builtin_abs(ASU1_(a)));} + A_STATIC AL1 AAbsSL1(AL1 a){return AL1_(__builtin_llabs(ASL1_(a)));} + #else + A_STATIC AD1 AAbsD1(AD1 a){return fabs(a);} + A_STATIC AF1 AAbsF1(AF1 a){return fabsf(a);} + A_STATIC AU1 AAbsSU1(AU1 a){return AU1_(abs(ASU1_(a)));} + A_STATIC AL1 AAbsSL1(AL1 a){return AL1_(labs((long)ASL1_(a)));} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ACosD1(AD1 a){return __builtin_cos(a);} + A_STATIC AF1 ACosF1(AF1 a){return __builtin_cosf(a);} + #else + A_STATIC AD1 ACosD1(AD1 a){return cos(a);} + A_STATIC AF1 ACosF1(AF1 a){return cosf(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ADotD2(inAD2 a,inAD2 b){return a[0]*b[0]+a[1]*b[1];} + A_STATIC AD1 ADotD3(inAD3 a,inAD3 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];} + A_STATIC AD1 ADotD4(inAD4 a,inAD4 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];} + A_STATIC AF1 ADotF2(inAF2 a,inAF2 b){return a[0]*b[0]+a[1]*b[1];} + A_STATIC AF1 ADotF3(inAF3 a,inAF3 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];} + A_STATIC AF1 ADotF4(inAF4 a,inAF4 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 AExp2D1(AD1 a){return __builtin_exp2(a);} + A_STATIC AF1 AExp2F1(AF1 a){return __builtin_exp2f(a);} + #else + A_STATIC AD1 AExp2D1(AD1 a){return exp2(a);} + A_STATIC AF1 AExp2F1(AF1 a){return exp2f(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 AFloorD1(AD1 a){return __builtin_floor(a);} + A_STATIC AF1 AFloorF1(AF1 a){return __builtin_floorf(a);} + #else + A_STATIC AD1 AFloorD1(AD1 a){return floor(a);} + A_STATIC AF1 AFloorF1(AF1 a){return floorf(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ALerpD1(AD1 a,AD1 b,AD1 c){return b*c+(-a*c+a);} + A_STATIC AF1 ALerpF1(AF1 a,AF1 b,AF1 c){return b*c+(-a*c+a);} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ALog2D1(AD1 a){return __builtin_log2(a);} + A_STATIC AF1 ALog2F1(AF1 a){return __builtin_log2f(a);} + #else + A_STATIC AD1 ALog2D1(AD1 a){return log2(a);} + A_STATIC AF1 ALog2F1(AF1 a){return log2f(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 AMaxD1(AD1 a,AD1 b){return a>b?a:b;} + A_STATIC AF1 AMaxF1(AF1 a,AF1 b){return a>b?a:b;} + A_STATIC AL1 AMaxL1(AL1 a,AL1 b){return a>b?a:b;} + A_STATIC AU1 AMaxU1(AU1 a,AU1 b){return a>b?a:b;} +//------------------------------------------------------------------------------------------------------------------------------ + // These follow the convention that A integer types don't have signage, until they are operated on. + A_STATIC AL1 AMaxSL1(AL1 a,AL1 b){return (ASL1_(a)>ASL1_(b))?a:b;} + A_STATIC AU1 AMaxSU1(AU1 a,AU1 b){return (ASU1_(a)>ASU1_(b))?a:b;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 AMinD1(AD1 a,AD1 b){return a>ASL1_(b));} + A_STATIC AU1 AShrSU1(AU1 a,AU1 b){return AU1_(ASU1_(a)>>ASU1_(b));} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ASinD1(AD1 a){return __builtin_sin(a);} + A_STATIC AF1 ASinF1(AF1 a){return __builtin_sinf(a);} + #else + A_STATIC AD1 ASinD1(AD1 a){return sin(a);} + A_STATIC AF1 ASinF1(AF1 a){return sinf(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ASqrtD1(AD1 a){return __builtin_sqrt(a);} + A_STATIC AF1 ASqrtF1(AF1 a){return __builtin_sqrtf(a);} + #else + A_STATIC AD1 ASqrtD1(AD1 a){return sqrt(a);} + A_STATIC AF1 ASqrtF1(AF1 a){return sqrtf(a);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS - DEPENDENT +//============================================================================================================================== + A_STATIC AD1 AClampD1(AD1 x,AD1 n,AD1 m){return AMaxD1(n,AMinD1(x,m));} + A_STATIC AF1 AClampF1(AF1 x,AF1 n,AF1 m){return AMaxF1(n,AMinF1(x,m));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 AFractD1(AD1 a){return a-AFloorD1(a);} + A_STATIC AF1 AFractF1(AF1 a){return a-AFloorF1(a);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 APowD1(AD1 a,AD1 b){return AExp2D1(b*ALog2D1(a));} + A_STATIC AF1 APowF1(AF1 a,AF1 b){return AExp2F1(b*ALog2F1(a));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ARsqD1(AD1 a){return ARcpD1(ASqrtD1(a));} + A_STATIC AF1 ARsqF1(AF1 a){return ARcpF1(ASqrtF1(a));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ASatD1(AD1 a){return AMinD1(1.0,AMaxD1(0.0,a));} + A_STATIC AF1 ASatF1(AF1 a){return AMinF1(1.0f,AMaxF1(0.0f,a));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR OPS +//------------------------------------------------------------------------------------------------------------------------------ +// These are added as needed for production or prototyping, so not necessarily a complete set. +// They follow a convention of taking in a destination and also returning the destination value to increase utility. +//============================================================================================================================== + A_STATIC retAD2 opAAbsD2(outAD2 d,inAD2 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);return d;} + A_STATIC retAD3 opAAbsD3(outAD3 d,inAD3 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);d[2]=AAbsD1(a[2]);return d;} + A_STATIC retAD4 opAAbsD4(outAD4 d,inAD4 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);d[2]=AAbsD1(a[2]);d[3]=AAbsD1(a[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAAbsF2(outAF2 d,inAF2 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);return d;} + A_STATIC retAF3 opAAbsF3(outAF3 d,inAF3 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);d[2]=AAbsF1(a[2]);return d;} + A_STATIC retAF4 opAAbsF4(outAF4 d,inAF4 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);d[2]=AAbsF1(a[2]);d[3]=AAbsF1(a[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAAddD2(outAD2 d,inAD2 a,inAD2 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];return d;} + A_STATIC retAD3 opAAddD3(outAD3 d,inAD3 a,inAD3 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];return d;} + A_STATIC retAD4 opAAddD4(outAD4 d,inAD4 a,inAD4 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];d[3]=a[3]+b[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAAddF2(outAF2 d,inAF2 a,inAF2 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];return d;} + A_STATIC retAF3 opAAddF3(outAF3 d,inAF3 a,inAF3 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];return d;} + A_STATIC retAF4 opAAddF4(outAF4 d,inAF4 a,inAF4 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];d[3]=a[3]+b[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opAAddOneD2(outAD2 d,inAD2 a,AD1 b){d[0]=a[0]+b;d[1]=a[1]+b;return d;} + A_STATIC retAD3 opAAddOneD3(outAD3 d,inAD3 a,AD1 b){d[0]=a[0]+b;d[1]=a[1]+b;d[2]=a[2]+b;return d;} + A_STATIC retAD4 opAAddOneD4(outAD4 d,inAD4 a,AD1 b){d[0]=a[0]+b;d[1]=a[1]+b;d[2]=a[2]+b;d[3]=a[3]+b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAAddOneF2(outAF2 d,inAF2 a,AF1 b){d[0]=a[0]+b;d[1]=a[1]+b;return d;} + A_STATIC retAF3 opAAddOneF3(outAF3 d,inAF3 a,AF1 b){d[0]=a[0]+b;d[1]=a[1]+b;d[2]=a[2]+b;return d;} + A_STATIC retAF4 opAAddOneF4(outAF4 d,inAF4 a,AF1 b){d[0]=a[0]+b;d[1]=a[1]+b;d[2]=a[2]+b;d[3]=a[3]+b;return d;} +//============================================================================================================================== + A_STATIC retAD2 opACpyD2(outAD2 d,inAD2 a){d[0]=a[0];d[1]=a[1];return d;} + A_STATIC retAD3 opACpyD3(outAD3 d,inAD3 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];return d;} + A_STATIC retAD4 opACpyD4(outAD4 d,inAD4 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];d[3]=a[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opACpyF2(outAF2 d,inAF2 a){d[0]=a[0];d[1]=a[1];return d;} + A_STATIC retAF3 opACpyF3(outAF3 d,inAF3 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];return d;} + A_STATIC retAF4 opACpyF4(outAF4 d,inAF4 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];d[3]=a[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opALerpD2(outAD2 d,inAD2 a,inAD2 b,inAD2 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);return d;} + A_STATIC retAD3 opALerpD3(outAD3 d,inAD3 a,inAD3 b,inAD3 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);d[2]=ALerpD1(a[2],b[2],c[2]);return d;} + A_STATIC retAD4 opALerpD4(outAD4 d,inAD4 a,inAD4 b,inAD4 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);d[2]=ALerpD1(a[2],b[2],c[2]);d[3]=ALerpD1(a[3],b[3],c[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opALerpF2(outAF2 d,inAF2 a,inAF2 b,inAF2 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);return d;} + A_STATIC retAF3 opALerpF3(outAF3 d,inAF3 a,inAF3 b,inAF3 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);d[2]=ALerpF1(a[2],b[2],c[2]);return d;} + A_STATIC retAF4 opALerpF4(outAF4 d,inAF4 a,inAF4 b,inAF4 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);d[2]=ALerpF1(a[2],b[2],c[2]);d[3]=ALerpF1(a[3],b[3],c[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opALerpOneD2(outAD2 d,inAD2 a,inAD2 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);return d;} + A_STATIC retAD3 opALerpOneD3(outAD3 d,inAD3 a,inAD3 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);d[2]=ALerpD1(a[2],b[2],c);return d;} + A_STATIC retAD4 opALerpOneD4(outAD4 d,inAD4 a,inAD4 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);d[2]=ALerpD1(a[2],b[2],c);d[3]=ALerpD1(a[3],b[3],c);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opALerpOneF2(outAF2 d,inAF2 a,inAF2 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);return d;} + A_STATIC retAF3 opALerpOneF3(outAF3 d,inAF3 a,inAF3 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);d[2]=ALerpF1(a[2],b[2],c);return d;} + A_STATIC retAF4 opALerpOneF4(outAF4 d,inAF4 a,inAF4 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);d[2]=ALerpF1(a[2],b[2],c);d[3]=ALerpF1(a[3],b[3],c);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMaxD2(outAD2 d,inAD2 a,inAD2 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);return d;} + A_STATIC retAD3 opAMaxD3(outAD3 d,inAD3 a,inAD3 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);d[2]=AMaxD1(a[2],b[2]);return d;} + A_STATIC retAD4 opAMaxD4(outAD4 d,inAD4 a,inAD4 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);d[2]=AMaxD1(a[2],b[2]);d[3]=AMaxD1(a[3],b[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMaxF2(outAF2 d,inAF2 a,inAF2 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);return d;} + A_STATIC retAF3 opAMaxF3(outAF3 d,inAF3 a,inAF3 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);d[2]=AMaxF1(a[2],b[2]);return d;} + A_STATIC retAF4 opAMaxF4(outAF4 d,inAF4 a,inAF4 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);d[2]=AMaxF1(a[2],b[2]);d[3]=AMaxF1(a[3],b[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMinD2(outAD2 d,inAD2 a,inAD2 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);return d;} + A_STATIC retAD3 opAMinD3(outAD3 d,inAD3 a,inAD3 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);d[2]=AMinD1(a[2],b[2]);return d;} + A_STATIC retAD4 opAMinD4(outAD4 d,inAD4 a,inAD4 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);d[2]=AMinD1(a[2],b[2]);d[3]=AMinD1(a[3],b[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMinF2(outAF2 d,inAF2 a,inAF2 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);return d;} + A_STATIC retAF3 opAMinF3(outAF3 d,inAF3 a,inAF3 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);d[2]=AMinF1(a[2],b[2]);return d;} + A_STATIC retAF4 opAMinF4(outAF4 d,inAF4 a,inAF4 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);d[2]=AMinF1(a[2],b[2]);d[3]=AMinF1(a[3],b[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMulD2(outAD2 d,inAD2 a,inAD2 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];return d;} + A_STATIC retAD3 opAMulD3(outAD3 d,inAD3 a,inAD3 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];return d;} + A_STATIC retAD4 opAMulD4(outAD4 d,inAD4 a,inAD4 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];d[3]=a[3]*b[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMulF2(outAF2 d,inAF2 a,inAF2 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];return d;} + A_STATIC retAF3 opAMulF3(outAF3 d,inAF3 a,inAF3 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];return d;} + A_STATIC retAF4 opAMulF4(outAF4 d,inAF4 a,inAF4 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];d[3]=a[3]*b[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMulOneD2(outAD2 d,inAD2 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;return d;} + A_STATIC retAD3 opAMulOneD3(outAD3 d,inAD3 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;return d;} + A_STATIC retAD4 opAMulOneD4(outAD4 d,inAD4 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;d[3]=a[3]*b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMulOneF2(outAF2 d,inAF2 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;return d;} + A_STATIC retAF3 opAMulOneF3(outAF3 d,inAF3 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;return d;} + A_STATIC retAF4 opAMulOneF4(outAF4 d,inAF4 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;d[3]=a[3]*b;return d;} +//============================================================================================================================== + A_STATIC retAD2 opANegD2(outAD2 d,inAD2 a){d[0]=-a[0];d[1]=-a[1];return d;} + A_STATIC retAD3 opANegD3(outAD3 d,inAD3 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];return d;} + A_STATIC retAD4 opANegD4(outAD4 d,inAD4 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];d[3]=-a[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opANegF2(outAF2 d,inAF2 a){d[0]=-a[0];d[1]=-a[1];return d;} + A_STATIC retAF3 opANegF3(outAF3 d,inAF3 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];return d;} + A_STATIC retAF4 opANegF4(outAF4 d,inAF4 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];d[3]=-a[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opARcpD2(outAD2 d,inAD2 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);return d;} + A_STATIC retAD3 opARcpD3(outAD3 d,inAD3 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);d[2]=ARcpD1(a[2]);return d;} + A_STATIC retAD4 opARcpD4(outAD4 d,inAD4 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);d[2]=ARcpD1(a[2]);d[3]=ARcpD1(a[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opARcpF2(outAF2 d,inAF2 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);return d;} + A_STATIC retAF3 opARcpF3(outAF3 d,inAF3 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);d[2]=ARcpF1(a[2]);return d;} + A_STATIC retAF4 opARcpF4(outAF4 d,inAF4 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);d[2]=ARcpF1(a[2]);d[3]=ARcpF1(a[3]);return d;} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HALF FLOAT PACKING +//============================================================================================================================== + // Convert float to half (in lower 16-bits of output). + // Same fast technique as documented here: ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf + // Supports denormals. + // Conversion rules are to make computations possibly "safer" on the GPU, + // -INF & -NaN -> -65504 + // +INF & +NaN -> +65504 + A_STATIC AU1 AU1_AH1_AF1(AF1 f){ + static AW1 base[512]={ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100, + 0x0200,0x0400,0x0800,0x0c00,0x1000,0x1400,0x1800,0x1c00,0x2000,0x2400,0x2800,0x2c00,0x3000,0x3400,0x3800,0x3c00, + 0x4000,0x4400,0x4800,0x4c00,0x5000,0x5400,0x5800,0x5c00,0x6000,0x6400,0x6800,0x6c00,0x7000,0x7400,0x7800,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8001,0x8002,0x8004,0x8008,0x8010,0x8020,0x8040,0x8080,0x8100, + 0x8200,0x8400,0x8800,0x8c00,0x9000,0x9400,0x9800,0x9c00,0xa000,0xa400,0xa800,0xac00,0xb000,0xb400,0xb800,0xbc00, + 0xc000,0xc400,0xc800,0xcc00,0xd000,0xd400,0xd800,0xdc00,0xe000,0xe400,0xe800,0xec00,0xf000,0xf400,0xf800,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff}; + static AB1 shift[512]={ + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f, + 0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, + 0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f, + 0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, + 0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}; + union{AF1 f;AU1 u;}bits;bits.f=f;AU1 u=bits.u;AU1 i=u>>23;return (AU1)(base[i])+((u&0x7fffff)>>shift[i]);} +//------------------------------------------------------------------------------------------------------------------------------ + // Used to output packed constant. + A_STATIC AU1 AU1_AH2_AF2(inAF2 a){return AU1_AH1_AF1(a[0])+(AU1_AH1_AF1(a[1])<<16);} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// GLSL +// +// +//============================================================================================================================== +#if defined(A_GLSL) && defined(A_GPU) + #ifndef A_SKIP_EXT + #ifdef A_HALF + #extension GL_EXT_shader_16bit_storage:require + #extension GL_EXT_shader_explicit_arithmetic_types:require + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_LONG + #extension GL_ARB_gpu_shader_int64:require + #extension GL_NV_shader_atomic_int64:require + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_WAVE + #extension GL_KHR_shader_subgroup_arithmetic:require + #extension GL_KHR_shader_subgroup_ballot:require + #extension GL_KHR_shader_subgroup_quad:require + #extension GL_KHR_shader_subgroup_shuffle:require + #endif + #endif +//============================================================================================================================== + #define AP1 bool + #define AP2 bvec2 + #define AP3 bvec3 + #define AP4 bvec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF1 float + #define AF2 vec2 + #define AF3 vec3 + #define AF4 vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1 uint + #define AU2 uvec2 + #define AU3 uvec3 + #define AU4 uvec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASU1 int + #define ASU2 ivec2 + #define ASU3 ivec3 + #define ASU4 ivec4 +//============================================================================================================================== + #define AF1_AU1(x) uintBitsToFloat(AU1(x)) + #define AF2_AU2(x) uintBitsToFloat(AU2(x)) + #define AF3_AU3(x) uintBitsToFloat(AU3(x)) + #define AF4_AU4(x) uintBitsToFloat(AU4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AF1(x) floatBitsToUint(AF1(x)) + #define AU2_AF2(x) floatBitsToUint(AF2(x)) + #define AU3_AF3(x) floatBitsToUint(AF3(x)) + #define AU4_AF4(x) floatBitsToUint(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH1_AF1_x(AF1 a){return packHalf2x16(AF2(a,0.0));} + #define AU1_AH1_AF1(a) AU1_AH1_AF1_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AH2_AF2 packHalf2x16 + #define AU1_AW2Unorm_AF2 packUnorm2x16 + #define AU1_AB4Unorm_AF4 packUnorm4x8 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF2_AH2_AU1 unpackHalf2x16 + #define AF2_AW2Unorm_AU1 unpackUnorm2x16 + #define AF4_AB4Unorm_AU1 unpackUnorm4x8 +//============================================================================================================================== + AF1 AF1_x(AF1 a){return AF1(a);} + AF2 AF2_x(AF1 a){return AF2(a,a);} + AF3 AF3_x(AF1 a){return AF3(a,a,a);} + AF4 AF4_x(AF1 a){return AF4(a,a,a,a);} + #define AF1_(a) AF1_x(AF1(a)) + #define AF2_(a) AF2_x(AF1(a)) + #define AF3_(a) AF3_x(AF1(a)) + #define AF4_(a) AF4_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_x(AU1 a){return AU1(a);} + AU2 AU2_x(AU1 a){return AU2(a,a);} + AU3 AU3_x(AU1 a){return AU3(a,a,a);} + AU4 AU4_x(AU1 a){return AU4(a,a,a,a);} + #define AU1_(a) AU1_x(AU1(a)) + #define AU2_(a) AU2_x(AU1(a)) + #define AU3_(a) AU3_x(AU1(a)) + #define AU4_(a) AU4_x(AU1(a)) +//============================================================================================================================== + AU1 AAbsSU1(AU1 a){return AU1(abs(ASU1(a)));} + AU2 AAbsSU2(AU2 a){return AU2(abs(ASU2(a)));} + AU3 AAbsSU3(AU3 a){return AU3(abs(ASU3(a)));} + AU4 AAbsSU4(AU4 a){return AU4(abs(ASU4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 ABfe(AU1 src,AU1 off,AU1 bits){return bitfieldExtract(src,ASU1(off),ASU1(bits));} + AU1 ABfi(AU1 src,AU1 ins,AU1 mask){return (ins&mask)|(src&(~mask));} + // Proxy for V_BFI_B32 where the 'mask' is set as 'bits', 'mask=(1<>ASU1(b));} + AU2 AShrSU2(AU2 a,AU2 b){return AU2(ASU2(a)>>ASU2(b));} + AU3 AShrSU3(AU3 a,AU3 b){return AU3(ASU3(a)>>ASU3(b));} + AU4 AShrSU4(AU4 a,AU4 b){return AU4(ASU4(a)>>ASU4(b));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL BYTE +//============================================================================================================================== + #ifdef A_BYTE + #define AB1 uint8_t + #define AB2 u8vec2 + #define AB3 u8vec3 + #define AB4 u8vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASB1 int8_t + #define ASB2 i8vec2 + #define ASB3 i8vec3 + #define ASB4 i8vec4 +//------------------------------------------------------------------------------------------------------------------------------ + AB1 AB1_x(AB1 a){return AB1(a);} + AB2 AB2_x(AB1 a){return AB2(a,a);} + AB3 AB3_x(AB1 a){return AB3(a,a,a);} + AB4 AB4_x(AB1 a){return AB4(a,a,a,a);} + #define AB1_(a) AB1_x(AB1(a)) + #define AB2_(a) AB2_x(AB1(a)) + #define AB3_(a) AB3_x(AB1(a)) + #define AB4_(a) AB4_x(AB1(a)) + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL HALF +//============================================================================================================================== + #ifdef A_HALF + #define AH1 float16_t + #define AH2 f16vec2 + #define AH3 f16vec3 + #define AH4 f16vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1 uint16_t + #define AW2 u16vec2 + #define AW3 u16vec3 + #define AW4 u16vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASW1 int16_t + #define ASW2 i16vec2 + #define ASW3 i16vec3 + #define ASW4 i16vec4 +//============================================================================================================================== + #define AH2_AU1(x) unpackFloat2x16(AU1(x)) + AH4 AH4_AU2_x(AU2 x){return AH4(unpackFloat2x16(x.x),unpackFloat2x16(x.y));} + #define AH4_AU2(x) AH4_AU2_x(AU2(x)) + #define AW2_AU1(x) unpackUint2x16(AU1(x)) + #define AW4_AU2(x) unpackUint4x16(pack64(AU2(x))) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AH2(x) packFloat2x16(AH2(x)) + AU2 AU2_AH4_x(AH4 x){return AU2(packFloat2x16(x.xy),packFloat2x16(x.zw));} + #define AU2_AH4(x) AU2_AH4_x(AH4(x)) + #define AU1_AW2(x) packUint2x16(AW2(x)) + #define AU2_AW4(x) unpack32(packUint4x16(AW4(x))) +//============================================================================================================================== + #define AW1_AH1(x) halfBitsToUint16(AH1(x)) + #define AW2_AH2(x) halfBitsToUint16(AH2(x)) + #define AW3_AH3(x) halfBitsToUint16(AH3(x)) + #define AW4_AH4(x) halfBitsToUint16(AH4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AH1_AW1(x) uint16BitsToHalf(AW1(x)) + #define AH2_AW2(x) uint16BitsToHalf(AW2(x)) + #define AH3_AW3(x) uint16BitsToHalf(AW3(x)) + #define AH4_AW4(x) uint16BitsToHalf(AW4(x)) +//============================================================================================================================== + AH1 AH1_x(AH1 a){return AH1(a);} + AH2 AH2_x(AH1 a){return AH2(a,a);} + AH3 AH3_x(AH1 a){return AH3(a,a,a);} + AH4 AH4_x(AH1 a){return AH4(a,a,a,a);} + #define AH1_(a) AH1_x(AH1(a)) + #define AH2_(a) AH2_x(AH1(a)) + #define AH3_(a) AH3_x(AH1(a)) + #define AH4_(a) AH4_x(AH1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AW1_x(AW1 a){return AW1(a);} + AW2 AW2_x(AW1 a){return AW2(a,a);} + AW3 AW3_x(AW1 a){return AW3(a,a,a);} + AW4 AW4_x(AW1 a){return AW4(a,a,a,a);} + #define AW1_(a) AW1_x(AW1(a)) + #define AW2_(a) AW2_x(AW1(a)) + #define AW3_(a) AW3_x(AW1(a)) + #define AW4_(a) AW4_x(AW1(a)) +//============================================================================================================================== + AW1 AAbsSW1(AW1 a){return AW1(abs(ASW1(a)));} + AW2 AAbsSW2(AW2 a){return AW2(abs(ASW2(a)));} + AW3 AAbsSW3(AW3 a){return AW3(abs(ASW3(a)));} + AW4 AAbsSW4(AW4 a){return AW4(abs(ASW4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AClampH1(AH1 x,AH1 n,AH1 m){return clamp(x,n,m);} + AH2 AClampH2(AH2 x,AH2 n,AH2 m){return clamp(x,n,m);} + AH3 AClampH3(AH3 x,AH3 n,AH3 m){return clamp(x,n,m);} + AH4 AClampH4(AH4 x,AH4 n,AH4 m){return clamp(x,n,m);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AFractH1(AH1 x){return fract(x);} + AH2 AFractH2(AH2 x){return fract(x);} + AH3 AFractH3(AH3 x){return fract(x);} + AH4 AFractH4(AH4 x){return fract(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ALerpH1(AH1 x,AH1 y,AH1 a){return mix(x,y,a);} + AH2 ALerpH2(AH2 x,AH2 y,AH2 a){return mix(x,y,a);} + AH3 ALerpH3(AH3 x,AH3 y,AH3 a){return mix(x,y,a);} + AH4 ALerpH4(AH4 x,AH4 y,AH4 a){return mix(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + // No packed version of max3. + AH1 AMax3H1(AH1 x,AH1 y,AH1 z){return max(x,max(y,z));} + AH2 AMax3H2(AH2 x,AH2 y,AH2 z){return max(x,max(y,z));} + AH3 AMax3H3(AH3 x,AH3 y,AH3 z){return max(x,max(y,z));} + AH4 AMax3H4(AH4 x,AH4 y,AH4 z){return max(x,max(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMaxSW1(AW1 a,AW1 b){return AW1(max(ASU1(a),ASU1(b)));} + AW2 AMaxSW2(AW2 a,AW2 b){return AW2(max(ASU2(a),ASU2(b)));} + AW3 AMaxSW3(AW3 a,AW3 b){return AW3(max(ASU3(a),ASU3(b)));} + AW4 AMaxSW4(AW4 a,AW4 b){return AW4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + // No packed version of min3. + AH1 AMin3H1(AH1 x,AH1 y,AH1 z){return min(x,min(y,z));} + AH2 AMin3H2(AH2 x,AH2 y,AH2 z){return min(x,min(y,z));} + AH3 AMin3H3(AH3 x,AH3 y,AH3 z){return min(x,min(y,z));} + AH4 AMin3H4(AH4 x,AH4 y,AH4 z){return min(x,min(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMinSW1(AW1 a,AW1 b){return AW1(min(ASU1(a),ASU1(b)));} + AW2 AMinSW2(AW2 a,AW2 b){return AW2(min(ASU2(a),ASU2(b)));} + AW3 AMinSW3(AW3 a,AW3 b){return AW3(min(ASU3(a),ASU3(b)));} + AW4 AMinSW4(AW4 a,AW4 b){return AW4(min(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARcpH1(AH1 x){return AH1_(1.0)/x;} + AH2 ARcpH2(AH2 x){return AH2_(1.0)/x;} + AH3 ARcpH3(AH3 x){return AH3_(1.0)/x;} + AH4 ARcpH4(AH4 x){return AH4_(1.0)/x;} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARsqH1(AH1 x){return AH1_(1.0)/sqrt(x);} + AH2 ARsqH2(AH2 x){return AH2_(1.0)/sqrt(x);} + AH3 ARsqH3(AH3 x){return AH3_(1.0)/sqrt(x);} + AH4 ARsqH4(AH4 x){return AH4_(1.0)/sqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASatH1(AH1 x){return clamp(x,AH1_(0.0),AH1_(1.0));} + AH2 ASatH2(AH2 x){return clamp(x,AH2_(0.0),AH2_(1.0));} + AH3 ASatH3(AH3 x){return clamp(x,AH3_(0.0),AH3_(1.0));} + AH4 ASatH4(AH4 x){return clamp(x,AH4_(0.0),AH4_(1.0));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AShrSW1(AW1 a,AW1 b){return AW1(ASW1(a)>>ASW1(b));} + AW2 AShrSW2(AW2 a,AW2 b){return AW2(ASW2(a)>>ASW2(b));} + AW3 AShrSW3(AW3 a,AW3 b){return AW3(ASW3(a)>>ASW3(b));} + AW4 AShrSW4(AW4 a,AW4 b){return AW4(ASW4(a)>>ASW4(b));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL DOUBLE +//============================================================================================================================== + #ifdef A_DUBL + #define AD1 double + #define AD2 dvec2 + #define AD3 dvec3 + #define AD4 dvec4 +//------------------------------------------------------------------------------------------------------------------------------ + AD1 AD1_x(AD1 a){return AD1(a);} + AD2 AD2_x(AD1 a){return AD2(a,a);} + AD3 AD3_x(AD1 a){return AD3(a,a,a);} + AD4 AD4_x(AD1 a){return AD4(a,a,a,a);} + #define AD1_(a) AD1_x(AD1(a)) + #define AD2_(a) AD2_x(AD1(a)) + #define AD3_(a) AD3_x(AD1(a)) + #define AD4_(a) AD4_x(AD1(a)) +//============================================================================================================================== + AD1 AFractD1(AD1 x){return fract(x);} + AD2 AFractD2(AD2 x){return fract(x);} + AD3 AFractD3(AD3 x){return fract(x);} + AD4 AFractD4(AD4 x){return fract(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ALerpD1(AD1 x,AD1 y,AD1 a){return mix(x,y,a);} + AD2 ALerpD2(AD2 x,AD2 y,AD2 a){return mix(x,y,a);} + AD3 ALerpD3(AD3 x,AD3 y,AD3 a){return mix(x,y,a);} + AD4 ALerpD4(AD4 x,AD4 y,AD4 a){return mix(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARcpD1(AD1 x){return AD1_(1.0)/x;} + AD2 ARcpD2(AD2 x){return AD2_(1.0)/x;} + AD3 ARcpD3(AD3 x){return AD3_(1.0)/x;} + AD4 ARcpD4(AD4 x){return AD4_(1.0)/x;} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARsqD1(AD1 x){return AD1_(1.0)/sqrt(x);} + AD2 ARsqD2(AD2 x){return AD2_(1.0)/sqrt(x);} + AD3 ARsqD3(AD3 x){return AD3_(1.0)/sqrt(x);} + AD4 ARsqD4(AD4 x){return AD4_(1.0)/sqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ASatD1(AD1 x){return clamp(x,AD1_(0.0),AD1_(1.0));} + AD2 ASatD2(AD2 x){return clamp(x,AD2_(0.0),AD2_(1.0));} + AD3 ASatD3(AD3 x){return clamp(x,AD3_(0.0),AD3_(1.0));} + AD4 ASatD4(AD4 x){return clamp(x,AD4_(0.0),AD4_(1.0));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL LONG +//============================================================================================================================== + #ifdef A_LONG + #define AL1 uint64_t + #define AL2 u64vec2 + #define AL3 u64vec3 + #define AL4 u64vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASL1 int64_t + #define ASL2 i64vec2 + #define ASL3 i64vec3 + #define ASL4 i64vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AL1_AU2(x) packUint2x32(AU2(x)) + #define AU2_AL1(x) unpackUint2x32(AL1(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AL1 AL1_x(AL1 a){return AL1(a);} + AL2 AL2_x(AL1 a){return AL2(a,a);} + AL3 AL3_x(AL1 a){return AL3(a,a,a);} + AL4 AL4_x(AL1 a){return AL4(a,a,a,a);} + #define AL1_(a) AL1_x(AL1(a)) + #define AL2_(a) AL2_x(AL1(a)) + #define AL3_(a) AL3_x(AL1(a)) + #define AL4_(a) AL4_x(AL1(a)) +//============================================================================================================================== + AL1 AAbsSL1(AL1 a){return AL1(abs(ASL1(a)));} + AL2 AAbsSL2(AL2 a){return AL2(abs(ASL2(a)));} + AL3 AAbsSL3(AL3 a){return AL3(abs(ASL3(a)));} + AL4 AAbsSL4(AL4 a){return AL4(abs(ASL4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AL1 AMaxSL1(AL1 a,AL1 b){return AL1(max(ASU1(a),ASU1(b)));} + AL2 AMaxSL2(AL2 a,AL2 b){return AL2(max(ASU2(a),ASU2(b)));} + AL3 AMaxSL3(AL3 a,AL3 b){return AL3(max(ASU3(a),ASU3(b)));} + AL4 AMaxSL4(AL4 a,AL4 b){return AL4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AL1 AMinSL1(AL1 a,AL1 b){return AL1(min(ASU1(a),ASU1(b)));} + AL2 AMinSL2(AL2 a,AL2 b){return AL2(min(ASU2(a),ASU2(b)));} + AL3 AMinSL3(AL3 a,AL3 b){return AL3(min(ASU3(a),ASU3(b)));} + AL4 AMinSL4(AL4 a,AL4 b){return AL4(min(ASU4(a),ASU4(b)));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// WAVE OPERATIONS +//============================================================================================================================== + #ifdef A_WAVE + // Where 'x' must be a compile time literal. + AF1 AWaveXorF1(AF1 v,AU1 x){return subgroupShuffleXor(v,x);} + AF2 AWaveXorF2(AF2 v,AU1 x){return subgroupShuffleXor(v,x);} + AF3 AWaveXorF3(AF3 v,AU1 x){return subgroupShuffleXor(v,x);} + AF4 AWaveXorF4(AF4 v,AU1 x){return subgroupShuffleXor(v,x);} + AU1 AWaveXorU1(AU1 v,AU1 x){return subgroupShuffleXor(v,x);} + AU2 AWaveXorU2(AU2 v,AU1 x){return subgroupShuffleXor(v,x);} + AU3 AWaveXorU3(AU3 v,AU1 x){return subgroupShuffleXor(v,x);} + AU4 AWaveXorU4(AU4 v,AU1 x){return subgroupShuffleXor(v,x);} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_HALF + AH2 AWaveXorH2(AH2 v,AU1 x){return AH2_AU1(subgroupShuffleXor(AU1_AH2(v),x));} + AH4 AWaveXorH4(AH4 v,AU1 x){return AH4_AU2(subgroupShuffleXor(AU2_AH4(v),x));} + AW2 AWaveXorW2(AW2 v,AU1 x){return AW2_AU1(subgroupShuffleXor(AU1_AW2(v),x));} + AW4 AWaveXorW4(AW4 v,AU1 x){return AW4_AU2(subgroupShuffleXor(AU2_AW4(v),x));} + #endif + #endif +//============================================================================================================================== +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// HLSL +// +// +//============================================================================================================================== +#if defined(A_HLSL) && defined(A_GPU) + #ifdef A_HLSL_6_2 + #define AP1 bool + #define AP2 bool2 + #define AP3 bool3 + #define AP4 bool4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF1 float32_t + #define AF2 float32_t2 + #define AF3 float32_t3 + #define AF4 float32_t4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1 uint32_t + #define AU2 uint32_t2 + #define AU3 uint32_t3 + #define AU4 uint32_t4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASU1 int32_t + #define ASU2 int32_t2 + #define ASU3 int32_t3 + #define ASU4 int32_t4 + #else + #define AP1 bool + #define AP2 bool2 + #define AP3 bool3 + #define AP4 bool4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF1 float + #define AF2 float2 + #define AF3 float3 + #define AF4 float4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1 uint + #define AU2 uint2 + #define AU3 uint3 + #define AU4 uint4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASU1 int + #define ASU2 int2 + #define ASU3 int3 + #define ASU4 int4 + #endif +//============================================================================================================================== + #define AF1_AU1(x) asfloat(AU1(x)) + #define AF2_AU2(x) asfloat(AU2(x)) + #define AF3_AU3(x) asfloat(AU3(x)) + #define AF4_AU4(x) asfloat(AU4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AF1(x) asuint(AF1(x)) + #define AU2_AF2(x) asuint(AF2(x)) + #define AU3_AF3(x) asuint(AF3(x)) + #define AU4_AF4(x) asuint(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH1_AF1_x(AF1 a){return f32tof16(a);} + #define AU1_AH1_AF1(a) AU1_AH1_AF1_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH2_AF2_x(AF2 a){return f32tof16(a.x)|(f32tof16(a.y)<<16);} + #define AU1_AH2_AF2(a) AU1_AH2_AF2_x(AF2(a)) + #define AU1_AB4Unorm_AF4(x) D3DCOLORtoUBYTE4(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AF2 AF2_AH2_AU1_x(AU1 x){return AF2(f16tof32(x&0xFFFF),f16tof32(x>>16));} + #define AF2_AH2_AU1(x) AF2_AH2_AU1_x(AU1(x)) +//============================================================================================================================== + AF1 AF1_x(AF1 a){return AF1(a);} + AF2 AF2_x(AF1 a){return AF2(a,a);} + AF3 AF3_x(AF1 a){return AF3(a,a,a);} + AF4 AF4_x(AF1 a){return AF4(a,a,a,a);} + #define AF1_(a) AF1_x(AF1(a)) + #define AF2_(a) AF2_x(AF1(a)) + #define AF3_(a) AF3_x(AF1(a)) + #define AF4_(a) AF4_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_x(AU1 a){return AU1(a);} + AU2 AU2_x(AU1 a){return AU2(a,a);} + AU3 AU3_x(AU1 a){return AU3(a,a,a);} + AU4 AU4_x(AU1 a){return AU4(a,a,a,a);} + #define AU1_(a) AU1_x(AU1(a)) + #define AU2_(a) AU2_x(AU1(a)) + #define AU3_(a) AU3_x(AU1(a)) + #define AU4_(a) AU4_x(AU1(a)) +//============================================================================================================================== + AU1 AAbsSU1(AU1 a){return AU1(abs(ASU1(a)));} + AU2 AAbsSU2(AU2 a){return AU2(abs(ASU2(a)));} + AU3 AAbsSU3(AU3 a){return AU3(abs(ASU3(a)));} + AU4 AAbsSU4(AU4 a){return AU4(abs(ASU4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 ABfe(AU1 src,AU1 off,AU1 bits){AU1 mask=(1u<>off)&mask;} + AU1 ABfi(AU1 src,AU1 ins,AU1 mask){return (ins&mask)|(src&(~mask));} + AU1 ABfiM(AU1 src,AU1 ins,AU1 bits){AU1 mask=(1u<>ASU1(b));} + AU2 AShrSU2(AU2 a,AU2 b){return AU2(ASU2(a)>>ASU2(b));} + AU3 AShrSU3(AU3 a,AU3 b){return AU3(ASU3(a)>>ASU3(b));} + AU4 AShrSU4(AU4 a,AU4 b){return AU4(ASU4(a)>>ASU4(b));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL BYTE +//============================================================================================================================== + #ifdef A_BYTE + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL HALF +//============================================================================================================================== + #ifdef A_HALF + #ifdef A_HLSL_6_2 + #define AH1 float16_t + #define AH2 float16_t2 + #define AH3 float16_t3 + #define AH4 float16_t4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1 uint16_t + #define AW2 uint16_t2 + #define AW3 uint16_t3 + #define AW4 uint16_t4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASW1 int16_t + #define ASW2 int16_t2 + #define ASW3 int16_t3 + #define ASW4 int16_t4 + #else + #define AH1 min16float + #define AH2 min16float2 + #define AH3 min16float3 + #define AH4 min16float4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1 min16uint + #define AW2 min16uint2 + #define AW3 min16uint3 + #define AW4 min16uint4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASW1 min16int + #define ASW2 min16int2 + #define ASW3 min16int3 + #define ASW4 min16int4 + #endif +//============================================================================================================================== + // Need to use manual unpack to get optimal execution (don't use packed types in buffers directly). + // Unpack requires this pattern: https://gpuopen.com/first-steps-implementing-fp16/ + AH2 AH2_AU1_x(AU1 x){AF2 t=f16tof32(AU2(x&0xFFFF,x>>16));return AH2(t);} + AH4 AH4_AU2_x(AU2 x){return AH4(AH2_AU1_x(x.x),AH2_AU1_x(x.y));} + AW2 AW2_AU1_x(AU1 x){AU2 t=AU2(x&0xFFFF,x>>16);return AW2(t);} + AW4 AW4_AU2_x(AU2 x){return AW4(AW2_AU1_x(x.x),AW2_AU1_x(x.y));} + #define AH2_AU1(x) AH2_AU1_x(AU1(x)) + #define AH4_AU2(x) AH4_AU2_x(AU2(x)) + #define AW2_AU1(x) AW2_AU1_x(AU1(x)) + #define AW4_AU2(x) AW4_AU2_x(AU2(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH2_x(AH2 x){return f32tof16(x.x)+(f32tof16(x.y)<<16);} + AU2 AU2_AH4_x(AH4 x){return AU2(AU1_AH2_x(x.xy),AU1_AH2_x(x.zw));} + AU1 AU1_AW2_x(AW2 x){return AU1(x.x)+(AU1(x.y)<<16);} + AU2 AU2_AW4_x(AW4 x){return AU2(AU1_AW2_x(x.xy),AU1_AW2_x(x.zw));} + #define AU1_AH2(x) AU1_AH2_x(AH2(x)) + #define AU2_AH4(x) AU2_AH4_x(AH4(x)) + #define AU1_AW2(x) AU1_AW2_x(AW2(x)) + #define AU2_AW4(x) AU2_AW4_x(AW4(x)) +//============================================================================================================================== + #if defined(A_HLSL_6_2) && !defined(A_NO_16_BIT_CAST) + #define AW1_AH1(x) asuint16(x) + #define AW2_AH2(x) asuint16(x) + #define AW3_AH3(x) asuint16(x) + #define AW4_AH4(x) asuint16(x) + #else + #define AW1_AH1(a) AW1(f32tof16(AF1(a))) + #define AW2_AH2(a) AW2(AW1_AH1((a).x),AW1_AH1((a).y)) + #define AW3_AH3(a) AW3(AW1_AH1((a).x),AW1_AH1((a).y),AW1_AH1((a).z)) + #define AW4_AH4(a) AW4(AW1_AH1((a).x),AW1_AH1((a).y),AW1_AH1((a).z),AW1_AH1((a).w)) + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #if defined(A_HLSL_6_2) && !defined(A_NO_16_BIT_CAST) + #define AH1_AW1(x) asfloat16(x) + #define AH2_AW2(x) asfloat16(x) + #define AH3_AW3(x) asfloat16(x) + #define AH4_AW4(x) asfloat16(x) + #else + #define AH1_AW1(a) AH1(f16tof32(AU1(a))) + #define AH2_AW2(a) AH2(AH1_AW1((a).x),AH1_AW1((a).y)) + #define AH3_AW3(a) AH3(AH1_AW1((a).x),AH1_AW1((a).y),AH1_AW1((a).z)) + #define AH4_AW4(a) AH4(AH1_AW1((a).x),AH1_AW1((a).y),AH1_AW1((a).z),AH1_AW1((a).w)) + #endif +//============================================================================================================================== + AH1 AH1_x(AH1 a){return AH1(a);} + AH2 AH2_x(AH1 a){return AH2(a,a);} + AH3 AH3_x(AH1 a){return AH3(a,a,a);} + AH4 AH4_x(AH1 a){return AH4(a,a,a,a);} + #define AH1_(a) AH1_x(AH1(a)) + #define AH2_(a) AH2_x(AH1(a)) + #define AH3_(a) AH3_x(AH1(a)) + #define AH4_(a) AH4_x(AH1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AW1_x(AW1 a){return AW1(a);} + AW2 AW2_x(AW1 a){return AW2(a,a);} + AW3 AW3_x(AW1 a){return AW3(a,a,a);} + AW4 AW4_x(AW1 a){return AW4(a,a,a,a);} + #define AW1_(a) AW1_x(AW1(a)) + #define AW2_(a) AW2_x(AW1(a)) + #define AW3_(a) AW3_x(AW1(a)) + #define AW4_(a) AW4_x(AW1(a)) +//============================================================================================================================== + AW1 AAbsSW1(AW1 a){return AW1(abs(ASW1(a)));} + AW2 AAbsSW2(AW2 a){return AW2(abs(ASW2(a)));} + AW3 AAbsSW3(AW3 a){return AW3(abs(ASW3(a)));} + AW4 AAbsSW4(AW4 a){return AW4(abs(ASW4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AClampH1(AH1 x,AH1 n,AH1 m){return max(n,min(x,m));} + AH2 AClampH2(AH2 x,AH2 n,AH2 m){return max(n,min(x,m));} + AH3 AClampH3(AH3 x,AH3 n,AH3 m){return max(n,min(x,m));} + AH4 AClampH4(AH4 x,AH4 n,AH4 m){return max(n,min(x,m));} +//------------------------------------------------------------------------------------------------------------------------------ + // V_FRACT_F16 (note DX frac() is different). + AH1 AFractH1(AH1 x){return x-floor(x);} + AH2 AFractH2(AH2 x){return x-floor(x);} + AH3 AFractH3(AH3 x){return x-floor(x);} + AH4 AFractH4(AH4 x){return x-floor(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ALerpH1(AH1 x,AH1 y,AH1 a){return lerp(x,y,a);} + AH2 ALerpH2(AH2 x,AH2 y,AH2 a){return lerp(x,y,a);} + AH3 ALerpH3(AH3 x,AH3 y,AH3 a){return lerp(x,y,a);} + AH4 ALerpH4(AH4 x,AH4 y,AH4 a){return lerp(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AMax3H1(AH1 x,AH1 y,AH1 z){return max(x,max(y,z));} + AH2 AMax3H2(AH2 x,AH2 y,AH2 z){return max(x,max(y,z));} + AH3 AMax3H3(AH3 x,AH3 y,AH3 z){return max(x,max(y,z));} + AH4 AMax3H4(AH4 x,AH4 y,AH4 z){return max(x,max(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMaxSW1(AW1 a,AW1 b){return AW1(max(ASU1(a),ASU1(b)));} + AW2 AMaxSW2(AW2 a,AW2 b){return AW2(max(ASU2(a),ASU2(b)));} + AW3 AMaxSW3(AW3 a,AW3 b){return AW3(max(ASU3(a),ASU3(b)));} + AW4 AMaxSW4(AW4 a,AW4 b){return AW4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AMin3H1(AH1 x,AH1 y,AH1 z){return min(x,min(y,z));} + AH2 AMin3H2(AH2 x,AH2 y,AH2 z){return min(x,min(y,z));} + AH3 AMin3H3(AH3 x,AH3 y,AH3 z){return min(x,min(y,z));} + AH4 AMin3H4(AH4 x,AH4 y,AH4 z){return min(x,min(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMinSW1(AW1 a,AW1 b){return AW1(min(ASU1(a),ASU1(b)));} + AW2 AMinSW2(AW2 a,AW2 b){return AW2(min(ASU2(a),ASU2(b)));} + AW3 AMinSW3(AW3 a,AW3 b){return AW3(min(ASU3(a),ASU3(b)));} + AW4 AMinSW4(AW4 a,AW4 b){return AW4(min(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARcpH1(AH1 x){return rcp(x);} + AH2 ARcpH2(AH2 x){return rcp(x);} + AH3 ARcpH3(AH3 x){return rcp(x);} + AH4 ARcpH4(AH4 x){return rcp(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARsqH1(AH1 x){return rsqrt(x);} + AH2 ARsqH2(AH2 x){return rsqrt(x);} + AH3 ARsqH3(AH3 x){return rsqrt(x);} + AH4 ARsqH4(AH4 x){return rsqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASatH1(AH1 x){return saturate(x);} + AH2 ASatH2(AH2 x){return saturate(x);} + AH3 ASatH3(AH3 x){return saturate(x);} + AH4 ASatH4(AH4 x){return saturate(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AShrSW1(AW1 a,AW1 b){return AW1(ASW1(a)>>ASW1(b));} + AW2 AShrSW2(AW2 a,AW2 b){return AW2(ASW2(a)>>ASW2(b));} + AW3 AShrSW3(AW3 a,AW3 b){return AW3(ASW3(a)>>ASW3(b));} + AW4 AShrSW4(AW4 a,AW4 b){return AW4(ASW4(a)>>ASW4(b));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL DOUBLE +//============================================================================================================================== + #ifdef A_DUBL + #ifdef A_HLSL_6_2 + #define AD1 float64_t + #define AD2 float64_t2 + #define AD3 float64_t3 + #define AD4 float64_t4 + #else + #define AD1 double + #define AD2 double2 + #define AD3 double3 + #define AD4 double4 + #endif +//------------------------------------------------------------------------------------------------------------------------------ + AD1 AD1_x(AD1 a){return AD1(a);} + AD2 AD2_x(AD1 a){return AD2(a,a);} + AD3 AD3_x(AD1 a){return AD3(a,a,a);} + AD4 AD4_x(AD1 a){return AD4(a,a,a,a);} + #define AD1_(a) AD1_x(AD1(a)) + #define AD2_(a) AD2_x(AD1(a)) + #define AD3_(a) AD3_x(AD1(a)) + #define AD4_(a) AD4_x(AD1(a)) +//============================================================================================================================== + AD1 AFractD1(AD1 a){return a-floor(a);} + AD2 AFractD2(AD2 a){return a-floor(a);} + AD3 AFractD3(AD3 a){return a-floor(a);} + AD4 AFractD4(AD4 a){return a-floor(a);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ALerpD1(AD1 x,AD1 y,AD1 a){return lerp(x,y,a);} + AD2 ALerpD2(AD2 x,AD2 y,AD2 a){return lerp(x,y,a);} + AD3 ALerpD3(AD3 x,AD3 y,AD3 a){return lerp(x,y,a);} + AD4 ALerpD4(AD4 x,AD4 y,AD4 a){return lerp(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARcpD1(AD1 x){return rcp(x);} + AD2 ARcpD2(AD2 x){return rcp(x);} + AD3 ARcpD3(AD3 x){return rcp(x);} + AD4 ARcpD4(AD4 x){return rcp(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARsqD1(AD1 x){return rsqrt(x);} + AD2 ARsqD2(AD2 x){return rsqrt(x);} + AD3 ARsqD3(AD3 x){return rsqrt(x);} + AD4 ARsqD4(AD4 x){return rsqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ASatD1(AD1 x){return saturate(x);} + AD2 ASatD2(AD2 x){return saturate(x);} + AD3 ASatD3(AD3 x){return saturate(x);} + AD4 ASatD4(AD4 x){return saturate(x);} + #endif +//============================================================================================================================== +// HLSL WAVE +//============================================================================================================================== + #ifdef A_WAVE + // Where 'x' must be a compile time literal. + AF1 AWaveXorF1(AF1 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AF2 AWaveXorF2(AF2 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AF3 AWaveXorF3(AF3 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AF4 AWaveXorF4(AF4 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AU1 AWaveXorU1(AU1 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AU2 AWaveXorU1(AU2 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AU3 AWaveXorU1(AU3 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AU4 AWaveXorU1(AU4 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_HALF + AH2 AWaveXorH2(AH2 v,AU1 x){return AH2_AU1(WaveReadLaneAt(AU1_AH2(v),WaveGetLaneIndex()^x));} + AH4 AWaveXorH4(AH4 v,AU1 x){return AH4_AU2(WaveReadLaneAt(AU2_AH4(v),WaveGetLaneIndex()^x));} + AW2 AWaveXorW2(AW2 v,AU1 x){return AW2_AU1(WaveReadLaneAt(AU1_AW2(v),WaveGetLaneIndex()^x));} + AW4 AWaveXorW4(AW4 v,AU1 x){return AW4_AU1(WaveReadLaneAt(AU1_AW4(v),WaveGetLaneIndex()^x));} + #endif + #endif +//============================================================================================================================== +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// GPU COMMON +// +// +//============================================================================================================================== +#ifdef A_GPU + // Negative and positive infinity. + #define A_INFP_F AF1_AU1(0x7f800000u) + #define A_INFN_F AF1_AU1(0xff800000u) +//------------------------------------------------------------------------------------------------------------------------------ + // Copy sign from 's' to positive 'd'. + AF1 ACpySgnF1(AF1 d,AF1 s){return AF1_AU1(AU1_AF1(d)|(AU1_AF1(s)&AU1_(0x80000000u)));} + AF2 ACpySgnF2(AF2 d,AF2 s){return AF2_AU2(AU2_AF2(d)|(AU2_AF2(s)&AU2_(0x80000000u)));} + AF3 ACpySgnF3(AF3 d,AF3 s){return AF3_AU3(AU3_AF3(d)|(AU3_AF3(s)&AU3_(0x80000000u)));} + AF4 ACpySgnF4(AF4 d,AF4 s){return AF4_AU4(AU4_AF4(d)|(AU4_AF4(s)&AU4_(0x80000000u)));} +//------------------------------------------------------------------------------------------------------------------------------ + // Single operation to return (useful to create a mask to use in lerp for branch free logic), + // m=NaN := 0 + // m>=0 := 0 + // m<0 := 1 + // Uses the following useful floating point logic, + // saturate(+a*(-INF)==-INF) := 0 + // saturate( 0*(-INF)== NaN) := 0 + // saturate(-a*(-INF)==+INF) := 1 + AF1 ASignedF1(AF1 m){return ASatF1(m*AF1_(A_INFN_F));} + AF2 ASignedF2(AF2 m){return ASatF2(m*AF2_(A_INFN_F));} + AF3 ASignedF3(AF3 m){return ASatF3(m*AF3_(A_INFN_F));} + AF4 ASignedF4(AF4 m){return ASatF4(m*AF4_(A_INFN_F));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AGtZeroF1(AF1 m){return ASatF1(m*AF1_(A_INFP_F));} + AF2 AGtZeroF2(AF2 m){return ASatF2(m*AF2_(A_INFP_F));} + AF3 AGtZeroF3(AF3 m){return ASatF3(m*AF3_(A_INFP_F));} + AF4 AGtZeroF4(AF4 m){return ASatF4(m*AF4_(A_INFP_F));} +//============================================================================================================================== + #ifdef A_HALF + #ifdef A_HLSL_6_2 + #define A_INFP_H AH1_AW1((uint16_t)0x7c00u) + #define A_INFN_H AH1_AW1((uint16_t)0xfc00u) + #else + #define A_INFP_H AH1_AW1(0x7c00u) + #define A_INFN_H AH1_AW1(0xfc00u) + #endif + +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ACpySgnH1(AH1 d,AH1 s){return AH1_AW1(AW1_AH1(d)|(AW1_AH1(s)&AW1_(0x8000u)));} + AH2 ACpySgnH2(AH2 d,AH2 s){return AH2_AW2(AW2_AH2(d)|(AW2_AH2(s)&AW2_(0x8000u)));} + AH3 ACpySgnH3(AH3 d,AH3 s){return AH3_AW3(AW3_AH3(d)|(AW3_AH3(s)&AW3_(0x8000u)));} + AH4 ACpySgnH4(AH4 d,AH4 s){return AH4_AW4(AW4_AH4(d)|(AW4_AH4(s)&AW4_(0x8000u)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASignedH1(AH1 m){return ASatH1(m*AH1_(A_INFN_H));} + AH2 ASignedH2(AH2 m){return ASatH2(m*AH2_(A_INFN_H));} + AH3 ASignedH3(AH3 m){return ASatH3(m*AH3_(A_INFN_H));} + AH4 ASignedH4(AH4 m){return ASatH4(m*AH4_(A_INFN_H));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AGtZeroH1(AH1 m){return ASatH1(m*AH1_(A_INFP_H));} + AH2 AGtZeroH2(AH2 m){return ASatH2(m*AH2_(A_INFP_H));} + AH3 AGtZeroH3(AH3 m){return ASatH3(m*AH3_(A_INFP_H));} + AH4 AGtZeroH4(AH4 m){return ASatH4(m*AH4_(A_INFP_H));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [FIS] FLOAT INTEGER SORTABLE +//------------------------------------------------------------------------------------------------------------------------------ +// Float to integer sortable. +// - If sign bit=0, flip the sign bit (positives). +// - If sign bit=1, flip all bits (negatives). +// Integer sortable to float. +// - If sign bit=1, flip the sign bit (positives). +// - If sign bit=0, flip all bits (negatives). +// Has nice side effects. +// - Larger integers are more positive values. +// - Float zero is mapped to center of integers (so clear to integer zero is a nice default for atomic max usage). +// Burns 3 ops for conversion {shift,or,xor}. +//============================================================================================================================== + AU1 AFisToU1(AU1 x){return x^(( AShrSU1(x,AU1_(31)))|AU1_(0x80000000));} + AU1 AFisFromU1(AU1 x){return x^((~AShrSU1(x,AU1_(31)))|AU1_(0x80000000));} +//------------------------------------------------------------------------------------------------------------------------------ + // Just adjust high 16-bit value (useful when upper part of 32-bit word is a 16-bit float value). + AU1 AFisToHiU1(AU1 x){return x^(( AShrSU1(x,AU1_(15)))|AU1_(0x80000000));} + AU1 AFisFromHiU1(AU1 x){return x^((~AShrSU1(x,AU1_(15)))|AU1_(0x80000000));} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_HALF + AW1 AFisToW1(AW1 x){return x^(( AShrSW1(x,AW1_(15)))|AW1_(0x8000));} + AW1 AFisFromW1(AW1 x){return x^((~AShrSW1(x,AW1_(15)))|AW1_(0x8000));} +//------------------------------------------------------------------------------------------------------------------------------ + AW2 AFisToW2(AW2 x){return x^(( AShrSW2(x,AW2_(15)))|AW2_(0x8000));} + AW2 AFisFromW2(AW2 x){return x^((~AShrSW2(x,AW2_(15)))|AW2_(0x8000));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [PERM] V_PERM_B32 +//------------------------------------------------------------------------------------------------------------------------------ +// Support for V_PERM_B32 started in the 3rd generation of GCN. +//------------------------------------------------------------------------------------------------------------------------------ +// yyyyxxxx - The 'i' input. +// 76543210 +// ======== +// HGFEDCBA - Naming on permutation. +//------------------------------------------------------------------------------------------------------------------------------ +// TODO +// ==== +// - Make sure compiler optimizes this. +//============================================================================================================================== + #ifdef A_HALF + AU1 APerm0E0A(AU2 i){return((i.x )&0xffu)|((i.y<<16)&0xff0000u);} + AU1 APerm0F0B(AU2 i){return((i.x>> 8)&0xffu)|((i.y<< 8)&0xff0000u);} + AU1 APerm0G0C(AU2 i){return((i.x>>16)&0xffu)|((i.y )&0xff0000u);} + AU1 APerm0H0D(AU2 i){return((i.x>>24)&0xffu)|((i.y>> 8)&0xff0000u);} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 APermHGFA(AU2 i){return((i.x )&0x000000ffu)|(i.y&0xffffff00u);} + AU1 APermHGFC(AU2 i){return((i.x>>16)&0x000000ffu)|(i.y&0xffffff00u);} + AU1 APermHGAE(AU2 i){return((i.x<< 8)&0x0000ff00u)|(i.y&0xffff00ffu);} + AU1 APermHGCE(AU2 i){return((i.x>> 8)&0x0000ff00u)|(i.y&0xffff00ffu);} + AU1 APermHAFE(AU2 i){return((i.x<<16)&0x00ff0000u)|(i.y&0xff00ffffu);} + AU1 APermHCFE(AU2 i){return((i.x )&0x00ff0000u)|(i.y&0xff00ffffu);} + AU1 APermAGFE(AU2 i){return((i.x<<24)&0xff000000u)|(i.y&0x00ffffffu);} + AU1 APermCGFE(AU2 i){return((i.x<< 8)&0xff000000u)|(i.y&0x00ffffffu);} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 APermGCEA(AU2 i){return((i.x)&0x00ff00ffu)|((i.y<<8)&0xff00ff00u);} + AU1 APermGECA(AU2 i){return(((i.x)&0xffu)|((i.x>>8)&0xff00u)|((i.y<<16)&0xff0000u)|((i.y<<8)&0xff000000u));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [BUC] BYTE UNSIGNED CONVERSION +//------------------------------------------------------------------------------------------------------------------------------ +// Designed to use the optimal conversion, enables the scaling to possibly be factored into other computation. +// Works on a range of {0 to A_BUC_<32,16>}, for <32-bit, and 16-bit> respectively. +//------------------------------------------------------------------------------------------------------------------------------ +// OPCODE NOTES +// ============ +// GCN does not do UNORM or SNORM for bytes in opcodes. +// - V_CVT_F32_UBYTE{0,1,2,3} - Unsigned byte to float. +// - V_CVT_PKACC_U8_F32 - Float to unsigned byte (does bit-field insert into 32-bit integer). +// V_PERM_B32 does byte packing with ability to zero fill bytes as well. +// - Can pull out byte values from two sources, and zero fill upper 8-bits of packed hi and lo. +//------------------------------------------------------------------------------------------------------------------------------ +// BYTE : FLOAT - ABuc{0,1,2,3}{To,From}U1() - Designed for V_CVT_F32_UBYTE* and V_CVT_PKACCUM_U8_F32 ops. +// ==== ===== +// 0 : 0 +// 1 : 1 +// ... +// 255 : 255 +// : 256 (just outside the encoding range) +//------------------------------------------------------------------------------------------------------------------------------ +// BYTE : FLOAT - ABuc{0,1,2,3}{To,From}U2() - Designed for 16-bit denormal tricks and V_PERM_B32. +// ==== ===== +// 0 : 0 +// 1 : 1/512 +// 2 : 1/256 +// ... +// 64 : 1/8 +// 128 : 1/4 +// 255 : 255/512 +// : 1/2 (just outside the encoding range) +//------------------------------------------------------------------------------------------------------------------------------ +// OPTIMAL IMPLEMENTATIONS ON AMD ARCHITECTURES +// ============================================ +// r=ABuc0FromU1(i) +// V_CVT_F32_UBYTE0 r,i +// -------------------------------------------- +// r=ABuc0ToU1(d,i) +// V_CVT_PKACCUM_U8_F32 r,i,0,d +// -------------------------------------------- +// d=ABuc0FromU2(i) +// Where 'k0' is an SGPR with 0x0E0A +// Where 'k1' is an SGPR with {32768.0} packed into the lower 16-bits +// V_PERM_B32 d,i.x,i.y,k0 +// V_PK_FMA_F16 d,d,k1.x,0 +// -------------------------------------------- +// r=ABuc0ToU2(d,i) +// Where 'k0' is an SGPR with {1.0/32768.0} packed into the lower 16-bits +// Where 'k1' is an SGPR with 0x???? +// Where 'k2' is an SGPR with 0x???? +// V_PK_FMA_F16 i,i,k0.x,0 +// V_PERM_B32 r.x,i,i,k1 +// V_PERM_B32 r.y,i,i,k2 +//============================================================================================================================== + // Peak range for 32-bit and 16-bit operations. + #define A_BUC_32 (255.0) + #define A_BUC_16 (255.0/512.0) +//============================================================================================================================== + #if 1 + // Designed to be one V_CVT_PKACCUM_U8_F32. + // The extra min is required to pattern match to V_CVT_PKACCUM_U8_F32. + AU1 ABuc0ToU1(AU1 d,AF1 i){return (d&0xffffff00u)|((min(AU1(i),255u) )&(0x000000ffu));} + AU1 ABuc1ToU1(AU1 d,AF1 i){return (d&0xffff00ffu)|((min(AU1(i),255u)<< 8)&(0x0000ff00u));} + AU1 ABuc2ToU1(AU1 d,AF1 i){return (d&0xff00ffffu)|((min(AU1(i),255u)<<16)&(0x00ff0000u));} + AU1 ABuc3ToU1(AU1 d,AF1 i){return (d&0x00ffffffu)|((min(AU1(i),255u)<<24)&(0xff000000u));} +//------------------------------------------------------------------------------------------------------------------------------ + // Designed to be one V_CVT_F32_UBYTE*. + AF1 ABuc0FromU1(AU1 i){return AF1((i )&255u);} + AF1 ABuc1FromU1(AU1 i){return AF1((i>> 8)&255u);} + AF1 ABuc2FromU1(AU1 i){return AF1((i>>16)&255u);} + AF1 ABuc3FromU1(AU1 i){return AF1((i>>24)&255u);} + #endif +//============================================================================================================================== + #ifdef A_HALF + // Takes {x0,x1} and {y0,y1} and builds {{x0,y0},{x1,y1}}. + AW2 ABuc01ToW2(AH2 x,AH2 y){x*=AH2_(1.0/32768.0);y*=AH2_(1.0/32768.0); + return AW2_AU1(APermGCEA(AU2(AU1_AW2(AW2_AH2(x)),AU1_AW2(AW2_AH2(y)))));} +//------------------------------------------------------------------------------------------------------------------------------ + // Designed for 3 ops to do SOA to AOS and conversion. + AU2 ABuc0ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0))); + return AU2(APermHGFA(AU2(d.x,b)),APermHGFC(AU2(d.y,b)));} + AU2 ABuc1ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0))); + return AU2(APermHGAE(AU2(d.x,b)),APermHGCE(AU2(d.y,b)));} + AU2 ABuc2ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0))); + return AU2(APermHAFE(AU2(d.x,b)),APermHCFE(AU2(d.y,b)));} + AU2 ABuc3ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0))); + return AU2(APermAGFE(AU2(d.x,b)),APermCGFE(AU2(d.y,b)));} +//------------------------------------------------------------------------------------------------------------------------------ + // Designed for 2 ops to do both AOS to SOA, and conversion. + AH2 ABuc0FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0E0A(i)))*AH2_(32768.0);} + AH2 ABuc1FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0F0B(i)))*AH2_(32768.0);} + AH2 ABuc2FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0G0C(i)))*AH2_(32768.0);} + AH2 ABuc3FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0H0D(i)))*AH2_(32768.0);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [BSC] BYTE SIGNED CONVERSION +//------------------------------------------------------------------------------------------------------------------------------ +// Similar to [BUC]. +// Works on a range of {-/+ A_BSC_<32,16>}, for <32-bit, and 16-bit> respectively. +//------------------------------------------------------------------------------------------------------------------------------ +// ENCODING (without zero-based encoding) +// ======== +// 0 = unused (can be used to mean something else) +// 1 = lowest value +// 128 = exact zero center (zero based encoding +// 255 = highest value +//------------------------------------------------------------------------------------------------------------------------------ +// Zero-based [Zb] flips the MSB bit of the byte (making 128 "exact zero" actually zero). +// This is useful if there is a desire for cleared values to decode as zero. +//------------------------------------------------------------------------------------------------------------------------------ +// BYTE : FLOAT - ABsc{0,1,2,3}{To,From}U2() - Designed for 16-bit denormal tricks and V_PERM_B32. +// ==== ===== +// 0 : -127/512 (unused) +// 1 : -126/512 +// 2 : -125/512 +// ... +// 128 : 0 +// ... +// 255 : 127/512 +// : 1/4 (just outside the encoding range) +//============================================================================================================================== + // Peak range for 32-bit and 16-bit operations. + #define A_BSC_32 (127.0) + #define A_BSC_16 (127.0/512.0) +//============================================================================================================================== + #if 1 + AU1 ABsc0ToU1(AU1 d,AF1 i){return (d&0xffffff00u)|((min(AU1(i+128.0),255u) )&(0x000000ffu));} + AU1 ABsc1ToU1(AU1 d,AF1 i){return (d&0xffff00ffu)|((min(AU1(i+128.0),255u)<< 8)&(0x0000ff00u));} + AU1 ABsc2ToU1(AU1 d,AF1 i){return (d&0xff00ffffu)|((min(AU1(i+128.0),255u)<<16)&(0x00ff0000u));} + AU1 ABsc3ToU1(AU1 d,AF1 i){return (d&0x00ffffffu)|((min(AU1(i+128.0),255u)<<24)&(0xff000000u));} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 ABsc0ToZbU1(AU1 d,AF1 i){return ((d&0xffffff00u)|((min(AU1(trunc(i)+128.0),255u) )&(0x000000ffu)))^0x00000080u;} + AU1 ABsc1ToZbU1(AU1 d,AF1 i){return ((d&0xffff00ffu)|((min(AU1(trunc(i)+128.0),255u)<< 8)&(0x0000ff00u)))^0x00008000u;} + AU1 ABsc2ToZbU1(AU1 d,AF1 i){return ((d&0xff00ffffu)|((min(AU1(trunc(i)+128.0),255u)<<16)&(0x00ff0000u)))^0x00800000u;} + AU1 ABsc3ToZbU1(AU1 d,AF1 i){return ((d&0x00ffffffu)|((min(AU1(trunc(i)+128.0),255u)<<24)&(0xff000000u)))^0x80000000u;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 ABsc0FromU1(AU1 i){return AF1((i )&255u)-128.0;} + AF1 ABsc1FromU1(AU1 i){return AF1((i>> 8)&255u)-128.0;} + AF1 ABsc2FromU1(AU1 i){return AF1((i>>16)&255u)-128.0;} + AF1 ABsc3FromU1(AU1 i){return AF1((i>>24)&255u)-128.0;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 ABsc0FromZbU1(AU1 i){return AF1(((i )&255u)^0x80u)-128.0;} + AF1 ABsc1FromZbU1(AU1 i){return AF1(((i>> 8)&255u)^0x80u)-128.0;} + AF1 ABsc2FromZbU1(AU1 i){return AF1(((i>>16)&255u)^0x80u)-128.0;} + AF1 ABsc3FromZbU1(AU1 i){return AF1(((i>>24)&255u)^0x80u)-128.0;} + #endif +//============================================================================================================================== + #ifdef A_HALF + // Takes {x0,x1} and {y0,y1} and builds {{x0,y0},{x1,y1}}. + AW2 ABsc01ToW2(AH2 x,AH2 y){x=x*AH2_(1.0/32768.0)+AH2_(0.25/32768.0);y=y*AH2_(1.0/32768.0)+AH2_(0.25/32768.0); + return AW2_AU1(APermGCEA(AU2(AU1_AW2(AW2_AH2(x)),AU1_AW2(AW2_AH2(y)))));} +//------------------------------------------------------------------------------------------------------------------------------ + AU2 ABsc0ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0))); + return AU2(APermHGFA(AU2(d.x,b)),APermHGFC(AU2(d.y,b)));} + AU2 ABsc1ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0))); + return AU2(APermHGAE(AU2(d.x,b)),APermHGCE(AU2(d.y,b)));} + AU2 ABsc2ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0))); + return AU2(APermHAFE(AU2(d.x,b)),APermHCFE(AU2(d.y,b)));} + AU2 ABsc3ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0))); + return AU2(APermAGFE(AU2(d.x,b)),APermCGFE(AU2(d.y,b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AU2 ABsc0ToZbU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0)))^0x00800080u; + return AU2(APermHGFA(AU2(d.x,b)),APermHGFC(AU2(d.y,b)));} + AU2 ABsc1ToZbU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0)))^0x00800080u; + return AU2(APermHGAE(AU2(d.x,b)),APermHGCE(AU2(d.y,b)));} + AU2 ABsc2ToZbU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0)))^0x00800080u; + return AU2(APermHAFE(AU2(d.x,b)),APermHCFE(AU2(d.y,b)));} + AU2 ABsc3ToZbU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0)))^0x00800080u; + return AU2(APermAGFE(AU2(d.x,b)),APermCGFE(AU2(d.y,b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH2 ABsc0FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0E0A(i)))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc1FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0F0B(i)))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc2FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0G0C(i)))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc3FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0H0D(i)))*AH2_(32768.0)-AH2_(0.25);} +//------------------------------------------------------------------------------------------------------------------------------ + AH2 ABsc0FromZbU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0E0A(i)^0x00800080u))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc1FromZbU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0F0B(i)^0x00800080u))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc2FromZbU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0G0C(i)^0x00800080u))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc3FromZbU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0H0D(i)^0x00800080u))*AH2_(32768.0)-AH2_(0.25);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HALF APPROXIMATIONS +//------------------------------------------------------------------------------------------------------------------------------ +// These support only positive inputs. +// Did not see value yet in specialization for range. +// Using quick testing, ended up mostly getting the same "best" approximation for various ranges. +// With hardware that can co-execute transcendentals, the value in approximations could be less than expected. +// However from a latency perspective, if execution of a transcendental is 4 clk, with no packed support, -> 8 clk total. +// And co-execution would require a compiler interleaving a lot of independent work for packed usage. +//------------------------------------------------------------------------------------------------------------------------------ +// The one Newton Raphson iteration form of rsq() was skipped (requires 6 ops total). +// Same with sqrt(), as this could be x*rsq() (7 ops). +//============================================================================================================================== + #ifdef A_HALF + // Minimize squared error across full positive range, 2 ops. + // The 0x1de2 based approximation maps {0 to 1} input maps to < 1 output. + AH1 APrxLoSqrtH1(AH1 a){return AH1_AW1((AW1_AH1(a)>>AW1_(1))+AW1_(0x1de2));} + AH2 APrxLoSqrtH2(AH2 a){return AH2_AW2((AW2_AH2(a)>>AW2_(1))+AW2_(0x1de2));} + AH3 APrxLoSqrtH3(AH3 a){return AH3_AW3((AW3_AH3(a)>>AW3_(1))+AW3_(0x1de2));} + AH4 APrxLoSqrtH4(AH4 a){return AH4_AW4((AW4_AH4(a)>>AW4_(1))+AW4_(0x1de2));} +//------------------------------------------------------------------------------------------------------------------------------ + // Lower precision estimation, 1 op. + // Minimize squared error across {smallest normal to 16384.0}. + AH1 APrxLoRcpH1(AH1 a){return AH1_AW1(AW1_(0x7784)-AW1_AH1(a));} + AH2 APrxLoRcpH2(AH2 a){return AH2_AW2(AW2_(0x7784)-AW2_AH2(a));} + AH3 APrxLoRcpH3(AH3 a){return AH3_AW3(AW3_(0x7784)-AW3_AH3(a));} + AH4 APrxLoRcpH4(AH4 a){return AH4_AW4(AW4_(0x7784)-AW4_AH4(a));} +//------------------------------------------------------------------------------------------------------------------------------ + // Medium precision estimation, one Newton Raphson iteration, 3 ops. + AH1 APrxMedRcpH1(AH1 a){AH1 b=AH1_AW1(AW1_(0x778d)-AW1_AH1(a));return b*(-b*a+AH1_(2.0));} + AH2 APrxMedRcpH2(AH2 a){AH2 b=AH2_AW2(AW2_(0x778d)-AW2_AH2(a));return b*(-b*a+AH2_(2.0));} + AH3 APrxMedRcpH3(AH3 a){AH3 b=AH3_AW3(AW3_(0x778d)-AW3_AH3(a));return b*(-b*a+AH3_(2.0));} + AH4 APrxMedRcpH4(AH4 a){AH4 b=AH4_AW4(AW4_(0x778d)-AW4_AH4(a));return b*(-b*a+AH4_(2.0));} +//------------------------------------------------------------------------------------------------------------------------------ + // Minimize squared error across {smallest normal to 16384.0}, 2 ops. + AH1 APrxLoRsqH1(AH1 a){return AH1_AW1(AW1_(0x59a3)-(AW1_AH1(a)>>AW1_(1)));} + AH2 APrxLoRsqH2(AH2 a){return AH2_AW2(AW2_(0x59a3)-(AW2_AH2(a)>>AW2_(1)));} + AH3 APrxLoRsqH3(AH3 a){return AH3_AW3(AW3_(0x59a3)-(AW3_AH3(a)>>AW3_(1)));} + AH4 APrxLoRsqH4(AH4 a){return AH4_AW4(AW4_(0x59a3)-(AW4_AH4(a)>>AW4_(1)));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// FLOAT APPROXIMATIONS +//------------------------------------------------------------------------------------------------------------------------------ +// Michal Drobot has an excellent presentation on these: "Low Level Optimizations For GCN", +// - Idea dates back to SGI, then to Quake 3, etc. +// - https://michaldrobot.files.wordpress.com/2014/05/gcn_alu_opt_digitaldragons2014.pdf +// - sqrt(x)=rsqrt(x)*x +// - rcp(x)=rsqrt(x)*rsqrt(x) for positive x +// - https://github.com/michaldrobot/ShaderFastLibs/blob/master/ShaderFastMathLib.h +//------------------------------------------------------------------------------------------------------------------------------ +// These below are from perhaps less complete searching for optimal. +// Used FP16 normal range for testing with +4096 32-bit step size for sampling error. +// So these match up well with the half approximations. +//============================================================================================================================== + AF1 APrxLoSqrtF1(AF1 a){return AF1_AU1((AU1_AF1(a)>>AU1_(1))+AU1_(0x1fbc4639));} + AF1 APrxLoRcpF1(AF1 a){return AF1_AU1(AU1_(0x7ef07ebb)-AU1_AF1(a));} + AF1 APrxMedRcpF1(AF1 a){AF1 b=AF1_AU1(AU1_(0x7ef19fff)-AU1_AF1(a));return b*(-b*a+AF1_(2.0));} + AF1 APrxLoRsqF1(AF1 a){return AF1_AU1(AU1_(0x5f347d74)-(AU1_AF1(a)>>AU1_(1)));} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 APrxLoSqrtF2(AF2 a){return AF2_AU2((AU2_AF2(a)>>AU2_(1))+AU2_(0x1fbc4639));} + AF2 APrxLoRcpF2(AF2 a){return AF2_AU2(AU2_(0x7ef07ebb)-AU2_AF2(a));} + AF2 APrxMedRcpF2(AF2 a){AF2 b=AF2_AU2(AU2_(0x7ef19fff)-AU2_AF2(a));return b*(-b*a+AF2_(2.0));} + AF2 APrxLoRsqF2(AF2 a){return AF2_AU2(AU2_(0x5f347d74)-(AU2_AF2(a)>>AU2_(1)));} +//------------------------------------------------------------------------------------------------------------------------------ + AF3 APrxLoSqrtF3(AF3 a){return AF3_AU3((AU3_AF3(a)>>AU3_(1))+AU3_(0x1fbc4639));} + AF3 APrxLoRcpF3(AF3 a){return AF3_AU3(AU3_(0x7ef07ebb)-AU3_AF3(a));} + AF3 APrxMedRcpF3(AF3 a){AF3 b=AF3_AU3(AU3_(0x7ef19fff)-AU3_AF3(a));return b*(-b*a+AF3_(2.0));} + AF3 APrxLoRsqF3(AF3 a){return AF3_AU3(AU3_(0x5f347d74)-(AU3_AF3(a)>>AU3_(1)));} +//------------------------------------------------------------------------------------------------------------------------------ + AF4 APrxLoSqrtF4(AF4 a){return AF4_AU4((AU4_AF4(a)>>AU4_(1))+AU4_(0x1fbc4639));} + AF4 APrxLoRcpF4(AF4 a){return AF4_AU4(AU4_(0x7ef07ebb)-AU4_AF4(a));} + AF4 APrxMedRcpF4(AF4 a){AF4 b=AF4_AU4(AU4_(0x7ef19fff)-AU4_AF4(a));return b*(-b*a+AF4_(2.0));} + AF4 APrxLoRsqF4(AF4 a){return AF4_AU4(AU4_(0x5f347d74)-(AU4_AF4(a)>>AU4_(1)));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// PQ APPROXIMATIONS +//------------------------------------------------------------------------------------------------------------------------------ +// PQ is very close to x^(1/8). The functions below Use the fast float approximation method to do +// PQ<~>Gamma2 (4th power and fast 4th root) and PQ<~>Linear (8th power and fast 8th root). Maximum error is ~0.2%. +//============================================================================================================================== +// Helpers + AF1 Quart(AF1 a) { a = a * a; return a * a;} + AF1 Oct(AF1 a) { a = a * a; a = a * a; return a * a; } + AF2 Quart(AF2 a) { a = a * a; return a * a; } + AF2 Oct(AF2 a) { a = a * a; a = a * a; return a * a; } + AF3 Quart(AF3 a) { a = a * a; return a * a; } + AF3 Oct(AF3 a) { a = a * a; a = a * a; return a * a; } + AF4 Quart(AF4 a) { a = a * a; return a * a; } + AF4 Oct(AF4 a) { a = a * a; a = a * a; return a * a; } + //------------------------------------------------------------------------------------------------------------------------------ + AF1 APrxPQToGamma2(AF1 a) { return Quart(a); } + AF1 APrxPQToLinear(AF1 a) { return Oct(a); } + AF1 APrxLoGamma2ToPQ(AF1 a) { return AF1_AU1((AU1_AF1(a) >> AU1_(2)) + AU1_(0x2F9A4E46)); } + AF1 APrxMedGamma2ToPQ(AF1 a) { AF1 b = AF1_AU1((AU1_AF1(a) >> AU1_(2)) + AU1_(0x2F9A4E46)); AF1 b4 = Quart(b); return b - b * (b4 - a) / (AF1_(4.0) * b4); } + AF1 APrxHighGamma2ToPQ(AF1 a) { return sqrt(sqrt(a)); } + AF1 APrxLoLinearToPQ(AF1 a) { return AF1_AU1((AU1_AF1(a) >> AU1_(3)) + AU1_(0x378D8723)); } + AF1 APrxMedLinearToPQ(AF1 a) { AF1 b = AF1_AU1((AU1_AF1(a) >> AU1_(3)) + AU1_(0x378D8723)); AF1 b8 = Oct(b); return b - b * (b8 - a) / (AF1_(8.0) * b8); } + AF1 APrxHighLinearToPQ(AF1 a) { return sqrt(sqrt(sqrt(a))); } + //------------------------------------------------------------------------------------------------------------------------------ + AF2 APrxPQToGamma2(AF2 a) { return Quart(a); } + AF2 APrxPQToLinear(AF2 a) { return Oct(a); } + AF2 APrxLoGamma2ToPQ(AF2 a) { return AF2_AU2((AU2_AF2(a) >> AU2_(2)) + AU2_(0x2F9A4E46)); } + AF2 APrxMedGamma2ToPQ(AF2 a) { AF2 b = AF2_AU2((AU2_AF2(a) >> AU2_(2)) + AU2_(0x2F9A4E46)); AF2 b4 = Quart(b); return b - b * (b4 - a) / (AF1_(4.0) * b4); } + AF2 APrxHighGamma2ToPQ(AF2 a) { return sqrt(sqrt(a)); } + AF2 APrxLoLinearToPQ(AF2 a) { return AF2_AU2((AU2_AF2(a) >> AU2_(3)) + AU2_(0x378D8723)); } + AF2 APrxMedLinearToPQ(AF2 a) { AF2 b = AF2_AU2((AU2_AF2(a) >> AU2_(3)) + AU2_(0x378D8723)); AF2 b8 = Oct(b); return b - b * (b8 - a) / (AF1_(8.0) * b8); } + AF2 APrxHighLinearToPQ(AF2 a) { return sqrt(sqrt(sqrt(a))); } + //------------------------------------------------------------------------------------------------------------------------------ + AF3 APrxPQToGamma2(AF3 a) { return Quart(a); } + AF3 APrxPQToLinear(AF3 a) { return Oct(a); } + AF3 APrxLoGamma2ToPQ(AF3 a) { return AF3_AU3((AU3_AF3(a) >> AU3_(2)) + AU3_(0x2F9A4E46)); } + AF3 APrxMedGamma2ToPQ(AF3 a) { AF3 b = AF3_AU3((AU3_AF3(a) >> AU3_(2)) + AU3_(0x2F9A4E46)); AF3 b4 = Quart(b); return b - b * (b4 - a) / (AF1_(4.0) * b4); } + AF3 APrxHighGamma2ToPQ(AF3 a) { return sqrt(sqrt(a)); } + AF3 APrxLoLinearToPQ(AF3 a) { return AF3_AU3((AU3_AF3(a) >> AU3_(3)) + AU3_(0x378D8723)); } + AF3 APrxMedLinearToPQ(AF3 a) { AF3 b = AF3_AU3((AU3_AF3(a) >> AU3_(3)) + AU3_(0x378D8723)); AF3 b8 = Oct(b); return b - b * (b8 - a) / (AF1_(8.0) * b8); } + AF3 APrxHighLinearToPQ(AF3 a) { return sqrt(sqrt(sqrt(a))); } + //------------------------------------------------------------------------------------------------------------------------------ + AF4 APrxPQToGamma2(AF4 a) { return Quart(a); } + AF4 APrxPQToLinear(AF4 a) { return Oct(a); } + AF4 APrxLoGamma2ToPQ(AF4 a) { return AF4_AU4((AU4_AF4(a) >> AU4_(2)) + AU4_(0x2F9A4E46)); } + AF4 APrxMedGamma2ToPQ(AF4 a) { AF4 b = AF4_AU4((AU4_AF4(a) >> AU4_(2)) + AU4_(0x2F9A4E46)); AF4 b4 = Quart(b); return b - b * (b4 - a) / (AF1_(4.0) * b4); } + AF4 APrxHighGamma2ToPQ(AF4 a) { return sqrt(sqrt(a)); } + AF4 APrxLoLinearToPQ(AF4 a) { return AF4_AU4((AU4_AF4(a) >> AU4_(3)) + AU4_(0x378D8723)); } + AF4 APrxMedLinearToPQ(AF4 a) { AF4 b = AF4_AU4((AU4_AF4(a) >> AU4_(3)) + AU4_(0x378D8723)); AF4 b8 = Oct(b); return b - b * (b8 - a) / (AF1_(8.0) * b8); } + AF4 APrxHighLinearToPQ(AF4 a) { return sqrt(sqrt(sqrt(a))); } +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// PARABOLIC SIN & COS +//------------------------------------------------------------------------------------------------------------------------------ +// Approximate answers to transcendental questions. +//------------------------------------------------------------------------------------------------------------------------------ +//============================================================================================================================== + #if 1 + // Valid input range is {-1 to 1} representing {0 to 2 pi}. + // Output range is {-1/4 to 1/4} representing {-1 to 1}. + AF1 APSinF1(AF1 x){return x*abs(x)-x;} // MAD. + AF2 APSinF2(AF2 x){return x*abs(x)-x;} + AF1 APCosF1(AF1 x){x=AFractF1(x*AF1_(0.5)+AF1_(0.75));x=x*AF1_(2.0)-AF1_(1.0);return APSinF1(x);} // 3x MAD, FRACT + AF2 APCosF2(AF2 x){x=AFractF2(x*AF2_(0.5)+AF2_(0.75));x=x*AF2_(2.0)-AF2_(1.0);return APSinF2(x);} + AF2 APSinCosF1(AF1 x){AF1 y=AFractF1(x*AF1_(0.5)+AF1_(0.75));y=y*AF1_(2.0)-AF1_(1.0);return APSinF2(AF2(x,y));} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_HALF + // For a packed {sin,cos} pair, + // - Native takes 16 clocks and 4 issue slots (no packed transcendentals). + // - Parabolic takes 8 clocks and 8 issue slots (only fract is non-packed). + AH1 APSinH1(AH1 x){return x*abs(x)-x;} + AH2 APSinH2(AH2 x){return x*abs(x)-x;} // AND,FMA + AH1 APCosH1(AH1 x){x=AFractH1(x*AH1_(0.5)+AH1_(0.75));x=x*AH1_(2.0)-AH1_(1.0);return APSinH1(x);} + AH2 APCosH2(AH2 x){x=AFractH2(x*AH2_(0.5)+AH2_(0.75));x=x*AH2_(2.0)-AH2_(1.0);return APSinH2(x);} // 3x FMA, 2xFRACT, AND + AH2 APSinCosH1(AH1 x){AH1 y=AFractH1(x*AH1_(0.5)+AH1_(0.75));y=y*AH1_(2.0)-AH1_(1.0);return APSinH2(AH2(x,y));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [ZOL] ZERO ONE LOGIC +//------------------------------------------------------------------------------------------------------------------------------ +// Conditional free logic designed for easy 16-bit packing, and backwards porting to 32-bit. +//------------------------------------------------------------------------------------------------------------------------------ +// 0 := false +// 1 := true +//------------------------------------------------------------------------------------------------------------------------------ +// AndNot(x,y) -> !(x&y) .... One op. +// AndOr(x,y,z) -> (x&y)|z ... One op. +// GtZero(x) -> x>0.0 ..... One op. +// Sel(x,y,z) -> x?y:z ..... Two ops, has no precision loss. +// Signed(x) -> x<0.0 ..... One op. +// ZeroPass(x,y) -> x?0:y ..... Two ops, 'y' is a pass through safe for aliasing as integer. +//------------------------------------------------------------------------------------------------------------------------------ +// OPTIMIZATION NOTES +// ================== +// - On Vega to use 2 constants in a packed op, pass in as one AW2 or one AH2 'k.xy' and use as 'k.xx' and 'k.yy'. +// For example 'a.xy*k.xx+k.yy'. +//============================================================================================================================== + #if 1 + AU1 AZolAndU1(AU1 x,AU1 y){return min(x,y);} + AU2 AZolAndU2(AU2 x,AU2 y){return min(x,y);} + AU3 AZolAndU3(AU3 x,AU3 y){return min(x,y);} + AU4 AZolAndU4(AU4 x,AU4 y){return min(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AZolNotU1(AU1 x){return x^AU1_(1);} + AU2 AZolNotU2(AU2 x){return x^AU2_(1);} + AU3 AZolNotU3(AU3 x){return x^AU3_(1);} + AU4 AZolNotU4(AU4 x){return x^AU4_(1);} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AZolOrU1(AU1 x,AU1 y){return max(x,y);} + AU2 AZolOrU2(AU2 x,AU2 y){return max(x,y);} + AU3 AZolOrU3(AU3 x,AU3 y){return max(x,y);} + AU4 AZolOrU4(AU4 x,AU4 y){return max(x,y);} +//============================================================================================================================== + AU1 AZolF1ToU1(AF1 x){return AU1(x);} + AU2 AZolF2ToU2(AF2 x){return AU2(x);} + AU3 AZolF3ToU3(AF3 x){return AU3(x);} + AU4 AZolF4ToU4(AF4 x){return AU4(x);} +//------------------------------------------------------------------------------------------------------------------------------ + // 2 ops, denormals don't work in 32-bit on PC (and if they are enabled, OMOD is disabled). + AU1 AZolNotF1ToU1(AF1 x){return AU1(AF1_(1.0)-x);} + AU2 AZolNotF2ToU2(AF2 x){return AU2(AF2_(1.0)-x);} + AU3 AZolNotF3ToU3(AF3 x){return AU3(AF3_(1.0)-x);} + AU4 AZolNotF4ToU4(AF4 x){return AU4(AF4_(1.0)-x);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolU1ToF1(AU1 x){return AF1(x);} + AF2 AZolU2ToF2(AU2 x){return AF2(x);} + AF3 AZolU3ToF3(AU3 x){return AF3(x);} + AF4 AZolU4ToF4(AU4 x){return AF4(x);} +//============================================================================================================================== + AF1 AZolAndF1(AF1 x,AF1 y){return min(x,y);} + AF2 AZolAndF2(AF2 x,AF2 y){return min(x,y);} + AF3 AZolAndF3(AF3 x,AF3 y){return min(x,y);} + AF4 AZolAndF4(AF4 x,AF4 y){return min(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 ASolAndNotF1(AF1 x,AF1 y){return (-x)*y+AF1_(1.0);} + AF2 ASolAndNotF2(AF2 x,AF2 y){return (-x)*y+AF2_(1.0);} + AF3 ASolAndNotF3(AF3 x,AF3 y){return (-x)*y+AF3_(1.0);} + AF4 ASolAndNotF4(AF4 x,AF4 y){return (-x)*y+AF4_(1.0);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolAndOrF1(AF1 x,AF1 y,AF1 z){return ASatF1(x*y+z);} + AF2 AZolAndOrF2(AF2 x,AF2 y,AF2 z){return ASatF2(x*y+z);} + AF3 AZolAndOrF3(AF3 x,AF3 y,AF3 z){return ASatF3(x*y+z);} + AF4 AZolAndOrF4(AF4 x,AF4 y,AF4 z){return ASatF4(x*y+z);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolGtZeroF1(AF1 x){return ASatF1(x*AF1_(A_INFP_F));} + AF2 AZolGtZeroF2(AF2 x){return ASatF2(x*AF2_(A_INFP_F));} + AF3 AZolGtZeroF3(AF3 x){return ASatF3(x*AF3_(A_INFP_F));} + AF4 AZolGtZeroF4(AF4 x){return ASatF4(x*AF4_(A_INFP_F));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolNotF1(AF1 x){return AF1_(1.0)-x;} + AF2 AZolNotF2(AF2 x){return AF2_(1.0)-x;} + AF3 AZolNotF3(AF3 x){return AF3_(1.0)-x;} + AF4 AZolNotF4(AF4 x){return AF4_(1.0)-x;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolOrF1(AF1 x,AF1 y){return max(x,y);} + AF2 AZolOrF2(AF2 x,AF2 y){return max(x,y);} + AF3 AZolOrF3(AF3 x,AF3 y){return max(x,y);} + AF4 AZolOrF4(AF4 x,AF4 y){return max(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolSelF1(AF1 x,AF1 y,AF1 z){AF1 r=(-x)*z+z;return x*y+r;} + AF2 AZolSelF2(AF2 x,AF2 y,AF2 z){AF2 r=(-x)*z+z;return x*y+r;} + AF3 AZolSelF3(AF3 x,AF3 y,AF3 z){AF3 r=(-x)*z+z;return x*y+r;} + AF4 AZolSelF4(AF4 x,AF4 y,AF4 z){AF4 r=(-x)*z+z;return x*y+r;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolSignedF1(AF1 x){return ASatF1(x*AF1_(A_INFN_F));} + AF2 AZolSignedF2(AF2 x){return ASatF2(x*AF2_(A_INFN_F));} + AF3 AZolSignedF3(AF3 x){return ASatF3(x*AF3_(A_INFN_F));} + AF4 AZolSignedF4(AF4 x){return ASatF4(x*AF4_(A_INFN_F));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolZeroPassF1(AF1 x,AF1 y){return AF1_AU1((AU1_AF1(x)!=AU1_(0))?AU1_(0):AU1_AF1(y));} + AF2 AZolZeroPassF2(AF2 x,AF2 y){return AF2_AU2((AU2_AF2(x)!=AU2_(0))?AU2_(0):AU2_AF2(y));} + AF3 AZolZeroPassF3(AF3 x,AF3 y){return AF3_AU3((AU3_AF3(x)!=AU3_(0))?AU3_(0):AU3_AF3(y));} + AF4 AZolZeroPassF4(AF4 x,AF4 y){return AF4_AU4((AU4_AF4(x)!=AU4_(0))?AU4_(0):AU4_AF4(y));} + #endif +//============================================================================================================================== + #ifdef A_HALF + AW1 AZolAndW1(AW1 x,AW1 y){return min(x,y);} + AW2 AZolAndW2(AW2 x,AW2 y){return min(x,y);} + AW3 AZolAndW3(AW3 x,AW3 y){return min(x,y);} + AW4 AZolAndW4(AW4 x,AW4 y){return min(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AZolNotW1(AW1 x){return x^AW1_(1);} + AW2 AZolNotW2(AW2 x){return x^AW2_(1);} + AW3 AZolNotW3(AW3 x){return x^AW3_(1);} + AW4 AZolNotW4(AW4 x){return x^AW4_(1);} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AZolOrW1(AW1 x,AW1 y){return max(x,y);} + AW2 AZolOrW2(AW2 x,AW2 y){return max(x,y);} + AW3 AZolOrW3(AW3 x,AW3 y){return max(x,y);} + AW4 AZolOrW4(AW4 x,AW4 y){return max(x,y);} +//============================================================================================================================== + // Uses denormal trick. + AW1 AZolH1ToW1(AH1 x){return AW1_AH1(x*AH1_AW1(AW1_(1)));} + AW2 AZolH2ToW2(AH2 x){return AW2_AH2(x*AH2_AW2(AW2_(1)));} + AW3 AZolH3ToW3(AH3 x){return AW3_AH3(x*AH3_AW3(AW3_(1)));} + AW4 AZolH4ToW4(AH4 x){return AW4_AH4(x*AH4_AW4(AW4_(1)));} +//------------------------------------------------------------------------------------------------------------------------------ + // AMD arch lacks a packed conversion opcode. + AH1 AZolW1ToH1(AW1 x){return AH1_AW1(x*AW1_AH1(AH1_(1.0)));} + AH2 AZolW2ToH2(AW2 x){return AH2_AW2(x*AW2_AH2(AH2_(1.0)));} + AH3 AZolW1ToH3(AW3 x){return AH3_AW3(x*AW3_AH3(AH3_(1.0)));} + AH4 AZolW2ToH4(AW4 x){return AH4_AW4(x*AW4_AH4(AH4_(1.0)));} +//============================================================================================================================== + AH1 AZolAndH1(AH1 x,AH1 y){return min(x,y);} + AH2 AZolAndH2(AH2 x,AH2 y){return min(x,y);} + AH3 AZolAndH3(AH3 x,AH3 y){return min(x,y);} + AH4 AZolAndH4(AH4 x,AH4 y){return min(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASolAndNotH1(AH1 x,AH1 y){return (-x)*y+AH1_(1.0);} + AH2 ASolAndNotH2(AH2 x,AH2 y){return (-x)*y+AH2_(1.0);} + AH3 ASolAndNotH3(AH3 x,AH3 y){return (-x)*y+AH3_(1.0);} + AH4 ASolAndNotH4(AH4 x,AH4 y){return (-x)*y+AH4_(1.0);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolAndOrH1(AH1 x,AH1 y,AH1 z){return ASatH1(x*y+z);} + AH2 AZolAndOrH2(AH2 x,AH2 y,AH2 z){return ASatH2(x*y+z);} + AH3 AZolAndOrH3(AH3 x,AH3 y,AH3 z){return ASatH3(x*y+z);} + AH4 AZolAndOrH4(AH4 x,AH4 y,AH4 z){return ASatH4(x*y+z);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolGtZeroH1(AH1 x){return ASatH1(x*AH1_(A_INFP_H));} + AH2 AZolGtZeroH2(AH2 x){return ASatH2(x*AH2_(A_INFP_H));} + AH3 AZolGtZeroH3(AH3 x){return ASatH3(x*AH3_(A_INFP_H));} + AH4 AZolGtZeroH4(AH4 x){return ASatH4(x*AH4_(A_INFP_H));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolNotH1(AH1 x){return AH1_(1.0)-x;} + AH2 AZolNotH2(AH2 x){return AH2_(1.0)-x;} + AH3 AZolNotH3(AH3 x){return AH3_(1.0)-x;} + AH4 AZolNotH4(AH4 x){return AH4_(1.0)-x;} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolOrH1(AH1 x,AH1 y){return max(x,y);} + AH2 AZolOrH2(AH2 x,AH2 y){return max(x,y);} + AH3 AZolOrH3(AH3 x,AH3 y){return max(x,y);} + AH4 AZolOrH4(AH4 x,AH4 y){return max(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolSelH1(AH1 x,AH1 y,AH1 z){AH1 r=(-x)*z+z;return x*y+r;} + AH2 AZolSelH2(AH2 x,AH2 y,AH2 z){AH2 r=(-x)*z+z;return x*y+r;} + AH3 AZolSelH3(AH3 x,AH3 y,AH3 z){AH3 r=(-x)*z+z;return x*y+r;} + AH4 AZolSelH4(AH4 x,AH4 y,AH4 z){AH4 r=(-x)*z+z;return x*y+r;} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolSignedH1(AH1 x){return ASatH1(x*AH1_(A_INFN_H));} + AH2 AZolSignedH2(AH2 x){return ASatH2(x*AH2_(A_INFN_H));} + AH3 AZolSignedH3(AH3 x){return ASatH3(x*AH3_(A_INFN_H));} + AH4 AZolSignedH4(AH4 x){return ASatH4(x*AH4_(A_INFN_H));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// COLOR CONVERSIONS +//------------------------------------------------------------------------------------------------------------------------------ +// These are all linear to/from some other space (where 'linear' has been shortened out of the function name). +// So 'ToGamma' is 'LinearToGamma', and 'FromGamma' is 'LinearFromGamma'. +// These are branch free implementations. +// The AToSrgbF1() function is useful for stores for compute shaders for GPUs without hardware linear->sRGB store conversion. +//------------------------------------------------------------------------------------------------------------------------------ +// TRANSFER FUNCTIONS +// ================== +// 709 ..... Rec709 used for some HDTVs +// Gamma ... Typically 2.2 for some PC displays, or 2.4-2.5 for CRTs, or 2.2 FreeSync2 native +// Pq ...... PQ native for HDR10 +// Srgb .... The sRGB output, typical of PC displays, useful for 10-bit output, or storing to 8-bit UNORM without SRGB type +// Two ..... Gamma 2.0, fastest conversion (useful for intermediate pass approximations) +// Three ... Gamma 3.0, less fast, but good for HDR. +//------------------------------------------------------------------------------------------------------------------------------ +// KEEPING TO SPEC +// =============== +// Both Rec.709 and sRGB have a linear segment which as spec'ed would intersect the curved segment 2 times. +// (a.) For 8-bit sRGB, steps {0 to 10.3} are in the linear region (4% of the encoding range). +// (b.) For 8-bit 709, steps {0 to 20.7} are in the linear region (8% of the encoding range). +// Also there is a slight step in the transition regions. +// Precision of the coefficients in the spec being the likely cause. +// Main usage case of the sRGB code is to do the linear->sRGB converstion in a compute shader before store. +// This is to work around lack of hardware (typically only ROP does the conversion for free). +// To "correct" the linear segment, would be to introduce error, because hardware decode of sRGB->linear is fixed (and free). +// So this header keeps with the spec. +// For linear->sRGB transforms, the linear segment in some respects reduces error, because rounding in that region is linear. +// Rounding in the curved region in hardware (and fast software code) introduces error due to rounding in non-linear. +//------------------------------------------------------------------------------------------------------------------------------ +// FOR PQ +// ====== +// Both input and output is {0.0-1.0}, and where output 1.0 represents 10000.0 cd/m^2. +// All constants are only specified to FP32 precision. +// External PQ source reference, +// - https://github.com/ampas/aces-dev/blob/master/transforms/ctl/utilities/ACESlib.Utilities_Color.a1.0.1.ctl +//------------------------------------------------------------------------------------------------------------------------------ +// PACKED VERSIONS +// =============== +// These are the A*H2() functions. +// There is no PQ functions as FP16 seemed to not have enough precision for the conversion. +// The remaining functions are "good enough" for 8-bit, and maybe 10-bit if not concerned about a few 1-bit errors. +// Precision is lowest in the 709 conversion, higher in sRGB, higher still in Two and Gamma (when using 2.2 at least). +//------------------------------------------------------------------------------------------------------------------------------ +// NOTES +// ===== +// Could be faster for PQ conversions to be in ALU or a texture lookup depending on usage case. +//============================================================================================================================== + #if 1 + AF1 ATo709F1(AF1 c){AF3 j=AF3(0.018*4.5,4.5,0.45);AF2 k=AF2(1.099,-0.099); + return clamp(j.x ,c*j.y ,pow(c,j.z )*k.x +k.y );} + AF2 ATo709F2(AF2 c){AF3 j=AF3(0.018*4.5,4.5,0.45);AF2 k=AF2(1.099,-0.099); + return clamp(j.xx ,c*j.yy ,pow(c,j.zz )*k.xx +k.yy );} + AF3 ATo709F3(AF3 c){AF3 j=AF3(0.018*4.5,4.5,0.45);AF2 k=AF2(1.099,-0.099); + return clamp(j.xxx,c*j.yyy,pow(c,j.zzz)*k.xxx+k.yyy);} +//------------------------------------------------------------------------------------------------------------------------------ + // Note 'rcpX' is '1/x', where the 'x' is what would be used in AFromGamma(). + AF1 AToGammaF1(AF1 c,AF1 rcpX){return pow(c,AF1_(rcpX));} + AF2 AToGammaF2(AF2 c,AF1 rcpX){return pow(c,AF2_(rcpX));} + AF3 AToGammaF3(AF3 c,AF1 rcpX){return pow(c,AF3_(rcpX));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AToPqF1(AF1 x){AF1 p=pow(x,AF1_(0.159302)); + return pow((AF1_(0.835938)+AF1_(18.8516)*p)/(AF1_(1.0)+AF1_(18.6875)*p),AF1_(78.8438));} + AF2 AToPqF1(AF2 x){AF2 p=pow(x,AF2_(0.159302)); + return pow((AF2_(0.835938)+AF2_(18.8516)*p)/(AF2_(1.0)+AF2_(18.6875)*p),AF2_(78.8438));} + AF3 AToPqF1(AF3 x){AF3 p=pow(x,AF3_(0.159302)); + return pow((AF3_(0.835938)+AF3_(18.8516)*p)/(AF3_(1.0)+AF3_(18.6875)*p),AF3_(78.8438));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AToSrgbF1(AF1 c){AF3 j=AF3(0.0031308*12.92,12.92,1.0/2.4);AF2 k=AF2(1.055,-0.055); + return clamp(j.x ,c*j.y ,pow(c,j.z )*k.x +k.y );} + AF2 AToSrgbF2(AF2 c){AF3 j=AF3(0.0031308*12.92,12.92,1.0/2.4);AF2 k=AF2(1.055,-0.055); + return clamp(j.xx ,c*j.yy ,pow(c,j.zz )*k.xx +k.yy );} + AF3 AToSrgbF3(AF3 c){AF3 j=AF3(0.0031308*12.92,12.92,1.0/2.4);AF2 k=AF2(1.055,-0.055); + return clamp(j.xxx,c*j.yyy,pow(c,j.zzz)*k.xxx+k.yyy);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AToTwoF1(AF1 c){return sqrt(c);} + AF2 AToTwoF2(AF2 c){return sqrt(c);} + AF3 AToTwoF3(AF3 c){return sqrt(c);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AToThreeF1(AF1 c){return pow(c,AF1_(1.0/3.0));} + AF2 AToThreeF2(AF2 c){return pow(c,AF2_(1.0/3.0));} + AF3 AToThreeF3(AF3 c){return pow(c,AF3_(1.0/3.0));} + #endif +//============================================================================================================================== + #if 1 + // Unfortunately median won't work here. + AF1 AFrom709F1(AF1 c){AF3 j=AF3(0.081/4.5,1.0/4.5,1.0/0.45);AF2 k=AF2(1.0/1.099,0.099/1.099); + return AZolSelF1(AZolSignedF1(c-j.x ),c*j.y ,pow(c*k.x +k.y ,j.z ));} + AF2 AFrom709F2(AF2 c){AF3 j=AF3(0.081/4.5,1.0/4.5,1.0/0.45);AF2 k=AF2(1.0/1.099,0.099/1.099); + return AZolSelF2(AZolSignedF2(c-j.xx ),c*j.yy ,pow(c*k.xx +k.yy ,j.zz ));} + AF3 AFrom709F3(AF3 c){AF3 j=AF3(0.081/4.5,1.0/4.5,1.0/0.45);AF2 k=AF2(1.0/1.099,0.099/1.099); + return AZolSelF3(AZolSignedF3(c-j.xxx),c*j.yyy,pow(c*k.xxx+k.yyy,j.zzz));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AFromGammaF1(AF1 c,AF1 x){return pow(c,AF1_(x));} + AF2 AFromGammaF2(AF2 c,AF1 x){return pow(c,AF2_(x));} + AF3 AFromGammaF3(AF3 c,AF1 x){return pow(c,AF3_(x));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AFromPqF1(AF1 x){AF1 p=pow(x,AF1_(0.0126833)); + return pow(ASatF1(p-AF1_(0.835938))/(AF1_(18.8516)-AF1_(18.6875)*p),AF1_(6.27739));} + AF2 AFromPqF1(AF2 x){AF2 p=pow(x,AF2_(0.0126833)); + return pow(ASatF2(p-AF2_(0.835938))/(AF2_(18.8516)-AF2_(18.6875)*p),AF2_(6.27739));} + AF3 AFromPqF1(AF3 x){AF3 p=pow(x,AF3_(0.0126833)); + return pow(ASatF3(p-AF3_(0.835938))/(AF3_(18.8516)-AF3_(18.6875)*p),AF3_(6.27739));} +//------------------------------------------------------------------------------------------------------------------------------ + // Unfortunately median won't work here. + AF1 AFromSrgbF1(AF1 c){AF3 j=AF3(0.04045/12.92,1.0/12.92,2.4);AF2 k=AF2(1.0/1.055,0.055/1.055); + return AZolSelF1(AZolSignedF1(c-j.x ),c*j.y ,pow(c*k.x +k.y ,j.z ));} + AF2 AFromSrgbF2(AF2 c){AF3 j=AF3(0.04045/12.92,1.0/12.92,2.4);AF2 k=AF2(1.0/1.055,0.055/1.055); + return AZolSelF2(AZolSignedF2(c-j.xx ),c*j.yy ,pow(c*k.xx +k.yy ,j.zz ));} + AF3 AFromSrgbF3(AF3 c){AF3 j=AF3(0.04045/12.92,1.0/12.92,2.4);AF2 k=AF2(1.0/1.055,0.055/1.055); + return AZolSelF3(AZolSignedF3(c-j.xxx),c*j.yyy,pow(c*k.xxx+k.yyy,j.zzz));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AFromTwoF1(AF1 c){return c*c;} + AF2 AFromTwoF2(AF2 c){return c*c;} + AF3 AFromTwoF3(AF3 c){return c*c;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AFromThreeF1(AF1 c){return c*c*c;} + AF2 AFromThreeF2(AF2 c){return c*c*c;} + AF3 AFromThreeF3(AF3 c){return c*c*c;} + #endif +//============================================================================================================================== + #ifdef A_HALF + AH1 ATo709H1(AH1 c){AH3 j=AH3(0.018*4.5,4.5,0.45);AH2 k=AH2(1.099,-0.099); + return clamp(j.x ,c*j.y ,pow(c,j.z )*k.x +k.y );} + AH2 ATo709H2(AH2 c){AH3 j=AH3(0.018*4.5,4.5,0.45);AH2 k=AH2(1.099,-0.099); + return clamp(j.xx ,c*j.yy ,pow(c,j.zz )*k.xx +k.yy );} + AH3 ATo709H3(AH3 c){AH3 j=AH3(0.018*4.5,4.5,0.45);AH2 k=AH2(1.099,-0.099); + return clamp(j.xxx,c*j.yyy,pow(c,j.zzz)*k.xxx+k.yyy);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AToGammaH1(AH1 c,AH1 rcpX){return pow(c,AH1_(rcpX));} + AH2 AToGammaH2(AH2 c,AH1 rcpX){return pow(c,AH2_(rcpX));} + AH3 AToGammaH3(AH3 c,AH1 rcpX){return pow(c,AH3_(rcpX));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AToSrgbH1(AH1 c){AH3 j=AH3(0.0031308*12.92,12.92,1.0/2.4);AH2 k=AH2(1.055,-0.055); + return clamp(j.x ,c*j.y ,pow(c,j.z )*k.x +k.y );} + AH2 AToSrgbH2(AH2 c){AH3 j=AH3(0.0031308*12.92,12.92,1.0/2.4);AH2 k=AH2(1.055,-0.055); + return clamp(j.xx ,c*j.yy ,pow(c,j.zz )*k.xx +k.yy );} + AH3 AToSrgbH3(AH3 c){AH3 j=AH3(0.0031308*12.92,12.92,1.0/2.4);AH2 k=AH2(1.055,-0.055); + return clamp(j.xxx,c*j.yyy,pow(c,j.zzz)*k.xxx+k.yyy);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AToTwoH1(AH1 c){return sqrt(c);} + AH2 AToTwoH2(AH2 c){return sqrt(c);} + AH3 AToTwoH3(AH3 c){return sqrt(c);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AToThreeF1(AH1 c){return pow(c,AH1_(1.0/3.0));} + AH2 AToThreeF2(AH2 c){return pow(c,AH2_(1.0/3.0));} + AH3 AToThreeF3(AH3 c){return pow(c,AH3_(1.0/3.0));} + #endif +//============================================================================================================================== + #ifdef A_HALF + AH1 AFrom709H1(AH1 c){AH3 j=AH3(0.081/4.5,1.0/4.5,1.0/0.45);AH2 k=AH2(1.0/1.099,0.099/1.099); + return AZolSelH1(AZolSignedH1(c-j.x ),c*j.y ,pow(c*k.x +k.y ,j.z ));} + AH2 AFrom709H2(AH2 c){AH3 j=AH3(0.081/4.5,1.0/4.5,1.0/0.45);AH2 k=AH2(1.0/1.099,0.099/1.099); + return AZolSelH2(AZolSignedH2(c-j.xx ),c*j.yy ,pow(c*k.xx +k.yy ,j.zz ));} + AH3 AFrom709H3(AH3 c){AH3 j=AH3(0.081/4.5,1.0/4.5,1.0/0.45);AH2 k=AH2(1.0/1.099,0.099/1.099); + return AZolSelH3(AZolSignedH3(c-j.xxx),c*j.yyy,pow(c*k.xxx+k.yyy,j.zzz));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AFromGammaH1(AH1 c,AH1 x){return pow(c,AH1_(x));} + AH2 AFromGammaH2(AH2 c,AH1 x){return pow(c,AH2_(x));} + AH3 AFromGammaH3(AH3 c,AH1 x){return pow(c,AH3_(x));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AHromSrgbF1(AH1 c){AH3 j=AH3(0.04045/12.92,1.0/12.92,2.4);AH2 k=AH2(1.0/1.055,0.055/1.055); + return AZolSelH1(AZolSignedH1(c-j.x ),c*j.y ,pow(c*k.x +k.y ,j.z ));} + AH2 AHromSrgbF2(AH2 c){AH3 j=AH3(0.04045/12.92,1.0/12.92,2.4);AH2 k=AH2(1.0/1.055,0.055/1.055); + return AZolSelH2(AZolSignedH2(c-j.xx ),c*j.yy ,pow(c*k.xx +k.yy ,j.zz ));} + AH3 AHromSrgbF3(AH3 c){AH3 j=AH3(0.04045/12.92,1.0/12.92,2.4);AH2 k=AH2(1.0/1.055,0.055/1.055); + return AZolSelH3(AZolSignedH3(c-j.xxx),c*j.yyy,pow(c*k.xxx+k.yyy,j.zzz));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AFromTwoH1(AH1 c){return c*c;} + AH2 AFromTwoH2(AH2 c){return c*c;} + AH3 AFromTwoH3(AH3 c){return c*c;} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AFromThreeH1(AH1 c){return c*c*c;} + AH2 AFromThreeH2(AH2 c){return c*c*c;} + AH3 AFromThreeH3(AH3 c){return c*c*c;} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// CS REMAP +//============================================================================================================================== + // Simple remap 64x1 to 8x8 with rotated 2x2 pixel quads in quad linear. + // 543210 + // ====== + // ..xxx. + // yy...y + AU2 ARmp8x8(AU1 a){return AU2(ABfe(a,1u,3u),ABfiM(ABfe(a,3u,3u),a,1u));} +//============================================================================================================================== + // More complex remap 64x1 to 8x8 which is necessary for 2D wave reductions. + // 543210 + // ====== + // .xx..x + // y..yy. + // Details, + // LANE TO 8x8 MAPPING + // =================== + // 00 01 08 09 10 11 18 19 + // 02 03 0a 0b 12 13 1a 1b + // 04 05 0c 0d 14 15 1c 1d + // 06 07 0e 0f 16 17 1e 1f + // 20 21 28 29 30 31 38 39 + // 22 23 2a 2b 32 33 3a 3b + // 24 25 2c 2d 34 35 3c 3d + // 26 27 2e 2f 36 37 3e 3f + AU2 ARmpRed8x8(AU1 a){return AU2(ABfiM(ABfe(a,2u,3u),a,1u),ABfiM(ABfe(a,3u,3u),ABfe(a,1u,2u),2u));} +//============================================================================================================================== + #ifdef A_HALF + AW2 ARmp8x8H(AU1 a){return AW2(ABfe(a,1u,3u),ABfiM(ABfe(a,3u,3u),a,1u));} + AW2 ARmpRed8x8H(AU1 a){return AW2(ABfiM(ABfe(a,2u,3u),a,1u),ABfiM(ABfe(a,3u,3u),ABfe(a,1u,2u),2u));} + #endif +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// REFERENCE +// +//------------------------------------------------------------------------------------------------------------------------------ +// IEEE FLOAT RULES +// ================ +// - saturate(NaN)=0, saturate(-INF)=0, saturate(+INF)=1 +// - {+/-}0 * {+/-}INF = NaN +// - -INF + (+INF) = NaN +// - {+/-}0 / {+/-}0 = NaN +// - {+/-}INF / {+/-}INF = NaN +// - a<(-0) := sqrt(a) = NaN (a=-0.0 won't NaN) +// - 0 == -0 +// - 4/0 = +INF +// - 4/-0 = -INF +// - 4+INF = +INF +// - 4-INF = -INF +// - 4*(+INF) = +INF +// - 4*(-INF) = -INF +// - -4*(+INF) = -INF +// - sqrt(+INF) = +INF +//------------------------------------------------------------------------------------------------------------------------------ +// FP16 ENCODING +// ============= +// fedcba9876543210 +// ---------------- +// ......mmmmmmmmmm 10-bit mantissa (encodes 11-bit 0.5 to 1.0 except for denormals) +// .eeeee.......... 5-bit exponent +// .00000.......... denormals +// .00001.......... -14 exponent +// .11110.......... 15 exponent +// .111110000000000 infinity +// .11111nnnnnnnnnn NaN with n!=0 +// s............... sign +//------------------------------------------------------------------------------------------------------------------------------ +// FP16/INT16 ALIASING DENORMAL +// ============================ +// 11-bit unsigned integers alias with half float denormal/normal values, +// 1 = 2^(-24) = 1/16777216 ....................... first denormal value +// 2 = 2^(-23) +// ... +// 1023 = 2^(-14)*(1-2^(-10)) = 2^(-14)*(1-1/1024) ... last denormal value +// 1024 = 2^(-14) = 1/16384 .......................... first normal value that still maps to integers +// 2047 .............................................. last normal value that still maps to integers +// Scaling limits, +// 2^15 = 32768 ...................................... largest power of 2 scaling +// Largest pow2 conversion mapping is at *32768, +// 1 : 2^(-9) = 1/512 +// 2 : 1/256 +// 4 : 1/128 +// 8 : 1/64 +// 16 : 1/32 +// 32 : 1/16 +// 64 : 1/8 +// 128 : 1/4 +// 256 : 1/2 +// 512 : 1 +// 1024 : 2 +// 2047 : a little less than 4 +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// GPU/CPU PORTABILITY +// +// +//------------------------------------------------------------------------------------------------------------------------------ +// This is the GPU implementation. +// See the CPU implementation for docs. +//============================================================================================================================== +#ifdef A_GPU + #define A_TRUE true + #define A_FALSE false + #define A_STATIC +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR ARGUMENT/RETURN/INITIALIZATION PORTABILITY +//============================================================================================================================== + #define retAD2 AD2 + #define retAD3 AD3 + #define retAD4 AD4 + #define retAF2 AF2 + #define retAF3 AF3 + #define retAF4 AF4 + #define retAL2 AL2 + #define retAL3 AL3 + #define retAL4 AL4 + #define retAU2 AU2 + #define retAU3 AU3 + #define retAU4 AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define inAD2 in AD2 + #define inAD3 in AD3 + #define inAD4 in AD4 + #define inAF2 in AF2 + #define inAF3 in AF3 + #define inAF4 in AF4 + #define inAL2 in AL2 + #define inAL3 in AL3 + #define inAL4 in AL4 + #define inAU2 in AU2 + #define inAU3 in AU3 + #define inAU4 in AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define inoutAD2 inout AD2 + #define inoutAD3 inout AD3 + #define inoutAD4 inout AD4 + #define inoutAF2 inout AF2 + #define inoutAF3 inout AF3 + #define inoutAF4 inout AF4 + #define inoutAL2 inout AL2 + #define inoutAL3 inout AL3 + #define inoutAL4 inout AL4 + #define inoutAU2 inout AU2 + #define inoutAU3 inout AU3 + #define inoutAU4 inout AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define outAD2 out AD2 + #define outAD3 out AD3 + #define outAD4 out AD4 + #define outAF2 out AF2 + #define outAF3 out AF3 + #define outAF4 out AF4 + #define outAL2 out AL2 + #define outAL3 out AL3 + #define outAL4 out AL4 + #define outAU2 out AU2 + #define outAU3 out AU3 + #define outAU4 out AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define varAD2(x) AD2 x + #define varAD3(x) AD3 x + #define varAD4(x) AD4 x + #define varAF2(x) AF2 x + #define varAF3(x) AF3 x + #define varAF4(x) AF4 x + #define varAL2(x) AL2 x + #define varAL3(x) AL3 x + #define varAL4(x) AL4 x + #define varAU2(x) AU2 x + #define varAU3(x) AU3 x + #define varAU4(x) AU4 x +//------------------------------------------------------------------------------------------------------------------------------ + #define initAD2(x,y) AD2(x,y) + #define initAD3(x,y,z) AD3(x,y,z) + #define initAD4(x,y,z,w) AD4(x,y,z,w) + #define initAF2(x,y) AF2(x,y) + #define initAF3(x,y,z) AF3(x,y,z) + #define initAF4(x,y,z,w) AF4(x,y,z,w) + #define initAL2(x,y) AL2(x,y) + #define initAL3(x,y,z) AL3(x,y,z) + #define initAL4(x,y,z,w) AL4(x,y,z,w) + #define initAU2(x,y) AU2(x,y) + #define initAU3(x,y,z) AU3(x,y,z) + #define initAU4(x,y,z,w) AU4(x,y,z,w) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS +//============================================================================================================================== + #define AAbsD1(a) abs(AD1(a)) + #define AAbsF1(a) abs(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ACosD1(a) cos(AD1(a)) + #define ACosF1(a) cos(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ADotD2(a,b) dot(AD2(a),AD2(b)) + #define ADotD3(a,b) dot(AD3(a),AD3(b)) + #define ADotD4(a,b) dot(AD4(a),AD4(b)) + #define ADotF2(a,b) dot(AF2(a),AF2(b)) + #define ADotF3(a,b) dot(AF3(a),AF3(b)) + #define ADotF4(a,b) dot(AF4(a),AF4(b)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AExp2D1(a) exp2(AD1(a)) + #define AExp2F1(a) exp2(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AFloorD1(a) floor(AD1(a)) + #define AFloorF1(a) floor(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ALog2D1(a) log2(AD1(a)) + #define ALog2F1(a) log2(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AMaxD1(a,b) max(a,b) + #define AMaxF1(a,b) max(a,b) + #define AMaxL1(a,b) max(a,b) + #define AMaxU1(a,b) max(a,b) +//------------------------------------------------------------------------------------------------------------------------------ + #define AMinD1(a,b) min(a,b) + #define AMinF1(a,b) min(a,b) + #define AMinL1(a,b) min(a,b) + #define AMinU1(a,b) min(a,b) +//------------------------------------------------------------------------------------------------------------------------------ + #define ASinD1(a) sin(AD1(a)) + #define ASinF1(a) sin(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ASqrtD1(a) sqrt(AD1(a)) + #define ASqrtF1(a) sqrt(AF1(a)) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS - DEPENDENT +//============================================================================================================================== + #define APowD1(a,b) pow(AD1(a),AF1(b)) + #define APowF1(a,b) pow(AF1(a),AF1(b)) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR OPS +//------------------------------------------------------------------------------------------------------------------------------ +// These are added as needed for production or prototyping, so not necessarily a complete set. +// They follow a convention of taking in a destination and also returning the destination value to increase utility. +//============================================================================================================================== + #ifdef A_DUBL + AD2 opAAbsD2(outAD2 d,inAD2 a){d=abs(a);return d;} + AD3 opAAbsD3(outAD3 d,inAD3 a){d=abs(a);return d;} + AD4 opAAbsD4(outAD4 d,inAD4 a){d=abs(a);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAAddD2(outAD2 d,inAD2 a,inAD2 b){d=a+b;return d;} + AD3 opAAddD3(outAD3 d,inAD3 a,inAD3 b){d=a+b;return d;} + AD4 opAAddD4(outAD4 d,inAD4 a,inAD4 b){d=a+b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAAddOneD2(outAD2 d,inAD2 a,AD1 b){d=a+AD2_(b);return d;} + AD3 opAAddOneD3(outAD3 d,inAD3 a,AD1 b){d=a+AD3_(b);return d;} + AD4 opAAddOneD4(outAD4 d,inAD4 a,AD1 b){d=a+AD4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opACpyD2(outAD2 d,inAD2 a){d=a;return d;} + AD3 opACpyD3(outAD3 d,inAD3 a){d=a;return d;} + AD4 opACpyD4(outAD4 d,inAD4 a){d=a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opALerpD2(outAD2 d,inAD2 a,inAD2 b,inAD2 c){d=ALerpD2(a,b,c);return d;} + AD3 opALerpD3(outAD3 d,inAD3 a,inAD3 b,inAD3 c){d=ALerpD3(a,b,c);return d;} + AD4 opALerpD4(outAD4 d,inAD4 a,inAD4 b,inAD4 c){d=ALerpD4(a,b,c);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opALerpOneD2(outAD2 d,inAD2 a,inAD2 b,AD1 c){d=ALerpD2(a,b,AD2_(c));return d;} + AD3 opALerpOneD3(outAD3 d,inAD3 a,inAD3 b,AD1 c){d=ALerpD3(a,b,AD3_(c));return d;} + AD4 opALerpOneD4(outAD4 d,inAD4 a,inAD4 b,AD1 c){d=ALerpD4(a,b,AD4_(c));return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAMaxD2(outAD2 d,inAD2 a,inAD2 b){d=max(a,b);return d;} + AD3 opAMaxD3(outAD3 d,inAD3 a,inAD3 b){d=max(a,b);return d;} + AD4 opAMaxD4(outAD4 d,inAD4 a,inAD4 b){d=max(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAMinD2(outAD2 d,inAD2 a,inAD2 b){d=min(a,b);return d;} + AD3 opAMinD3(outAD3 d,inAD3 a,inAD3 b){d=min(a,b);return d;} + AD4 opAMinD4(outAD4 d,inAD4 a,inAD4 b){d=min(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAMulD2(outAD2 d,inAD2 a,inAD2 b){d=a*b;return d;} + AD3 opAMulD3(outAD3 d,inAD3 a,inAD3 b){d=a*b;return d;} + AD4 opAMulD4(outAD4 d,inAD4 a,inAD4 b){d=a*b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAMulOneD2(outAD2 d,inAD2 a,AD1 b){d=a*AD2_(b);return d;} + AD3 opAMulOneD3(outAD3 d,inAD3 a,AD1 b){d=a*AD3_(b);return d;} + AD4 opAMulOneD4(outAD4 d,inAD4 a,AD1 b){d=a*AD4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opANegD2(outAD2 d,inAD2 a){d=-a;return d;} + AD3 opANegD3(outAD3 d,inAD3 a){d=-a;return d;} + AD4 opANegD4(outAD4 d,inAD4 a){d=-a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opARcpD2(outAD2 d,inAD2 a){d=ARcpD2(a);return d;} + AD3 opARcpD3(outAD3 d,inAD3 a){d=ARcpD3(a);return d;} + AD4 opARcpD4(outAD4 d,inAD4 a){d=ARcpD4(a);return d;} + #endif +//============================================================================================================================== + AF2 opAAbsF2(outAF2 d,inAF2 a){d=abs(a);return d;} + AF3 opAAbsF3(outAF3 d,inAF3 a){d=abs(a);return d;} + AF4 opAAbsF4(outAF4 d,inAF4 a){d=abs(a);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAAddF2(outAF2 d,inAF2 a,inAF2 b){d=a+b;return d;} + AF3 opAAddF3(outAF3 d,inAF3 a,inAF3 b){d=a+b;return d;} + AF4 opAAddF4(outAF4 d,inAF4 a,inAF4 b){d=a+b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAAddOneF2(outAF2 d,inAF2 a,AF1 b){d=a+AF2_(b);return d;} + AF3 opAAddOneF3(outAF3 d,inAF3 a,AF1 b){d=a+AF3_(b);return d;} + AF4 opAAddOneF4(outAF4 d,inAF4 a,AF1 b){d=a+AF4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opACpyF2(outAF2 d,inAF2 a){d=a;return d;} + AF3 opACpyF3(outAF3 d,inAF3 a){d=a;return d;} + AF4 opACpyF4(outAF4 d,inAF4 a){d=a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opALerpF2(outAF2 d,inAF2 a,inAF2 b,inAF2 c){d=ALerpF2(a,b,c);return d;} + AF3 opALerpF3(outAF3 d,inAF3 a,inAF3 b,inAF3 c){d=ALerpF3(a,b,c);return d;} + AF4 opALerpF4(outAF4 d,inAF4 a,inAF4 b,inAF4 c){d=ALerpF4(a,b,c);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opALerpOneF2(outAF2 d,inAF2 a,inAF2 b,AF1 c){d=ALerpF2(a,b,AF2_(c));return d;} + AF3 opALerpOneF3(outAF3 d,inAF3 a,inAF3 b,AF1 c){d=ALerpF3(a,b,AF3_(c));return d;} + AF4 opALerpOneF4(outAF4 d,inAF4 a,inAF4 b,AF1 c){d=ALerpF4(a,b,AF4_(c));return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAMaxF2(outAF2 d,inAF2 a,inAF2 b){d=max(a,b);return d;} + AF3 opAMaxF3(outAF3 d,inAF3 a,inAF3 b){d=max(a,b);return d;} + AF4 opAMaxF4(outAF4 d,inAF4 a,inAF4 b){d=max(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAMinF2(outAF2 d,inAF2 a,inAF2 b){d=min(a,b);return d;} + AF3 opAMinF3(outAF3 d,inAF3 a,inAF3 b){d=min(a,b);return d;} + AF4 opAMinF4(outAF4 d,inAF4 a,inAF4 b){d=min(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAMulF2(outAF2 d,inAF2 a,inAF2 b){d=a*b;return d;} + AF3 opAMulF3(outAF3 d,inAF3 a,inAF3 b){d=a*b;return d;} + AF4 opAMulF4(outAF4 d,inAF4 a,inAF4 b){d=a*b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAMulOneF2(outAF2 d,inAF2 a,AF1 b){d=a*AF2_(b);return d;} + AF3 opAMulOneF3(outAF3 d,inAF3 a,AF1 b){d=a*AF3_(b);return d;} + AF4 opAMulOneF4(outAF4 d,inAF4 a,AF1 b){d=a*AF4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opANegF2(outAF2 d,inAF2 a){d=-a;return d;} + AF3 opANegF3(outAF3 d,inAF3 a){d=-a;return d;} + AF4 opANegF4(outAF4 d,inAF4 a){d=-a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opARcpF2(outAF2 d,inAF2 a){d=ARcpF2(a);return d;} + AF3 opARcpF3(outAF3 d,inAF3 a){d=ARcpF3(a);return d;} + AF4 opARcpF4(outAF4 d,inAF4 a){d=ARcpF4(a);return d;} +#endif diff --git a/externals/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h b/externals/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h new file mode 100644 index 0000000..4e0b3d5 --- /dev/null +++ b/externals/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h @@ -0,0 +1,1199 @@ +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// AMD FidelityFX SUPER RESOLUTION [FSR 1] ::: SPATIAL SCALING & EXTRAS - v1.20210629 +// +// +//------------------------------------------------------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//------------------------------------------------------------------------------------------------------------------------------ +// FidelityFX Super Resolution Sample +// +// Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +//------------------------------------------------------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//------------------------------------------------------------------------------------------------------------------------------ +// ABOUT +// ===== +// FSR is a collection of algorithms relating to generating a higher resolution image. +// This specific header focuses on single-image non-temporal image scaling, and related tools. +// +// The core functions are EASU and RCAS: +// [EASU] Edge Adaptive Spatial Upsampling ....... 1x to 4x area range spatial scaling, clamped adaptive elliptical filter. +// [RCAS] Robust Contrast Adaptive Sharpening .... A non-scaling variation on CAS. +// RCAS needs to be applied after EASU as a separate pass. +// +// Optional utility functions are: +// [LFGA] Linear Film Grain Applicator ........... Tool to apply film grain after scaling. +// [SRTM] Simple Reversible Tone-Mapper .......... Linear HDR {0 to FP16_MAX} to {0 to 1} and back. +// [TEPD] Temporal Energy Preserving Dither ...... Temporally energy preserving dithered {0 to 1} linear to gamma 2.0 conversion. +// See each individual sub-section for inline documentation. +//------------------------------------------------------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//------------------------------------------------------------------------------------------------------------------------------ +// FUNCTION PERMUTATIONS +// ===================== +// *F() ..... Single item computation with 32-bit. +// *H() ..... Single item computation with 16-bit, with packing (aka two 16-bit ops in parallel) when possible. +// *Hx2() ... Processing two items in parallel with 16-bit, easier packing. +// Not all interfaces in this file have a *Hx2() form. +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// FSR - [EASU] EDGE ADAPTIVE SPATIAL UPSAMPLING +// +//------------------------------------------------------------------------------------------------------------------------------ +// EASU provides a high quality spatial-only scaling at relatively low cost. +// Meaning EASU is appropiate for laptops and other low-end GPUs. +// Quality from 1x to 4x area scaling is good. +//------------------------------------------------------------------------------------------------------------------------------ +// The scalar uses a modified fast approximation to the standard lanczos(size=2) kernel. +// EASU runs in a single pass, so it applies a directionally and anisotropically adaptive radial lanczos. +// This is also kept as simple as possible to have minimum runtime. +//------------------------------------------------------------------------------------------------------------------------------ +// The lanzcos filter has negative lobes, so by itself it will introduce ringing. +// To remove all ringing, the algorithm uses the nearest 2x2 input texels as a neighborhood, +// and limits output to the minimum and maximum of that neighborhood. +//------------------------------------------------------------------------------------------------------------------------------ +// Input image requirements: +// +// Color needs to be encoded as 3 channel[red, green, blue](e.g.XYZ not supported) +// Each channel needs to be in the range[0, 1] +// Any color primaries are supported +// Display / tonemapping curve needs to be as if presenting to sRGB display or similar(e.g.Gamma 2.0) +// There should be no banding in the input +// There should be no high amplitude noise in the input +// There should be no noise in the input that is not at input pixel granularity +// For performance purposes, use 32bpp formats +//------------------------------------------------------------------------------------------------------------------------------ +// Best to apply EASU at the end of the frame after tonemapping +// but before film grain or composite of the UI. +//------------------------------------------------------------------------------------------------------------------------------ +// Example of including this header for D3D HLSL : +// +// #define A_GPU 1 +// #define A_HLSL 1 +// #define A_HALF 1 +// #include "ffx_a.h" +// #define FSR_EASU_H 1 +// #define FSR_RCAS_H 1 +// //declare input callbacks +// #include "ffx_fsr1.h" +// +// Example of including this header for Vulkan GLSL : +// +// #define A_GPU 1 +// #define A_GLSL 1 +// #define A_HALF 1 +// #include "ffx_a.h" +// #define FSR_EASU_H 1 +// #define FSR_RCAS_H 1 +// //declare input callbacks +// #include "ffx_fsr1.h" +// +// Example of including this header for Vulkan HLSL : +// +// #define A_GPU 1 +// #define A_HLSL 1 +// #define A_HLSL_6_2 1 +// #define A_NO_16_BIT_CAST 1 +// #define A_HALF 1 +// #include "ffx_a.h" +// #define FSR_EASU_H 1 +// #define FSR_RCAS_H 1 +// //declare input callbacks +// #include "ffx_fsr1.h" +// +// Example of declaring the required input callbacks for GLSL : +// The callbacks need to gather4 for each color channel using the specified texture coordinate 'p'. +// EASU uses gather4 to reduce position computation logic and for free Arrays of Structures to Structures of Arrays conversion. +// +// AH4 FsrEasuRH(AF2 p){return AH4(textureGather(sampler2D(tex,sam),p,0));} +// AH4 FsrEasuGH(AF2 p){return AH4(textureGather(sampler2D(tex,sam),p,1));} +// AH4 FsrEasuBH(AF2 p){return AH4(textureGather(sampler2D(tex,sam),p,2));} +// ... +// The FsrEasuCon function needs to be called from the CPU or GPU to set up constants. +// The difference in viewport and input image size is there to support Dynamic Resolution Scaling. +// To use FsrEasuCon() on the CPU, define A_CPU before including ffx_a and ffx_fsr1. +// Including a GPU example here, the 'con0' through 'con3' values would be stored out to a constant buffer. +// AU4 con0,con1,con2,con3; +// FsrEasuCon(con0,con1,con2,con3, +// 1920.0,1080.0, // Viewport size (top left aligned) in the input image which is to be scaled. +// 3840.0,2160.0, // The size of the input image. +// 2560.0,1440.0); // The output resolution. +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// CONSTANT SETUP +//============================================================================================================================== +// Call to setup required constant values (works on CPU or GPU). +A_STATIC void FsrEasuCon( +outAU4 con0, +outAU4 con1, +outAU4 con2, +outAU4 con3, +// This the rendered image resolution being upscaled +AF1 inputViewportInPixelsX, +AF1 inputViewportInPixelsY, +// This is the resolution of the resource containing the input image (useful for dynamic resolution) +AF1 inputSizeInPixelsX, +AF1 inputSizeInPixelsY, +// This is the display resolution which the input image gets upscaled to +AF1 outputSizeInPixelsX, +AF1 outputSizeInPixelsY){ + // Output integer position to a pixel position in viewport. + con0[0]=AU1_AF1(inputViewportInPixelsX*ARcpF1(outputSizeInPixelsX)); + con0[1]=AU1_AF1(inputViewportInPixelsY*ARcpF1(outputSizeInPixelsY)); + con0[2]=AU1_AF1(AF1_(0.5)*inputViewportInPixelsX*ARcpF1(outputSizeInPixelsX)-AF1_(0.5)); + con0[3]=AU1_AF1(AF1_(0.5)*inputViewportInPixelsY*ARcpF1(outputSizeInPixelsY)-AF1_(0.5)); + // Viewport pixel position to normalized image space. + // This is used to get upper-left of 'F' tap. + con1[0]=AU1_AF1(ARcpF1(inputSizeInPixelsX)); + con1[1]=AU1_AF1(ARcpF1(inputSizeInPixelsY)); + // Centers of gather4, first offset from upper-left of 'F'. + // +---+---+ + // | | | + // +--(0)--+ + // | b | c | + // +---F---+---+---+ + // | e | f | g | h | + // +--(1)--+--(2)--+ + // | i | j | k | l | + // +---+---+---+---+ + // | n | o | + // +--(3)--+ + // | | | + // +---+---+ + con1[2]=AU1_AF1(AF1_( 1.0)*ARcpF1(inputSizeInPixelsX)); + con1[3]=AU1_AF1(AF1_(-1.0)*ARcpF1(inputSizeInPixelsY)); + // These are from (0) instead of 'F'. + con2[0]=AU1_AF1(AF1_(-1.0)*ARcpF1(inputSizeInPixelsX)); + con2[1]=AU1_AF1(AF1_( 2.0)*ARcpF1(inputSizeInPixelsY)); + con2[2]=AU1_AF1(AF1_( 1.0)*ARcpF1(inputSizeInPixelsX)); + con2[3]=AU1_AF1(AF1_( 2.0)*ARcpF1(inputSizeInPixelsY)); + con3[0]=AU1_AF1(AF1_( 0.0)*ARcpF1(inputSizeInPixelsX)); + con3[1]=AU1_AF1(AF1_( 4.0)*ARcpF1(inputSizeInPixelsY)); + con3[2]=con3[3]=0;} + +//If the an offset into the input image resource +A_STATIC void FsrEasuConOffset( + outAU4 con0, + outAU4 con1, + outAU4 con2, + outAU4 con3, + // This the rendered image resolution being upscaled + AF1 inputViewportInPixelsX, + AF1 inputViewportInPixelsY, + // This is the resolution of the resource containing the input image (useful for dynamic resolution) + AF1 inputSizeInPixelsX, + AF1 inputSizeInPixelsY, + // This is the display resolution which the input image gets upscaled to + AF1 outputSizeInPixelsX, + AF1 outputSizeInPixelsY, + // This is the input image offset into the resource containing it (useful for dynamic resolution) + AF1 inputOffsetInPixelsX, + AF1 inputOffsetInPixelsY) { + FsrEasuCon(con0, con1, con2, con3, inputViewportInPixelsX, inputViewportInPixelsY, inputSizeInPixelsX, inputSizeInPixelsY, outputSizeInPixelsX, outputSizeInPixelsY); + con0[2] = AU1_AF1(AF1_(0.5) * inputViewportInPixelsX * ARcpF1(outputSizeInPixelsX) - AF1_(0.5) + inputOffsetInPixelsX); + con0[3] = AU1_AF1(AF1_(0.5) * inputViewportInPixelsY * ARcpF1(outputSizeInPixelsY) - AF1_(0.5) + inputOffsetInPixelsY); +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// NON-PACKED 32-BIT VERSION +//============================================================================================================================== +#if defined(A_GPU)&&defined(FSR_EASU_F) + // Input callback prototypes, need to be implemented by calling shader + AF4 FsrEasuRF(AF2 p); + AF4 FsrEasuGF(AF2 p); + AF4 FsrEasuBF(AF2 p); +//------------------------------------------------------------------------------------------------------------------------------ + // Filtering for a given tap for the scalar. + void FsrEasuTapF( + inout AF3 aC, // Accumulated color, with negative lobe. + inout AF1 aW, // Accumulated weight. + AF2 off, // Pixel offset from resolve position to tap. + AF2 dir, // Gradient direction. + AF2 len, // Length. + AF1 lob, // Negative lobe strength. + AF1 clp, // Clipping point. + AF3 c){ // Tap color. + // Rotate offset by direction. + AF2 v; + v.x=(off.x*( dir.x))+(off.y*dir.y); + v.y=(off.x*(-dir.y))+(off.y*dir.x); + // Anisotropy. + v*=len; + // Compute distance^2. + AF1 d2=v.x*v.x+v.y*v.y; + // Limit to the window as at corner, 2 taps can easily be outside. + d2=min(d2,clp); + // Approximation of lancos2 without sin() or rcp(), or sqrt() to get x. + // (25/16 * (2/5 * x^2 - 1)^2 - (25/16 - 1)) * (1/4 * x^2 - 1)^2 + // |_______________________________________| |_______________| + // base window + // The general form of the 'base' is, + // (a*(b*x^2-1)^2-(a-1)) + // Where 'a=1/(2*b-b^2)' and 'b' moves around the negative lobe. + AF1 wB=AF1_(2.0/5.0)*d2+AF1_(-1.0); + AF1 wA=lob*d2+AF1_(-1.0); + wB*=wB; + wA*=wA; + wB=AF1_(25.0/16.0)*wB+AF1_(-(25.0/16.0-1.0)); + AF1 w=wB*wA; + // Do weighted average. + aC+=c*w;aW+=w;} +//------------------------------------------------------------------------------------------------------------------------------ + // Accumulate direction and length. + void FsrEasuSetF( + inout AF2 dir, + inout AF1 len, + AF2 pp, + AP1 biS,AP1 biT,AP1 biU,AP1 biV, + AF1 lA,AF1 lB,AF1 lC,AF1 lD,AF1 lE){ + // Compute bilinear weight, branches factor out as predicates are compiler time immediates. + // s t + // u v + AF1 w = AF1_(0.0); + if(biS)w=(AF1_(1.0)-pp.x)*(AF1_(1.0)-pp.y); + if(biT)w= pp.x *(AF1_(1.0)-pp.y); + if(biU)w=(AF1_(1.0)-pp.x)* pp.y ; + if(biV)w= pp.x * pp.y ; + // Direction is the '+' diff. + // a + // b c d + // e + // Then takes magnitude from abs average of both sides of 'c'. + // Length converts gradient reversal to 0, smoothly to non-reversal at 1, shaped, then adding horz and vert terms. + AF1 dc=lD-lC; + AF1 cb=lC-lB; + AF1 lenX=max(abs(dc),abs(cb)); + lenX=APrxLoRcpF1(lenX); + AF1 dirX=lD-lB; + dir.x+=dirX*w; + lenX=ASatF1(abs(dirX)*lenX); + lenX*=lenX; + len+=lenX*w; + // Repeat for the y axis. + AF1 ec=lE-lC; + AF1 ca=lC-lA; + AF1 lenY=max(abs(ec),abs(ca)); + lenY=APrxLoRcpF1(lenY); + AF1 dirY=lE-lA; + dir.y+=dirY*w; + lenY=ASatF1(abs(dirY)*lenY); + lenY*=lenY; + len+=lenY*w;} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrEasuF( + out AF3 pix, + AU2 ip, // Integer pixel position in output. + AU4 con0, // Constants generated by FsrEasuCon(). + AU4 con1, + AU4 con2, + AU4 con3){ +//------------------------------------------------------------------------------------------------------------------------------ + // Get position of 'f'. + AF2 pp=AF2(ip)*AF2_AU2(con0.xy)+AF2_AU2(con0.zw); + AF2 fp=floor(pp); + pp-=fp; +//------------------------------------------------------------------------------------------------------------------------------ + // 12-tap kernel. + // b c + // e f g h + // i j k l + // n o + // Gather 4 ordering. + // a b + // r g + // For packed FP16, need either {rg} or {ab} so using the following setup for gather in all versions, + // a b <- unused (z) + // r g + // a b a b + // r g r g + // a b + // r g <- unused (z) + // Allowing dead-code removal to remove the 'z's. + AF2 p0=fp*AF2_AU2(con1.xy)+AF2_AU2(con1.zw); + // These are from p0 to avoid pulling two constants on pre-Navi hardware. + AF2 p1=p0+AF2_AU2(con2.xy); + AF2 p2=p0+AF2_AU2(con2.zw); + AF2 p3=p0+AF2_AU2(con3.xy); + AF4 bczzR=FsrEasuRF(p0); + AF4 bczzG=FsrEasuGF(p0); + AF4 bczzB=FsrEasuBF(p0); + AF4 ijfeR=FsrEasuRF(p1); + AF4 ijfeG=FsrEasuGF(p1); + AF4 ijfeB=FsrEasuBF(p1); + AF4 klhgR=FsrEasuRF(p2); + AF4 klhgG=FsrEasuGF(p2); + AF4 klhgB=FsrEasuBF(p2); + AF4 zzonR=FsrEasuRF(p3); + AF4 zzonG=FsrEasuGF(p3); + AF4 zzonB=FsrEasuBF(p3); +//------------------------------------------------------------------------------------------------------------------------------ + // Simplest multi-channel approximate luma possible (luma times 2, in 2 FMA/MAD). + AF4 bczzL=bczzB*AF4_(0.5)+(bczzR*AF4_(0.5)+bczzG); + AF4 ijfeL=ijfeB*AF4_(0.5)+(ijfeR*AF4_(0.5)+ijfeG); + AF4 klhgL=klhgB*AF4_(0.5)+(klhgR*AF4_(0.5)+klhgG); + AF4 zzonL=zzonB*AF4_(0.5)+(zzonR*AF4_(0.5)+zzonG); + // Rename. + AF1 bL=bczzL.x; + AF1 cL=bczzL.y; + AF1 iL=ijfeL.x; + AF1 jL=ijfeL.y; + AF1 fL=ijfeL.z; + AF1 eL=ijfeL.w; + AF1 kL=klhgL.x; + AF1 lL=klhgL.y; + AF1 hL=klhgL.z; + AF1 gL=klhgL.w; + AF1 oL=zzonL.z; + AF1 nL=zzonL.w; + // Accumulate for bilinear interpolation. + AF2 dir=AF2_(0.0); + AF1 len=AF1_(0.0); + FsrEasuSetF(dir,len,pp,true, false,false,false,bL,eL,fL,gL,jL); + FsrEasuSetF(dir,len,pp,false,true ,false,false,cL,fL,gL,hL,kL); + FsrEasuSetF(dir,len,pp,false,false,true ,false,fL,iL,jL,kL,nL); + FsrEasuSetF(dir,len,pp,false,false,false,true ,gL,jL,kL,lL,oL); +//------------------------------------------------------------------------------------------------------------------------------ + // Normalize with approximation, and cleanup close to zero. + AF2 dir2=dir*dir; + AF1 dirR=dir2.x+dir2.y; + AP1 zro=dirR w = -m/(n+e+w+s) +// 1 == (w*(n+e+w+s)+m)/(4*w+1) -> w = (1-m)/(n+e+w+s-4*1) +// Then chooses the 'w' which results in no clipping, limits 'w', and multiplies by the 'sharp' amount. +// This solution above has issues with MSAA input as the steps along the gradient cause edge detection issues. +// So RCAS uses 4x the maximum and 4x the minimum (depending on equation)in place of the individual taps. +// As well as switching from 'm' to either the minimum or maximum (depending on side), to help in energy conservation. +// This stabilizes RCAS. +// RCAS does a simple highpass which is normalized against the local contrast then shaped, +// 0.25 +// 0.25 -1 0.25 +// 0.25 +// This is used as a noise detection filter, to reduce the effect of RCAS on grain, and focus on real edges. +// +// GLSL example for the required callbacks : +// +// AH4 FsrRcasLoadH(ASW2 p){return AH4(imageLoad(imgSrc,ASU2(p)));} +// void FsrRcasInputH(inout AH1 r,inout AH1 g,inout AH1 b) +// { +// //do any simple input color conversions here or leave empty if none needed +// } +// +// FsrRcasCon need to be called from the CPU or GPU to set up constants. +// Including a GPU example here, the 'con' value would be stored out to a constant buffer. +// +// AU4 con; +// FsrRcasCon(con, +// 0.0); // The scale is {0.0 := maximum sharpness, to N>0, where N is the number of stops (halving) of the reduction of sharpness}. +// --------------- +// RCAS sharpening supports a CAS-like pass-through alpha via, +// #define FSR_RCAS_PASSTHROUGH_ALPHA 1 +// RCAS also supports a define to enable a more expensive path to avoid some sharpening of noise. +// Would suggest it is better to apply film grain after RCAS sharpening (and after scaling) instead of using this define, +// #define FSR_RCAS_DENOISE 1 +//============================================================================================================================== +// This is set at the limit of providing unnatural results for sharpening. +#define FSR_RCAS_LIMIT (0.25-(1.0/16.0)) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// CONSTANT SETUP +//============================================================================================================================== +// Call to setup required constant values (works on CPU or GPU). +A_STATIC void FsrRcasCon( +outAU4 con, +// The scale is {0.0 := maximum, to N>0, where N is the number of stops (halving) of the reduction of sharpness}. +AF1 sharpness){ + // Transform from stops to linear value. + sharpness=AExp2F1(-sharpness); + varAF2(hSharp)=initAF2(sharpness,sharpness); + con[0]=AU1_AF1(sharpness); + con[1]=AU1_AH2_AF2(hSharp); + con[2]=0; + con[3]=0;} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// NON-PACKED 32-BIT VERSION +//============================================================================================================================== +#if defined(A_GPU)&&defined(FSR_RCAS_F) + // Input callback prototypes that need to be implemented by calling shader + AF4 FsrRcasLoadF(ASU2 p); + void FsrRcasInputF(inout AF1 r,inout AF1 g,inout AF1 b); +//------------------------------------------------------------------------------------------------------------------------------ + void FsrRcasF( + out AF1 pixR, // Output values, non-vector so port between RcasFilter() and RcasFilterH() is easy. + out AF1 pixG, + out AF1 pixB, + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + out AF1 pixA, + #endif + AU2 ip, // Integer pixel position in output. + AU4 con){ // Constant generated by RcasSetup(). + // Algorithm uses minimal 3x3 pixel neighborhood. + // b + // d e f + // h + ASU2 sp=ASU2(ip); + AF3 b=FsrRcasLoadF(sp+ASU2( 0,-1)).rgb; + AF3 d=FsrRcasLoadF(sp+ASU2(-1, 0)).rgb; + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + AF4 ee=FsrRcasLoadF(sp); + AF3 e=ee.rgb;pixA=ee.a; + #else + AF3 e=FsrRcasLoadF(sp).rgb; + #endif + AF3 f=FsrRcasLoadF(sp+ASU2( 1, 0)).rgb; + AF3 h=FsrRcasLoadF(sp+ASU2( 0, 1)).rgb; + // Rename (32-bit) or regroup (16-bit). + AF1 bR=b.r; + AF1 bG=b.g; + AF1 bB=b.b; + AF1 dR=d.r; + AF1 dG=d.g; + AF1 dB=d.b; + AF1 eR=e.r; + AF1 eG=e.g; + AF1 eB=e.b; + AF1 fR=f.r; + AF1 fG=f.g; + AF1 fB=f.b; + AF1 hR=h.r; + AF1 hG=h.g; + AF1 hB=h.b; + // Run optional input transform. + FsrRcasInputF(bR,bG,bB); + FsrRcasInputF(dR,dG,dB); + FsrRcasInputF(eR,eG,eB); + FsrRcasInputF(fR,fG,fB); + FsrRcasInputF(hR,hG,hB); + // Luma times 2. + AF1 bL=bB*AF1_(0.5)+(bR*AF1_(0.5)+bG); + AF1 dL=dB*AF1_(0.5)+(dR*AF1_(0.5)+dG); + AF1 eL=eB*AF1_(0.5)+(eR*AF1_(0.5)+eG); + AF1 fL=fB*AF1_(0.5)+(fR*AF1_(0.5)+fG); + AF1 hL=hB*AF1_(0.5)+(hR*AF1_(0.5)+hG); + // Noise detection. + AF1 nz=AF1_(0.25)*bL+AF1_(0.25)*dL+AF1_(0.25)*fL+AF1_(0.25)*hL-eL; + nz=ASatF1(abs(nz)*APrxMedRcpF1(AMax3F1(AMax3F1(bL,dL,eL),fL,hL)-AMin3F1(AMin3F1(bL,dL,eL),fL,hL))); + nz=AF1_(-0.5)*nz+AF1_(1.0); + // Min and max of ring. + AF1 mn4R=min(AMin3F1(bR,dR,fR),hR); + AF1 mn4G=min(AMin3F1(bG,dG,fG),hG); + AF1 mn4B=min(AMin3F1(bB,dB,fB),hB); + AF1 mx4R=max(AMax3F1(bR,dR,fR),hR); + AF1 mx4G=max(AMax3F1(bG,dG,fG),hG); + AF1 mx4B=max(AMax3F1(bB,dB,fB),hB); + // Immediate constants for peak range. + AF2 peakC=AF2(1.0,-1.0*4.0); + // Limiters, these need to be high precision RCPs. + AF1 hitMinR=min(mn4R,eR)*ARcpF1(AF1_(4.0)*mx4R); + AF1 hitMinG=min(mn4G,eG)*ARcpF1(AF1_(4.0)*mx4G); + AF1 hitMinB=min(mn4B,eB)*ARcpF1(AF1_(4.0)*mx4B); + AF1 hitMaxR=(peakC.x-max(mx4R,eR))*ARcpF1(AF1_(4.0)*mn4R+peakC.y); + AF1 hitMaxG=(peakC.x-max(mx4G,eG))*ARcpF1(AF1_(4.0)*mn4G+peakC.y); + AF1 hitMaxB=(peakC.x-max(mx4B,eB))*ARcpF1(AF1_(4.0)*mn4B+peakC.y); + AF1 lobeR=max(-hitMinR,hitMaxR); + AF1 lobeG=max(-hitMinG,hitMaxG); + AF1 lobeB=max(-hitMinB,hitMaxB); + AF1 lobe=max(AF1_(-FSR_RCAS_LIMIT),min(AMax3F1(lobeR,lobeG,lobeB),AF1_(0.0)))*AF1_AU1(con.x); + // Apply noise removal. + #ifdef FSR_RCAS_DENOISE + lobe*=nz; + #endif + // Resolve, which needs the medium precision rcp approximation to avoid visible tonality changes. + AF1 rcpL=APrxMedRcpF1(AF1_(4.0)*lobe+AF1_(1.0)); + pixR=(lobe*bR+lobe*dR+lobe*hR+lobe*fR+eR)*rcpL; + pixG=(lobe*bG+lobe*dG+lobe*hG+lobe*fG+eG)*rcpL; + pixB=(lobe*bB+lobe*dB+lobe*hB+lobe*fB+eB)*rcpL; + return;} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// NON-PACKED 16-BIT VERSION +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF)&&defined(FSR_RCAS_H) + // Input callback prototypes that need to be implemented by calling shader + AH4 FsrRcasLoadH(ASW2 p); + void FsrRcasInputH(inout AH1 r,inout AH1 g,inout AH1 b); +//------------------------------------------------------------------------------------------------------------------------------ + void FsrRcasH( + out AH1 pixR, // Output values, non-vector so port between RcasFilter() and RcasFilterH() is easy. + out AH1 pixG, + out AH1 pixB, + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + out AH1 pixA, + #endif + AU2 ip, // Integer pixel position in output. + AU4 con){ // Constant generated by RcasSetup(). + // Sharpening algorithm uses minimal 3x3 pixel neighborhood. + // b + // d e f + // h + ASW2 sp=ASW2(ip); + AH3 b=FsrRcasLoadH(sp+ASW2( 0,-1)).rgb; + AH3 d=FsrRcasLoadH(sp+ASW2(-1, 0)).rgb; + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + AH4 ee=FsrRcasLoadH(sp); + AH3 e=ee.rgb;pixA=ee.a; + #else + AH3 e=FsrRcasLoadH(sp).rgb; + #endif + AH3 f=FsrRcasLoadH(sp+ASW2( 1, 0)).rgb; + AH3 h=FsrRcasLoadH(sp+ASW2( 0, 1)).rgb; + // Rename (32-bit) or regroup (16-bit). + AH1 bR=b.r; + AH1 bG=b.g; + AH1 bB=b.b; + AH1 dR=d.r; + AH1 dG=d.g; + AH1 dB=d.b; + AH1 eR=e.r; + AH1 eG=e.g; + AH1 eB=e.b; + AH1 fR=f.r; + AH1 fG=f.g; + AH1 fB=f.b; + AH1 hR=h.r; + AH1 hG=h.g; + AH1 hB=h.b; + // Run optional input transform. + FsrRcasInputH(bR,bG,bB); + FsrRcasInputH(dR,dG,dB); + FsrRcasInputH(eR,eG,eB); + FsrRcasInputH(fR,fG,fB); + FsrRcasInputH(hR,hG,hB); + // Luma times 2. + AH1 bL=bB*AH1_(0.5)+(bR*AH1_(0.5)+bG); + AH1 dL=dB*AH1_(0.5)+(dR*AH1_(0.5)+dG); + AH1 eL=eB*AH1_(0.5)+(eR*AH1_(0.5)+eG); + AH1 fL=fB*AH1_(0.5)+(fR*AH1_(0.5)+fG); + AH1 hL=hB*AH1_(0.5)+(hR*AH1_(0.5)+hG); + // Noise detection. + AH1 nz=AH1_(0.25)*bL+AH1_(0.25)*dL+AH1_(0.25)*fL+AH1_(0.25)*hL-eL; + nz=ASatH1(abs(nz)*APrxMedRcpH1(AMax3H1(AMax3H1(bL,dL,eL),fL,hL)-AMin3H1(AMin3H1(bL,dL,eL),fL,hL))); + nz=AH1_(-0.5)*nz+AH1_(1.0); + // Min and max of ring. + AH1 mn4R=min(AMin3H1(bR,dR,fR),hR); + AH1 mn4G=min(AMin3H1(bG,dG,fG),hG); + AH1 mn4B=min(AMin3H1(bB,dB,fB),hB); + AH1 mx4R=max(AMax3H1(bR,dR,fR),hR); + AH1 mx4G=max(AMax3H1(bG,dG,fG),hG); + AH1 mx4B=max(AMax3H1(bB,dB,fB),hB); + // Immediate constants for peak range. + AH2 peakC=AH2(1.0,-1.0*4.0); + // Limiters, these need to be high precision RCPs. + AH1 hitMinR=min(mn4R,eR)*ARcpH1(AH1_(4.0)*mx4R); + AH1 hitMinG=min(mn4G,eG)*ARcpH1(AH1_(4.0)*mx4G); + AH1 hitMinB=min(mn4B,eB)*ARcpH1(AH1_(4.0)*mx4B); + AH1 hitMaxR=(peakC.x-max(mx4R,eR))*ARcpH1(AH1_(4.0)*mn4R+peakC.y); + AH1 hitMaxG=(peakC.x-max(mx4G,eG))*ARcpH1(AH1_(4.0)*mn4G+peakC.y); + AH1 hitMaxB=(peakC.x-max(mx4B,eB))*ARcpH1(AH1_(4.0)*mn4B+peakC.y); + AH1 lobeR=max(-hitMinR,hitMaxR); + AH1 lobeG=max(-hitMinG,hitMaxG); + AH1 lobeB=max(-hitMinB,hitMaxB); + AH1 lobe=max(AH1_(-FSR_RCAS_LIMIT),min(AMax3H1(lobeR,lobeG,lobeB),AH1_(0.0)))*AH2_AU1(con.y).x; + // Apply noise removal. + #ifdef FSR_RCAS_DENOISE + lobe*=nz; + #endif + // Resolve, which needs the medium precision rcp approximation to avoid visible tonality changes. + AH1 rcpL=APrxMedRcpH1(AH1_(4.0)*lobe+AH1_(1.0)); + pixR=(lobe*bR+lobe*dR+lobe*hR+lobe*fR+eR)*rcpL; + pixG=(lobe*bG+lobe*dG+lobe*hG+lobe*fG+eG)*rcpL; + pixB=(lobe*bB+lobe*dB+lobe*hB+lobe*fB+eB)*rcpL;} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// PACKED 16-BIT VERSION +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF)&&defined(FSR_RCAS_HX2) + // Input callback prototypes that need to be implemented by the calling shader + AH4 FsrRcasLoadHx2(ASW2 p); + void FsrRcasInputHx2(inout AH2 r,inout AH2 g,inout AH2 b); +//------------------------------------------------------------------------------------------------------------------------------ + // Can be used to convert from packed Structures of Arrays to Arrays of Structures for store. + void FsrRcasDepackHx2(out AH4 pix0,out AH4 pix1,AH2 pixR,AH2 pixG,AH2 pixB){ + #ifdef A_HLSL + // Invoke a slower path for DX only, since it won't allow uninitialized values. + pix0.a=pix1.a=0.0; + #endif + pix0.rgb=AH3(pixR.x,pixG.x,pixB.x); + pix1.rgb=AH3(pixR.y,pixG.y,pixB.y);} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrRcasHx2( + // Output values are for 2 8x8 tiles in a 16x8 region. + // pix.x = left 8x8 tile + // pix.y = right 8x8 tile + // This enables later processing to easily be packed as well. + out AH2 pixR, + out AH2 pixG, + out AH2 pixB, + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + out AH2 pixA, + #endif + AU2 ip, // Integer pixel position in output. + AU4 con){ // Constant generated by RcasSetup(). + // No scaling algorithm uses minimal 3x3 pixel neighborhood. + ASW2 sp0=ASW2(ip); + AH3 b0=FsrRcasLoadHx2(sp0+ASW2( 0,-1)).rgb; + AH3 d0=FsrRcasLoadHx2(sp0+ASW2(-1, 0)).rgb; + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + AH4 ee0=FsrRcasLoadHx2(sp0); + AH3 e0=ee0.rgb;pixA.r=ee0.a; + #else + AH3 e0=FsrRcasLoadHx2(sp0).rgb; + #endif + AH3 f0=FsrRcasLoadHx2(sp0+ASW2( 1, 0)).rgb; + AH3 h0=FsrRcasLoadHx2(sp0+ASW2( 0, 1)).rgb; + ASW2 sp1=sp0+ASW2(8,0); + AH3 b1=FsrRcasLoadHx2(sp1+ASW2( 0,-1)).rgb; + AH3 d1=FsrRcasLoadHx2(sp1+ASW2(-1, 0)).rgb; + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + AH4 ee1=FsrRcasLoadHx2(sp1); + AH3 e1=ee1.rgb;pixA.g=ee1.a; + #else + AH3 e1=FsrRcasLoadHx2(sp1).rgb; + #endif + AH3 f1=FsrRcasLoadHx2(sp1+ASW2( 1, 0)).rgb; + AH3 h1=FsrRcasLoadHx2(sp1+ASW2( 0, 1)).rgb; + // Arrays of Structures to Structures of Arrays conversion. + AH2 bR=AH2(b0.r,b1.r); + AH2 bG=AH2(b0.g,b1.g); + AH2 bB=AH2(b0.b,b1.b); + AH2 dR=AH2(d0.r,d1.r); + AH2 dG=AH2(d0.g,d1.g); + AH2 dB=AH2(d0.b,d1.b); + AH2 eR=AH2(e0.r,e1.r); + AH2 eG=AH2(e0.g,e1.g); + AH2 eB=AH2(e0.b,e1.b); + AH2 fR=AH2(f0.r,f1.r); + AH2 fG=AH2(f0.g,f1.g); + AH2 fB=AH2(f0.b,f1.b); + AH2 hR=AH2(h0.r,h1.r); + AH2 hG=AH2(h0.g,h1.g); + AH2 hB=AH2(h0.b,h1.b); + // Run optional input transform. + FsrRcasInputHx2(bR,bG,bB); + FsrRcasInputHx2(dR,dG,dB); + FsrRcasInputHx2(eR,eG,eB); + FsrRcasInputHx2(fR,fG,fB); + FsrRcasInputHx2(hR,hG,hB); + // Luma times 2. + AH2 bL=bB*AH2_(0.5)+(bR*AH2_(0.5)+bG); + AH2 dL=dB*AH2_(0.5)+(dR*AH2_(0.5)+dG); + AH2 eL=eB*AH2_(0.5)+(eR*AH2_(0.5)+eG); + AH2 fL=fB*AH2_(0.5)+(fR*AH2_(0.5)+fG); + AH2 hL=hB*AH2_(0.5)+(hR*AH2_(0.5)+hG); + // Noise detection. + AH2 nz=AH2_(0.25)*bL+AH2_(0.25)*dL+AH2_(0.25)*fL+AH2_(0.25)*hL-eL; + nz=ASatH2(abs(nz)*APrxMedRcpH2(AMax3H2(AMax3H2(bL,dL,eL),fL,hL)-AMin3H2(AMin3H2(bL,dL,eL),fL,hL))); + nz=AH2_(-0.5)*nz+AH2_(1.0); + // Min and max of ring. + AH2 mn4R=min(AMin3H2(bR,dR,fR),hR); + AH2 mn4G=min(AMin3H2(bG,dG,fG),hG); + AH2 mn4B=min(AMin3H2(bB,dB,fB),hB); + AH2 mx4R=max(AMax3H2(bR,dR,fR),hR); + AH2 mx4G=max(AMax3H2(bG,dG,fG),hG); + AH2 mx4B=max(AMax3H2(bB,dB,fB),hB); + // Immediate constants for peak range. + AH2 peakC=AH2(1.0,-1.0*4.0); + // Limiters, these need to be high precision RCPs. + AH2 hitMinR=min(mn4R,eR)*ARcpH2(AH2_(4.0)*mx4R); + AH2 hitMinG=min(mn4G,eG)*ARcpH2(AH2_(4.0)*mx4G); + AH2 hitMinB=min(mn4B,eB)*ARcpH2(AH2_(4.0)*mx4B); + AH2 hitMaxR=(peakC.x-max(mx4R,eR))*ARcpH2(AH2_(4.0)*mn4R+peakC.y); + AH2 hitMaxG=(peakC.x-max(mx4G,eG))*ARcpH2(AH2_(4.0)*mn4G+peakC.y); + AH2 hitMaxB=(peakC.x-max(mx4B,eB))*ARcpH2(AH2_(4.0)*mn4B+peakC.y); + AH2 lobeR=max(-hitMinR,hitMaxR); + AH2 lobeG=max(-hitMinG,hitMaxG); + AH2 lobeB=max(-hitMinB,hitMaxB); + AH2 lobe=max(AH2_(-FSR_RCAS_LIMIT),min(AMax3H2(lobeR,lobeG,lobeB),AH2_(0.0)))*AH2_(AH2_AU1(con.y).x); + // Apply noise removal. + #ifdef FSR_RCAS_DENOISE + lobe*=nz; + #endif + // Resolve, which needs the medium precision rcp approximation to avoid visible tonality changes. + AH2 rcpL=APrxMedRcpH2(AH2_(4.0)*lobe+AH2_(1.0)); + pixR=(lobe*bR+lobe*dR+lobe*hR+lobe*fR+eR)*rcpL; + pixG=(lobe*bG+lobe*dG+lobe*hG+lobe*fG+eG)*rcpL; + pixB=(lobe*bB+lobe*dB+lobe*hB+lobe*fB+eB)*rcpL;} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// FSR - [LFGA] LINEAR FILM GRAIN APPLICATOR +// +//------------------------------------------------------------------------------------------------------------------------------ +// Adding output-resolution film grain after scaling is a good way to mask both rendering and scaling artifacts. +// Suggest using tiled blue noise as film grain input, with peak noise frequency set for a specific look and feel. +// The 'Lfga*()' functions provide a convenient way to introduce grain. +// These functions limit grain based on distance to signal limits. +// This is done so that the grain is temporally energy preserving, and thus won't modify image tonality. +// Grain application should be done in a linear colorspace. +// The grain should be temporally changing, but have a temporal sum per pixel that adds to zero (non-biased). +//------------------------------------------------------------------------------------------------------------------------------ +// Usage, +// FsrLfga*( +// color, // In/out linear colorspace color {0 to 1} ranged. +// grain, // Per pixel grain texture value {-0.5 to 0.5} ranged, input is 3-channel to support colored grain. +// amount); // Amount of grain (0 to 1} ranged. +//------------------------------------------------------------------------------------------------------------------------------ +// Example if grain texture is monochrome: 'FsrLfgaF(color,AF3_(grain),amount)' +//============================================================================================================================== +#if defined(A_GPU) + // Maximum grain is the minimum distance to the signal limit. + void FsrLfgaF(inout AF3 c,AF3 t,AF1 a){c+=(t*AF3_(a))*min(AF3_(1.0)-c,c);} +#endif +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF) + // Half precision version (slower). + void FsrLfgaH(inout AH3 c,AH3 t,AH1 a){c+=(t*AH3_(a))*min(AH3_(1.0)-c,c);} +//------------------------------------------------------------------------------------------------------------------------------ + // Packed half precision version (faster). + void FsrLfgaHx2(inout AH2 cR,inout AH2 cG,inout AH2 cB,AH2 tR,AH2 tG,AH2 tB,AH1 a){ + cR+=(tR*AH2_(a))*min(AH2_(1.0)-cR,cR);cG+=(tG*AH2_(a))*min(AH2_(1.0)-cG,cG);cB+=(tB*AH2_(a))*min(AH2_(1.0)-cB,cB);} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// FSR - [SRTM] SIMPLE REVERSIBLE TONE-MAPPER +// +//------------------------------------------------------------------------------------------------------------------------------ +// This provides a way to take linear HDR color {0 to FP16_MAX} and convert it into a temporary {0 to 1} ranged post-tonemapped linear. +// The tonemapper preserves RGB ratio, which helps maintain HDR color bleed during filtering. +//------------------------------------------------------------------------------------------------------------------------------ +// Reversible tonemapper usage, +// FsrSrtm*(color); // {0 to FP16_MAX} converted to {0 to 1}. +// FsrSrtmInv*(color); // {0 to 1} converted into {0 to 32768, output peak safe for FP16}. +//============================================================================================================================== +#if defined(A_GPU) + void FsrSrtmF(inout AF3 c){c*=AF3_(ARcpF1(AMax3F1(c.r,c.g,c.b)+AF1_(1.0)));} + // The extra max solves the c=1.0 case (which is a /0). + void FsrSrtmInvF(inout AF3 c){c*=AF3_(ARcpF1(max(AF1_(1.0/32768.0),AF1_(1.0)-AMax3F1(c.r,c.g,c.b))));} +#endif +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF) + void FsrSrtmH(inout AH3 c){c*=AH3_(ARcpH1(AMax3H1(c.r,c.g,c.b)+AH1_(1.0)));} + void FsrSrtmInvH(inout AH3 c){c*=AH3_(ARcpH1(max(AH1_(1.0/32768.0),AH1_(1.0)-AMax3H1(c.r,c.g,c.b))));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrSrtmHx2(inout AH2 cR,inout AH2 cG,inout AH2 cB){ + AH2 rcp=ARcpH2(AMax3H2(cR,cG,cB)+AH2_(1.0));cR*=rcp;cG*=rcp;cB*=rcp;} + void FsrSrtmInvHx2(inout AH2 cR,inout AH2 cG,inout AH2 cB){ + AH2 rcp=ARcpH2(max(AH2_(1.0/32768.0),AH2_(1.0)-AMax3H2(cR,cG,cB)));cR*=rcp;cG*=rcp;cB*=rcp;} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// FSR - [TEPD] TEMPORAL ENERGY PRESERVING DITHER +// +//------------------------------------------------------------------------------------------------------------------------------ +// Temporally energy preserving dithered {0 to 1} linear to gamma 2.0 conversion. +// Gamma 2.0 is used so that the conversion back to linear is just to square the color. +// The conversion comes in 8-bit and 10-bit modes, designed for output to 8-bit UNORM or 10:10:10:2 respectively. +// Given good non-biased temporal blue noise as dither input, +// the output dither will temporally conserve energy. +// This is done by choosing the linear nearest step point instead of perceptual nearest. +// See code below for details. +//------------------------------------------------------------------------------------------------------------------------------ +// DX SPEC RULES FOR FLOAT->UNORM 8-BIT CONVERSION +// =============================================== +// - Output is 'uint(floor(saturate(n)*255.0+0.5))'. +// - Thus rounding is to nearest. +// - NaN gets converted to zero. +// - INF is clamped to {0.0 to 1.0}. +//============================================================================================================================== +#if defined(A_GPU) + // Hand tuned integer position to dither value, with more values than simple checkerboard. + // Only 32-bit has enough precision for this compddation. + // Output is {0 to <1}. + AF1 FsrTepdDitF(AU2 p,AU1 f){ + AF1 x=AF1_(p.x+f); + AF1 y=AF1_(p.y); + // The 1.61803 golden ratio. + AF1 a=AF1_((1.0+sqrt(5.0))/2.0); + // Number designed to provide a good visual pattern. + AF1 b=AF1_(1.0/3.69); + x=x*a+(y*b); + return AFractF1(x);} +//------------------------------------------------------------------------------------------------------------------------------ + // This version is 8-bit gamma 2.0. + // The 'c' input is {0 to 1}. + // Output is {0 to 1} ready for image store. + void FsrTepdC8F(inout AF3 c,AF1 dit){ + AF3 n=sqrt(c); + n=floor(n*AF3_(255.0))*AF3_(1.0/255.0); + AF3 a=n*n; + AF3 b=n+AF3_(1.0/255.0);b=b*b; + // Ratio of 'a' to 'b' required to produce 'c'. + // APrxLoRcpF1() won't work here (at least for very high dynamic ranges). + // APrxMedRcpF1() is an IADD,FMA,MUL. + AF3 r=(c-b)*APrxMedRcpF3(a-b); + // Use the ratio as a cutoff to choose 'a' or 'b'. + // AGtZeroF1() is a MUL. + c=ASatF3(n+AGtZeroF3(AF3_(dit)-r)*AF3_(1.0/255.0));} +//------------------------------------------------------------------------------------------------------------------------------ + // This version is 10-bit gamma 2.0. + // The 'c' input is {0 to 1}. + // Output is {0 to 1} ready for image store. + void FsrTepdC10F(inout AF3 c,AF1 dit){ + AF3 n=sqrt(c); + n=floor(n*AF3_(1023.0))*AF3_(1.0/1023.0); + AF3 a=n*n; + AF3 b=n+AF3_(1.0/1023.0);b=b*b; + AF3 r=(c-b)*APrxMedRcpF3(a-b); + c=ASatF3(n+AGtZeroF3(AF3_(dit)-r)*AF3_(1.0/1023.0));} +#endif +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF) + AH1 FsrTepdDitH(AU2 p,AU1 f){ + AF1 x=AF1_(p.x+f); + AF1 y=AF1_(p.y); + AF1 a=AF1_((1.0+sqrt(5.0))/2.0); + AF1 b=AF1_(1.0/3.69); + x=x*a+(y*b); + return AH1(AFractF1(x));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrTepdC8H(inout AH3 c,AH1 dit){ + AH3 n=sqrt(c); + n=floor(n*AH3_(255.0))*AH3_(1.0/255.0); + AH3 a=n*n; + AH3 b=n+AH3_(1.0/255.0);b=b*b; + AH3 r=(c-b)*APrxMedRcpH3(a-b); + c=ASatH3(n+AGtZeroH3(AH3_(dit)-r)*AH3_(1.0/255.0));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrTepdC10H(inout AH3 c,AH1 dit){ + AH3 n=sqrt(c); + n=floor(n*AH3_(1023.0))*AH3_(1.0/1023.0); + AH3 a=n*n; + AH3 b=n+AH3_(1.0/1023.0);b=b*b; + AH3 r=(c-b)*APrxMedRcpH3(a-b); + c=ASatH3(n+AGtZeroH3(AH3_(dit)-r)*AH3_(1.0/1023.0));} +//============================================================================================================================== + // This computes dither for positions 'p' and 'p+{8,0}'. + AH2 FsrTepdDitHx2(AU2 p,AU1 f){ + AF2 x; + x.x=AF1_(p.x+f); + x.y=x.x+AF1_(8.0); + AF1 y=AF1_(p.y); + AF1 a=AF1_((1.0+sqrt(5.0))/2.0); + AF1 b=AF1_(1.0/3.69); + x=x*AF2_(a)+AF2_(y*b); + return AH2(AFractF2(x));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrTepdC8Hx2(inout AH2 cR,inout AH2 cG,inout AH2 cB,AH2 dit){ + AH2 nR=sqrt(cR); + AH2 nG=sqrt(cG); + AH2 nB=sqrt(cB); + nR=floor(nR*AH2_(255.0))*AH2_(1.0/255.0); + nG=floor(nG*AH2_(255.0))*AH2_(1.0/255.0); + nB=floor(nB*AH2_(255.0))*AH2_(1.0/255.0); + AH2 aR=nR*nR; + AH2 aG=nG*nG; + AH2 aB=nB*nB; + AH2 bR=nR+AH2_(1.0/255.0);bR=bR*bR; + AH2 bG=nG+AH2_(1.0/255.0);bG=bG*bG; + AH2 bB=nB+AH2_(1.0/255.0);bB=bB*bB; + AH2 rR=(cR-bR)*APrxMedRcpH2(aR-bR); + AH2 rG=(cG-bG)*APrxMedRcpH2(aG-bG); + AH2 rB=(cB-bB)*APrxMedRcpH2(aB-bB); + cR=ASatH2(nR+AGtZeroH2(dit-rR)*AH2_(1.0/255.0)); + cG=ASatH2(nG+AGtZeroH2(dit-rG)*AH2_(1.0/255.0)); + cB=ASatH2(nB+AGtZeroH2(dit-rB)*AH2_(1.0/255.0));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrTepdC10Hx2(inout AH2 cR,inout AH2 cG,inout AH2 cB,AH2 dit){ + AH2 nR=sqrt(cR); + AH2 nG=sqrt(cG); + AH2 nB=sqrt(cB); + nR=floor(nR*AH2_(1023.0))*AH2_(1.0/1023.0); + nG=floor(nG*AH2_(1023.0))*AH2_(1.0/1023.0); + nB=floor(nB*AH2_(1023.0))*AH2_(1.0/1023.0); + AH2 aR=nR*nR; + AH2 aG=nG*nG; + AH2 aB=nB*nB; + AH2 bR=nR+AH2_(1.0/1023.0);bR=bR*bR; + AH2 bG=nG+AH2_(1.0/1023.0);bG=bG*bG; + AH2 bB=nB+AH2_(1.0/1023.0);bB=bB*bB; + AH2 rR=(cR-bR)*APrxMedRcpH2(aR-bR); + AH2 rG=(cG-bG)*APrxMedRcpH2(aG-bG); + AH2 rB=(cB-bB)*APrxMedRcpH2(aB-bB); + cR=ASatH2(nR+AGtZeroH2(dit-rR)*AH2_(1.0/1023.0)); + cG=ASatH2(nG+AGtZeroH2(dit-rG)*AH2_(1.0/1023.0)); + cB=ASatH2(nB+AGtZeroH2(dit-rB)*AH2_(1.0/1023.0));} +#endif diff --git a/externals/FidelityFX-FSR/license.txt b/externals/FidelityFX-FSR/license.txt new file mode 100644 index 0000000..324cba5 --- /dev/null +++ b/externals/FidelityFX-FSR/license.txt @@ -0,0 +1,19 @@ +Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/externals/bc_decoder/bc_decoder.cpp b/externals/bc_decoder/bc_decoder.cpp new file mode 100644 index 0000000..536c44f --- /dev/null +++ b/externals/bc_decoder/bc_decoder.cpp @@ -0,0 +1,1522 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright © 2022 Skyline Team and Contributors (https://github.com/skyline-emu/) +// Copyright 2019 The SwiftShader Authors. All Rights Reserved. + +// This BCn Decoder is directly derivative of Swiftshader's BCn Decoder found at: https://github.com/google/swiftshader/blob/d070309f7d154d6764cbd514b1a5c8bfcef61d06/src/Device/BC_Decoder.cpp +// This file does not follow the Skyline code conventions but has certain Skyline specific code +// There are a lot of implicit and narrowing conversions in this file due to this (Warnings are disabled as a result) + +#include +#include +#include +#include + +namespace { + constexpr int BlockWidth = 4; + constexpr int BlockHeight = 4; + + struct BC_color { + void decode(uint8_t *dst, size_t x, size_t y, size_t dstW, size_t dstH, size_t dstPitch, size_t dstBpp, bool hasAlphaChannel, bool hasSeparateAlpha) const { + Color c[4]; + c[0].extract565(c0); + c[1].extract565(c1); + if (hasSeparateAlpha || (c0 > c1)) { + c[2] = ((c[0] * 2) + c[1]) / 3; + c[3] = ((c[1] * 2) + c[0]) / 3; + } else { + c[2] = (c[0] + c[1]) >> 1; + if (hasAlphaChannel) { + c[3].clearAlpha(); + } + } + + for (int j = 0; j < BlockHeight && (y + j) < dstH; j++) { + size_t dstOffset = j * dstPitch; + size_t idxOffset = j * BlockHeight; + for (size_t i = 0; i < BlockWidth && (x + i) < dstW; i++, idxOffset++, dstOffset += dstBpp) { + *reinterpret_cast(dst + dstOffset) = c[getIdx(idxOffset)].pack8888(); + } + } + } + + private: + struct Color { + Color() { + c[0] = c[1] = c[2] = 0; + c[3] = 0xFF000000; + } + + void extract565(const unsigned int c565) { + c[0] = ((c565 & 0x0000001F) << 3) | ((c565 & 0x0000001C) >> 2); + c[1] = ((c565 & 0x000007E0) >> 3) | ((c565 & 0x00000600) >> 9); + c[2] = ((c565 & 0x0000F800) >> 8) | ((c565 & 0x0000E000) >> 13); + } + + unsigned int pack8888() const { + return ((c[0] & 0xFF) << 16) | ((c[1] & 0xFF) << 8) | (c[2] & 0xFF) | c[3]; + } + + void clearAlpha() { + c[3] = 0; + } + + Color operator*(int factor) const { + Color res; + for (int i = 0; i < 4; ++i) { + res.c[i] = c[i] * factor; + } + return res; + } + + Color operator/(int factor) const { + Color res; + for (int i = 0; i < 4; ++i) { + res.c[i] = c[i] / factor; + } + return res; + } + + Color operator>>(int shift) const { + Color res; + for (int i = 0; i < 4; ++i) { + res.c[i] = c[i] >> shift; + } + return res; + } + + Color operator+(Color const &obj) const { + Color res; + for (int i = 0; i < 4; ++i) { + res.c[i] = c[i] + obj.c[i]; + } + return res; + } + + private: + int c[4]; + }; + + size_t getIdx(int i) const { + size_t offset = i << 1; // 2 bytes per index + return (idx & (0x3 << offset)) >> offset; + } + + unsigned short c0; + unsigned short c1; + unsigned int idx; + }; + static_assert(sizeof(BC_color) == 8, "BC_color must be 8 bytes"); + + struct BC_channel { + void decode(uint8_t *dst, size_t x, size_t y, size_t dstW, size_t dstH, size_t dstPitch, size_t dstBpp, size_t channel, bool isSigned) const { + int c[8] = {0}; + + if (isSigned) { + c[0] = static_cast(data & 0xFF); + c[1] = static_cast((data & 0xFF00) >> 8); + } else { + c[0] = static_cast(data & 0xFF); + c[1] = static_cast((data & 0xFF00) >> 8); + } + + if (c[0] > c[1]) { + for (int i = 2; i < 8; ++i) { + c[i] = ((8 - i) * c[0] + (i - 1) * c[1]) / 7; + } + } else { + for (int i = 2; i < 6; ++i) { + c[i] = ((6 - i) * c[0] + (i - 1) * c[1]) / 5; + } + c[6] = isSigned ? -128 : 0; + c[7] = isSigned ? 127 : 255; + } + + for (size_t j = 0; j < BlockHeight && (y + j) < dstH; j++) { + for (size_t i = 0; i < BlockWidth && (x + i) < dstW; i++) { + dst[channel + (i * dstBpp) + (j * dstPitch)] = static_cast(c[getIdx((j * BlockHeight) + i)]); + } + } + } + + private: + uint8_t getIdx(int i) const { + int offset = i * 3 + 16; + return static_cast((data & (0x7ull << offset)) >> offset); + } + + uint64_t data; + }; + static_assert(sizeof(BC_channel) == 8, "BC_channel must be 8 bytes"); + + struct BC_alpha { + void decode(uint8_t *dst, size_t x, size_t y, size_t dstW, size_t dstH, size_t dstPitch, size_t dstBpp) const { + dst += 3; // Write only to alpha (channel 3) + for (size_t j = 0; j < BlockHeight && (y + j) < dstH; j++, dst += dstPitch) { + uint8_t *dstRow = dst; + for (size_t i = 0; i < BlockWidth && (x + i) < dstW; i++, dstRow += dstBpp) { + *dstRow = getAlpha(j * BlockHeight + i); + } + } + } + + private: + uint8_t getAlpha(int i) const { + int offset = i << 2; + int alpha = (data & (0xFull << offset)) >> offset; + return static_cast(alpha | (alpha << 4)); + } + + uint64_t data; + }; + static_assert(sizeof(BC_alpha) == 8, "BC_alpha must be 8 bytes"); + + namespace BC6H { + static constexpr int MaxPartitions = 64; + + // @fmt:off + + static constexpr uint8_t PartitionTable2[MaxPartitions][16] = { + { 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, + { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }, + { 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 }, + { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1 }, + { 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1 }, + { 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1 }, + { 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 }, + { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1 }, + { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0 }, + { 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, + { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }, + { 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1 }, + { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }, + { 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0 }, + { 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0 }, + { 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, + { 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0 }, + { 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, + { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, + { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 }, + { 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0 }, + { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 }, + { 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 }, + { 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1 }, + { 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 }, + { 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0 }, + { 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0 }, + { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }, + { 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1 }, + { 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 }, + { 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, + { 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0 }, + { 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0 }, + { 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1 }, + { 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1 }, + { 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0 }, + { 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1 }, + { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1 }, + { 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 }, + { 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1 }, + { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, + { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, + { 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 }, + { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1 }, + }; + + static constexpr uint8_t AnchorTable2[MaxPartitions] = { + 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, + 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, + 0xf, 0x2, 0x8, 0x2, 0x2, 0x8, 0x8, 0xf, + 0x2, 0x8, 0x2, 0x2, 0x8, 0x8, 0x2, 0x2, + 0xf, 0xf, 0x6, 0x8, 0x2, 0x8, 0xf, 0xf, + 0x2, 0x8, 0x2, 0x2, 0x2, 0xf, 0xf, 0x6, + 0x6, 0x2, 0x6, 0x8, 0xf, 0xf, 0x2, 0x2, + 0xf, 0xf, 0xf, 0xf, 0xf, 0x2, 0x2, 0xf, + }; + + // @fmt:on + + // 1.0f in half-precision floating point format + static constexpr uint16_t halfFloat1 = 0x3C00; + union Color { + struct RGBA { + uint16_t r = 0; + uint16_t g = 0; + uint16_t b = 0; + uint16_t a = halfFloat1; + + RGBA(uint16_t r, uint16_t g, uint16_t b) + : r(r), g(g), b(b) { + } + + RGBA &operator=(const RGBA &other) { + this->r = other.r; + this->g = other.g; + this->b = other.b; + this->a = halfFloat1; + + return *this; + } + }; + + Color(uint16_t r, uint16_t g, uint16_t b) + : rgba(r, g, b) { + } + + Color(int r, int g, int b) + : rgba((uint16_t) r, (uint16_t) g, (uint16_t) b) { + } + + Color() {} + + Color(const Color &other) { + this->rgba = other.rgba; + } + + Color &operator=(const Color &other) { + this->rgba = other.rgba; + + return *this; + } + + RGBA rgba; + uint16_t channel[4]; + }; + static_assert(sizeof(Color) == 8, "BC6h::Color must be 8 bytes long"); + + inline int32_t extendSign(int32_t val, size_t size) { + // Suppose we have a 2-bit integer being stored in 4 bit variable: + // x = 0b00AB + // + // In order to sign extend x, we need to turn the 0s into A's: + // x_extend = 0bAAAB + // + // We can do that by flipping A in x then subtracting 0b0010 from x. + // Suppose A is 1: + // x = 0b001B + // x_flip = 0b000B + // x_minus = 0b111B + // Since A is flipped to 0, subtracting the mask sets it and all the bits above it to 1. + // And if A is 0: + // x = 0b000B + // x_flip = 0b001B + // x_minus = 0b000B + // We unset the bit we flipped, and touch no other bit + uint16_t mask = 1u << (size - 1); + return (val ^ mask) - mask; + } + + static int constexpr RGBfChannels = 3; + struct RGBf { + uint16_t channel[RGBfChannels]; + size_t size[RGBfChannels]; + bool isSigned; + + RGBf() { + static_assert(RGBfChannels == 3, "RGBf must have exactly 3 channels"); + static_assert(sizeof(channel) / sizeof(channel[0]) == RGBfChannels, "RGBf must have exactly 3 channels"); + static_assert(sizeof(channel) / sizeof(channel[0]) == sizeof(size) / sizeof(size[0]), "RGBf requires equally sized arrays for channels and channel sizes"); + + for (int i = 0; i < RGBfChannels; i++) { + channel[i] = 0; + size[i] = 0; + } + + isSigned = false; + } + + void extendSign() { + for (int i = 0; i < RGBfChannels; i++) { + channel[i] = BC6H::extendSign(channel[i], size[i]); + } + } + + // Assuming this is the delta, take the base-endpoint and transform this into + // a proper endpoint. + // + // The final computed endpoint is truncated to the base-endpoint's size; + void resolveDelta(RGBf base) { + for (int i = 0; i < RGBfChannels; i++) { + size[i] = base.size[i]; + channel[i] = (base.channel[i] + channel[i]) & ((1 << base.size[i]) - 1); + } + + // Per the spec: + // "For signed formats, the results of the delta calculation must be sign + // extended as well." + if (isSigned) { + extendSign(); + } + } + + void unquantize() { + if (isSigned) { + unquantizeSigned(); + } else { + unquantizeUnsigned(); + } + } + + void unquantizeUnsigned() { + for (int i = 0; i < RGBfChannels; i++) { + if (size[i] >= 15 || channel[i] == 0) { + continue; + } else if (channel[i] == ((1u << size[i]) - 1)) { + channel[i] = 0xFFFFu; + } else { + // Need 32 bits to avoid overflow + uint32_t tmp = channel[i]; + channel[i] = (uint16_t) (((tmp << 16) + 0x8000) >> size[i]); + } + size[i] = 16; + } + } + + void unquantizeSigned() { + for (int i = 0; i < RGBfChannels; i++) { + if (size[i] >= 16 || channel[i] == 0) { + continue; + } + + int16_t value = (int16_t)channel[i]; + int32_t result = value; + bool signBit = value < 0; + if (signBit) { + value = -value; + } + + if (value >= ((1 << (size[i] - 1)) - 1)) { + result = 0x7FFF; + } else { + // Need 32 bits to avoid overflow + int32_t tmp = value; + result = (((tmp << 15) + 0x4000) >> (size[i] - 1)); + } + + if (signBit) { + result = -result; + } + + channel[i] = (uint16_t) result; + size[i] = 16; + } + } + }; + + struct Data { + uint64_t low64; + uint64_t high64; + + Data() = default; + + Data(uint64_t low64, uint64_t high64) + : low64(low64), high64(high64) { + } + + // Consumes the lowest N bits from from low64 and high64 where N is: + // abs(MSB - LSB) + // MSB and LSB come from the block description of the BC6h spec and specify + // the location of the bits in the returned bitstring. + // + // If MSB < LSB, then the bits are reversed. Otherwise, the bitstring is read and + // shifted without further modification. + // + uint32_t consumeBits(uint32_t MSB, uint32_t LSB) { + bool reversed = MSB < LSB; + if (reversed) { + std::swap(MSB, LSB); + } + assert(MSB - LSB + 1 < sizeof(uint32_t) * 8); + + uint32_t numBits = MSB - LSB + 1; + uint32_t mask = (1 << numBits) - 1; + // Read the low N bits + uint32_t bits = (low64 & mask); + + low64 >>= numBits; + // Put the low N bits of high64 into the high 64-N bits of low64 + low64 |= (high64 & mask) << (sizeof(high64) * 8 - numBits); + high64 >>= numBits; + + if (reversed) { + uint32_t tmp = 0; + for (uint32_t numSwaps = 0; numSwaps < numBits; numSwaps++) { + tmp <<= 1; + tmp |= (bits & 1); + bits >>= 1; + } + + bits = tmp; + } + + return bits << LSB; + } + }; + + struct IndexInfo { + uint64_t value; + int numBits; + }; + +// Interpolates between two endpoints, then does a final unquantization step + Color interpolate(RGBf e0, RGBf e1, const IndexInfo &index, bool isSigned) { + static constexpr uint32_t weights3[] = {0, 9, 18, 27, 37, 46, 55, 64}; + static constexpr uint32_t weights4[] = {0, 4, 9, 13, 17, 21, 26, 30, + 34, 38, 43, 47, 51, 55, 60, 64}; + static constexpr uint32_t const *weightsN[] = { + nullptr, nullptr, nullptr, weights3, weights4 + }; + auto weights = weightsN[index.numBits]; + assert(weights != nullptr); + Color color; + uint32_t e0Weight = 64 - weights[index.value]; + uint32_t e1Weight = weights[index.value]; + + for (int i = 0; i < RGBfChannels; i++) { + int32_t e0Channel = e0.channel[i]; + int32_t e1Channel = e1.channel[i]; + + if (isSigned) { + e0Channel = extendSign(e0Channel, 16); + e1Channel = extendSign(e1Channel, 16); + } + + int32_t e0Value = e0Channel * e0Weight; + int32_t e1Value = e1Channel * e1Weight; + + uint32_t tmp = ((e0Value + e1Value + 32) >> 6); + + // Need to unquantize value to limit it to the legal range of half-precision + // floats. We do this by scaling by 31/32 or 31/64 depending on if the value + // is signed or unsigned. + if (isSigned) { + tmp = ((tmp & 0x80000000) != 0) ? (((~tmp + 1) * 31) >> 5) | 0x8000 : (tmp * 31) >> 5; + // Don't return -0.0f, just normalize it to 0.0f. + if (tmp == 0x8000) + tmp = 0; + } else { + tmp = (tmp * 31) >> 6; + } + + color.channel[i] = (uint16_t) tmp; + } + + return color; + } + + enum DataType { + // Endpoints + EP0 = 0, + EP1 = 1, + EP2 = 2, + EP3 = 3, + Mode, + Partition, + End, + }; + + enum Channel { + R = 0, + G = 1, + B = 2, + None, + }; + + struct DeltaBits { + size_t channel[3]; + + constexpr DeltaBits() + : channel{0, 0, 0} { + } + + constexpr DeltaBits(size_t r, size_t g, size_t b) + : channel{r, g, b} { + } + }; + + struct ModeDesc { + int number; + bool hasDelta; + int partitionCount; + int endpointBits; + DeltaBits deltaBits; + + constexpr ModeDesc() + : number(-1), hasDelta(false), partitionCount(0), endpointBits(0) { + } + + constexpr ModeDesc(int number, bool hasDelta, int partitionCount, int endpointBits, DeltaBits deltaBits) + : number(number), hasDelta(hasDelta), partitionCount(partitionCount), endpointBits(endpointBits), deltaBits(deltaBits) { + } + }; + + struct BlockDesc { + DataType type; + Channel channel; + int MSB; + int LSB; + ModeDesc modeDesc; + + constexpr BlockDesc() + : type(End), channel(None), MSB(0), LSB(0), modeDesc() { + } + + constexpr BlockDesc(const DataType type, Channel channel, int MSB, int LSB, ModeDesc modeDesc) + : type(type), channel(channel), MSB(MSB), LSB(LSB), modeDesc(modeDesc) { + } + + constexpr BlockDesc(DataType type, Channel channel, int MSB, int LSB) + : type(type), channel(channel), MSB(MSB), LSB(LSB), modeDesc() { + } + }; + +// Turns a legal mode into an index into the BlockDesc table. +// Illegal or reserved modes return -1. + static int modeToIndex(uint8_t mode) { + if (mode <= 3) { + return mode; + } else if ((mode & 0x2) != 0) { + if (mode <= 18) { +// Turns 6 into 4, 7 into 5, 10 into 6, etc. + return (mode / 2) + 1 + (mode & 0x1); + } else if (mode == 22 || mode == 26 || mode == 30) { +// Turns 22 into 11, 26 into 12, etc. + return mode / 4 + 6; + } + } + + return -1; + } + +// Returns a description of the bitfields for each mode from the LSB +// to the MSB before the index data starts. +// +// The numbers come from the BC6h block description. Each BlockDesc in the +// {Type, Channel, MSB, LSB} +// * Type describes which endpoint this is, or if this is a mode, a partition +// number, or the end of the block description. +// * Channel describes one of the 3 color channels within an endpoint +// * MSB and LSB specificy: +// * The size of the bitfield being read +// * The position of the bitfield within the variable it is being read to +// * If the bitfield is stored in reverse bit order +// If MSB < LSB then the bitfield is stored in reverse order. The size of +// the bitfield is abs(MSB-LSB+1). And the position of the bitfield within +// the variable is min(LSB, MSB). +// +// Invalid or reserved modes return an empty list. + static constexpr int NumBlocks = 14; +// The largest number of descriptions within a block. + static constexpr int MaxBlockDescIndex = 26; + static constexpr BlockDesc blockDescs[NumBlocks][MaxBlockDescIndex] = { +// @fmt:off +// Mode 0, Index 0 +{ +{ Mode, None, 1, 0, { 0, true, 2, 10, { 5, 5, 5 } } }, +{ EP2, G, 4, 4 }, { EP2, B, 4, 4 }, { EP3, B, 4, 4 }, +{ EP0, R, 9, 0 }, { EP0, G, 9, 0 }, { EP0, B, 9, 0 }, +{ EP1, R, 4, 0 }, { EP3, G, 4, 4 }, { EP2, G, 3, 0 }, +{ EP1, G, 4, 0 }, { EP3, B, 0, 0 }, { EP3, G, 3, 0 }, +{ EP1, B, 4, 0 }, { EP3, B, 1, 1 }, { EP2, B, 3, 0 }, +{ EP2, R, 4, 0 }, { EP3, B, 2, 2 }, { EP3, R, 4, 0 }, +{ EP3, B, 3, 3 }, +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +}, +// Mode 1, Index 1 +{ +{ Mode, None, 1, 0, { 1, true, 2, 7, { 6, 6, 6 } } }, +{ EP2, G, 5, 5 }, { EP3, G, 5, 4 }, { EP0, R, 6, 0 }, +{ EP3, B, 1, 0 }, { EP2, B, 4, 4 }, { EP0, G, 6, 0 }, +{ EP2, B, 5, 5 }, { EP3, B, 2, 2 }, { EP2, G, 4, 4 }, +{ EP0, B, 6, 0 }, { EP3, B, 3, 3 }, { EP3, B, 5, 5 }, +{ EP3, B, 4, 4 }, { EP1, R, 5, 0 }, { EP2, G, 3, 0 }, +{ EP1, G, 5, 0 }, { EP3, G, 3, 0 }, { EP1, B, 5, 0 }, +{ EP2, B, 3, 0 }, { EP2, R, 5, 0 }, { EP3, R, 5, 0 }, +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +}, +// Mode 2, Index 2 +{ +{ Mode, None, 4, 0, { 2, true, 2, 11, { 5, 4, 4 } } }, +{ EP0, R, 9, 0 }, { EP0, G, 9, 0 }, { EP0, B, 9, 0 }, +{ EP1, R, 4, 0 }, { EP0, R, 10, 10 }, { EP2, G, 3, 0 }, +{ EP1, G, 3, 0 }, { EP0, G, 10, 10 }, { EP3, B, 0, 0 }, +{ EP3, G, 3, 0 }, { EP1, B, 3, 0 }, { EP0, B, 10, 10 }, +{ EP3, B, 1, 1 }, { EP2, B, 3, 0 }, { EP2, R, 4, 0 }, +{ EP3, B, 2, 2 }, { EP3, R, 4, 0 }, { EP3, B, 3, 3 }, +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +}, +// Mode 3, Index 3 +{ +{ Mode, None, 4, 0, { 3, false, 1, 10, { 0, 0, 0 } } }, +{ EP0, R, 9, 0 }, { EP0, G, 9, 0 }, { EP0, B, 9, 0 }, +{ EP1, R, 9, 0 }, { EP1, G, 9, 0 }, { EP1, B, 9, 0 }, +{ End, None, 0, 0}, +}, +// Mode 6, Index 4 +{ +{ Mode, None, 4, 0, { 6, true, 2, 11, { 4, 5, 4 } } }, // 1 1 +{ EP0, R, 9, 0 }, { EP0, G, 9, 0 }, { EP0, B, 9, 0 }, +{ EP1, R, 3, 0 }, { EP0, R, 10, 10 }, { EP3, G, 4, 4 }, +{ EP2, G, 3, 0 }, { EP1, G, 4, 0 }, { EP0, G, 10, 10 }, +{ EP3, G, 3, 0 }, { EP1, B, 3, 0 }, { EP0, B, 10, 10 }, +{ EP3, B, 1, 1 }, { EP2, B, 3, 0 }, { EP2, R, 3, 0 }, +{ EP3, B, 0, 0 }, { EP3, B, 2, 2 }, { EP3, R, 3, 0 }, // 18 19 +{ EP2, G, 4, 4 }, { EP3, B, 3, 3 }, // 2 21 +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +}, +// Mode 7, Index 5 +{ +{ Mode, None, 4, 0, { 7, true, 1, 11, { 9, 9, 9 } } }, +{ EP0, R, 9, 0 }, { EP0, G, 9, 0 }, { EP0, B, 9, 0 }, +{ EP1, R, 8, 0 }, { EP0, R, 10, 10 }, { EP1, G, 8, 0 }, +{ EP0, G, 10, 10 }, { EP1, B, 8, 0 }, { EP0, B, 10, 10 }, +{ End, None, 0, 0}, +}, +// Mode 10, Index 6 +{ +{ Mode, None, 4, 0, { 10, true, 2, 11, { 4, 4, 5 } } }, +{ EP0, R, 9, 0 }, { EP0, G, 9, 0 }, { EP0, B, 9, 0 }, +{ EP1, R, 3, 0 }, { EP0, R, 10, 10 }, { EP2, B, 4, 4 }, +{ EP2, G, 3, 0 }, { EP1, G, 3, 0 }, { EP0, G, 10, 10 }, +{ EP3, B, 0, 0 }, { EP3, G, 3, 0 }, { EP1, B, 4, 0 }, +{ EP0, B, 10, 10 }, { EP2, B, 3, 0 }, { EP2, R, 3, 0 }, +{ EP3, B, 1, 1 }, { EP3, B, 2, 2 }, { EP3, R, 3, 0 }, +{ EP3, B, 4, 4 }, { EP3, B, 3, 3 }, +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +}, +// Mode 11, Index 7 +{ +{ Mode, None, 4, 0, { 11, true, 1, 12, { 8, 8, 8 } } }, +{ EP0, R, 9, 0 }, { EP0, G, 9, 0 }, { EP0, B, 9, 0 }, +{ EP1, R, 7, 0 }, { EP0, R, 10, 11 }, { EP1, G, 7, 0 }, +{ EP0, G, 10, 11 }, { EP1, B, 7, 0 }, { EP0, B, 10, 11 }, +{ End, None, 0, 0}, +}, +// Mode 14, Index 8 +{ +{ Mode, None, 4, 0, { 14, true, 2, 9, { 5, 5, 5 } } }, +{ EP0, R, 8, 0 }, { EP2, B, 4, 4 }, { EP0, G, 8, 0 }, +{ EP2, G, 4, 4 }, { EP0, B, 8, 0 }, { EP3, B, 4, 4 }, +{ EP1, R, 4, 0 }, { EP3, G, 4, 4 }, { EP2, G, 3, 0 }, +{ EP1, G, 4, 0 }, { EP3, B, 0, 0 }, { EP3, G, 3, 0 }, +{ EP1, B, 4, 0 }, { EP3, B, 1, 1 }, { EP2, B, 3, 0 }, +{ EP2, R, 4, 0 }, { EP3, B, 2, 2 }, { EP3, R, 4, 0 }, +{ EP3, B, 3, 3 }, +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +}, +// Mode 15, Index 9 +{ +{ Mode, None, 4, 0, { 15, true, 1, 16, { 4, 4, 4 } } }, +{ EP0, R, 9, 0 }, { EP0, G, 9, 0 }, { EP0, B, 9, 0 }, +{ EP1, R, 3, 0 }, { EP0, R, 10, 15 }, { EP1, G, 3, 0 }, +{ EP0, G, 10, 15 }, { EP1, B, 3, 0 }, { EP0, B, 10, 15 }, +{ End, None, 0, 0}, +}, +// Mode 18, Index 10 +{ +{ Mode, None, 4, 0, { 18, true, 2, 8, { 6, 5, 5 } } }, +{ EP0, R, 7, 0 }, { EP3, G, 4, 4 }, { EP2, B, 4, 4 }, +{ EP0, G, 7, 0 }, { EP3, B, 2, 2 }, { EP2, G, 4, 4 }, +{ EP0, B, 7, 0 }, { EP3, B, 3, 3 }, { EP3, B, 4, 4 }, +{ EP1, R, 5, 0 }, { EP2, G, 3, 0 }, { EP1, G, 4, 0 }, +{ EP3, B, 0, 0 }, { EP3, G, 3, 0 }, { EP1, B, 4, 0 }, +{ EP3, B, 1, 1 }, { EP2, B, 3, 0 }, { EP2, R, 5, 0 }, +{ EP3, R, 5, 0 }, +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +}, +// Mode 22, Index 11 +{ +{ Mode, None, 4, 0, { 22, true, 2, 8, { 5, 6, 5 } } }, +{ EP0, R, 7, 0 }, { EP3, B, 0, 0 }, { EP2, B, 4, 4 }, +{ EP0, G, 7, 0 }, { EP2, G, 5, 5 }, { EP2, G, 4, 4 }, +{ EP0, B, 7, 0 }, { EP3, G, 5, 5 }, { EP3, B, 4, 4 }, +{ EP1, R, 4, 0 }, { EP3, G, 4, 4 }, { EP2, G, 3, 0 }, +{ EP1, G, 5, 0 }, { EP3, G, 3, 0 }, { EP1, B, 4, 0 }, +{ EP3, B, 1, 1 }, { EP2, B, 3, 0 }, { EP2, R, 4, 0 }, +{ EP3, B, 2, 2 }, { EP3, R, 4, 0 }, { EP3, B, 3, 3 }, +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +}, +// Mode 26, Index 12 +{ +{ Mode, None, 4, 0, { 26, true, 2, 8, { 5, 5, 6 } } }, +{ EP0, R, 7, 0 }, { EP3, B, 1, 1 }, { EP2, B, 4, 4 }, +{ EP0, G, 7, 0 }, { EP2, B, 5, 5 }, { EP2, G, 4, 4 }, +{ EP0, B, 7, 0 }, { EP3, B, 5, 5 }, { EP3, B, 4, 4 }, +{ EP1, R, 4, 0 }, { EP3, G, 4, 4 }, { EP2, G, 3, 0 }, +{ EP1, G, 4, 0 }, { EP3, B, 0, 0 }, { EP3, G, 3, 0 }, +{ EP1, B, 5, 0 }, { EP2, B, 3, 0 }, { EP2, R, 4, 0 }, +{ EP3, B, 2, 2 }, { EP3, R, 4, 0 }, { EP3, B, 3, 3 }, +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +}, +// Mode 30, Index 13 +{ +{ Mode, None, 4, 0, { 30, false, 2, 6, { 0, 0, 0 } } }, +{ EP0, R, 5, 0 }, { EP3, G, 4, 4 }, { EP3, B, 0, 0 }, +{ EP3, B, 1, 1 }, { EP2, B, 4, 4 }, { EP0, G, 5, 0 }, +{ EP2, G, 5, 5 }, { EP2, B, 5, 5 }, { EP3, B, 2, 2 }, +{ EP2, G, 4, 4 }, { EP0, B, 5, 0 }, { EP3, G, 5, 5 }, +{ EP3, B, 3, 3 }, { EP3, B, 5, 5 }, { EP3, B, 4, 4 }, +{ EP1, R, 5, 0 }, { EP2, G, 3, 0 }, { EP1, G, 5, 0 }, +{ EP3, G, 3, 0 }, { EP1, B, 5, 0 }, { EP2, B, 3, 0 }, +{ EP2, R, 5, 0 }, { EP3, R, 5, 0 }, +{ Partition, None, 4, 0 }, +{ End, None, 0, 0}, +} +// @fmt:on + }; + + struct Block { + uint64_t low64; + uint64_t high64; + + void decode(uint8_t *dst, size_t dstX, size_t dstY, size_t dstWidth, size_t dstHeight, size_t dstPitch, size_t dstBpp, bool isSigned) const { + uint8_t mode = 0; + Data data(low64, high64); + assert(dstBpp == sizeof(Color)); + + if ((data.low64 & 0x2) == 0) { + mode = data.consumeBits(1, 0); + } else { + mode = data.consumeBits(4, 0); + } + + int blockIndex = modeToIndex(mode); + // Handle illegal or reserved mode + if (blockIndex == -1) { + for (int y = 0; y < 4 && y + dstY < dstHeight; y++) { + for (int x = 0; x < 4 && x + dstX < dstWidth; x++) { + auto out = reinterpret_cast(dst + sizeof(Color) * x + dstPitch * y); + out->rgba = {0, 0, 0}; + } + } + return; + } + const BlockDesc *blockDesc = blockDescs[blockIndex]; + + RGBf e[4]; + e[0].isSigned = e[1].isSigned = e[2].isSigned = e[3].isSigned = isSigned; + + int partition = 0; + ModeDesc modeDesc; + for (int index = 0; blockDesc[index].type != End; index++) { + const BlockDesc desc = blockDesc[index]; + + switch (desc.type) { + case Mode: + modeDesc = desc.modeDesc; + assert(modeDesc.number == mode); + + e[0].size[0] = e[0].size[1] = e[0].size[2] = modeDesc.endpointBits; + for (int i = 0; i < RGBfChannels; i++) { + if (modeDesc.hasDelta) { + e[1].size[i] = e[2].size[i] = e[3].size[i] = modeDesc.deltaBits.channel[i]; + } else { + e[1].size[i] = e[2].size[i] = e[3].size[i] = modeDesc.endpointBits; + } + } + break; + case Partition: + partition |= data.consumeBits(desc.MSB, desc.LSB); + break; + case EP0: + case EP1: + case EP2: + case EP3: + e[desc.type].channel[desc.channel] |= data.consumeBits(desc.MSB, desc.LSB); + break; + default: + assert(false); + return; + } + } + + // Sign extension + if (isSigned) { + for (int ep = 0; ep < modeDesc.partitionCount * 2; ep++) { + e[ep].extendSign(); + } + } else if (modeDesc.hasDelta) { + // Don't sign-extend the base endpoint in an unsigned format. + for (int ep = 1; ep < modeDesc.partitionCount * 2; ep++) { + e[ep].extendSign(); + } + } + + // Turn the deltas into endpoints + if (modeDesc.hasDelta) { + for (int ep = 1; ep < modeDesc.partitionCount * 2; ep++) { + e[ep].resolveDelta(e[0]); + } + } + + for (int ep = 0; ep < modeDesc.partitionCount * 2; ep++) { + e[ep].unquantize(); + } + + // Get the indices, calculate final colors, and output + for (int y = 0; y < 4; y++) { + for (int x = 0; x < 4; x++) { + int pixelNum = x + y * 4; + IndexInfo idx; + bool isAnchor = false; + int firstEndpoint = 0; + // Bc6H can have either 1 or 2 petitions depending on the mode. + // The number of petitions affects the number of indices with implicit + // leading 0 bits and the number of bits per index. + if (modeDesc.partitionCount == 1) { + idx.numBits = 4; + // There's an implicit leading 0 bit for the first idx + isAnchor = (pixelNum == 0); + } else { + idx.numBits = 3; + // There are 2 indices with implicit leading 0-bits. + isAnchor = ((pixelNum == 0) || (pixelNum == AnchorTable2[partition])); + firstEndpoint = PartitionTable2[partition][pixelNum] * 2; + } + + idx.value = data.consumeBits(idx.numBits - isAnchor - 1, 0); + + // Don't exit the loop early, we need to consume these index bits regardless if + // we actually output them or not. + if ((y + dstY >= dstHeight) || (x + dstX >= dstWidth)) { + continue; + } + + Color color = interpolate(e[firstEndpoint], e[firstEndpoint + 1], idx, isSigned); + auto out = reinterpret_cast(dst + dstBpp * x + dstPitch * y); + *out = color; + } + } + } + }; + + } // namespace BC6H + + namespace BC7 { +// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_compression_bptc.txt +// https://docs.microsoft.com/en-us/windows/win32/direct3d11/bc7-format + + struct Bitfield { + int offset; + int count; + + constexpr Bitfield Then(const int bits) { return {offset + count, bits}; } + + constexpr bool operator==(const Bitfield &rhs) { + return offset == rhs.offset && count == rhs.count; + } + }; + + struct Mode { + const int IDX; // Mode index + const int NS; // Number of subsets in each partition + const int PB; // Partition bits + const int RB; // Rotation bits + const int ISB; // Index selection bits + const int CB; // Color bits + const int AB; // Alpha bits + const int EPB; // Endpoint P-bits + const int SPB; // Shared P-bits + const int IB; // Primary index bits per element + const int IBC; // Primary index bits total + const int IB2; // Secondary index bits per element + + constexpr int NumColors() const { return NS * 2; } + + constexpr Bitfield Partition() const { return {IDX + 1, PB}; } + + constexpr Bitfield Rotation() const { return Partition().Then(RB); } + + constexpr Bitfield IndexSelection() const { return Rotation().Then(ISB); } + + constexpr Bitfield Red(int idx) const { + return IndexSelection().Then(CB * idx).Then(CB); + } + + constexpr Bitfield Green(int idx) const { + return Red(NumColors() - 1).Then(CB * idx).Then(CB); + } + + constexpr Bitfield Blue(int idx) const { + return Green(NumColors() - 1).Then(CB * idx).Then(CB); + } + + constexpr Bitfield Alpha(int idx) const { + return Blue(NumColors() - 1).Then(AB * idx).Then(AB); + } + + constexpr Bitfield EndpointPBit(int idx) const { + return Alpha(NumColors() - 1).Then(EPB * idx).Then(EPB); + } + + constexpr Bitfield SharedPBit0() const { + return EndpointPBit(NumColors() - 1).Then(SPB); + } + + constexpr Bitfield SharedPBit1() const { + return SharedPBit0().Then(SPB); + } + + constexpr Bitfield PrimaryIndex(int offset, int count) const { + return SharedPBit1().Then(offset).Then(count); + } + + constexpr Bitfield SecondaryIndex(int offset, int count) const { + return SharedPBit1().Then(IBC + offset).Then(count); + } + }; + + static constexpr Mode Modes[] = { + // IDX NS PB RB ISB CB AB EPB SPB IB IBC, IB2 + /**/ {0x0, 0x3, 0x4, 0x0, 0x0, 0x4, 0x0, 0x1, 0x0, 0x3, 0x2d, 0x0}, +/**/ {0x1, 0x2, 0x6, 0x0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x3, 0x2e, 0x0}, +/**/ {0x2, 0x3, 0x6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x2, 0x1d, 0x0}, +/**/ {0x3, 0x2, 0x6, 0x0, 0x0, 0x7, 0x0, 0x1, 0x0, 0x2, 0x1e, 0x0}, +/**/ {0x4, 0x1, 0x0, 0x2, 0x1, 0x5, 0x6, 0x0, 0x0, 0x2, 0x1f, 0x3}, +/**/ {0x5, 0x1, 0x0, 0x2, 0x0, 0x7, 0x8, 0x0, 0x0, 0x2, 0x1f, 0x2}, +/**/ {0x6, 0x1, 0x0, 0x0, 0x0, 0x7, 0x7, 0x1, 0x0, 0x4, 0x3f, 0x0}, +/**/ {0x7, 0x2, 0x6, 0x0, 0x0, 0x5, 0x5, 0x1, 0x0, 0x2, 0x1e, 0x0}, +/**/ {-1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x00, 0x0}, + }; + + static constexpr int MaxPartitions = 64; + static constexpr int MaxSubsets = 3; + + static constexpr uint8_t PartitionTable2[MaxPartitions][16] = { + {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1}, + {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1}, + {0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1}, + {0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1}, + {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1}, + {0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1}, + {0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1}, + {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1}, + {0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1}, + {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, + {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, + {0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1}, + {0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0}, + {0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0}, + {0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}, + {0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1}, + {0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0}, + {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0}, + {0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0}, + {0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0}, + {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, + {0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0}, + {0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0}, + {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}, + {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1}, + {0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0}, + {0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0}, + {0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0}, + {0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0}, + {0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1}, + {0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1}, + {0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0}, + {0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0}, + {0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0}, + {0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0}, + {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1}, + {0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1}, + {0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0}, + {0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0}, + {0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0}, + {0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0}, + {0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1}, + {0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1}, + {0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0}, + {0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0}, + {0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1}, + {0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1}, + {0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1}, + {0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1}, + {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1}, + {0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, + {0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0}, + {0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1}, + }; + + static constexpr uint8_t PartitionTable3[MaxPartitions][16] = { + {0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 1, 2, 2, 2, 2}, + {0, 0, 0, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1}, + {0, 0, 0, 0, 2, 0, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1}, + {0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 1, 0, 1, 1, 1}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2}, + {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 2, 2}, + {0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1}, + {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2}, + {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2}, + {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2}, + {0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2}, + {0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2}, + {0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2}, + {0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2}, + {0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0, 2, 2, 2, 0}, + {0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2}, + {0, 1, 1, 1, 0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0}, + {0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2}, + {0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1}, + {0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2, 0, 2, 2, 2}, + {0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 1, 2, 2, 2, 1}, + {0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2}, + {0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 1, 0, 2, 2, 1, 0}, + {0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0}, + {0, 0, 1, 2, 0, 0, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2}, + {0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1, 0, 1, 1, 0}, + {0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1}, + {0, 0, 2, 2, 1, 1, 0, 2, 1, 1, 0, 2, 0, 0, 2, 2}, + {0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 0, 2, 2, 2, 2, 2}, + {0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1}, + {0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 1, 1, 2, 2, 2, 1}, + {0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 2, 2, 2}, + {0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 2, 0, 0, 1, 1}, + {0, 0, 1, 1, 0, 0, 1, 2, 0, 0, 2, 2, 0, 2, 2, 2}, + {0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0}, + {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0}, + {0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0}, + {0, 1, 2, 0, 2, 0, 1, 2, 1, 2, 0, 1, 0, 1, 2, 0}, + {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1}, + {0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1}, + {0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2}, + {0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1}, + {0, 0, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2, 1, 1, 2, 2}, + {0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 1, 1}, + {0, 2, 2, 0, 1, 2, 2, 1, 0, 2, 2, 0, 1, 2, 2, 1}, + {0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 1}, + {0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1}, + {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2}, + {0, 2, 2, 2, 0, 1, 1, 1, 0, 2, 2, 2, 0, 1, 1, 1}, + {0, 0, 0, 2, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 2}, + {0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2}, + {0, 2, 2, 2, 0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2}, + {0, 0, 0, 2, 1, 1, 1, 2, 1, 1, 1, 2, 0, 0, 0, 2}, + {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2}, + {0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2}, + {0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2}, + {0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2}, + {0, 0, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2}, + {0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1}, + {0, 2, 2, 2, 1, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2}, + {0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {0, 1, 1, 1, 2, 0, 1, 1, 2, 2, 0, 1, 2, 2, 2, 0}, + }; + + static constexpr uint8_t AnchorTable2[MaxPartitions] = { +// @fmt:off +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0x2, 0x8, 0x2, 0x2, 0x8, 0x8, 0xf, +0x2, 0x8, 0x2, 0x2, 0x8, 0x8, 0x2, 0x2, +0xf, 0xf, 0x6, 0x8, 0x2, 0x8, 0xf, 0xf, +0x2, 0x8, 0x2, 0x2, 0x2, 0xf, 0xf, 0x6, +0x6, 0x2, 0x6, 0x8, 0xf, 0xf, 0x2, 0x2, +0xf, 0xf, 0xf, 0xf, 0xf, 0x2, 0x2, 0xf, +// @fmt:on + }; + + static constexpr uint8_t AnchorTable3a[MaxPartitions] = { +// @fmt:off +0x3, 0x3, 0xf, 0xf, 0x8, 0x3, 0xf, 0xf, +0x8, 0x8, 0x6, 0x6, 0x6, 0x5, 0x3, 0x3, +0x3, 0x3, 0x8, 0xf, 0x3, 0x3, 0x6, 0xa, +0x5, 0x8, 0x8, 0x6, 0x8, 0x5, 0xf, 0xf, +0x8, 0xf, 0x3, 0x5, 0x6, 0xa, 0x8, 0xf, +0xf, 0x3, 0xf, 0x5, 0xf, 0xf, 0xf, 0xf, +0x3, 0xf, 0x5, 0x5, 0x5, 0x8, 0x5, 0xa, +0x5, 0xa, 0x8, 0xd, 0xf, 0xc, 0x3, 0x3, +// @fmt:on + }; + + static constexpr uint8_t AnchorTable3b[MaxPartitions] = { +// @fmt:off +0xf, 0x8, 0x8, 0x3, 0xf, 0xf, 0x3, 0x8, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x8, +0xf, 0x8, 0xf, 0x3, 0xf, 0x8, 0xf, 0x8, +0x3, 0xf, 0x6, 0xa, 0xf, 0xf, 0xa, 0x8, +0xf, 0x3, 0xf, 0xa, 0xa, 0x8, 0x9, 0xa, +0x6, 0xf, 0x8, 0xf, 0x3, 0x6, 0x6, 0x8, +0xf, 0x3, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0x3, 0xf, 0xf, 0x8, +// @fmt:on + }; + + struct Color { + struct RGB { + RGB() = default; + + RGB(uint8_t r, uint8_t g, uint8_t b) + : b(b), g(g), r(r) {} + + RGB(int r, int g, int b) + : b(static_cast(b)), g(static_cast(g)), r(static_cast(r)) {} + + RGB operator<<(int shift) const { return {r << shift, g << shift, b << shift}; } + + RGB operator>>(int shift) const { return {r >> shift, g >> shift, b >> shift}; } + + RGB operator|(int bits) const { return {r | bits, g | bits, b | bits}; } + + RGB operator|(const RGB &rhs) const { return {r | rhs.r, g | rhs.g, b | rhs.b}; } + + RGB operator+(const RGB &rhs) const { return {r + rhs.r, g + rhs.g, b + rhs.b}; } + + uint8_t b; + uint8_t g; + uint8_t r; + }; + + RGB rgb; + uint8_t a; + }; + + static_assert(sizeof(Color) == 4, "Color size must be 4 bytes"); + + struct Block { + constexpr uint64_t Get(const Bitfield &bf) const { + uint64_t mask = (1ULL << bf.count) - 1; + if (bf.offset + bf.count <= 64) { + return (low >> bf.offset) & mask; + } + if (bf.offset >= 64) { + return (high >> (bf.offset - 64)) & mask; + } + return ((low >> bf.offset) | (high << (64 - bf.offset))) & mask; + } + + const Mode &mode() const { + if ((low & 0b00000001) != 0) { + return Modes[0]; + } + if ((low & 0b00000010) != 0) { + return Modes[1]; + } + if ((low & 0b00000100) != 0) { + return Modes[2]; + } + if ((low & 0b00001000) != 0) { + return Modes[3]; + } + if ((low & 0b00010000) != 0) { + return Modes[4]; + } + if ((low & 0b00100000) != 0) { + return Modes[5]; + } + if ((low & 0b01000000) != 0) { + return Modes[6]; + } + if ((low & 0b10000000) != 0) { + return Modes[7]; + } + return Modes[8]; // Invalid mode + } + + struct IndexInfo { + uint64_t value; + int numBits; + }; + + uint8_t interpolate(uint8_t e0, uint8_t e1, const IndexInfo &index) const { + static constexpr uint16_t weights2[] = {0, 21, 43, 64}; + static constexpr uint16_t weights3[] = {0, 9, 18, 27, 37, 46, 55, 64}; + static constexpr uint16_t weights4[] = {0, 4, 9, 13, 17, 21, 26, 30, + 34, 38, 43, 47, 51, 55, 60, 64}; + static constexpr uint16_t const *weightsN[] = { + nullptr, nullptr, weights2, weights3, weights4 + }; + auto weights = weightsN[index.numBits]; + assert(weights != nullptr); + return (uint8_t) (((64 - weights[index.value]) * uint16_t(e0) + weights[index.value] * uint16_t(e1) + 32) >> 6); + } + + void decode(uint8_t *dst, size_t dstX, size_t dstY, size_t dstWidth, size_t dstHeight, size_t dstPitch) const { + auto const &mode = this->mode(); + + if (mode.IDX < 0) // Invalid mode: + { + for (size_t y = 0; y < 4 && y + dstY < dstHeight; y++) { + for (size_t x = 0; x < 4 && x + dstX < dstWidth; x++) { + auto out = reinterpret_cast(dst + sizeof(Color) * x + dstPitch * y); + out->rgb = {0, 0, 0}; + out->a = 0; + } + } + return; + } + + using Endpoint = std::array; + std::array subsets; + + for (size_t i = 0; i < mode.NS; i++) { + auto &subset = subsets[i]; + subset[0].rgb.r = Get(mode.Red(i * 2 + 0)); + subset[0].rgb.g = Get(mode.Green(i * 2 + 0)); + subset[0].rgb.b = Get(mode.Blue(i * 2 + 0)); + subset[0].a = (mode.AB > 0) ? Get(mode.Alpha(i * 2 + 0)) : 255; + + subset[1].rgb.r = Get(mode.Red(i * 2 + 1)); + subset[1].rgb.g = Get(mode.Green(i * 2 + 1)); + subset[1].rgb.b = Get(mode.Blue(i * 2 + 1)); + subset[1].a = (mode.AB > 0) ? Get(mode.Alpha(i * 2 + 1)) : 255; + } + + if (mode.SPB > 0) { + auto pbit0 = Get(mode.SharedPBit0()); + auto pbit1 = Get(mode.SharedPBit1()); + subsets[0][0].rgb = (subsets[0][0].rgb << 1) | pbit0; + subsets[0][1].rgb = (subsets[0][1].rgb << 1) | pbit0; + subsets[1][0].rgb = (subsets[1][0].rgb << 1) | pbit1; + subsets[1][1].rgb = (subsets[1][1].rgb << 1) | pbit1; + } + + if (mode.EPB > 0) { + for (size_t i = 0; i < mode.NS; i++) { + auto &subset = subsets[i]; + auto pbit0 = Get(mode.EndpointPBit(i * 2 + 0)); + auto pbit1 = Get(mode.EndpointPBit(i * 2 + 1)); + subset[0].rgb = (subset[0].rgb << 1) | pbit0; + subset[1].rgb = (subset[1].rgb << 1) | pbit1; + if (mode.AB > 0) { + subset[0].a = (subset[0].a << 1) | pbit0; + subset[1].a = (subset[1].a << 1) | pbit1; + } + } + } + + auto const colorBits = mode.CB + mode.SPB + mode.EPB; + auto const alphaBits = mode.AB + mode.SPB + mode.EPB; + + for (size_t i = 0; i < mode.NS; i++) { + auto &subset = subsets[i]; + subset[0].rgb = subset[0].rgb << (8 - colorBits); + subset[1].rgb = subset[1].rgb << (8 - colorBits); + subset[0].rgb = subset[0].rgb | (subset[0].rgb >> colorBits); + subset[1].rgb = subset[1].rgb | (subset[1].rgb >> colorBits); + + if (mode.AB > 0) { + subset[0].a = subset[0].a << (8 - alphaBits); + subset[1].a = subset[1].a << (8 - alphaBits); + subset[0].a = subset[0].a | (subset[0].a >> alphaBits); + subset[1].a = subset[1].a | (subset[1].a >> alphaBits); + } + } + + int colorIndexBitOffset = 0; + int alphaIndexBitOffset = 0; + for (int y = 0; y < 4; y++) { + for (int x = 0; x < 4; x++) { + auto texelIdx = y * 4 + x; + auto partitionIdx = Get(mode.Partition()); + assert(partitionIdx < MaxPartitions); + auto subsetIdx = subsetIndex(mode, partitionIdx, texelIdx); + assert(subsetIdx < MaxSubsets); + auto const &subset = subsets[subsetIdx]; + + auto anchorIdx = anchorIndex(mode, partitionIdx, subsetIdx); + auto isAnchor = anchorIdx == texelIdx; + auto colorIdx = colorIndex(mode, isAnchor, colorIndexBitOffset); + auto alphaIdx = alphaIndex(mode, isAnchor, alphaIndexBitOffset); + + if (y + dstY >= dstHeight || x + dstX >= dstWidth) { + // Don't be tempted to skip early at the loops: + // The calls to colorIndex() and alphaIndex() adjust bit + // offsets that need to be carefully tracked. + continue; + } + + Color output; + // Note: We flip r and b channels past this point as the texture storage is BGR while the output is RGB + output.rgb.r = interpolate(subset[0].rgb.b, subset[1].rgb.b, colorIdx); + output.rgb.g = interpolate(subset[0].rgb.g, subset[1].rgb.g, colorIdx); + output.rgb.b = interpolate(subset[0].rgb.r, subset[1].rgb.r, colorIdx); + output.a = interpolate(subset[0].a, subset[1].a, alphaIdx); + + switch (Get(mode.Rotation())) { + default: + break; + case 1: + std::swap(output.a, output.rgb.b); + break; + case 2: + std::swap(output.a, output.rgb.g); + break; + case 3: + std::swap(output.a, output.rgb.r); + break; + } + + auto out = reinterpret_cast(dst + sizeof(Color) * x + dstPitch * y); + *out = output; + } + } + } + + int subsetIndex(const Mode &mode, int partitionIdx, int texelIndex) const { + switch (mode.NS) { + default: + return 0; + case 2: + return PartitionTable2[partitionIdx][texelIndex]; + case 3: + return PartitionTable3[partitionIdx][texelIndex]; + } + } + + int anchorIndex(const Mode &mode, int partitionIdx, int subsetIdx) const { + // ARB_texture_compression_bptc states: + // "In partition zero, the anchor index is always index zero. + // In other partitions, the anchor index is specified by tables + // Table.A2 and Table.A3."" + // Note: This is really confusing - I believe they meant subset instead + // of partition here. + switch (subsetIdx) { + default: + return 0; + case 1: + return mode.NS == 2 ? AnchorTable2[partitionIdx] : AnchorTable3a[partitionIdx]; + case 2: + return AnchorTable3b[partitionIdx]; + } + } + + IndexInfo colorIndex(const Mode &mode, bool isAnchor, + int &indexBitOffset) const { + // ARB_texture_compression_bptc states: + // "The index value for interpolating color comes from the secondary + // index for the texel if the format has an index selection bit and its + // value is one and from the primary index otherwise."" + auto idx = Get(mode.IndexSelection()); + assert(idx <= 1); + bool secondary = idx == 1; + auto numBits = secondary ? mode.IB2 : mode.IB; + auto numReadBits = numBits - (isAnchor ? 1 : 0); + auto index = + Get(secondary ? mode.SecondaryIndex(indexBitOffset, numReadBits) + : mode.PrimaryIndex(indexBitOffset, numReadBits)); + indexBitOffset += numReadBits; + return {index, numBits}; + } + + IndexInfo alphaIndex(const Mode &mode, bool isAnchor, + int &indexBitOffset) const { + // ARB_texture_compression_bptc states: + // "The alpha index comes from the secondary index if the block has a + // secondary index and the block either doesn't have an index selection + // bit or that bit is zero and the primary index otherwise." + auto idx = Get(mode.IndexSelection()); + assert(idx <= 1); + bool secondary = (mode.IB2 != 0) && (idx == 0); + auto numBits = secondary ? mode.IB2 : mode.IB; + auto numReadBits = numBits - (isAnchor ? 1 : 0); + auto index = + Get(secondary ? mode.SecondaryIndex(indexBitOffset, numReadBits) + : mode.PrimaryIndex(indexBitOffset, numReadBits)); + indexBitOffset += numReadBits; + return {index, numBits}; + } + + // Assumes little-endian + uint64_t low; + uint64_t high; + }; + + } // namespace BC7 +} // anonymous namespace + +namespace bcn { + constexpr size_t R8Bpp{1}; //!< The amount of bytes per pixel in R8 + constexpr size_t R8g8Bpp{2}; //!< The amount of bytes per pixel in R8G8 + constexpr size_t R8g8b8a8Bpp{4}; //!< The amount of bytes per pixel in R8G8B8A8 + constexpr size_t R16g16b16a16Bpp{8}; //!< The amount of bytes per pixel in R16G16B16 + + void DecodeBc1(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height) { + const auto *color{reinterpret_cast(src)}; + size_t pitch{R8g8b8a8Bpp * width}; + color->decode(dst, x, y, width, height, pitch, R8g8b8a8Bpp, true, false); + } + + void DecodeBc2(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height) { + const auto *alpha{reinterpret_cast(src)}; + const auto *color{reinterpret_cast(src + 8)}; + size_t pitch{R8g8b8a8Bpp * width}; + color->decode(dst, x, y, width, height, pitch, R8g8b8a8Bpp, false, true); + alpha->decode(dst, x, y, width, height, pitch, R8g8b8a8Bpp); + } + + void DecodeBc3(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height) { + const auto *alpha{reinterpret_cast(src)}; + const auto *color{reinterpret_cast(src + 8)}; + size_t pitch{R8g8b8a8Bpp * width}; + color->decode(dst, x, y, width, height, pitch, R8g8b8a8Bpp, false, true); + alpha->decode(dst, x, y, width, height, pitch, R8g8b8a8Bpp, 3, false); + } + + void DecodeBc4(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height, bool isSigned) { + const auto *red{reinterpret_cast(src)}; + size_t pitch{R8Bpp * width}; + red->decode(dst, x, y, width, height, pitch, R8Bpp, 0, isSigned); + } + + void DecodeBc5(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height, bool isSigned) { + const auto *red{reinterpret_cast(src)}; + const auto *green{reinterpret_cast(src + 8)}; + size_t pitch{R8g8Bpp * width}; + red->decode(dst, x, y, width, height, pitch, R8g8Bpp, 0, isSigned); + green->decode(dst, x, y, width, height, pitch, R8g8Bpp, 1, isSigned); + } + + void DecodeBc6(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height, bool isSigned) { + const auto *block{reinterpret_cast(src)}; + size_t pitch{R16g16b16a16Bpp * width}; + block->decode(dst, x, y, width, height, pitch, R16g16b16a16Bpp, isSigned); + } + + void DecodeBc7(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height) { + const auto *block{reinterpret_cast(src)}; + size_t pitch{R8g8b8a8Bpp * width}; + block->decode(dst, x, y, width, height, pitch); + } +} diff --git a/externals/bc_decoder/bc_decoder.h b/externals/bc_decoder/bc_decoder.h new file mode 100644 index 0000000..4f0ead7 --- /dev/null +++ b/externals/bc_decoder/bc_decoder.h @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MPL-2.0 +// Copyright © 2022 Skyline Team and Contributors (https://github.com/skyline-emu/) + +#pragma once + +#include + +namespace bcn { + /** + * @brief Decodes a BC1 encoded image to R8G8B8A8 + */ + void DecodeBc1(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height); + + /** + * @brief Decodes a BC2 encoded image to R8G8B8A8 + */ + void DecodeBc2(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height); + + /** + * @brief Decodes a BC3 encoded image to R8G8B8A8 + */ + void DecodeBc3(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height); + + /** + * @brief Decodes a BC4 encoded image to R8 + */ + void DecodeBc4(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height, bool isSigned); + + /** + * @brief Decodes a BC5 encoded image to R8G8 + */ + void DecodeBc5(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height, bool isSigned); + + /** + * @brief Decodes a BC6 encoded image to R16G16B16A16 + */ + void DecodeBc6(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height, bool isSigned); + + /** + * @brief Decodes a BC7 encoded image to R8G8B8A8 + */ + void DecodeBc7(const uint8_t *src, uint8_t *dst, size_t x, size_t y, size_t width, size_t height); +} diff --git a/externals/cmake-modules/GetGitRevisionDescription.cmake b/externals/cmake-modules/GetGitRevisionDescription.cmake new file mode 100644 index 0000000..dab1347 --- /dev/null +++ b/externals/cmake-modules/GetGitRevisionDescription.cmake @@ -0,0 +1,162 @@ +# SPDX-FileCopyrightText: 2009 Iowa State University +# SPDX-FileContributor: Ryan Pavlik +# SPDX-License-Identifier: BSL-1.0 + +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +# get_git_head_revision( [ ...]) +# +# Returns the refspec and sha hash of the current head revision +# +# git_describe( [ ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +# git_get_exact_tag( [ ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) + return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +function(get_git_head_revision _refspecvar _hashvar) + set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories + set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") + get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) + if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) + # We have reached the root directory, we are not in git + set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + endwhile() + # check if this is a submodule + if(NOT IS_DIRECTORY ${GIT_DIR}) + file(READ ${GIT_DIR} submodule) + string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) + get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) + get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) + endif() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() + + if(NOT EXISTS "${GIT_DIR}/HEAD") + return() + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) + + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" + "${GIT_DATA}/grabRef.cmake" + @ONLY) + include("${GIT_DATA}/grabRef.cmake") + + set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) + set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) +endfunction() + +function(git_branch_name _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY + "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_describe _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + #get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + #if(NOT hash) + # set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + # return() + #endif() + + # TODO sanitize + #if((${ARGN}" MATCHES "&&") OR + # (ARGN MATCHES "||") OR + # (ARGN MATCHES "\\;")) + # message("Please report the following error to the project!") + # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") + #endif() + + #message(STATUS "Arguments to execute_process: ${ARGN}") + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + describe + ${hash} + ${ARGN} + WORKING_DIRECTORY + "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) + git_describe(out --exact-match ${ARGN}) + set(${_var} "${out}" PARENT_SCOPE) +endfunction() diff --git a/externals/cmake-modules/GetGitRevisionDescription.cmake.in b/externals/cmake-modules/GetGitRevisionDescription.cmake.in new file mode 100644 index 0000000..868e032 --- /dev/null +++ b/externals/cmake-modules/GetGitRevisionDescription.cmake.in @@ -0,0 +1,45 @@ +# SPDX-FileCopyrightText: 2009 Iowa State University +# SPDX-FileContributor: Ryan Pavlik +# SPDX-License-Identifier: BSL-1.0 + +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +set(HEAD_HASH) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") + if(EXISTS "@GIT_DIR@/${HEAD_REF}") + configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}") + configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + set(HEAD_HASH "${HEAD_REF}") + endif() +else() + # detached HEAD + configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +if(NOT HEAD_HASH) + if(EXISTS "@GIT_DATA@/head-ref") + file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) + string(STRIP "${HEAD_HASH}" HEAD_HASH) + else() + set(HEAD_HASH "Unknown") + endif() +endif() diff --git a/externals/demangle/ItaniumDemangle.cpp b/externals/demangle/ItaniumDemangle.cpp new file mode 100644 index 0000000..47dd5d3 --- /dev/null +++ b/externals/demangle/ItaniumDemangle.cpp @@ -0,0 +1,597 @@ +//===------------------------- ItaniumDemangle.cpp ------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-FileCopyrightText: Part of the LLVM Project +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// FIXME: (possibly) incomplete list of features that clang mangles that this +// file does not yet support: +// - C++ modules TS + +#include "llvm/Demangle/Demangle.h" +#include "llvm/Demangle/ItaniumDemangle.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace llvm; +using namespace llvm::itanium_demangle; + +constexpr const char *itanium_demangle::FloatData::spec; +constexpr const char *itanium_demangle::FloatData::spec; +constexpr const char *itanium_demangle::FloatData::spec; + +// := _ # when number < 10 +// := __ _ # when number >= 10 +// extension := decimal-digit+ # at the end of string +const char *itanium_demangle::parse_discriminator(const char *first, + const char *last) { + // parse but ignore discriminator + if (first != last) { + if (*first == '_') { + const char *t1 = first + 1; + if (t1 != last) { + if (std::isdigit(*t1)) + first = t1 + 1; + else if (*t1 == '_') { + for (++t1; t1 != last && std::isdigit(*t1); ++t1) + ; + if (t1 != last && *t1 == '_') + first = t1 + 1; + } + } + } else if (std::isdigit(*first)) { + const char *t1 = first + 1; + for (; t1 != last && std::isdigit(*t1); ++t1) + ; + if (t1 == last) + first = last; + } + } + return first; +} + +#ifndef NDEBUG +namespace { +struct DumpVisitor { + unsigned Depth = 0; + bool PendingNewline = false; + + template static constexpr bool wantsNewline(const NodeT *) { + return true; + } + static bool wantsNewline(NodeArray A) { return !A.empty(); } + static constexpr bool wantsNewline(...) { return false; } + + template static bool anyWantNewline(Ts ...Vs) { + for (bool B : {wantsNewline(Vs)...}) + if (B) + return true; + return false; + } + + void printStr(const char *S) { fprintf(stderr, "%s", S); } + void print(std::string_view SV) { + fprintf(stderr, "\"%.*s\"", (int)SV.size(), SV.data()); + } + void print(const Node *N) { + if (N) + N->visit(std::ref(*this)); + else + printStr(""); + } + void print(NodeArray A) { + ++Depth; + printStr("{"); + bool First = true; + for (const Node *N : A) { + if (First) + print(N); + else + printWithComma(N); + First = false; + } + printStr("}"); + --Depth; + } + + // Overload used when T is exactly 'bool', not merely convertible to 'bool'. + void print(bool B) { printStr(B ? "true" : "false"); } + + template std::enable_if_t::value> print(T N) { + fprintf(stderr, "%llu", (unsigned long long)N); + } + + template std::enable_if_t::value> print(T N) { + fprintf(stderr, "%lld", (long long)N); + } + + void print(ReferenceKind RK) { + switch (RK) { + case ReferenceKind::LValue: + return printStr("ReferenceKind::LValue"); + case ReferenceKind::RValue: + return printStr("ReferenceKind::RValue"); + } + } + void print(FunctionRefQual RQ) { + switch (RQ) { + case FunctionRefQual::FrefQualNone: + return printStr("FunctionRefQual::FrefQualNone"); + case FunctionRefQual::FrefQualLValue: + return printStr("FunctionRefQual::FrefQualLValue"); + case FunctionRefQual::FrefQualRValue: + return printStr("FunctionRefQual::FrefQualRValue"); + } + } + void print(Qualifiers Qs) { + if (!Qs) return printStr("QualNone"); + struct QualName { Qualifiers Q; const char *Name; } Names[] = { + {QualConst, "QualConst"}, + {QualVolatile, "QualVolatile"}, + {QualRestrict, "QualRestrict"}, + }; + for (QualName Name : Names) { + if (Qs & Name.Q) { + printStr(Name.Name); + Qs = Qualifiers(Qs & ~Name.Q); + if (Qs) printStr(" | "); + } + } + } + void print(SpecialSubKind SSK) { + switch (SSK) { + case SpecialSubKind::allocator: + return printStr("SpecialSubKind::allocator"); + case SpecialSubKind::basic_string: + return printStr("SpecialSubKind::basic_string"); + case SpecialSubKind::string: + return printStr("SpecialSubKind::string"); + case SpecialSubKind::istream: + return printStr("SpecialSubKind::istream"); + case SpecialSubKind::ostream: + return printStr("SpecialSubKind::ostream"); + case SpecialSubKind::iostream: + return printStr("SpecialSubKind::iostream"); + } + } + void print(TemplateParamKind TPK) { + switch (TPK) { + case TemplateParamKind::Type: + return printStr("TemplateParamKind::Type"); + case TemplateParamKind::NonType: + return printStr("TemplateParamKind::NonType"); + case TemplateParamKind::Template: + return printStr("TemplateParamKind::Template"); + } + } + void print(Node::Prec P) { + switch (P) { + case Node::Prec::Primary: + return printStr("Node::Prec::Primary"); + case Node::Prec::Postfix: + return printStr("Node::Prec::Postfix"); + case Node::Prec::Unary: + return printStr("Node::Prec::Unary"); + case Node::Prec::Cast: + return printStr("Node::Prec::Cast"); + case Node::Prec::PtrMem: + return printStr("Node::Prec::PtrMem"); + case Node::Prec::Multiplicative: + return printStr("Node::Prec::Multiplicative"); + case Node::Prec::Additive: + return printStr("Node::Prec::Additive"); + case Node::Prec::Shift: + return printStr("Node::Prec::Shift"); + case Node::Prec::Spaceship: + return printStr("Node::Prec::Spaceship"); + case Node::Prec::Relational: + return printStr("Node::Prec::Relational"); + case Node::Prec::Equality: + return printStr("Node::Prec::Equality"); + case Node::Prec::And: + return printStr("Node::Prec::And"); + case Node::Prec::Xor: + return printStr("Node::Prec::Xor"); + case Node::Prec::Ior: + return printStr("Node::Prec::Ior"); + case Node::Prec::AndIf: + return printStr("Node::Prec::AndIf"); + case Node::Prec::OrIf: + return printStr("Node::Prec::OrIf"); + case Node::Prec::Conditional: + return printStr("Node::Prec::Conditional"); + case Node::Prec::Assign: + return printStr("Node::Prec::Assign"); + case Node::Prec::Comma: + return printStr("Node::Prec::Comma"); + case Node::Prec::Default: + return printStr("Node::Prec::Default"); + } + } + + void newLine() { + printStr("\n"); + for (unsigned I = 0; I != Depth; ++I) + printStr(" "); + PendingNewline = false; + } + + template void printWithPendingNewline(T V) { + print(V); + if (wantsNewline(V)) + PendingNewline = true; + } + + template void printWithComma(T V) { + if (PendingNewline || wantsNewline(V)) { + printStr(","); + newLine(); + } else { + printStr(", "); + } + + printWithPendingNewline(V); + } + + struct CtorArgPrinter { + DumpVisitor &Visitor; + + template void operator()(T V, Rest ...Vs) { + if (Visitor.anyWantNewline(V, Vs...)) + Visitor.newLine(); + Visitor.printWithPendingNewline(V); + int PrintInOrder[] = { (Visitor.printWithComma(Vs), 0)..., 0 }; + (void)PrintInOrder; + } + }; + + template void operator()(const NodeT *Node) { + Depth += 2; + fprintf(stderr, "%s(", itanium_demangle::NodeKind::name()); + Node->match(CtorArgPrinter{*this}); + fprintf(stderr, ")"); + Depth -= 2; + } + + void operator()(const ForwardTemplateReference *Node) { + Depth += 2; + fprintf(stderr, "ForwardTemplateReference("); + if (Node->Ref && !Node->Printing) { + Node->Printing = true; + CtorArgPrinter{*this}(Node->Ref); + Node->Printing = false; + } else { + CtorArgPrinter{*this}(Node->Index); + } + fprintf(stderr, ")"); + Depth -= 2; + } +}; +} + +void itanium_demangle::Node::dump() const { + DumpVisitor V; + visit(std::ref(V)); + V.newLine(); +} +#endif + +namespace { +class BumpPointerAllocator { + struct BlockMeta { + BlockMeta* Next; + size_t Current; + }; + + static constexpr size_t AllocSize = 4096; + static constexpr size_t UsableAllocSize = AllocSize - sizeof(BlockMeta); + + alignas(long double) char InitialBuffer[AllocSize]; + BlockMeta* BlockList = nullptr; + + void grow() { + char* NewMeta = static_cast(std::malloc(AllocSize)); + if (NewMeta == nullptr) + std::terminate(); + BlockList = new (NewMeta) BlockMeta{BlockList, 0}; + } + + void* allocateMassive(size_t NBytes) { + NBytes += sizeof(BlockMeta); + BlockMeta* NewMeta = reinterpret_cast(std::malloc(NBytes)); + if (NewMeta == nullptr) + std::terminate(); + BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0}; + return static_cast(NewMeta + 1); + } + +public: + BumpPointerAllocator() + : BlockList(new (InitialBuffer) BlockMeta{nullptr, 0}) {} + + void* allocate(size_t N) { + N = (N + 15u) & ~15u; + if (N + BlockList->Current >= UsableAllocSize) { + if (N > UsableAllocSize) + return allocateMassive(N); + grow(); + } + BlockList->Current += N; + return static_cast(reinterpret_cast(BlockList + 1) + + BlockList->Current - N); + } + + void reset() { + while (BlockList) { + BlockMeta* Tmp = BlockList; + BlockList = BlockList->Next; + if (reinterpret_cast(Tmp) != InitialBuffer) + std::free(Tmp); + } + BlockList = new (InitialBuffer) BlockMeta{nullptr, 0}; + } + + ~BumpPointerAllocator() { reset(); } +}; + +class DefaultAllocator { + BumpPointerAllocator Alloc; + +public: + void reset() { Alloc.reset(); } + + template T *makeNode(Args &&...args) { + return new (Alloc.allocate(sizeof(T))) + T(std::forward(args)...); + } + + void *allocateNodeArray(size_t sz) { + return Alloc.allocate(sizeof(Node *) * sz); + } +}; +} // unnamed namespace + +//===----------------------------------------------------------------------===// +// Code beyond this point should not be synchronized with libc++abi. +//===----------------------------------------------------------------------===// + +using Demangler = itanium_demangle::ManglingParser; + +char *llvm::itaniumDemangle(std::string_view MangledName) { + if (MangledName.empty()) + return nullptr; + + Demangler Parser(MangledName.data(), + MangledName.data() + MangledName.length()); + Node *AST = Parser.parse(); + if (!AST) + return nullptr; + + OutputBuffer OB; + assert(Parser.ForwardTemplateRefs.empty()); + AST->print(OB); + OB += '\0'; + return OB.getBuffer(); +} + +ItaniumPartialDemangler::ItaniumPartialDemangler() + : RootNode(nullptr), Context(new Demangler{nullptr, nullptr}) {} + +ItaniumPartialDemangler::~ItaniumPartialDemangler() { + delete static_cast(Context); +} + +ItaniumPartialDemangler::ItaniumPartialDemangler( + ItaniumPartialDemangler &&Other) + : RootNode(Other.RootNode), Context(Other.Context) { + Other.Context = Other.RootNode = nullptr; +} + +ItaniumPartialDemangler &ItaniumPartialDemangler:: +operator=(ItaniumPartialDemangler &&Other) { + std::swap(RootNode, Other.RootNode); + std::swap(Context, Other.Context); + return *this; +} + +// Demangle MangledName into an AST, storing it into this->RootNode. +bool ItaniumPartialDemangler::partialDemangle(const char *MangledName) { + Demangler *Parser = static_cast(Context); + size_t Len = std::strlen(MangledName); + Parser->reset(MangledName, MangledName + Len); + RootNode = Parser->parse(); + return RootNode == nullptr; +} + +static char *printNode(const Node *RootNode, char *Buf, size_t *N) { + OutputBuffer OB(Buf, N); + RootNode->print(OB); + OB += '\0'; + if (N != nullptr) + *N = OB.getCurrentPosition(); + return OB.getBuffer(); +} + +char *ItaniumPartialDemangler::getFunctionBaseName(char *Buf, size_t *N) const { + if (!isFunction()) + return nullptr; + + const Node *Name = static_cast(RootNode)->getName(); + + while (true) { + switch (Name->getKind()) { + case Node::KAbiTagAttr: + Name = static_cast(Name)->Base; + continue; + case Node::KModuleEntity: + Name = static_cast(Name)->Name; + continue; + case Node::KNestedName: + Name = static_cast(Name)->Name; + continue; + case Node::KLocalName: + Name = static_cast(Name)->Entity; + continue; + case Node::KNameWithTemplateArgs: + Name = static_cast(Name)->Name; + continue; + default: + return printNode(Name, Buf, N); + } + } +} + +char *ItaniumPartialDemangler::getFunctionDeclContextName(char *Buf, + size_t *N) const { + if (!isFunction()) + return nullptr; + const Node *Name = static_cast(RootNode)->getName(); + + OutputBuffer OB(Buf, N); + + KeepGoingLocalFunction: + while (true) { + if (Name->getKind() == Node::KAbiTagAttr) { + Name = static_cast(Name)->Base; + continue; + } + if (Name->getKind() == Node::KNameWithTemplateArgs) { + Name = static_cast(Name)->Name; + continue; + } + break; + } + + if (Name->getKind() == Node::KModuleEntity) + Name = static_cast(Name)->Name; + + switch (Name->getKind()) { + case Node::KNestedName: + static_cast(Name)->Qual->print(OB); + break; + case Node::KLocalName: { + auto *LN = static_cast(Name); + LN->Encoding->print(OB); + OB += "::"; + Name = LN->Entity; + goto KeepGoingLocalFunction; + } + default: + break; + } + OB += '\0'; + if (N != nullptr) + *N = OB.getCurrentPosition(); + return OB.getBuffer(); +} + +char *ItaniumPartialDemangler::getFunctionName(char *Buf, size_t *N) const { + if (!isFunction()) + return nullptr; + auto *Name = static_cast(RootNode)->getName(); + return printNode(Name, Buf, N); +} + +char *ItaniumPartialDemangler::getFunctionParameters(char *Buf, + size_t *N) const { + if (!isFunction()) + return nullptr; + NodeArray Params = static_cast(RootNode)->getParams(); + + OutputBuffer OB(Buf, N); + + OB += '('; + Params.printWithComma(OB); + OB += ')'; + OB += '\0'; + if (N != nullptr) + *N = OB.getCurrentPosition(); + return OB.getBuffer(); +} + +char *ItaniumPartialDemangler::getFunctionReturnType( + char *Buf, size_t *N) const { + if (!isFunction()) + return nullptr; + + OutputBuffer OB(Buf, N); + + if (const Node *Ret = + static_cast(RootNode)->getReturnType()) + Ret->print(OB); + + OB += '\0'; + if (N != nullptr) + *N = OB.getCurrentPosition(); + return OB.getBuffer(); +} + +char *ItaniumPartialDemangler::finishDemangle(char *Buf, size_t *N) const { + assert(RootNode != nullptr && "must call partialDemangle()"); + return printNode(static_cast(RootNode), Buf, N); +} + +bool ItaniumPartialDemangler::hasFunctionQualifiers() const { + assert(RootNode != nullptr && "must call partialDemangle()"); + if (!isFunction()) + return false; + auto *E = static_cast(RootNode); + return E->getCVQuals() != QualNone || E->getRefQual() != FrefQualNone; +} + +bool ItaniumPartialDemangler::isCtorOrDtor() const { + const Node *N = static_cast(RootNode); + while (N) { + switch (N->getKind()) { + default: + return false; + case Node::KCtorDtorName: + return true; + + case Node::KAbiTagAttr: + N = static_cast(N)->Base; + break; + case Node::KFunctionEncoding: + N = static_cast(N)->getName(); + break; + case Node::KLocalName: + N = static_cast(N)->Entity; + break; + case Node::KNameWithTemplateArgs: + N = static_cast(N)->Name; + break; + case Node::KNestedName: + N = static_cast(N)->Name; + break; + case Node::KModuleEntity: + N = static_cast(N)->Name; + break; + } + } + return false; +} + +bool ItaniumPartialDemangler::isFunction() const { + assert(RootNode != nullptr && "must call partialDemangle()"); + return static_cast(RootNode)->getKind() == + Node::KFunctionEncoding; +} + +bool ItaniumPartialDemangler::isSpecialName() const { + assert(RootNode != nullptr && "must call partialDemangle()"); + auto K = static_cast(RootNode)->getKind(); + return K == Node::KSpecialName || K == Node::KCtorVtableSpecialName; +} + +bool ItaniumPartialDemangler::isData() const { + return !isFunction() && !isSpecialName(); +} diff --git a/externals/demangle/llvm/Demangle/Demangle.h b/externals/demangle/llvm/Demangle/Demangle.h new file mode 100644 index 0000000..1552a50 --- /dev/null +++ b/externals/demangle/llvm/Demangle/Demangle.h @@ -0,0 +1,131 @@ +//===--- Demangle.h ---------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-FileCopyrightText: Part of the LLVM Project +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_DEMANGLE_DEMANGLE_H +#define LLVM_DEMANGLE_DEMANGLE_H + +#include +#include +#include + +namespace llvm { +/// This is a llvm local version of __cxa_demangle. Other than the name and +/// being in the llvm namespace it is identical. +/// +/// The mangled_name is demangled into buf and returned. If the buffer is not +/// large enough, realloc is used to expand it. +/// +/// The *status will be set to a value from the following enumeration +enum : int { + demangle_unknown_error = -4, + demangle_invalid_args = -3, + demangle_invalid_mangled_name = -2, + demangle_memory_alloc_failure = -1, + demangle_success = 0, +}; + +/// Returns a non-NULL pointer to a NUL-terminated C style string +/// that should be explicitly freed, if successful. Otherwise, may return +/// nullptr if mangled_name is not a valid mangling or is nullptr. +char *itaniumDemangle(std::string_view mangled_name); + +enum MSDemangleFlags { + MSDF_None = 0, + MSDF_DumpBackrefs = 1 << 0, + MSDF_NoAccessSpecifier = 1 << 1, + MSDF_NoCallingConvention = 1 << 2, + MSDF_NoReturnType = 1 << 3, + MSDF_NoMemberType = 1 << 4, + MSDF_NoVariableType = 1 << 5, +}; + +/// Demangles the Microsoft symbol pointed at by mangled_name and returns it. +/// Returns a pointer to the start of a null-terminated demangled string on +/// success, or nullptr on error. +/// If n_read is non-null and demangling was successful, it receives how many +/// bytes of the input string were consumed. +/// status receives one of the demangle_ enum entries above if it's not nullptr. +/// Flags controls various details of the demangled representation. +char *microsoftDemangle(std::string_view mangled_name, size_t *n_read, + int *status, MSDemangleFlags Flags = MSDF_None); + +// Demangles a Rust v0 mangled symbol. +char *rustDemangle(std::string_view MangledName); + +// Demangles a D mangled symbol. +char *dlangDemangle(std::string_view MangledName); + +/// Attempt to demangle a string using different demangling schemes. +/// The function uses heuristics to determine which demangling scheme to use. +/// \param MangledName - reference to string to demangle. +/// \returns - the demangled string, or a copy of the input string if no +/// demangling occurred. +std::string demangle(std::string_view MangledName); + +bool nonMicrosoftDemangle(std::string_view MangledName, std::string &Result); + +/// "Partial" demangler. This supports demangling a string into an AST +/// (typically an intermediate stage in itaniumDemangle) and querying certain +/// properties or partially printing the demangled name. +struct ItaniumPartialDemangler { + ItaniumPartialDemangler(); + + ItaniumPartialDemangler(ItaniumPartialDemangler &&Other); + ItaniumPartialDemangler &operator=(ItaniumPartialDemangler &&Other); + + /// Demangle into an AST. Subsequent calls to the rest of the member functions + /// implicitly operate on the AST this produces. + /// \return true on error, false otherwise + bool partialDemangle(const char *MangledName); + + /// Just print the entire mangled name into Buf. Buf and N behave like the + /// second and third parameters to __cxa_demangle. + char *finishDemangle(char *Buf, size_t *N) const; + + /// Get the base name of a function. This doesn't include trailing template + /// arguments, ie for "a::b" this function returns "b". + char *getFunctionBaseName(char *Buf, size_t *N) const; + + /// Get the context name for a function. For "a::b::c", this function returns + /// "a::b". + char *getFunctionDeclContextName(char *Buf, size_t *N) const; + + /// Get the entire name of this function. + char *getFunctionName(char *Buf, size_t *N) const; + + /// Get the parameters for this function. + char *getFunctionParameters(char *Buf, size_t *N) const; + char *getFunctionReturnType(char *Buf, size_t *N) const; + + /// If this function has any any cv or reference qualifiers. These imply that + /// the function is a non-static member function. + bool hasFunctionQualifiers() const; + + /// If this symbol describes a constructor or destructor. + bool isCtorOrDtor() const; + + /// If this symbol describes a function. + bool isFunction() const; + + /// If this symbol describes a variable. + bool isData() const; + + /// If this symbol is a . These are generally implicitly + /// generated by the implementation, such as vtables and typeinfo names. + bool isSpecialName() const; + + ~ItaniumPartialDemangler(); + +private: + void *RootNode; + void *Context; +}; +} // namespace llvm + +#endif diff --git a/externals/demangle/llvm/Demangle/DemangleConfig.h b/externals/demangle/llvm/Demangle/DemangleConfig.h new file mode 100644 index 0000000..c7f86d7 --- /dev/null +++ b/externals/demangle/llvm/Demangle/DemangleConfig.h @@ -0,0 +1,93 @@ +//===--- DemangleConfig.h ---------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-FileCopyrightText: Part of the LLVM Project +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file contains a variety of feature test macros copied from +// include/llvm/Support/Compiler.h so that LLVMDemangle does not need to take +// a dependency on LLVMSupport. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_DEMANGLE_DEMANGLECONFIG_H +#define LLVM_DEMANGLE_DEMANGLECONFIG_H + +#ifndef __has_feature +#define __has_feature(x) 0 +#endif + +#ifndef __has_cpp_attribute +#define __has_cpp_attribute(x) 0 +#endif + +#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif + +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +#ifndef DEMANGLE_GNUC_PREREQ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) +#define DEMANGLE_GNUC_PREREQ(maj, min, patch) \ + ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) + __GNUC_PATCHLEVEL__ >= \ + ((maj) << 20) + ((min) << 10) + (patch)) +#elif defined(__GNUC__) && defined(__GNUC_MINOR__) +#define DEMANGLE_GNUC_PREREQ(maj, min, patch) \ + ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) >= ((maj) << 20) + ((min) << 10)) +#else +#define DEMANGLE_GNUC_PREREQ(maj, min, patch) 0 +#endif +#endif + +#if __has_attribute(used) || DEMANGLE_GNUC_PREREQ(3, 1, 0) +#define DEMANGLE_ATTRIBUTE_USED __attribute__((__used__)) +#else +#define DEMANGLE_ATTRIBUTE_USED +#endif + +#if __has_builtin(__builtin_unreachable) || DEMANGLE_GNUC_PREREQ(4, 5, 0) +#define DEMANGLE_UNREACHABLE __builtin_unreachable() +#elif defined(_MSC_VER) +#define DEMANGLE_UNREACHABLE __assume(false) +#else +#define DEMANGLE_UNREACHABLE +#endif + +#if __has_attribute(noinline) || DEMANGLE_GNUC_PREREQ(3, 4, 0) +#define DEMANGLE_ATTRIBUTE_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) +#define DEMANGLE_ATTRIBUTE_NOINLINE __declspec(noinline) +#else +#define DEMANGLE_ATTRIBUTE_NOINLINE +#endif + +#if !defined(NDEBUG) +#define DEMANGLE_DUMP_METHOD DEMANGLE_ATTRIBUTE_NOINLINE DEMANGLE_ATTRIBUTE_USED +#else +#define DEMANGLE_DUMP_METHOD DEMANGLE_ATTRIBUTE_NOINLINE +#endif + +#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough) +#define DEMANGLE_FALLTHROUGH [[fallthrough]] +#elif __has_cpp_attribute(gnu::fallthrough) +#define DEMANGLE_FALLTHROUGH [[gnu::fallthrough]] +#elif !__cplusplus +// Workaround for llvm.org/PR23435, since clang 3.6 and below emit a spurious +// error when __has_cpp_attribute is given a scoped attribute in C mode. +#define DEMANGLE_FALLTHROUGH +#elif __has_cpp_attribute(clang::fallthrough) +#define DEMANGLE_FALLTHROUGH [[clang::fallthrough]] +#else +#define DEMANGLE_FALLTHROUGH +#endif + +#define DEMANGLE_NAMESPACE_BEGIN namespace llvm { namespace itanium_demangle { +#define DEMANGLE_NAMESPACE_END } } + +#endif diff --git a/externals/demangle/llvm/Demangle/ItaniumDemangle.h b/externals/demangle/llvm/Demangle/ItaniumDemangle.h new file mode 100644 index 0000000..0dc3d73 --- /dev/null +++ b/externals/demangle/llvm/Demangle/ItaniumDemangle.h @@ -0,0 +1,5512 @@ +//===--- ItaniumDemangle.h -----------*- mode:c++;eval:(read-only-mode) -*-===// +// Do not edit! See README.txt. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-FileCopyrightText: Part of the LLVM Project +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Generic itanium demangler library. +// There are two copies of this file in the source tree. The one under +// libcxxabi is the original and the one under llvm is the copy. Use +// cp-to-llvm.sh to update the copy. See README.txt for more details. +// +//===----------------------------------------------------------------------===// + +#ifndef DEMANGLE_ITANIUMDEMANGLE_H +#define DEMANGLE_ITANIUMDEMANGLE_H + +#include "DemangleConfig.h" +#include "StringViewExtras.h" +#include "Utility.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DEMANGLE_NAMESPACE_BEGIN + +template class PODSmallVector { + static_assert(std::is_pod::value, + "T is required to be a plain old data type"); + + T *First = nullptr; + T *Last = nullptr; + T *Cap = nullptr; + T Inline[N] = {0}; + + bool isInline() const { return First == Inline; } + + void clearInline() { + First = Inline; + Last = Inline; + Cap = Inline + N; + } + + void reserve(size_t NewCap) { + size_t S = size(); + if (isInline()) { + auto *Tmp = static_cast(std::malloc(NewCap * sizeof(T))); + if (Tmp == nullptr) + std::terminate(); + std::copy(First, Last, Tmp); + First = Tmp; + } else { + First = static_cast(std::realloc(First, NewCap * sizeof(T))); + if (First == nullptr) + std::terminate(); + } + Last = First + S; + Cap = First + NewCap; + } + +public: + PODSmallVector() : First(Inline), Last(First), Cap(Inline + N) {} + + PODSmallVector(const PODSmallVector &) = delete; + PODSmallVector &operator=(const PODSmallVector &) = delete; + + PODSmallVector(PODSmallVector &&Other) : PODSmallVector() { + if (Other.isInline()) { + std::copy(Other.begin(), Other.end(), First); + Last = First + Other.size(); + Other.clear(); + return; + } + + First = Other.First; + Last = Other.Last; + Cap = Other.Cap; + Other.clearInline(); + } + + PODSmallVector &operator=(PODSmallVector &&Other) { + if (Other.isInline()) { + if (!isInline()) { + std::free(First); + clearInline(); + } + std::copy(Other.begin(), Other.end(), First); + Last = First + Other.size(); + Other.clear(); + return *this; + } + + if (isInline()) { + First = Other.First; + Last = Other.Last; + Cap = Other.Cap; + Other.clearInline(); + return *this; + } + + std::swap(First, Other.First); + std::swap(Last, Other.Last); + std::swap(Cap, Other.Cap); + Other.clear(); + return *this; + } + + // NOLINTNEXTLINE(readability-identifier-naming) + void push_back(const T &Elem) { + if (Last == Cap) + reserve(size() * 2); + *Last++ = Elem; + } + + // NOLINTNEXTLINE(readability-identifier-naming) + void pop_back() { + assert(Last != First && "Popping empty vector!"); + --Last; + } + + void dropBack(size_t Index) { + assert(Index <= size() && "dropBack() can't expand!"); + Last = First + Index; + } + + T *begin() { return First; } + T *end() { return Last; } + + bool empty() const { return First == Last; } + size_t size() const { return static_cast(Last - First); } + T &back() { + assert(Last != First && "Calling back() on empty vector!"); + return *(Last - 1); + } + T &operator[](size_t Index) { + assert(Index < size() && "Invalid access!"); + return *(begin() + Index); + } + void clear() { Last = First; } + + ~PODSmallVector() { + if (!isInline()) + std::free(First); + } +}; + +// Base class of all AST nodes. The AST is built by the parser, then is +// traversed by the printLeft/Right functions to produce a demangled string. +class Node { +public: + enum Kind : unsigned char { +#define NODE(NodeKind) K##NodeKind, +#include "ItaniumNodes.def" + }; + + /// Three-way bool to track a cached value. Unknown is possible if this node + /// has an unexpanded parameter pack below it that may affect this cache. + enum class Cache : unsigned char { Yes, No, Unknown, }; + + /// Operator precedence for expression nodes. Used to determine required + /// parens in expression emission. + enum class Prec { + Primary, + Postfix, + Unary, + Cast, + PtrMem, + Multiplicative, + Additive, + Shift, + Spaceship, + Relational, + Equality, + And, + Xor, + Ior, + AndIf, + OrIf, + Conditional, + Assign, + Comma, + Default, + }; + +private: + Kind K; + + Prec Precedence : 6; + + // FIXME: Make these protected. +public: + /// Tracks if this node has a component on its right side, in which case we + /// need to call printRight. + Cache RHSComponentCache : 2; + + /// Track if this node is a (possibly qualified) array type. This can affect + /// how we format the output string. + Cache ArrayCache : 2; + + /// Track if this node is a (possibly qualified) function type. This can + /// affect how we format the output string. + Cache FunctionCache : 2; + +public: + Node(Kind K_, Prec Precedence_ = Prec::Primary, + Cache RHSComponentCache_ = Cache::No, Cache ArrayCache_ = Cache::No, + Cache FunctionCache_ = Cache::No) + : K(K_), Precedence(Precedence_), RHSComponentCache(RHSComponentCache_), + ArrayCache(ArrayCache_), FunctionCache(FunctionCache_) {} + Node(Kind K_, Cache RHSComponentCache_, Cache ArrayCache_ = Cache::No, + Cache FunctionCache_ = Cache::No) + : Node(K_, Prec::Primary, RHSComponentCache_, ArrayCache_, + FunctionCache_) {} + + /// Visit the most-derived object corresponding to this object. + template void visit(Fn F) const; + + // The following function is provided by all derived classes: + // + // Call F with arguments that, when passed to the constructor of this node, + // would construct an equivalent node. + //template void match(Fn F) const; + + bool hasRHSComponent(OutputBuffer &OB) const { + if (RHSComponentCache != Cache::Unknown) + return RHSComponentCache == Cache::Yes; + return hasRHSComponentSlow(OB); + } + + bool hasArray(OutputBuffer &OB) const { + if (ArrayCache != Cache::Unknown) + return ArrayCache == Cache::Yes; + return hasArraySlow(OB); + } + + bool hasFunction(OutputBuffer &OB) const { + if (FunctionCache != Cache::Unknown) + return FunctionCache == Cache::Yes; + return hasFunctionSlow(OB); + } + + Kind getKind() const { return K; } + + Prec getPrecedence() const { return Precedence; } + + virtual bool hasRHSComponentSlow(OutputBuffer &) const { return false; } + virtual bool hasArraySlow(OutputBuffer &) const { return false; } + virtual bool hasFunctionSlow(OutputBuffer &) const { return false; } + + // Dig through "glue" nodes like ParameterPack and ForwardTemplateReference to + // get at a node that actually represents some concrete syntax. + virtual const Node *getSyntaxNode(OutputBuffer &) const { return this; } + + // Print this node as an expression operand, surrounding it in parentheses if + // its precedence is [Strictly] weaker than P. + void printAsOperand(OutputBuffer &OB, Prec P = Prec::Default, + bool StrictlyWorse = false) const { + bool Paren = + unsigned(getPrecedence()) >= unsigned(P) + unsigned(StrictlyWorse); + if (Paren) + OB.printOpen(); + print(OB); + if (Paren) + OB.printClose(); + } + + void print(OutputBuffer &OB) const { + printLeft(OB); + if (RHSComponentCache != Cache::No) + printRight(OB); + } + + // Print the "left" side of this Node into OutputBuffer. + virtual void printLeft(OutputBuffer &) const = 0; + + // Print the "right". This distinction is necessary to represent C++ types + // that appear on the RHS of their subtype, such as arrays or functions. + // Since most types don't have such a component, provide a default + // implementation. + virtual void printRight(OutputBuffer &) const {} + + virtual std::string_view getBaseName() const { return {}; } + + // Silence compiler warnings, this dtor will never be called. + virtual ~Node() = default; + +#ifndef NDEBUG + DEMANGLE_DUMP_METHOD void dump() const; +#endif +}; + +class NodeArray { + Node **Elements; + size_t NumElements; + +public: + NodeArray() : Elements(nullptr), NumElements(0) {} + NodeArray(Node **Elements_, size_t NumElements_) + : Elements(Elements_), NumElements(NumElements_) {} + + bool empty() const { return NumElements == 0; } + size_t size() const { return NumElements; } + + Node **begin() const { return Elements; } + Node **end() const { return Elements + NumElements; } + + Node *operator[](size_t Idx) const { return Elements[Idx]; } + + void printWithComma(OutputBuffer &OB) const { + bool FirstElement = true; + for (size_t Idx = 0; Idx != NumElements; ++Idx) { + size_t BeforeComma = OB.getCurrentPosition(); + if (!FirstElement) + OB += ", "; + size_t AfterComma = OB.getCurrentPosition(); + Elements[Idx]->printAsOperand(OB, Node::Prec::Comma); + + // Elements[Idx] is an empty parameter pack expansion, we should erase the + // comma we just printed. + if (AfterComma == OB.getCurrentPosition()) { + OB.setCurrentPosition(BeforeComma); + continue; + } + + FirstElement = false; + } + } +}; + +struct NodeArrayNode : Node { + NodeArray Array; + NodeArrayNode(NodeArray Array_) : Node(KNodeArrayNode), Array(Array_) {} + + template void match(Fn F) const { F(Array); } + + void printLeft(OutputBuffer &OB) const override { Array.printWithComma(OB); } +}; + +class DotSuffix final : public Node { + const Node *Prefix; + const std::string_view Suffix; + +public: + DotSuffix(const Node *Prefix_, std::string_view Suffix_) + : Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {} + + template void match(Fn F) const { F(Prefix, Suffix); } + + void printLeft(OutputBuffer &OB) const override { + Prefix->print(OB); + OB += " ("; + OB += Suffix; + OB += ")"; + } +}; + +class VendorExtQualType final : public Node { + const Node *Ty; + std::string_view Ext; + const Node *TA; + +public: + VendorExtQualType(const Node *Ty_, std::string_view Ext_, const Node *TA_) + : Node(KVendorExtQualType), Ty(Ty_), Ext(Ext_), TA(TA_) {} + + const Node *getTy() const { return Ty; } + std::string_view getExt() const { return Ext; } + const Node *getTA() const { return TA; } + + template void match(Fn F) const { F(Ty, Ext, TA); } + + void printLeft(OutputBuffer &OB) const override { + Ty->print(OB); + OB += " "; + OB += Ext; + if (TA != nullptr) + TA->print(OB); + } +}; + +enum FunctionRefQual : unsigned char { + FrefQualNone, + FrefQualLValue, + FrefQualRValue, +}; + +enum Qualifiers { + QualNone = 0, + QualConst = 0x1, + QualVolatile = 0x2, + QualRestrict = 0x4, +}; + +inline Qualifiers operator|=(Qualifiers &Q1, Qualifiers Q2) { + return Q1 = static_cast(Q1 | Q2); +} + +class QualType final : public Node { +protected: + const Qualifiers Quals; + const Node *Child; + + void printQuals(OutputBuffer &OB) const { + if (Quals & QualConst) + OB += " const"; + if (Quals & QualVolatile) + OB += " volatile"; + if (Quals & QualRestrict) + OB += " restrict"; + } + +public: + QualType(const Node *Child_, Qualifiers Quals_) + : Node(KQualType, Child_->RHSComponentCache, + Child_->ArrayCache, Child_->FunctionCache), + Quals(Quals_), Child(Child_) {} + + Qualifiers getQuals() const { return Quals; } + const Node *getChild() const { return Child; } + + template void match(Fn F) const { F(Child, Quals); } + + bool hasRHSComponentSlow(OutputBuffer &OB) const override { + return Child->hasRHSComponent(OB); + } + bool hasArraySlow(OutputBuffer &OB) const override { + return Child->hasArray(OB); + } + bool hasFunctionSlow(OutputBuffer &OB) const override { + return Child->hasFunction(OB); + } + + void printLeft(OutputBuffer &OB) const override { + Child->printLeft(OB); + printQuals(OB); + } + + void printRight(OutputBuffer &OB) const override { Child->printRight(OB); } +}; + +class ConversionOperatorType final : public Node { + const Node *Ty; + +public: + ConversionOperatorType(const Node *Ty_) + : Node(KConversionOperatorType), Ty(Ty_) {} + + template void match(Fn F) const { F(Ty); } + + void printLeft(OutputBuffer &OB) const override { + OB += "operator "; + Ty->print(OB); + } +}; + +class PostfixQualifiedType final : public Node { + const Node *Ty; + const std::string_view Postfix; + +public: + PostfixQualifiedType(const Node *Ty_, std::string_view Postfix_) + : Node(KPostfixQualifiedType), Ty(Ty_), Postfix(Postfix_) {} + + template void match(Fn F) const { F(Ty, Postfix); } + + void printLeft(OutputBuffer &OB) const override { + Ty->printLeft(OB); + OB += Postfix; + } +}; + +class NameType final : public Node { + const std::string_view Name; + +public: + NameType(std::string_view Name_) : Node(KNameType), Name(Name_) {} + + template void match(Fn F) const { F(Name); } + + std::string_view getName() const { return Name; } + std::string_view getBaseName() const override { return Name; } + + void printLeft(OutputBuffer &OB) const override { OB += Name; } +}; + +class BitIntType final : public Node { + const Node *Size; + bool Signed; + +public: + BitIntType(const Node *Size_, bool Signed_) + : Node(KBitIntType), Size(Size_), Signed(Signed_) {} + + template void match(Fn F) const { F(Size, Signed); } + + void printLeft(OutputBuffer &OB) const override { + if (!Signed) + OB += "unsigned "; + OB += "_BitInt"; + OB.printOpen(); + Size->printAsOperand(OB); + OB.printClose(); + } +}; + +class ElaboratedTypeSpefType : public Node { + std::string_view Kind; + Node *Child; +public: + ElaboratedTypeSpefType(std::string_view Kind_, Node *Child_) + : Node(KElaboratedTypeSpefType), Kind(Kind_), Child(Child_) {} + + template void match(Fn F) const { F(Kind, Child); } + + void printLeft(OutputBuffer &OB) const override { + OB += Kind; + OB += ' '; + Child->print(OB); + } +}; + +struct AbiTagAttr : Node { + Node *Base; + std::string_view Tag; + + AbiTagAttr(Node *Base_, std::string_view Tag_) + : Node(KAbiTagAttr, Base_->RHSComponentCache, Base_->ArrayCache, + Base_->FunctionCache), + Base(Base_), Tag(Tag_) {} + + template void match(Fn F) const { F(Base, Tag); } + + std::string_view getBaseName() const override { return Base->getBaseName(); } + + void printLeft(OutputBuffer &OB) const override { + Base->printLeft(OB); + OB += "[abi:"; + OB += Tag; + OB += "]"; + } +}; + +class EnableIfAttr : public Node { + NodeArray Conditions; +public: + EnableIfAttr(NodeArray Conditions_) + : Node(KEnableIfAttr), Conditions(Conditions_) {} + + template void match(Fn F) const { F(Conditions); } + + void printLeft(OutputBuffer &OB) const override { + OB += " [enable_if:"; + Conditions.printWithComma(OB); + OB += ']'; + } +}; + +class ObjCProtoName : public Node { + const Node *Ty; + std::string_view Protocol; + + friend class PointerType; + +public: + ObjCProtoName(const Node *Ty_, std::string_view Protocol_) + : Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {} + + template void match(Fn F) const { F(Ty, Protocol); } + + bool isObjCObject() const { + return Ty->getKind() == KNameType && + static_cast(Ty)->getName() == "objc_object"; + } + + void printLeft(OutputBuffer &OB) const override { + Ty->print(OB); + OB += "<"; + OB += Protocol; + OB += ">"; + } +}; + +class PointerType final : public Node { + const Node *Pointee; + +public: + PointerType(const Node *Pointee_) + : Node(KPointerType, Pointee_->RHSComponentCache), + Pointee(Pointee_) {} + + const Node *getPointee() const { return Pointee; } + + template void match(Fn F) const { F(Pointee); } + + bool hasRHSComponentSlow(OutputBuffer &OB) const override { + return Pointee->hasRHSComponent(OB); + } + + void printLeft(OutputBuffer &OB) const override { + // We rewrite objc_object* into id. + if (Pointee->getKind() != KObjCProtoName || + !static_cast(Pointee)->isObjCObject()) { + Pointee->printLeft(OB); + if (Pointee->hasArray(OB)) + OB += " "; + if (Pointee->hasArray(OB) || Pointee->hasFunction(OB)) + OB += "("; + OB += "*"; + } else { + const auto *objcProto = static_cast(Pointee); + OB += "id<"; + OB += objcProto->Protocol; + OB += ">"; + } + } + + void printRight(OutputBuffer &OB) const override { + if (Pointee->getKind() != KObjCProtoName || + !static_cast(Pointee)->isObjCObject()) { + if (Pointee->hasArray(OB) || Pointee->hasFunction(OB)) + OB += ")"; + Pointee->printRight(OB); + } + } +}; + +enum class ReferenceKind { + LValue, + RValue, +}; + +// Represents either a LValue or an RValue reference type. +class ReferenceType : public Node { + const Node *Pointee; + ReferenceKind RK; + + mutable bool Printing = false; + + // Dig through any refs to refs, collapsing the ReferenceTypes as we go. The + // rule here is rvalue ref to rvalue ref collapses to a rvalue ref, and any + // other combination collapses to a lvalue ref. + // + // A combination of a TemplateForwardReference and a back-ref Substitution + // from an ill-formed string may have created a cycle; use cycle detection to + // avoid looping forever. + std::pair collapse(OutputBuffer &OB) const { + auto SoFar = std::make_pair(RK, Pointee); + // Track the chain of nodes for the Floyd's 'tortoise and hare' + // cycle-detection algorithm, since getSyntaxNode(S) is impure + PODSmallVector Prev; + for (;;) { + const Node *SN = SoFar.second->getSyntaxNode(OB); + if (SN->getKind() != KReferenceType) + break; + auto *RT = static_cast(SN); + SoFar.second = RT->Pointee; + SoFar.first = std::min(SoFar.first, RT->RK); + + // The middle of Prev is the 'slow' pointer moving at half speed + Prev.push_back(SoFar.second); + if (Prev.size() > 1 && SoFar.second == Prev[(Prev.size() - 1) / 2]) { + // Cycle detected + SoFar.second = nullptr; + break; + } + } + return SoFar; + } + +public: + ReferenceType(const Node *Pointee_, ReferenceKind RK_) + : Node(KReferenceType, Pointee_->RHSComponentCache), + Pointee(Pointee_), RK(RK_) {} + + template void match(Fn F) const { F(Pointee, RK); } + + bool hasRHSComponentSlow(OutputBuffer &OB) const override { + return Pointee->hasRHSComponent(OB); + } + + void printLeft(OutputBuffer &OB) const override { + if (Printing) + return; + ScopedOverride SavePrinting(Printing, true); + std::pair Collapsed = collapse(OB); + if (!Collapsed.second) + return; + Collapsed.second->printLeft(OB); + if (Collapsed.second->hasArray(OB)) + OB += " "; + if (Collapsed.second->hasArray(OB) || Collapsed.second->hasFunction(OB)) + OB += "("; + + OB += (Collapsed.first == ReferenceKind::LValue ? "&" : "&&"); + } + void printRight(OutputBuffer &OB) const override { + if (Printing) + return; + ScopedOverride SavePrinting(Printing, true); + std::pair Collapsed = collapse(OB); + if (!Collapsed.second) + return; + if (Collapsed.second->hasArray(OB) || Collapsed.second->hasFunction(OB)) + OB += ")"; + Collapsed.second->printRight(OB); + } +}; + +class PointerToMemberType final : public Node { + const Node *ClassType; + const Node *MemberType; + +public: + PointerToMemberType(const Node *ClassType_, const Node *MemberType_) + : Node(KPointerToMemberType, MemberType_->RHSComponentCache), + ClassType(ClassType_), MemberType(MemberType_) {} + + template void match(Fn F) const { F(ClassType, MemberType); } + + bool hasRHSComponentSlow(OutputBuffer &OB) const override { + return MemberType->hasRHSComponent(OB); + } + + void printLeft(OutputBuffer &OB) const override { + MemberType->printLeft(OB); + if (MemberType->hasArray(OB) || MemberType->hasFunction(OB)) + OB += "("; + else + OB += " "; + ClassType->print(OB); + OB += "::*"; + } + + void printRight(OutputBuffer &OB) const override { + if (MemberType->hasArray(OB) || MemberType->hasFunction(OB)) + OB += ")"; + MemberType->printRight(OB); + } +}; + +class ArrayType final : public Node { + const Node *Base; + Node *Dimension; + +public: + ArrayType(const Node *Base_, Node *Dimension_) + : Node(KArrayType, + /*RHSComponentCache=*/Cache::Yes, + /*ArrayCache=*/Cache::Yes), + Base(Base_), Dimension(Dimension_) {} + + template void match(Fn F) const { F(Base, Dimension); } + + bool hasRHSComponentSlow(OutputBuffer &) const override { return true; } + bool hasArraySlow(OutputBuffer &) const override { return true; } + + void printLeft(OutputBuffer &OB) const override { Base->printLeft(OB); } + + void printRight(OutputBuffer &OB) const override { + if (OB.back() != ']') + OB += " "; + OB += "["; + if (Dimension) + Dimension->print(OB); + OB += "]"; + Base->printRight(OB); + } +}; + +class FunctionType final : public Node { + const Node *Ret; + NodeArray Params; + Qualifiers CVQuals; + FunctionRefQual RefQual; + const Node *ExceptionSpec; + +public: + FunctionType(const Node *Ret_, NodeArray Params_, Qualifiers CVQuals_, + FunctionRefQual RefQual_, const Node *ExceptionSpec_) + : Node(KFunctionType, + /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No, + /*FunctionCache=*/Cache::Yes), + Ret(Ret_), Params(Params_), CVQuals(CVQuals_), RefQual(RefQual_), + ExceptionSpec(ExceptionSpec_) {} + + template void match(Fn F) const { + F(Ret, Params, CVQuals, RefQual, ExceptionSpec); + } + + bool hasRHSComponentSlow(OutputBuffer &) const override { return true; } + bool hasFunctionSlow(OutputBuffer &) const override { return true; } + + // Handle C++'s ... quirky decl grammar by using the left & right + // distinction. Consider: + // int (*f(float))(char) {} + // f is a function that takes a float and returns a pointer to a function + // that takes a char and returns an int. If we're trying to print f, start + // by printing out the return types's left, then print our parameters, then + // finally print right of the return type. + void printLeft(OutputBuffer &OB) const override { + Ret->printLeft(OB); + OB += " "; + } + + void printRight(OutputBuffer &OB) const override { + OB.printOpen(); + Params.printWithComma(OB); + OB.printClose(); + Ret->printRight(OB); + + if (CVQuals & QualConst) + OB += " const"; + if (CVQuals & QualVolatile) + OB += " volatile"; + if (CVQuals & QualRestrict) + OB += " restrict"; + + if (RefQual == FrefQualLValue) + OB += " &"; + else if (RefQual == FrefQualRValue) + OB += " &&"; + + if (ExceptionSpec != nullptr) { + OB += ' '; + ExceptionSpec->print(OB); + } + } +}; + +class NoexceptSpec : public Node { + const Node *E; +public: + NoexceptSpec(const Node *E_) : Node(KNoexceptSpec), E(E_) {} + + template void match(Fn F) const { F(E); } + + void printLeft(OutputBuffer &OB) const override { + OB += "noexcept"; + OB.printOpen(); + E->printAsOperand(OB); + OB.printClose(); + } +}; + +class DynamicExceptionSpec : public Node { + NodeArray Types; +public: + DynamicExceptionSpec(NodeArray Types_) + : Node(KDynamicExceptionSpec), Types(Types_) {} + + template void match(Fn F) const { F(Types); } + + void printLeft(OutputBuffer &OB) const override { + OB += "throw"; + OB.printOpen(); + Types.printWithComma(OB); + OB.printClose(); + } +}; + +class FunctionEncoding final : public Node { + const Node *Ret; + const Node *Name; + NodeArray Params; + const Node *Attrs; + Qualifiers CVQuals; + FunctionRefQual RefQual; + +public: + FunctionEncoding(const Node *Ret_, const Node *Name_, NodeArray Params_, + const Node *Attrs_, Qualifiers CVQuals_, + FunctionRefQual RefQual_) + : Node(KFunctionEncoding, + /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No, + /*FunctionCache=*/Cache::Yes), + Ret(Ret_), Name(Name_), Params(Params_), Attrs(Attrs_), + CVQuals(CVQuals_), RefQual(RefQual_) {} + + template void match(Fn F) const { + F(Ret, Name, Params, Attrs, CVQuals, RefQual); + } + + Qualifiers getCVQuals() const { return CVQuals; } + FunctionRefQual getRefQual() const { return RefQual; } + NodeArray getParams() const { return Params; } + const Node *getReturnType() const { return Ret; } + + bool hasRHSComponentSlow(OutputBuffer &) const override { return true; } + bool hasFunctionSlow(OutputBuffer &) const override { return true; } + + const Node *getName() const { return Name; } + + void printLeft(OutputBuffer &OB) const override { + if (Ret) { + Ret->printLeft(OB); + if (!Ret->hasRHSComponent(OB)) + OB += " "; + } + Name->print(OB); + } + + void printRight(OutputBuffer &OB) const override { + OB.printOpen(); + Params.printWithComma(OB); + OB.printClose(); + if (Ret) + Ret->printRight(OB); + + if (CVQuals & QualConst) + OB += " const"; + if (CVQuals & QualVolatile) + OB += " volatile"; + if (CVQuals & QualRestrict) + OB += " restrict"; + + if (RefQual == FrefQualLValue) + OB += " &"; + else if (RefQual == FrefQualRValue) + OB += " &&"; + + if (Attrs != nullptr) + Attrs->print(OB); + } +}; + +class LiteralOperator : public Node { + const Node *OpName; + +public: + LiteralOperator(const Node *OpName_) + : Node(KLiteralOperator), OpName(OpName_) {} + + template void match(Fn F) const { F(OpName); } + + void printLeft(OutputBuffer &OB) const override { + OB += "operator\"\" "; + OpName->print(OB); + } +}; + +class SpecialName final : public Node { + const std::string_view Special; + const Node *Child; + +public: + SpecialName(std::string_view Special_, const Node *Child_) + : Node(KSpecialName), Special(Special_), Child(Child_) {} + + template void match(Fn F) const { F(Special, Child); } + + void printLeft(OutputBuffer &OB) const override { + OB += Special; + Child->print(OB); + } +}; + +class CtorVtableSpecialName final : public Node { + const Node *FirstType; + const Node *SecondType; + +public: + CtorVtableSpecialName(const Node *FirstType_, const Node *SecondType_) + : Node(KCtorVtableSpecialName), + FirstType(FirstType_), SecondType(SecondType_) {} + + template void match(Fn F) const { F(FirstType, SecondType); } + + void printLeft(OutputBuffer &OB) const override { + OB += "construction vtable for "; + FirstType->print(OB); + OB += "-in-"; + SecondType->print(OB); + } +}; + +struct NestedName : Node { + Node *Qual; + Node *Name; + + NestedName(Node *Qual_, Node *Name_) + : Node(KNestedName), Qual(Qual_), Name(Name_) {} + + template void match(Fn F) const { F(Qual, Name); } + + std::string_view getBaseName() const override { return Name->getBaseName(); } + + void printLeft(OutputBuffer &OB) const override { + Qual->print(OB); + OB += "::"; + Name->print(OB); + } +}; + +struct ModuleName : Node { + ModuleName *Parent; + Node *Name; + bool IsPartition; + + ModuleName(ModuleName *Parent_, Node *Name_, bool IsPartition_ = false) + : Node(KModuleName), Parent(Parent_), Name(Name_), + IsPartition(IsPartition_) {} + + template void match(Fn F) const { + F(Parent, Name, IsPartition); + } + + void printLeft(OutputBuffer &OB) const override { + if (Parent) + Parent->print(OB); + if (Parent || IsPartition) + OB += IsPartition ? ':' : '.'; + Name->print(OB); + } +}; + +struct ModuleEntity : Node { + ModuleName *Module; + Node *Name; + + ModuleEntity(ModuleName *Module_, Node *Name_) + : Node(KModuleEntity), Module(Module_), Name(Name_) {} + + template void match(Fn F) const { F(Module, Name); } + + std::string_view getBaseName() const override { return Name->getBaseName(); } + + void printLeft(OutputBuffer &OB) const override { + Name->print(OB); + OB += '@'; + Module->print(OB); + } +}; + +struct LocalName : Node { + Node *Encoding; + Node *Entity; + + LocalName(Node *Encoding_, Node *Entity_) + : Node(KLocalName), Encoding(Encoding_), Entity(Entity_) {} + + template void match(Fn F) const { F(Encoding, Entity); } + + void printLeft(OutputBuffer &OB) const override { + Encoding->print(OB); + OB += "::"; + Entity->print(OB); + } +}; + +class QualifiedName final : public Node { + // qualifier::name + const Node *Qualifier; + const Node *Name; + +public: + QualifiedName(const Node *Qualifier_, const Node *Name_) + : Node(KQualifiedName), Qualifier(Qualifier_), Name(Name_) {} + + template void match(Fn F) const { F(Qualifier, Name); } + + std::string_view getBaseName() const override { return Name->getBaseName(); } + + void printLeft(OutputBuffer &OB) const override { + Qualifier->print(OB); + OB += "::"; + Name->print(OB); + } +}; + +class VectorType final : public Node { + const Node *BaseType; + const Node *Dimension; + +public: + VectorType(const Node *BaseType_, const Node *Dimension_) + : Node(KVectorType), BaseType(BaseType_), Dimension(Dimension_) {} + + const Node *getBaseType() const { return BaseType; } + const Node *getDimension() const { return Dimension; } + + template void match(Fn F) const { F(BaseType, Dimension); } + + void printLeft(OutputBuffer &OB) const override { + BaseType->print(OB); + OB += " vector["; + if (Dimension) + Dimension->print(OB); + OB += "]"; + } +}; + +class PixelVectorType final : public Node { + const Node *Dimension; + +public: + PixelVectorType(const Node *Dimension_) + : Node(KPixelVectorType), Dimension(Dimension_) {} + + template void match(Fn F) const { F(Dimension); } + + void printLeft(OutputBuffer &OB) const override { + // FIXME: This should demangle as "vector pixel". + OB += "pixel vector["; + Dimension->print(OB); + OB += "]"; + } +}; + +class BinaryFPType final : public Node { + const Node *Dimension; + +public: + BinaryFPType(const Node *Dimension_) + : Node(KBinaryFPType), Dimension(Dimension_) {} + + template void match(Fn F) const { F(Dimension); } + + void printLeft(OutputBuffer &OB) const override { + OB += "_Float"; + Dimension->print(OB); + } +}; + +enum class TemplateParamKind { Type, NonType, Template }; + +/// An invented name for a template parameter for which we don't have a +/// corresponding template argument. +/// +/// This node is created when parsing the for a lambda with +/// explicit template arguments, which might be referenced in the parameter +/// types appearing later in the . +class SyntheticTemplateParamName final : public Node { + TemplateParamKind Kind; + unsigned Index; + +public: + SyntheticTemplateParamName(TemplateParamKind Kind_, unsigned Index_) + : Node(KSyntheticTemplateParamName), Kind(Kind_), Index(Index_) {} + + template void match(Fn F) const { F(Kind, Index); } + + void printLeft(OutputBuffer &OB) const override { + switch (Kind) { + case TemplateParamKind::Type: + OB += "$T"; + break; + case TemplateParamKind::NonType: + OB += "$N"; + break; + case TemplateParamKind::Template: + OB += "$TT"; + break; + } + if (Index > 0) + OB << Index - 1; + } +}; + +/// A template type parameter declaration, 'typename T'. +class TypeTemplateParamDecl final : public Node { + Node *Name; + +public: + TypeTemplateParamDecl(Node *Name_) + : Node(KTypeTemplateParamDecl, Cache::Yes), Name(Name_) {} + + template void match(Fn F) const { F(Name); } + + void printLeft(OutputBuffer &OB) const override { OB += "typename "; } + + void printRight(OutputBuffer &OB) const override { Name->print(OB); } +}; + +/// A non-type template parameter declaration, 'int N'. +class NonTypeTemplateParamDecl final : public Node { + Node *Name; + Node *Type; + +public: + NonTypeTemplateParamDecl(Node *Name_, Node *Type_) + : Node(KNonTypeTemplateParamDecl, Cache::Yes), Name(Name_), Type(Type_) {} + + template void match(Fn F) const { F(Name, Type); } + + void printLeft(OutputBuffer &OB) const override { + Type->printLeft(OB); + if (!Type->hasRHSComponent(OB)) + OB += " "; + } + + void printRight(OutputBuffer &OB) const override { + Name->print(OB); + Type->printRight(OB); + } +}; + +/// A template template parameter declaration, +/// 'template typename N'. +class TemplateTemplateParamDecl final : public Node { + Node *Name; + NodeArray Params; + +public: + TemplateTemplateParamDecl(Node *Name_, NodeArray Params_) + : Node(KTemplateTemplateParamDecl, Cache::Yes), Name(Name_), + Params(Params_) {} + + template void match(Fn F) const { F(Name, Params); } + + void printLeft(OutputBuffer &OB) const override { + ScopedOverride LT(OB.GtIsGt, 0); + OB += "template<"; + Params.printWithComma(OB); + OB += "> typename "; + } + + void printRight(OutputBuffer &OB) const override { Name->print(OB); } +}; + +/// A template parameter pack declaration, 'typename ...T'. +class TemplateParamPackDecl final : public Node { + Node *Param; + +public: + TemplateParamPackDecl(Node *Param_) + : Node(KTemplateParamPackDecl, Cache::Yes), Param(Param_) {} + + template void match(Fn F) const { F(Param); } + + void printLeft(OutputBuffer &OB) const override { + Param->printLeft(OB); + OB += "..."; + } + + void printRight(OutputBuffer &OB) const override { Param->printRight(OB); } +}; + +/// An unexpanded parameter pack (either in the expression or type context). If +/// this AST is correct, this node will have a ParameterPackExpansion node above +/// it. +/// +/// This node is created when some are found that apply to an +/// , and is stored in the TemplateParams table. In order for this to +/// appear in the final AST, it has to referenced via a (ie, +/// T_). +class ParameterPack final : public Node { + NodeArray Data; + + // Setup OutputBuffer for a pack expansion, unless we're already expanding + // one. + void initializePackExpansion(OutputBuffer &OB) const { + if (OB.CurrentPackMax == std::numeric_limits::max()) { + OB.CurrentPackMax = static_cast(Data.size()); + OB.CurrentPackIndex = 0; + } + } + +public: + ParameterPack(NodeArray Data_) : Node(KParameterPack), Data(Data_) { + ArrayCache = FunctionCache = RHSComponentCache = Cache::Unknown; + if (std::all_of(Data.begin(), Data.end(), [](Node* P) { + return P->ArrayCache == Cache::No; + })) + ArrayCache = Cache::No; + if (std::all_of(Data.begin(), Data.end(), [](Node* P) { + return P->FunctionCache == Cache::No; + })) + FunctionCache = Cache::No; + if (std::all_of(Data.begin(), Data.end(), [](Node* P) { + return P->RHSComponentCache == Cache::No; + })) + RHSComponentCache = Cache::No; + } + + template void match(Fn F) const { F(Data); } + + bool hasRHSComponentSlow(OutputBuffer &OB) const override { + initializePackExpansion(OB); + size_t Idx = OB.CurrentPackIndex; + return Idx < Data.size() && Data[Idx]->hasRHSComponent(OB); + } + bool hasArraySlow(OutputBuffer &OB) const override { + initializePackExpansion(OB); + size_t Idx = OB.CurrentPackIndex; + return Idx < Data.size() && Data[Idx]->hasArray(OB); + } + bool hasFunctionSlow(OutputBuffer &OB) const override { + initializePackExpansion(OB); + size_t Idx = OB.CurrentPackIndex; + return Idx < Data.size() && Data[Idx]->hasFunction(OB); + } + const Node *getSyntaxNode(OutputBuffer &OB) const override { + initializePackExpansion(OB); + size_t Idx = OB.CurrentPackIndex; + return Idx < Data.size() ? Data[Idx]->getSyntaxNode(OB) : this; + } + + void printLeft(OutputBuffer &OB) const override { + initializePackExpansion(OB); + size_t Idx = OB.CurrentPackIndex; + if (Idx < Data.size()) + Data[Idx]->printLeft(OB); + } + void printRight(OutputBuffer &OB) const override { + initializePackExpansion(OB); + size_t Idx = OB.CurrentPackIndex; + if (Idx < Data.size()) + Data[Idx]->printRight(OB); + } +}; + +/// A variadic template argument. This node represents an occurrence of +/// JE in some . It isn't itself unexpanded, unless +/// one of it's Elements is. The parser inserts a ParameterPack into the +/// TemplateParams table if the this pack belongs to apply to an +/// . +class TemplateArgumentPack final : public Node { + NodeArray Elements; +public: + TemplateArgumentPack(NodeArray Elements_) + : Node(KTemplateArgumentPack), Elements(Elements_) {} + + template void match(Fn F) const { F(Elements); } + + NodeArray getElements() const { return Elements; } + + void printLeft(OutputBuffer &OB) const override { + Elements.printWithComma(OB); + } +}; + +/// A pack expansion. Below this node, there are some unexpanded ParameterPacks +/// which each have Child->ParameterPackSize elements. +class ParameterPackExpansion final : public Node { + const Node *Child; + +public: + ParameterPackExpansion(const Node *Child_) + : Node(KParameterPackExpansion), Child(Child_) {} + + template void match(Fn F) const { F(Child); } + + const Node *getChild() const { return Child; } + + void printLeft(OutputBuffer &OB) const override { + constexpr unsigned Max = std::numeric_limits::max(); + ScopedOverride SavePackIdx(OB.CurrentPackIndex, Max); + ScopedOverride SavePackMax(OB.CurrentPackMax, Max); + size_t StreamPos = OB.getCurrentPosition(); + + // Print the first element in the pack. If Child contains a ParameterPack, + // it will set up S.CurrentPackMax and print the first element. + Child->print(OB); + + // No ParameterPack was found in Child. This can occur if we've found a pack + // expansion on a . + if (OB.CurrentPackMax == Max) { + OB += "..."; + return; + } + + // We found a ParameterPack, but it has no elements. Erase whatever we may + // of printed. + if (OB.CurrentPackMax == 0) { + OB.setCurrentPosition(StreamPos); + return; + } + + // Else, iterate through the rest of the elements in the pack. + for (unsigned I = 1, E = OB.CurrentPackMax; I < E; ++I) { + OB += ", "; + OB.CurrentPackIndex = I; + Child->print(OB); + } + } +}; + +class TemplateArgs final : public Node { + NodeArray Params; + +public: + TemplateArgs(NodeArray Params_) : Node(KTemplateArgs), Params(Params_) {} + + template void match(Fn F) const { F(Params); } + + NodeArray getParams() { return Params; } + + void printLeft(OutputBuffer &OB) const override { + ScopedOverride LT(OB.GtIsGt, 0); + OB += "<"; + Params.printWithComma(OB); + OB += ">"; + } +}; + +/// A forward-reference to a template argument that was not known at the point +/// where the template parameter name was parsed in a mangling. +/// +/// This is created when demangling the name of a specialization of a +/// conversion function template: +/// +/// \code +/// struct A { +/// template operator T*(); +/// }; +/// \endcode +/// +/// When demangling a specialization of the conversion function template, we +/// encounter the name of the template (including the \c T) before we reach +/// the template argument list, so we cannot substitute the parameter name +/// for the corresponding argument while parsing. Instead, we create a +/// \c ForwardTemplateReference node that is resolved after we parse the +/// template arguments. +struct ForwardTemplateReference : Node { + size_t Index; + Node *Ref = nullptr; + + // If we're currently printing this node. It is possible (though invalid) for + // a forward template reference to refer to itself via a substitution. This + // creates a cyclic AST, which will stack overflow printing. To fix this, bail + // out if more than one print* function is active. + mutable bool Printing = false; + + ForwardTemplateReference(size_t Index_) + : Node(KForwardTemplateReference, Cache::Unknown, Cache::Unknown, + Cache::Unknown), + Index(Index_) {} + + // We don't provide a matcher for these, because the value of the node is + // not determined by its construction parameters, and it generally needs + // special handling. + template void match(Fn F) const = delete; + + bool hasRHSComponentSlow(OutputBuffer &OB) const override { + if (Printing) + return false; + ScopedOverride SavePrinting(Printing, true); + return Ref->hasRHSComponent(OB); + } + bool hasArraySlow(OutputBuffer &OB) const override { + if (Printing) + return false; + ScopedOverride SavePrinting(Printing, true); + return Ref->hasArray(OB); + } + bool hasFunctionSlow(OutputBuffer &OB) const override { + if (Printing) + return false; + ScopedOverride SavePrinting(Printing, true); + return Ref->hasFunction(OB); + } + const Node *getSyntaxNode(OutputBuffer &OB) const override { + if (Printing) + return this; + ScopedOverride SavePrinting(Printing, true); + return Ref->getSyntaxNode(OB); + } + + void printLeft(OutputBuffer &OB) const override { + if (Printing) + return; + ScopedOverride SavePrinting(Printing, true); + Ref->printLeft(OB); + } + void printRight(OutputBuffer &OB) const override { + if (Printing) + return; + ScopedOverride SavePrinting(Printing, true); + Ref->printRight(OB); + } +}; + +struct NameWithTemplateArgs : Node { + // name + Node *Name; + Node *TemplateArgs; + + NameWithTemplateArgs(Node *Name_, Node *TemplateArgs_) + : Node(KNameWithTemplateArgs), Name(Name_), TemplateArgs(TemplateArgs_) {} + + template void match(Fn F) const { F(Name, TemplateArgs); } + + std::string_view getBaseName() const override { return Name->getBaseName(); } + + void printLeft(OutputBuffer &OB) const override { + Name->print(OB); + TemplateArgs->print(OB); + } +}; + +class GlobalQualifiedName final : public Node { + Node *Child; + +public: + GlobalQualifiedName(Node* Child_) + : Node(KGlobalQualifiedName), Child(Child_) {} + + template void match(Fn F) const { F(Child); } + + std::string_view getBaseName() const override { return Child->getBaseName(); } + + void printLeft(OutputBuffer &OB) const override { + OB += "::"; + Child->print(OB); + } +}; + +enum class SpecialSubKind { + allocator, + basic_string, + string, + istream, + ostream, + iostream, +}; + +class SpecialSubstitution; +class ExpandedSpecialSubstitution : public Node { +protected: + SpecialSubKind SSK; + + ExpandedSpecialSubstitution(SpecialSubKind SSK_, Kind K_) + : Node(K_), SSK(SSK_) {} +public: + ExpandedSpecialSubstitution(SpecialSubKind SSK_) + : ExpandedSpecialSubstitution(SSK_, KExpandedSpecialSubstitution) {} + inline ExpandedSpecialSubstitution(SpecialSubstitution const *); + + template void match(Fn F) const { F(SSK); } + +protected: + bool isInstantiation() const { + return unsigned(SSK) >= unsigned(SpecialSubKind::string); + } + + std::string_view getBaseName() const override { + switch (SSK) { + case SpecialSubKind::allocator: + return {"allocator"}; + case SpecialSubKind::basic_string: + return {"basic_string"}; + case SpecialSubKind::string: + return {"basic_string"}; + case SpecialSubKind::istream: + return {"basic_istream"}; + case SpecialSubKind::ostream: + return {"basic_ostream"}; + case SpecialSubKind::iostream: + return {"basic_iostream"}; + } + DEMANGLE_UNREACHABLE; + } + +private: + void printLeft(OutputBuffer &OB) const override { + OB << "std::" << getBaseName(); + if (isInstantiation()) { + OB << ""; + if (SSK == SpecialSubKind::string) + OB << ", std::allocator"; + OB << ">"; + } + } +}; + +class SpecialSubstitution final : public ExpandedSpecialSubstitution { +public: + SpecialSubstitution(SpecialSubKind SSK_) + : ExpandedSpecialSubstitution(SSK_, KSpecialSubstitution) {} + + template void match(Fn F) const { F(SSK); } + + std::string_view getBaseName() const override { + std::string_view SV = ExpandedSpecialSubstitution::getBaseName(); + if (isInstantiation()) { + // The instantiations are typedefs that drop the "basic_" prefix. + assert(llvm::itanium_demangle::starts_with(SV, "basic_")); + SV.remove_prefix(sizeof("basic_") - 1); + } + return SV; + } + + void printLeft(OutputBuffer &OB) const override { + OB << "std::" << getBaseName(); + } +}; + +inline ExpandedSpecialSubstitution::ExpandedSpecialSubstitution( + SpecialSubstitution const *SS) + : ExpandedSpecialSubstitution(SS->SSK) {} + +class CtorDtorName final : public Node { + const Node *Basename; + const bool IsDtor; + const int Variant; + +public: + CtorDtorName(const Node *Basename_, bool IsDtor_, int Variant_) + : Node(KCtorDtorName), Basename(Basename_), IsDtor(IsDtor_), + Variant(Variant_) {} + + template void match(Fn F) const { F(Basename, IsDtor, Variant); } + + void printLeft(OutputBuffer &OB) const override { + if (IsDtor) + OB += "~"; + OB += Basename->getBaseName(); + } +}; + +class DtorName : public Node { + const Node *Base; + +public: + DtorName(const Node *Base_) : Node(KDtorName), Base(Base_) {} + + template void match(Fn F) const { F(Base); } + + void printLeft(OutputBuffer &OB) const override { + OB += "~"; + Base->printLeft(OB); + } +}; + +class UnnamedTypeName : public Node { + const std::string_view Count; + +public: + UnnamedTypeName(std::string_view Count_) + : Node(KUnnamedTypeName), Count(Count_) {} + + template void match(Fn F) const { F(Count); } + + void printLeft(OutputBuffer &OB) const override { + OB += "'unnamed"; + OB += Count; + OB += "\'"; + } +}; + +class ClosureTypeName : public Node { + NodeArray TemplateParams; + NodeArray Params; + std::string_view Count; + +public: + ClosureTypeName(NodeArray TemplateParams_, NodeArray Params_, + std::string_view Count_) + : Node(KClosureTypeName), TemplateParams(TemplateParams_), + Params(Params_), Count(Count_) {} + + template void match(Fn F) const { + F(TemplateParams, Params, Count); + } + + void printDeclarator(OutputBuffer &OB) const { + if (!TemplateParams.empty()) { + ScopedOverride LT(OB.GtIsGt, 0); + OB += "<"; + TemplateParams.printWithComma(OB); + OB += ">"; + } + OB.printOpen(); + Params.printWithComma(OB); + OB.printClose(); + } + + void printLeft(OutputBuffer &OB) const override { + OB += "\'lambda"; + OB += Count; + OB += "\'"; + printDeclarator(OB); + } +}; + +class StructuredBindingName : public Node { + NodeArray Bindings; +public: + StructuredBindingName(NodeArray Bindings_) + : Node(KStructuredBindingName), Bindings(Bindings_) {} + + template void match(Fn F) const { F(Bindings); } + + void printLeft(OutputBuffer &OB) const override { + OB.printOpen('['); + Bindings.printWithComma(OB); + OB.printClose(']'); + } +}; + +// -- Expression Nodes -- + +class BinaryExpr : public Node { + const Node *LHS; + const std::string_view InfixOperator; + const Node *RHS; + +public: + BinaryExpr(const Node *LHS_, std::string_view InfixOperator_, + const Node *RHS_, Prec Prec_) + : Node(KBinaryExpr, Prec_), LHS(LHS_), InfixOperator(InfixOperator_), + RHS(RHS_) {} + + template void match(Fn F) const { + F(LHS, InfixOperator, RHS, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + bool ParenAll = OB.isGtInsideTemplateArgs() && + (InfixOperator == ">" || InfixOperator == ">>"); + if (ParenAll) + OB.printOpen(); + // Assignment is right associative, with special LHS precedence. + bool IsAssign = getPrecedence() == Prec::Assign; + LHS->printAsOperand(OB, IsAssign ? Prec::OrIf : getPrecedence(), !IsAssign); + // No space before comma operator + if (!(InfixOperator == ",")) + OB += " "; + OB += InfixOperator; + OB += " "; + RHS->printAsOperand(OB, getPrecedence(), IsAssign); + if (ParenAll) + OB.printClose(); + } +}; + +class ArraySubscriptExpr : public Node { + const Node *Op1; + const Node *Op2; + +public: + ArraySubscriptExpr(const Node *Op1_, const Node *Op2_, Prec Prec_) + : Node(KArraySubscriptExpr, Prec_), Op1(Op1_), Op2(Op2_) {} + + template void match(Fn F) const { + F(Op1, Op2, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + Op1->printAsOperand(OB, getPrecedence()); + OB.printOpen('['); + Op2->printAsOperand(OB); + OB.printClose(']'); + } +}; + +class PostfixExpr : public Node { + const Node *Child; + const std::string_view Operator; + +public: + PostfixExpr(const Node *Child_, std::string_view Operator_, Prec Prec_) + : Node(KPostfixExpr, Prec_), Child(Child_), Operator(Operator_) {} + + template void match(Fn F) const { + F(Child, Operator, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + Child->printAsOperand(OB, getPrecedence(), true); + OB += Operator; + } +}; + +class ConditionalExpr : public Node { + const Node *Cond; + const Node *Then; + const Node *Else; + +public: + ConditionalExpr(const Node *Cond_, const Node *Then_, const Node *Else_, + Prec Prec_) + : Node(KConditionalExpr, Prec_), Cond(Cond_), Then(Then_), Else(Else_) {} + + template void match(Fn F) const { + F(Cond, Then, Else, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + Cond->printAsOperand(OB, getPrecedence()); + OB += " ? "; + Then->printAsOperand(OB); + OB += " : "; + Else->printAsOperand(OB, Prec::Assign, true); + } +}; + +class MemberExpr : public Node { + const Node *LHS; + const std::string_view Kind; + const Node *RHS; + +public: + MemberExpr(const Node *LHS_, std::string_view Kind_, const Node *RHS_, + Prec Prec_) + : Node(KMemberExpr, Prec_), LHS(LHS_), Kind(Kind_), RHS(RHS_) {} + + template void match(Fn F) const { + F(LHS, Kind, RHS, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + LHS->printAsOperand(OB, getPrecedence(), true); + OB += Kind; + RHS->printAsOperand(OB, getPrecedence(), false); + } +}; + +class SubobjectExpr : public Node { + const Node *Type; + const Node *SubExpr; + std::string_view Offset; + NodeArray UnionSelectors; + bool OnePastTheEnd; + +public: + SubobjectExpr(const Node *Type_, const Node *SubExpr_, + std::string_view Offset_, NodeArray UnionSelectors_, + bool OnePastTheEnd_) + : Node(KSubobjectExpr), Type(Type_), SubExpr(SubExpr_), Offset(Offset_), + UnionSelectors(UnionSelectors_), OnePastTheEnd(OnePastTheEnd_) {} + + template void match(Fn F) const { + F(Type, SubExpr, Offset, UnionSelectors, OnePastTheEnd); + } + + void printLeft(OutputBuffer &OB) const override { + SubExpr->print(OB); + OB += ".<"; + Type->print(OB); + OB += " at offset "; + if (Offset.empty()) { + OB += "0"; + } else if (Offset[0] == 'n') { + OB += "-"; + OB += std::string_view(Offset.data() + 1, Offset.size() - 1); + } else { + OB += Offset; + } + OB += ">"; + } +}; + +class EnclosingExpr : public Node { + const std::string_view Prefix; + const Node *Infix; + const std::string_view Postfix; + +public: + EnclosingExpr(std::string_view Prefix_, const Node *Infix_, + Prec Prec_ = Prec::Primary) + : Node(KEnclosingExpr, Prec_), Prefix(Prefix_), Infix(Infix_) {} + + template void match(Fn F) const { + F(Prefix, Infix, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + OB += Prefix; + OB.printOpen(); + Infix->print(OB); + OB.printClose(); + OB += Postfix; + } +}; + +class CastExpr : public Node { + // cast_kind(from) + const std::string_view CastKind; + const Node *To; + const Node *From; + +public: + CastExpr(std::string_view CastKind_, const Node *To_, const Node *From_, + Prec Prec_) + : Node(KCastExpr, Prec_), CastKind(CastKind_), To(To_), From(From_) {} + + template void match(Fn F) const { + F(CastKind, To, From, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + OB += CastKind; + { + ScopedOverride LT(OB.GtIsGt, 0); + OB += "<"; + To->printLeft(OB); + OB += ">"; + } + OB.printOpen(); + From->printAsOperand(OB); + OB.printClose(); + } +}; + +class SizeofParamPackExpr : public Node { + const Node *Pack; + +public: + SizeofParamPackExpr(const Node *Pack_) + : Node(KSizeofParamPackExpr), Pack(Pack_) {} + + template void match(Fn F) const { F(Pack); } + + void printLeft(OutputBuffer &OB) const override { + OB += "sizeof..."; + OB.printOpen(); + ParameterPackExpansion PPE(Pack); + PPE.printLeft(OB); + OB.printClose(); + } +}; + +class CallExpr : public Node { + const Node *Callee; + NodeArray Args; + +public: + CallExpr(const Node *Callee_, NodeArray Args_, Prec Prec_) + : Node(KCallExpr, Prec_), Callee(Callee_), Args(Args_) {} + + template void match(Fn F) const { + F(Callee, Args, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + Callee->print(OB); + OB.printOpen(); + Args.printWithComma(OB); + OB.printClose(); + } +}; + +class NewExpr : public Node { + // new (expr_list) type(init_list) + NodeArray ExprList; + Node *Type; + NodeArray InitList; + bool IsGlobal; // ::operator new ? + bool IsArray; // new[] ? +public: + NewExpr(NodeArray ExprList_, Node *Type_, NodeArray InitList_, bool IsGlobal_, + bool IsArray_, Prec Prec_) + : Node(KNewExpr, Prec_), ExprList(ExprList_), Type(Type_), + InitList(InitList_), IsGlobal(IsGlobal_), IsArray(IsArray_) {} + + template void match(Fn F) const { + F(ExprList, Type, InitList, IsGlobal, IsArray, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + if (IsGlobal) + OB += "::"; + OB += "new"; + if (IsArray) + OB += "[]"; + if (!ExprList.empty()) { + OB.printOpen(); + ExprList.printWithComma(OB); + OB.printClose(); + } + OB += " "; + Type->print(OB); + if (!InitList.empty()) { + OB.printOpen(); + InitList.printWithComma(OB); + OB.printClose(); + } + } +}; + +class DeleteExpr : public Node { + Node *Op; + bool IsGlobal; + bool IsArray; + +public: + DeleteExpr(Node *Op_, bool IsGlobal_, bool IsArray_, Prec Prec_) + : Node(KDeleteExpr, Prec_), Op(Op_), IsGlobal(IsGlobal_), + IsArray(IsArray_) {} + + template void match(Fn F) const { + F(Op, IsGlobal, IsArray, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + if (IsGlobal) + OB += "::"; + OB += "delete"; + if (IsArray) + OB += "[]"; + OB += ' '; + Op->print(OB); + } +}; + +class PrefixExpr : public Node { + std::string_view Prefix; + Node *Child; + +public: + PrefixExpr(std::string_view Prefix_, Node *Child_, Prec Prec_) + : Node(KPrefixExpr, Prec_), Prefix(Prefix_), Child(Child_) {} + + template void match(Fn F) const { + F(Prefix, Child, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + OB += Prefix; + Child->printAsOperand(OB, getPrecedence()); + } +}; + +class FunctionParam : public Node { + std::string_view Number; + +public: + FunctionParam(std::string_view Number_) + : Node(KFunctionParam), Number(Number_) {} + + template void match(Fn F) const { F(Number); } + + void printLeft(OutputBuffer &OB) const override { + OB += "fp"; + OB += Number; + } +}; + +class ConversionExpr : public Node { + const Node *Type; + NodeArray Expressions; + +public: + ConversionExpr(const Node *Type_, NodeArray Expressions_, Prec Prec_) + : Node(KConversionExpr, Prec_), Type(Type_), Expressions(Expressions_) {} + + template void match(Fn F) const { + F(Type, Expressions, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + OB.printOpen(); + Type->print(OB); + OB.printClose(); + OB.printOpen(); + Expressions.printWithComma(OB); + OB.printClose(); + } +}; + +class PointerToMemberConversionExpr : public Node { + const Node *Type; + const Node *SubExpr; + std::string_view Offset; + +public: + PointerToMemberConversionExpr(const Node *Type_, const Node *SubExpr_, + std::string_view Offset_, Prec Prec_) + : Node(KPointerToMemberConversionExpr, Prec_), Type(Type_), + SubExpr(SubExpr_), Offset(Offset_) {} + + template void match(Fn F) const { + F(Type, SubExpr, Offset, getPrecedence()); + } + + void printLeft(OutputBuffer &OB) const override { + OB.printOpen(); + Type->print(OB); + OB.printClose(); + OB.printOpen(); + SubExpr->print(OB); + OB.printClose(); + } +}; + +class InitListExpr : public Node { + const Node *Ty; + NodeArray Inits; +public: + InitListExpr(const Node *Ty_, NodeArray Inits_) + : Node(KInitListExpr), Ty(Ty_), Inits(Inits_) {} + + template void match(Fn F) const { F(Ty, Inits); } + + void printLeft(OutputBuffer &OB) const override { + if (Ty) + Ty->print(OB); + OB += '{'; + Inits.printWithComma(OB); + OB += '}'; + } +}; + +class BracedExpr : public Node { + const Node *Elem; + const Node *Init; + bool IsArray; +public: + BracedExpr(const Node *Elem_, const Node *Init_, bool IsArray_) + : Node(KBracedExpr), Elem(Elem_), Init(Init_), IsArray(IsArray_) {} + + template void match(Fn F) const { F(Elem, Init, IsArray); } + + void printLeft(OutputBuffer &OB) const override { + if (IsArray) { + OB += '['; + Elem->print(OB); + OB += ']'; + } else { + OB += '.'; + Elem->print(OB); + } + if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr) + OB += " = "; + Init->print(OB); + } +}; + +class BracedRangeExpr : public Node { + const Node *First; + const Node *Last; + const Node *Init; +public: + BracedRangeExpr(const Node *First_, const Node *Last_, const Node *Init_) + : Node(KBracedRangeExpr), First(First_), Last(Last_), Init(Init_) {} + + template void match(Fn F) const { F(First, Last, Init); } + + void printLeft(OutputBuffer &OB) const override { + OB += '['; + First->print(OB); + OB += " ... "; + Last->print(OB); + OB += ']'; + if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr) + OB += " = "; + Init->print(OB); + } +}; + +class FoldExpr : public Node { + const Node *Pack, *Init; + std::string_view OperatorName; + bool IsLeftFold; + +public: + FoldExpr(bool IsLeftFold_, std::string_view OperatorName_, const Node *Pack_, + const Node *Init_) + : Node(KFoldExpr), Pack(Pack_), Init(Init_), OperatorName(OperatorName_), + IsLeftFold(IsLeftFold_) {} + + template void match(Fn F) const { + F(IsLeftFold, OperatorName, Pack, Init); + } + + void printLeft(OutputBuffer &OB) const override { + auto PrintPack = [&] { + OB.printOpen(); + ParameterPackExpansion(Pack).print(OB); + OB.printClose(); + }; + + OB.printOpen(); + // Either '[init op ]... op pack' or 'pack op ...[ op init]' + // Refactored to '[(init|pack) op ]...[ op (pack|init)]' + // Fold expr operands are cast-expressions + if (!IsLeftFold || Init != nullptr) { + // '(init|pack) op ' + if (IsLeftFold) + Init->printAsOperand(OB, Prec::Cast, true); + else + PrintPack(); + OB << " " << OperatorName << " "; + } + OB << "..."; + if (IsLeftFold || Init != nullptr) { + // ' op (init|pack)' + OB << " " << OperatorName << " "; + if (IsLeftFold) + PrintPack(); + else + Init->printAsOperand(OB, Prec::Cast, true); + } + OB.printClose(); + } +}; + +class ThrowExpr : public Node { + const Node *Op; + +public: + ThrowExpr(const Node *Op_) : Node(KThrowExpr), Op(Op_) {} + + template void match(Fn F) const { F(Op); } + + void printLeft(OutputBuffer &OB) const override { + OB += "throw "; + Op->print(OB); + } +}; + +class BoolExpr : public Node { + bool Value; + +public: + BoolExpr(bool Value_) : Node(KBoolExpr), Value(Value_) {} + + template void match(Fn F) const { F(Value); } + + void printLeft(OutputBuffer &OB) const override { + OB += Value ? std::string_view("true") : std::string_view("false"); + } +}; + +class StringLiteral : public Node { + const Node *Type; + +public: + StringLiteral(const Node *Type_) : Node(KStringLiteral), Type(Type_) {} + + template void match(Fn F) const { F(Type); } + + void printLeft(OutputBuffer &OB) const override { + OB += "\"<"; + Type->print(OB); + OB += ">\""; + } +}; + +class LambdaExpr : public Node { + const Node *Type; + +public: + LambdaExpr(const Node *Type_) : Node(KLambdaExpr), Type(Type_) {} + + template void match(Fn F) const { F(Type); } + + void printLeft(OutputBuffer &OB) const override { + OB += "[]"; + if (Type->getKind() == KClosureTypeName) + static_cast(Type)->printDeclarator(OB); + OB += "{...}"; + } +}; + +class EnumLiteral : public Node { + // ty(integer) + const Node *Ty; + std::string_view Integer; + +public: + EnumLiteral(const Node *Ty_, std::string_view Integer_) + : Node(KEnumLiteral), Ty(Ty_), Integer(Integer_) {} + + template void match(Fn F) const { F(Ty, Integer); } + + void printLeft(OutputBuffer &OB) const override { + OB.printOpen(); + Ty->print(OB); + OB.printClose(); + + if (Integer[0] == 'n') + OB << '-' << std::string_view(Integer.data() + 1, Integer.size() - 1); + else + OB << Integer; + } +}; + +class IntegerLiteral : public Node { + std::string_view Type; + std::string_view Value; + +public: + IntegerLiteral(std::string_view Type_, std::string_view Value_) + : Node(KIntegerLiteral), Type(Type_), Value(Value_) {} + + template void match(Fn F) const { F(Type, Value); } + + void printLeft(OutputBuffer &OB) const override { + if (Type.size() > 3) { + OB.printOpen(); + OB += Type; + OB.printClose(); + } + + if (Value[0] == 'n') + OB << '-' << std::string_view(Value.data() + 1, Value.size() - 1); + else + OB += Value; + + if (Type.size() <= 3) + OB += Type; + } +}; + +template struct FloatData; + +namespace float_literal_impl { +constexpr Node::Kind getFloatLiteralKind(float *) { + return Node::KFloatLiteral; +} +constexpr Node::Kind getFloatLiteralKind(double *) { + return Node::KDoubleLiteral; +} +constexpr Node::Kind getFloatLiteralKind(long double *) { + return Node::KLongDoubleLiteral; +} +} + +template class FloatLiteralImpl : public Node { + const std::string_view Contents; + + static constexpr Kind KindForClass = + float_literal_impl::getFloatLiteralKind((Float *)nullptr); + +public: + FloatLiteralImpl(std::string_view Contents_) + : Node(KindForClass), Contents(Contents_) {} + + template void match(Fn F) const { F(Contents); } + + void printLeft(OutputBuffer &OB) const override { + const size_t N = FloatData::mangled_size; + if (Contents.size() >= N) { + union { + Float value; + char buf[sizeof(Float)]; + }; + const char *t = Contents.data(); + const char *last = t + N; + char *e = buf; + for (; t != last; ++t, ++e) { + unsigned d1 = isdigit(*t) ? static_cast(*t - '0') + : static_cast(*t - 'a' + 10); + ++t; + unsigned d0 = isdigit(*t) ? static_cast(*t - '0') + : static_cast(*t - 'a' + 10); + *e = static_cast((d1 << 4) + d0); + } +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + std::reverse(buf, e); +#endif + char num[FloatData::max_demangled_size] = {0}; + int n = snprintf(num, sizeof(num), FloatData::spec, value); + OB += std::string_view(num, n); + } + } +}; + +using FloatLiteral = FloatLiteralImpl; +using DoubleLiteral = FloatLiteralImpl; +using LongDoubleLiteral = FloatLiteralImpl; + +/// Visit the node. Calls \c F(P), where \c P is the node cast to the +/// appropriate derived class. +template +void Node::visit(Fn F) const { + switch (K) { +#define NODE(X) \ + case K##X: \ + return F(static_cast(this)); +#include "ItaniumNodes.def" + } + assert(0 && "unknown mangling node kind"); +} + +/// Determine the kind of a node from its type. +template struct NodeKind; +#define NODE(X) \ + template <> struct NodeKind { \ + static constexpr Node::Kind Kind = Node::K##X; \ + static constexpr const char *name() { return #X; } \ + }; +#include "ItaniumNodes.def" + +template struct AbstractManglingParser { + const char *First; + const char *Last; + + // Name stack, this is used by the parser to hold temporary names that were + // parsed. The parser collapses multiple names into new nodes to construct + // the AST. Once the parser is finished, names.size() == 1. + PODSmallVector Names; + + // Substitution table. Itanium supports name substitutions as a means of + // compression. The string "S42_" refers to the 44nd entry (base-36) in this + // table. + PODSmallVector Subs; + + using TemplateParamList = PODSmallVector; + + class ScopedTemplateParamList { + AbstractManglingParser *Parser; + size_t OldNumTemplateParamLists; + TemplateParamList Params; + + public: + ScopedTemplateParamList(AbstractManglingParser *TheParser) + : Parser(TheParser), + OldNumTemplateParamLists(TheParser->TemplateParams.size()) { + Parser->TemplateParams.push_back(&Params); + } + ~ScopedTemplateParamList() { + assert(Parser->TemplateParams.size() >= OldNumTemplateParamLists); + Parser->TemplateParams.dropBack(OldNumTemplateParamLists); + } + }; + + // Template parameter table. Like the above, but referenced like "T42_". + // This has a smaller size compared to Subs and Names because it can be + // stored on the stack. + TemplateParamList OuterTemplateParams; + + // Lists of template parameters indexed by template parameter depth, + // referenced like "TL2_4_". If nonempty, element 0 is always + // OuterTemplateParams; inner elements are always template parameter lists of + // lambda expressions. For a generic lambda with no explicit template + // parameter list, the corresponding parameter list pointer will be null. + PODSmallVector TemplateParams; + + // Set of unresolved forward references. These can occur in a + // conversion operator's type, and are resolved in the enclosing . + PODSmallVector ForwardTemplateRefs; + + bool TryToParseTemplateArgs = true; + bool PermitForwardTemplateReferences = false; + size_t ParsingLambdaParamsAtLevel = (size_t)-1; + + unsigned NumSyntheticTemplateParameters[3] = {}; + + Alloc ASTAllocator; + + AbstractManglingParser(const char *First_, const char *Last_) + : First(First_), Last(Last_) {} + + Derived &getDerived() { return static_cast(*this); } + + void reset(const char *First_, const char *Last_) { + First = First_; + Last = Last_; + Names.clear(); + Subs.clear(); + TemplateParams.clear(); + ParsingLambdaParamsAtLevel = (size_t)-1; + TryToParseTemplateArgs = true; + PermitForwardTemplateReferences = false; + for (int I = 0; I != 3; ++I) + NumSyntheticTemplateParameters[I] = 0; + ASTAllocator.reset(); + } + + template Node *make(Args &&... args) { + return ASTAllocator.template makeNode(std::forward(args)...); + } + + template NodeArray makeNodeArray(It begin, It end) { + size_t sz = static_cast(end - begin); + void *mem = ASTAllocator.allocateNodeArray(sz); + Node **data = new (mem) Node *[sz]; + std::copy(begin, end, data); + return NodeArray(data, sz); + } + + NodeArray popTrailingNodeArray(size_t FromPosition) { + assert(FromPosition <= Names.size()); + NodeArray res = + makeNodeArray(Names.begin() + (long)FromPosition, Names.end()); + Names.dropBack(FromPosition); + return res; + } + + bool consumeIf(std::string_view S) { + if (llvm::itanium_demangle::starts_with( + std::string_view(First, Last - First), S)) { + First += S.size(); + return true; + } + return false; + } + + bool consumeIf(char C) { + if (First != Last && *First == C) { + ++First; + return true; + } + return false; + } + + char consume() { return First != Last ? *First++ : '\0'; } + + char look(unsigned Lookahead = 0) const { + if (static_cast(Last - First) <= Lookahead) + return '\0'; + return First[Lookahead]; + } + + size_t numLeft() const { return static_cast(Last - First); } + + std::string_view parseNumber(bool AllowNegative = false); + Qualifiers parseCVQualifiers(); + bool parsePositiveInteger(size_t *Out); + std::string_view parseBareSourceName(); + + bool parseSeqId(size_t *Out); + Node *parseSubstitution(); + Node *parseTemplateParam(); + Node *parseTemplateParamDecl(); + Node *parseTemplateArgs(bool TagTemplates = false); + Node *parseTemplateArg(); + + /// Parse the production. + Node *parseExpr(); + Node *parsePrefixExpr(std::string_view Kind, Node::Prec Prec); + Node *parseBinaryExpr(std::string_view Kind, Node::Prec Prec); + Node *parseIntegerLiteral(std::string_view Lit); + Node *parseExprPrimary(); + template Node *parseFloatingLiteral(); + Node *parseFunctionParam(); + Node *parseConversionExpr(); + Node *parseBracedExpr(); + Node *parseFoldExpr(); + Node *parsePointerToMemberConversionExpr(Node::Prec Prec); + Node *parseSubobjectExpr(); + + /// Parse the production. + Node *parseType(); + Node *parseFunctionType(); + Node *parseVectorType(); + Node *parseDecltype(); + Node *parseArrayType(); + Node *parsePointerToMemberType(); + Node *parseClassEnumType(); + Node *parseQualifiedType(); + + Node *parseEncoding(); + bool parseCallOffset(); + Node *parseSpecialName(); + + /// Holds some extra information about a that is being parsed. This + /// information is only pertinent if the refers to an . + struct NameState { + bool CtorDtorConversion = false; + bool EndsWithTemplateArgs = false; + Qualifiers CVQualifiers = QualNone; + FunctionRefQual ReferenceQualifier = FrefQualNone; + size_t ForwardTemplateRefsBegin; + + NameState(AbstractManglingParser *Enclosing) + : ForwardTemplateRefsBegin(Enclosing->ForwardTemplateRefs.size()) {} + }; + + bool resolveForwardTemplateRefs(NameState &State) { + size_t I = State.ForwardTemplateRefsBegin; + size_t E = ForwardTemplateRefs.size(); + for (; I < E; ++I) { + size_t Idx = ForwardTemplateRefs[I]->Index; + if (TemplateParams.empty() || !TemplateParams[0] || + Idx >= TemplateParams[0]->size()) + return true; + ForwardTemplateRefs[I]->Ref = (*TemplateParams[0])[Idx]; + } + ForwardTemplateRefs.dropBack(State.ForwardTemplateRefsBegin); + return false; + } + + /// Parse the production> + Node *parseName(NameState *State = nullptr); + Node *parseLocalName(NameState *State); + Node *parseOperatorName(NameState *State); + bool parseModuleNameOpt(ModuleName *&Module); + Node *parseUnqualifiedName(NameState *State, Node *Scope, ModuleName *Module); + Node *parseUnnamedTypeName(NameState *State); + Node *parseSourceName(NameState *State); + Node *parseUnscopedName(NameState *State, bool *isSubstName); + Node *parseNestedName(NameState *State); + Node *parseCtorDtorName(Node *&SoFar, NameState *State); + + Node *parseAbiTags(Node *N); + + struct OperatorInfo { + enum OIKind : unsigned char { + Prefix, // Prefix unary: @ expr + Postfix, // Postfix unary: expr @ + Binary, // Binary: lhs @ rhs + Array, // Array index: lhs [ rhs ] + Member, // Member access: lhs @ rhs + New, // New + Del, // Delete + Call, // Function call: expr (expr*) + CCast, // C cast: (type)expr + Conditional, // Conditional: expr ? expr : expr + NameOnly, // Overload only, not allowed in expression. + // Below do not have operator names + NamedCast, // Named cast, @(expr) + OfIdOp, // alignof, sizeof, typeid + + Unnameable = NamedCast, + }; + char Enc[2]; // Encoding + OIKind Kind; // Kind of operator + bool Flag : 1; // Entry-specific flag + Node::Prec Prec : 7; // Precedence + const char *Name; // Spelling + + public: + constexpr OperatorInfo(const char (&E)[3], OIKind K, bool F, Node::Prec P, + const char *N) + : Enc{E[0], E[1]}, Kind{K}, Flag{F}, Prec{P}, Name{N} {} + + public: + bool operator<(const OperatorInfo &Other) const { + return *this < Other.Enc; + } + bool operator<(const char *Peek) const { + return Enc[0] < Peek[0] || (Enc[0] == Peek[0] && Enc[1] < Peek[1]); + } + bool operator==(const char *Peek) const { + return Enc[0] == Peek[0] && Enc[1] == Peek[1]; + } + bool operator!=(const char *Peek) const { return !this->operator==(Peek); } + + public: + std::string_view getSymbol() const { + std::string_view Res = Name; + if (Kind < Unnameable) { + assert(llvm::itanium_demangle::starts_with(Res, "operator") && + "operator name does not start with 'operator'"); + Res.remove_prefix(sizeof("operator") - 1); + if (llvm::itanium_demangle::starts_with(Res, ' ')) + Res.remove_prefix(1); + } + return Res; + } + std::string_view getName() const { return Name; } + OIKind getKind() const { return Kind; } + bool getFlag() const { return Flag; } + Node::Prec getPrecedence() const { return Prec; } + }; + static const OperatorInfo Ops[]; + static const size_t NumOps; + const OperatorInfo *parseOperatorEncoding(); + + /// Parse the production. + Node *parseUnresolvedName(bool Global); + Node *parseSimpleId(); + Node *parseBaseUnresolvedName(); + Node *parseUnresolvedType(); + Node *parseDestructorName(); + + /// Top-level entry point into the parser. + Node *parse(); +}; + +const char* parse_discriminator(const char* first, const char* last); + +// ::= // N +// ::= # See Scope Encoding below // Z +// ::= +// ::= +// +// ::= +// ::= +template +Node *AbstractManglingParser::parseName(NameState *State) { + if (look() == 'N') + return getDerived().parseNestedName(State); + if (look() == 'Z') + return getDerived().parseLocalName(State); + + Node *Result = nullptr; + bool IsSubst = false; + + Result = getDerived().parseUnscopedName(State, &IsSubst); + if (!Result) + return nullptr; + + if (look() == 'I') { + // ::= + if (!IsSubst) + // An unscoped-template-name is substitutable. + Subs.push_back(Result); + Node *TA = getDerived().parseTemplateArgs(State != nullptr); + if (TA == nullptr) + return nullptr; + if (State) + State->EndsWithTemplateArgs = true; + Result = make(Result, TA); + } else if (IsSubst) { + // The substitution case must be followed by . + return nullptr; + } + + return Result; +} + +// := Z E [] +// := Z E s [] +// := Z Ed [ ] _ +template +Node *AbstractManglingParser::parseLocalName(NameState *State) { + if (!consumeIf('Z')) + return nullptr; + Node *Encoding = getDerived().parseEncoding(); + if (Encoding == nullptr || !consumeIf('E')) + return nullptr; + + if (consumeIf('s')) { + First = parse_discriminator(First, Last); + auto *StringLitName = make("string literal"); + if (!StringLitName) + return nullptr; + return make(Encoding, StringLitName); + } + + if (consumeIf('d')) { + parseNumber(true); + if (!consumeIf('_')) + return nullptr; + Node *N = getDerived().parseName(State); + if (N == nullptr) + return nullptr; + return make(Encoding, N); + } + + Node *Entity = getDerived().parseName(State); + if (Entity == nullptr) + return nullptr; + First = parse_discriminator(First, Last); + return make(Encoding, Entity); +} + +// ::= +// ::= St # ::std:: +// [*] extension +template +Node * +AbstractManglingParser::parseUnscopedName(NameState *State, + bool *IsSubst) { + + Node *Std = nullptr; + if (consumeIf("St")) { + Std = make("std"); + if (Std == nullptr) + return nullptr; + } + + Node *Res = nullptr; + ModuleName *Module = nullptr; + if (look() == 'S') { + Node *S = getDerived().parseSubstitution(); + if (!S) + return nullptr; + if (S->getKind() == Node::KModuleName) + Module = static_cast(S); + else if (IsSubst && Std == nullptr) { + Res = S; + *IsSubst = true; + } else { + return nullptr; + } + } + + if (Res == nullptr || Std != nullptr) { + Res = getDerived().parseUnqualifiedName(State, Std, Module); + } + + return Res; +} + +// ::= [] L? [] +// ::= [] [] +// ::= [] L? [] +// ::= [] L? [] +// # structured binding declaration +// ::= [] L? DC + E +template +Node *AbstractManglingParser::parseUnqualifiedName( + NameState *State, Node *Scope, ModuleName *Module) { + if (getDerived().parseModuleNameOpt(Module)) + return nullptr; + + consumeIf('L'); + + Node *Result; + if (look() >= '1' && look() <= '9') { + Result = getDerived().parseSourceName(State); + } else if (look() == 'U') { + Result = getDerived().parseUnnamedTypeName(State); + } else if (consumeIf("DC")) { + // Structured binding + size_t BindingsBegin = Names.size(); + do { + Node *Binding = getDerived().parseSourceName(State); + if (Binding == nullptr) + return nullptr; + Names.push_back(Binding); + } while (!consumeIf('E')); + Result = make(popTrailingNodeArray(BindingsBegin)); + } else if (look() == 'C' || look() == 'D') { + // A . + if (Scope == nullptr || Module != nullptr) + return nullptr; + Result = getDerived().parseCtorDtorName(Scope, State); + } else { + Result = getDerived().parseOperatorName(State); + } + + if (Result != nullptr && Module != nullptr) + Result = make(Module, Result); + if (Result != nullptr) + Result = getDerived().parseAbiTags(Result); + if (Result != nullptr && Scope != nullptr) + Result = make(Scope, Result); + + return Result; +} + +// ::= +// ::= +// ::= # passed in by caller +// ::= W +// ::= W P +template +bool AbstractManglingParser::parseModuleNameOpt( + ModuleName *&Module) { + while (consumeIf('W')) { + bool IsPartition = consumeIf('P'); + Node *Sub = getDerived().parseSourceName(nullptr); + if (!Sub) + return true; + Module = + static_cast(make(Module, Sub, IsPartition)); + Subs.push_back(Module); + } + + return false; +} + +// ::= Ut [] _ +// ::= +// +// ::= Ul E [ ] _ +// +// ::= + # Parameter types or "v" if the lambda has no parameters +template +Node * +AbstractManglingParser::parseUnnamedTypeName(NameState *State) { + // refer to the innermost . Clear out any + // outer args that we may have inserted into TemplateParams. + if (State != nullptr) + TemplateParams.clear(); + + if (consumeIf("Ut")) { + std::string_view Count = parseNumber(); + if (!consumeIf('_')) + return nullptr; + return make(Count); + } + if (consumeIf("Ul")) { + ScopedOverride SwapParams(ParsingLambdaParamsAtLevel, + TemplateParams.size()); + ScopedTemplateParamList LambdaTemplateParams(this); + + size_t ParamsBegin = Names.size(); + while (look() == 'T' && + std::string_view("yptn").find(look(1)) != std::string_view::npos) { + Node *T = parseTemplateParamDecl(); + if (!T) + return nullptr; + Names.push_back(T); + } + NodeArray TempParams = popTrailingNodeArray(ParamsBegin); + + // FIXME: If TempParams is empty and none of the function parameters + // includes 'auto', we should remove LambdaTemplateParams from the + // TemplateParams list. Unfortunately, we don't find out whether there are + // any 'auto' parameters until too late in an example such as: + // + // template void f( + // decltype([](decltype([](T v) {}), + // auto) {})) {} + // template void f( + // decltype([](decltype([](T w) {}), + // int) {})) {} + // + // Here, the type of v is at level 2 but the type of w is at level 1. We + // don't find this out until we encounter the type of the next parameter. + // + // However, compilers can't actually cope with the former example in + // practice, and it's likely to be made ill-formed in future, so we don't + // need to support it here. + // + // If we encounter an 'auto' in the function parameter types, we will + // recreate a template parameter scope for it, but any intervening lambdas + // will be parsed in the 'wrong' template parameter depth. + if (TempParams.empty()) + TemplateParams.pop_back(); + + if (!consumeIf("vE")) { + do { + Node *P = getDerived().parseType(); + if (P == nullptr) + return nullptr; + Names.push_back(P); + } while (!consumeIf('E')); + } + NodeArray Params = popTrailingNodeArray(ParamsBegin); + + std::string_view Count = parseNumber(); + if (!consumeIf('_')) + return nullptr; + return make(TempParams, Params, Count); + } + if (consumeIf("Ub")) { + (void)parseNumber(); + if (!consumeIf('_')) + return nullptr; + return make("'block-literal'"); + } + return nullptr; +} + +// ::= +template +Node *AbstractManglingParser::parseSourceName(NameState *) { + size_t Length = 0; + if (parsePositiveInteger(&Length)) + return nullptr; + if (numLeft() < Length || Length == 0) + return nullptr; + std::string_view Name(First, Length); + First += Length; + if (llvm::itanium_demangle::starts_with(Name, "_GLOBAL__N")) + return make("(anonymous namespace)"); + return make(Name); +} + +// Operator encodings +template +const typename AbstractManglingParser< + Derived, Alloc>::OperatorInfo AbstractManglingParser::Ops[] = { + // Keep ordered by encoding + {"aN", OperatorInfo::Binary, false, Node::Prec::Assign, "operator&="}, + {"aS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator="}, + {"aa", OperatorInfo::Binary, false, Node::Prec::AndIf, "operator&&"}, + {"ad", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator&"}, + {"an", OperatorInfo::Binary, false, Node::Prec::And, "operator&"}, + {"at", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary, "alignof "}, + {"aw", OperatorInfo::NameOnly, false, Node::Prec::Primary, + "operator co_await"}, + {"az", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary, "alignof "}, + {"cc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "const_cast"}, + {"cl", OperatorInfo::Call, false, Node::Prec::Postfix, "operator()"}, + {"cm", OperatorInfo::Binary, false, Node::Prec::Comma, "operator,"}, + {"co", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator~"}, + {"cv", OperatorInfo::CCast, false, Node::Prec::Cast, "operator"}, // C Cast + {"dV", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/="}, + {"da", OperatorInfo::Del, /*Ary*/ true, Node::Prec::Unary, + "operator delete[]"}, + {"dc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "dynamic_cast"}, + {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"}, + {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary, + "operator delete"}, + {"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem, + "operator.*"}, + {"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix, + "operator."}, + {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"}, + {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="}, + {"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"}, + {"eq", OperatorInfo::Binary, false, Node::Prec::Equality, "operator=="}, + {"ge", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>="}, + {"gt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator>"}, + {"ix", OperatorInfo::Array, false, Node::Prec::Postfix, "operator[]"}, + {"lS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator<<="}, + {"le", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<="}, + {"ls", OperatorInfo::Binary, false, Node::Prec::Shift, "operator<<"}, + {"lt", OperatorInfo::Binary, false, Node::Prec::Relational, "operator<"}, + {"mI", OperatorInfo::Binary, false, Node::Prec::Assign, "operator-="}, + {"mL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator*="}, + {"mi", OperatorInfo::Binary, false, Node::Prec::Additive, "operator-"}, + {"ml", OperatorInfo::Binary, false, Node::Prec::Multiplicative, + "operator*"}, + {"mm", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator--"}, + {"na", OperatorInfo::New, /*Ary*/ true, Node::Prec::Unary, + "operator new[]"}, + {"ne", OperatorInfo::Binary, false, Node::Prec::Equality, "operator!="}, + {"ng", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator-"}, + {"nt", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator!"}, + {"nw", OperatorInfo::New, /*Ary*/ false, Node::Prec::Unary, "operator new"}, + {"oR", OperatorInfo::Binary, false, Node::Prec::Assign, "operator|="}, + {"oo", OperatorInfo::Binary, false, Node::Prec::OrIf, "operator||"}, + {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"}, + {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="}, + {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"}, + {"pm", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem, + "operator->*"}, + {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"}, + {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"}, + {"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix, + "operator->"}, + {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional, + "operator?"}, + {"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="}, + {"rS", OperatorInfo::Binary, false, Node::Prec::Assign, "operator>>="}, + {"rc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, + "reinterpret_cast"}, + {"rm", OperatorInfo::Binary, false, Node::Prec::Multiplicative, + "operator%"}, + {"rs", OperatorInfo::Binary, false, Node::Prec::Shift, "operator>>"}, + {"sc", OperatorInfo::NamedCast, false, Node::Prec::Postfix, "static_cast"}, + {"ss", OperatorInfo::Binary, false, Node::Prec::Spaceship, "operator<=>"}, + {"st", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Unary, "sizeof "}, + {"sz", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Unary, "sizeof "}, + {"te", OperatorInfo::OfIdOp, /*Type*/ false, Node::Prec::Postfix, + "typeid "}, + {"ti", OperatorInfo::OfIdOp, /*Type*/ true, Node::Prec::Postfix, "typeid "}, +}; +template +const size_t AbstractManglingParser::NumOps = sizeof(Ops) / + sizeof(Ops[0]); + +// If the next 2 chars are an operator encoding, consume them and return their +// OperatorInfo. Otherwise return nullptr. +template +const typename AbstractManglingParser::OperatorInfo * +AbstractManglingParser::parseOperatorEncoding() { + if (numLeft() < 2) + return nullptr; + + // We can't use lower_bound as that can link to symbols in the C++ library, + // and this must remain independant of that. + size_t lower = 0u, upper = NumOps - 1; // Inclusive bounds. + while (upper != lower) { + size_t middle = (upper + lower) / 2; + if (Ops[middle] < First) + lower = middle + 1; + else + upper = middle; + } + if (Ops[lower] != First) + return nullptr; + + First += 2; + return &Ops[lower]; +} + +// ::= See parseOperatorEncoding() +// ::= li # operator "" +// ::= v # vendor extended operator +template +Node * +AbstractManglingParser::parseOperatorName(NameState *State) { + if (const auto *Op = parseOperatorEncoding()) { + if (Op->getKind() == OperatorInfo::CCast) { + // ::= cv # (cast) + ScopedOverride SaveTemplate(TryToParseTemplateArgs, false); + // If we're parsing an encoding, State != nullptr and the conversion + // operators' could have a that refers to some + // s further ahead in the mangled name. + ScopedOverride SavePermit(PermitForwardTemplateReferences, + PermitForwardTemplateReferences || + State != nullptr); + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + if (State) State->CtorDtorConversion = true; + return make(Ty); + } + + if (Op->getKind() >= OperatorInfo::Unnameable) + /* Not a nameable operator. */ + return nullptr; + if (Op->getKind() == OperatorInfo::Member && !Op->getFlag()) + /* Not a nameable MemberExpr */ + return nullptr; + + return make(Op->getName()); + } + + if (consumeIf("li")) { + // ::= li # operator "" + Node *SN = getDerived().parseSourceName(State); + if (SN == nullptr) + return nullptr; + return make(SN); + } + + if (consumeIf('v')) { + // ::= v # vendor extended operator + if (look() >= '0' && look() <= '9') { + First++; + Node *SN = getDerived().parseSourceName(State); + if (SN == nullptr) + return nullptr; + return make(SN); + } + return nullptr; + } + + return nullptr; +} + +// ::= C1 # complete object constructor +// ::= C2 # base object constructor +// ::= C3 # complete object allocating constructor +// extension ::= C4 # gcc old-style "[unified]" constructor +// extension ::= C5 # the COMDAT used for ctors +// ::= D0 # deleting destructor +// ::= D1 # complete object destructor +// ::= D2 # base object destructor +// extension ::= D4 # gcc old-style "[unified]" destructor +// extension ::= D5 # the COMDAT used for dtors +template +Node * +AbstractManglingParser::parseCtorDtorName(Node *&SoFar, + NameState *State) { + if (SoFar->getKind() == Node::KSpecialSubstitution) { + // Expand the special substitution. + SoFar = make( + static_cast(SoFar)); + if (!SoFar) + return nullptr; + } + + if (consumeIf('C')) { + bool IsInherited = consumeIf('I'); + if (look() != '1' && look() != '2' && look() != '3' && look() != '4' && + look() != '5') + return nullptr; + int Variant = look() - '0'; + ++First; + if (State) State->CtorDtorConversion = true; + if (IsInherited) { + if (getDerived().parseName(State) == nullptr) + return nullptr; + } + return make(SoFar, /*IsDtor=*/false, Variant); + } + + if (look() == 'D' && (look(1) == '0' || look(1) == '1' || look(1) == '2' || + look(1) == '4' || look(1) == '5')) { + int Variant = look(1) - '0'; + First += 2; + if (State) State->CtorDtorConversion = true; + return make(SoFar, /*IsDtor=*/true, Variant); + } + + return nullptr; +} + +// ::= N [] [] +// E +// ::= N [] [] +// E +// +// ::= +// ::= +// ::= +// ::= +// ::= # empty +// ::= +// ::= +// [*] extension +// +// := [] M +// +// ::=