Compare commits
103 commits
cd2874731d
...
7996cc4304
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7996cc4304 | ||
|
|
fef22089a5 | ||
|
|
b60310cc26 | ||
|
|
f2c46eadc1 | ||
|
|
7a17fd8c71 | ||
|
|
9423a33fc2 | ||
|
|
afec66f598 | ||
|
|
a022560991 | ||
|
|
11ad71b1e7 | ||
|
|
ddac8c8eb5 | ||
|
|
c062931c9b | ||
|
|
e4122dae1d | ||
|
|
b75e81af5e | ||
|
|
2ed1328c93 | ||
|
|
c70b857c4f | ||
|
|
23566a1f7d | ||
|
|
529b069499 | ||
|
|
9a07bd0570 | ||
|
|
05f6942bef | ||
|
|
70c1e9abed | ||
|
|
69e47bd2c0 | ||
|
|
cdf9b556b2 | ||
|
|
7f5de6bcd6 | ||
|
|
c682306788 | ||
|
|
9d2341eaea | ||
|
|
d720a7b4b4 | ||
|
|
464212393e | ||
|
|
ea209e6dab | ||
|
|
b5f9f8b743 | ||
|
|
a8fc994c0b | ||
|
|
2991bd18ef | ||
|
|
281d7a468e | ||
|
|
12f89745be | ||
|
|
7de5eb6884 | ||
|
|
ac181b756f | ||
|
|
4a833e7206 | ||
|
|
06a08de68a | ||
|
|
f8712e50e6 | ||
|
|
fc63de39dd | ||
|
|
bf25058dbd | ||
|
|
75104b6103 | ||
|
|
0d950195e9 | ||
|
|
04e88ab82c | ||
|
|
f957c36238 | ||
|
|
ee67853636 | ||
|
|
0ff84ef312 | ||
|
|
00e2128fab | ||
|
|
f25582833a | ||
|
|
7758f70833 | ||
|
|
5279e76534 | ||
|
|
270232e8d6 | ||
|
|
d2bef2731c | ||
|
|
b45c78a051 | ||
|
|
40251c2115 | ||
|
|
83cdeed3c4 | ||
|
|
f77c91431f | ||
|
|
213f7b810d | ||
|
|
a11eae425a | ||
|
|
c610b61126 | ||
|
|
963f9981ce | ||
|
|
89dd600790 | ||
|
|
eb57e11f42 | ||
|
|
45eb9cfcee | ||
|
|
0a687b82d4 | ||
|
|
80d6172084 | ||
|
|
d8b2971a2e | ||
|
|
12157214b6 | ||
|
|
0574d7d2c9 | ||
|
|
d64f7dfe5c | ||
|
|
2d27359074 | ||
|
|
978ba3ed6f | ||
|
|
f1e9e846f1 | ||
|
|
097ccf830d | ||
|
|
fecf763a51 | ||
|
|
a12eb5fef6 | ||
|
|
4014b45cb6 | ||
|
|
2082ba7ec7 | ||
|
|
bfc720152a | ||
|
|
b6238d6df7 | ||
|
|
f94bae10f2 | ||
|
|
d19303883e | ||
|
|
5ee81a4932 | ||
|
|
4f29128e50 | ||
|
|
f76dc401c3 | ||
|
|
732b7eb560 | ||
|
|
93eecca894 | ||
|
|
d5aa10d572 | ||
|
|
308a995275 | ||
|
|
f8145152c7 | ||
|
|
c9c136bea7 | ||
|
|
6f9d025ad2 | ||
|
|
ab129cf314 | ||
|
|
72b3f3a8a5 | ||
|
|
5fb3ae487c | ||
|
|
86e02aceba | ||
|
|
50ec0892c6 | ||
|
|
f4e7fc91ba | ||
|
|
45c9f9bbb3 | ||
|
|
8e373eb714 | ||
|
|
75ebfaa090 | ||
|
|
e3035ae8f2 | ||
|
|
bcd22d9f8b | ||
|
|
4e7c036c7e |
1
.gitignore
vendored
|
|
@ -63,3 +63,4 @@ artifacts
|
||||||
*.AppImage*
|
*.AppImage*
|
||||||
/install*
|
/install*
|
||||||
vulkansdk*.exe
|
vulkansdk*.exe
|
||||||
|
*.tar.zst
|
||||||
|
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
diff --git a/library/aesni.h b/library/aesni.h
|
|
||||||
index 754c984c79..59e27afd3e 100644
|
|
||||||
--- a/library/aesni.h
|
|
||||||
+++ b/library/aesni.h
|
|
||||||
@@ -35,7 +35,7 @@
|
|
||||||
/* GCC-like compilers: currently, we only support intrinsics if the requisite
|
|
||||||
* target flag is enabled when building the library (e.g. `gcc -mpclmul -msse2`
|
|
||||||
* or `clang -maes -mpclmul`). */
|
|
||||||
-#if (defined(__GNUC__) || defined(__clang__)) && defined(__AES__) && defined(__PCLMUL__)
|
|
||||||
+#if defined(__GNUC__) || defined(__clang__)
|
|
||||||
#define MBEDTLS_AESNI_HAVE_INTRINSICS
|
|
||||||
#endif
|
|
||||||
/* For 32-bit, we only support intrinsics */
|
|
||||||
diff --git a/library/aesni.c b/library/aesni.c
|
|
||||||
index 2857068..3e104ab 100644
|
|
||||||
--- a/library/aesni.c
|
|
||||||
+++ b/library/aesni.c
|
|
||||||
@@ -31,16 +31,14 @@
|
|
||||||
#include <immintrin.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#if defined(MBEDTLS_ARCH_IS_X86)
|
|
||||||
#if defined(MBEDTLS_COMPILER_IS_GCC)
|
|
||||||
#pragma GCC push_options
|
|
||||||
#pragma GCC target ("pclmul,sse2,aes")
|
|
||||||
#define MBEDTLS_POP_TARGET_PRAGMA
|
|
||||||
-#elif defined(__clang__) && (__clang_major__ >= 5)
|
|
||||||
+#elif defined(__clang__)
|
|
||||||
#pragma clang attribute push (__attribute__((target("pclmul,sse2,aes"))), apply_to=function)
|
|
||||||
#define MBEDTLS_POP_TARGET_PRAGMA
|
|
||||||
#endif
|
|
||||||
-#endif
|
|
||||||
|
|
||||||
#if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY)
|
|
||||||
/*
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
diff --git a/library/common.h b/library/common.h
|
|
||||||
index 50f2a29..c60d9dc 100644
|
|
||||||
--- a/library/common.h
|
|
||||||
+++ b/library/common.h
|
|
||||||
@@ -19,11 +19,11 @@
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
-#if defined(__ARM_NEON)
|
|
||||||
-#include <arm_neon.h>
|
|
||||||
+#if defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
|
|
||||||
+#include <arm64_neon.h>
|
|
||||||
#define MBEDTLS_HAVE_NEON_INTRINSICS
|
|
||||||
-#elif defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
|
|
||||||
-#include <arm64_neon.h>
|
|
||||||
+#elif (defined(__ANDROID__) && defined(__ARM_FP)) || defined(__ARM_NEON)
|
|
||||||
+#include <arm_neon.h>
|
|
||||||
#define MBEDTLS_HAVE_NEON_INTRINSICS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
234
CMakeLists.txt
|
|
@ -49,35 +49,28 @@ if (YUZU_STATIC_ROOM)
|
||||||
|
|
||||||
# disable e v e r y t h i n g
|
# disable e v e r y t h i n g
|
||||||
set(ENABLE_QT OFF)
|
set(ENABLE_QT OFF)
|
||||||
set(ENABLE_SDL2 OFF)
|
|
||||||
set(YUZU_CMD OFF)
|
set(YUZU_CMD OFF)
|
||||||
set(ENABLE_CUBEB OFF)
|
set(ENABLE_CUBEB OFF)
|
||||||
set(ENABLE_UPDATE_CHECKER OFF)
|
set(ENABLE_UPDATE_CHECKER OFF)
|
||||||
set(USE_DISCORD_PRESENCE OFF)
|
set(USE_DISCORD_PRESENCE OFF)
|
||||||
set(BUILD_TESTING OFF)
|
set(BUILD_TESTING OFF)
|
||||||
set(ENABLE_OPENSSL OFF)
|
|
||||||
set(ENABLE_WEB_SERVICE OFF)
|
set(ENABLE_WEB_SERVICE OFF)
|
||||||
set(ENABLE_LIBUSB OFF)
|
set(ENABLE_LIBUSB OFF)
|
||||||
|
|
||||||
# allow static libs for boost and mbedtls though
|
# allow static libs for boost though
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
set(MBEDTLS_LIB_SUFFIX "_static")
|
set(OPENSSL_USE_STATIC_LIBS ON)
|
||||||
set(YUZU_USE_CPM ON)
|
|
||||||
|
|
||||||
set(zstd_FORCE_BUNDLED ON)
|
set(zstd_FORCE_BUNDLED ON)
|
||||||
set(fmt_FORCE_BUNDLED ON)
|
set(fmt_FORCE_BUNDLED ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# common network mbedtls
|
|
||||||
# common: xbyak? booost fmt lz4 zstd
|
|
||||||
# network: enet boost
|
|
||||||
|
|
||||||
# qt stuff
|
# qt stuff
|
||||||
option(ENABLE_QT "Enable the Qt frontend" ON)
|
option(ENABLE_QT "Enable the Qt frontend" ON)
|
||||||
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
||||||
option(ENABLE_UPDATE_CHECKER "Enable update checker (for Qt and Android)" OFF)
|
option(ENABLE_UPDATE_CHECKER "Enable update checker (for Qt and Android)" OFF)
|
||||||
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
|
cmake_dependent_option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF "NOT YUZU_USE_BUNDLED_QT" OFF)
|
||||||
cmake_dependent_option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF "NOT YUZU_USE_BUNDLED_QT" OFF)
|
cmake_dependent_option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF "NOT YUZU_USE_BUNDLED_QT" OFF)
|
||||||
set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries")
|
set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries")
|
||||||
cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
||||||
|
|
@ -130,12 +123,7 @@ if (YUZU_STATIC_BUILD)
|
||||||
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
||||||
|
|
||||||
set(HTTPLIB_USE_BROTLI_IF_AVAILABLE OFF)
|
set(HTTPLIB_USE_BROTLI_IF_AVAILABLE OFF)
|
||||||
|
|
||||||
## some libraries define a Library::Name_static alternative ##
|
|
||||||
set(MBEDTLS_LIB_SUFFIX _static)
|
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
set(YUZU_USE_CPM ON)
|
|
||||||
|
|
||||||
set(YUZU_USE_BUNDLED_FFMPEG ON)
|
set(YUZU_USE_BUNDLED_FFMPEG ON)
|
||||||
set(YUZU_USE_BUNDLED_SDL2 ON)
|
set(YUZU_USE_BUNDLED_SDL2 ON)
|
||||||
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
||||||
|
|
@ -145,7 +133,6 @@ if (YUZU_STATIC_BUILD)
|
||||||
set(SPIRV-Tools_FORCE_BUNDLED ON)
|
set(SPIRV-Tools_FORCE_BUNDLED ON)
|
||||||
set(SPIRV-Headers_FORCE_BUNDLED ON)
|
set(SPIRV-Headers_FORCE_BUNDLED ON)
|
||||||
set(zstd_FORCE_BUNDLED ON)
|
set(zstd_FORCE_BUNDLED ON)
|
||||||
set(MbedTLS_FORCE_BUNDLED ON)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
@ -183,13 +170,9 @@ if (MSVC AND NOT CXX_CLANG)
|
||||||
set(CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS_INIT} /W3 /WX-")
|
set(CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS_INIT} /W3 /WX-")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Set bundled sdl2/qt as dependent options.
|
|
||||||
# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion
|
|
||||||
cmake_dependent_option(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF)
|
|
||||||
|
|
||||||
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
||||||
cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Build SDL2 from external source" OFF "ENABLE_SDL2;NOT MSVC" OFF)
|
cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Build SDL2 from external source" OFF "NOT MSVC;NOT ANDROID" OFF)
|
||||||
cmake_dependent_option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}" "ENABLE_SDL2" OFF)
|
cmake_dependent_option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}" "NOT ANDROID" OFF)
|
||||||
|
|
||||||
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
||||||
|
|
||||||
|
|
@ -198,8 +181,6 @@ if (MSVC OR ANDROID)
|
||||||
set(EXT_DEFAULT ON)
|
set(EXT_DEFAULT ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${EXT_DEFAULT})
|
|
||||||
|
|
||||||
# ffmpeg
|
# ffmpeg
|
||||||
option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT})
|
option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT})
|
||||||
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from external source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF)
|
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from external source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF)
|
||||||
|
|
@ -234,7 +215,7 @@ option(NIGHTLY_BUILD "Use Nightly qualifiers in the update checker and build met
|
||||||
cmake_dependent_option(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF)
|
cmake_dependent_option(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF)
|
||||||
cmake_dependent_option(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF)
|
cmake_dependent_option(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF)
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_CMD "Compile the eden-cli executable" ON "ENABLE_SDL2;NOT ANDROID" OFF)
|
cmake_dependent_option(YUZU_CMD "Compile the eden-cli executable" ON "NOT ANDROID" OFF)
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR PLATFORM_LINUX" OFF)
|
cmake_dependent_option(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR PLATFORM_LINUX" OFF)
|
||||||
|
|
||||||
|
|
@ -245,30 +226,12 @@ cmake_dependent_option(YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib"
|
||||||
|
|
||||||
option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF)
|
option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF)
|
||||||
|
|
||||||
set(DEFAULT_ENABLE_OPENSSL ON)
|
|
||||||
if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN OR PLATFORM_OPENBSD)
|
|
||||||
# - 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.
|
|
||||||
# - Solaris and OpenBSD have too old backends
|
|
||||||
# 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()
|
|
||||||
|
|
||||||
if (ENABLE_WEB_SERVICE OR USE_DISCORD_PRESENCE)
|
|
||||||
set(DEFAULT_ENABLE_OPENSSL ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL})
|
|
||||||
|
|
||||||
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF)
|
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF)
|
||||||
if (EXT_DEFAULT OR PLATFORM_SUN OR PLATFORM_OPENBSD)
|
if (EXT_DEFAULT OR PLATFORM_SUN OR PLATFORM_OPENBSD)
|
||||||
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON)
|
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL} "ENABLE_OPENSSL" OFF)
|
option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL})
|
||||||
|
|
||||||
if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL)
|
if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL)
|
||||||
AddJsonPackage(vulkan-validation-layers)
|
AddJsonPackage(vulkan-validation-layers)
|
||||||
|
|
@ -396,123 +359,94 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
||||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
# openssl funniness
|
find_package(RenderDoc MODULE)
|
||||||
if (ENABLE_OPENSSL)
|
|
||||||
if (YUZU_USE_BUNDLED_OPENSSL)
|
|
||||||
set(BUILD_SHARED_LIBS OFF)
|
|
||||||
AddJsonPackage(openssl)
|
|
||||||
if (OpenSSL_ADDED)
|
|
||||||
add_compile_definitions(YUZU_BUNDLED_OPENSSL)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(OpenSSL 1.1.1 REQUIRED)
|
# openssl funniness
|
||||||
|
if (YUZU_USE_BUNDLED_OPENSSL)
|
||||||
|
set(BUILD_SHARED_LIBS OFF)
|
||||||
|
AddJsonPackage(openssl)
|
||||||
|
if (OpenSSL_ADDED)
|
||||||
|
add_compile_definitions(YUZU_BUNDLED_OPENSSL)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (YUZU_USE_CPM)
|
find_package(OpenSSL 3 REQUIRED)
|
||||||
message(STATUS "Fetching needed dependencies with CPM")
|
|
||||||
|
|
||||||
set(BUILD_SHARED_LIBS OFF)
|
message(STATUS "Fetching needed dependencies with CPM")
|
||||||
set(BUILD_TESTING OFF)
|
|
||||||
set(ENABLE_TESTING OFF)
|
|
||||||
|
|
||||||
# TODO(crueter): renderdoc?
|
set(BUILD_SHARED_LIBS OFF)
|
||||||
|
set(BUILD_TESTING OFF)
|
||||||
|
set(ENABLE_TESTING OFF)
|
||||||
|
|
||||||
# boost
|
# boost
|
||||||
set(BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant)
|
set(BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant)
|
||||||
|
|
||||||
AddJsonPackage(boost)
|
AddJsonPackage(boost)
|
||||||
|
|
||||||
# really annoying thing where boost::headers doesn't work with cpm
|
# really annoying thing where boost::headers doesn't work with cpm
|
||||||
# TODO(crueter) investigate
|
# TODO(crueter) investigate
|
||||||
set(BOOST_NO_HEADERS ${Boost_ADDED})
|
set(BOOST_NO_HEADERS ${Boost_ADDED})
|
||||||
|
|
||||||
if (Boost_ADDED)
|
if (Boost_ADDED)
|
||||||
if (MSVC OR ANDROID)
|
if (MSVC OR ANDROID)
|
||||||
add_compile_definitions(YUZU_BOOST_v1)
|
add_compile_definitions(YUZU_BOOST_v1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT MSVC OR CXX_CLANG)
|
||||||
|
# boost sucks
|
||||||
|
if (PLATFORM_SUN)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthreads")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT MSVC OR CXX_CLANG)
|
target_compile_options(boost_heap INTERFACE -Wno-shadow)
|
||||||
# boost sucks
|
target_compile_options(boost_icl INTERFACE -Wno-shadow)
|
||||||
if (PLATFORM_SUN)
|
target_compile_options(boost_asio INTERFACE -Wno-conversion -Wno-implicit-fallthrough)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads")
|
endif()
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthreads")
|
endif()
|
||||||
endif()
|
|
||||||
|
|
||||||
target_compile_options(boost_heap INTERFACE -Wno-shadow)
|
# fmt
|
||||||
target_compile_options(boost_icl INTERFACE -Wno-shadow)
|
AddJsonPackage(fmt)
|
||||||
target_compile_options(boost_asio INTERFACE -Wno-conversion -Wno-implicit-fallthrough)
|
|
||||||
|
# lz4
|
||||||
|
AddJsonPackage(lz4)
|
||||||
|
|
||||||
|
if (lz4_ADDED)
|
||||||
|
add_library(lz4::lz4 ALIAS lz4_static)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# zstd
|
||||||
|
AddJsonPackage(zstd)
|
||||||
|
|
||||||
|
if (zstd_ADDED)
|
||||||
|
add_library(zstd::zstd ALIAS libzstd_static)
|
||||||
|
add_library(zstd::libzstd ALIAS libzstd_static)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT YUZU_STATIC_ROOM)
|
||||||
|
# nlohmann
|
||||||
|
AddJsonPackage(nlohmann)
|
||||||
|
|
||||||
|
# zlib
|
||||||
|
AddJsonPackage(zlib)
|
||||||
|
|
||||||
|
if (ZLIB_ADDED)
|
||||||
|
add_library(ZLIB::ZLIB ALIAS zlibstatic)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Opus
|
||||||
|
AddJsonPackage(opus)
|
||||||
|
|
||||||
|
if (Opus_ADDED)
|
||||||
|
if (MSVC AND CXX_CLANG)
|
||||||
|
target_compile_options(opus PRIVATE
|
||||||
|
-Wno-implicit-function-declaration
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# fmt
|
if (NOT TARGET Opus::opus)
|
||||||
AddJsonPackage(fmt)
|
add_library(Opus::opus ALIAS opus)
|
||||||
|
|
||||||
# lz4
|
|
||||||
AddJsonPackage(lz4)
|
|
||||||
|
|
||||||
if (lz4_ADDED)
|
|
||||||
add_library(lz4::lz4 ALIAS lz4_static)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# zstd
|
|
||||||
AddJsonPackage(zstd)
|
|
||||||
|
|
||||||
if (zstd_ADDED)
|
|
||||||
add_library(zstd::zstd ALIAS libzstd_static)
|
|
||||||
add_library(zstd::libzstd ALIAS libzstd_static)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT YUZU_STATIC_ROOM)
|
|
||||||
# nlohmann
|
|
||||||
AddJsonPackage(nlohmann)
|
|
||||||
|
|
||||||
# zlib
|
|
||||||
AddJsonPackage(zlib)
|
|
||||||
|
|
||||||
if (ZLIB_ADDED)
|
|
||||||
add_library(ZLIB::ZLIB ALIAS zlibstatic)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Opus
|
|
||||||
AddJsonPackage(opus)
|
|
||||||
|
|
||||||
if (Opus_ADDED)
|
|
||||||
if (MSVC AND CXX_CLANG)
|
|
||||||
target_compile_options(opus PRIVATE
|
|
||||||
-Wno-implicit-function-declaration
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT TARGET Opus::opus)
|
|
||||||
add_library(Opus::opus ALIAS opus)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
# TODO: we can probably just use CPM for this... right?
|
|
||||||
# Enforce the search mode of non-required packages for better and shorter failure messages
|
|
||||||
find_package(fmt 8 REQUIRED)
|
|
||||||
|
|
||||||
if (NOT YUZU_DISABLE_LLVM)
|
|
||||||
find_package(LLVM MODULE COMPONENTS Demangle)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(nlohmann_json 3.8 REQUIRED)
|
|
||||||
find_package(lz4 REQUIRED)
|
|
||||||
find_package(RenderDoc MODULE)
|
|
||||||
find_package(stb MODULE)
|
|
||||||
|
|
||||||
find_package(Opus 1.3 MODULE REQUIRED)
|
|
||||||
|
|
||||||
find_package(ZLIB 1.2 REQUIRED)
|
|
||||||
find_package(zstd 1.5 REQUIRED MODULE)
|
|
||||||
|
|
||||||
# wow
|
|
||||||
find_package(Boost 1.57.0 CONFIG REQUIRED OPTIONAL_COMPONENTS headers context system fiber filesystem)
|
|
||||||
|
|
||||||
if (ENABLE_OPENSSL)
|
|
||||||
find_package(OpenSSL 1.1.1 REQUIRED)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
@ -574,8 +508,8 @@ message(STATUS "Platform Libraries: ${PLATFORM_LIBRARIES}")
|
||||||
add_subdirectory(externals)
|
add_subdirectory(externals)
|
||||||
|
|
||||||
# pass targets from externals
|
# pass targets from externals
|
||||||
|
# TODO(crueter): CPMUtil Propagate func?
|
||||||
find_package(enet)
|
find_package(enet)
|
||||||
find_package(MbedTLS)
|
|
||||||
find_package(unordered_dense REQUIRED)
|
find_package(unordered_dense REQUIRED)
|
||||||
|
|
||||||
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
||||||
|
|
@ -605,7 +539,7 @@ if (NOT YUZU_STATIC_ROOM)
|
||||||
find_package(oaknut)
|
find_package(oaknut)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_SDL2)
|
if (NOT ANDROID)
|
||||||
find_package(SDL2)
|
find_package(SDL2)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
@ -641,7 +575,7 @@ if (ENABLE_QT)
|
||||||
list(APPEND CMAKE_PREFIX_PATH "${Qt6_DIR}")
|
list(APPEND CMAKE_PREFIX_PATH "${Qt6_DIR}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(Qt6 CONFIG REQUIRED COMPONENTS Widgets Concurrent)
|
find_package(Qt6 CONFIG REQUIRED COMPONENTS Widgets Charts Concurrent)
|
||||||
|
|
||||||
if (YUZU_USE_QT_MULTIMEDIA)
|
if (YUZU_USE_QT_MULTIMEDIA)
|
||||||
find_package(Qt6 REQUIRED COMPONENTS Multimedia)
|
find_package(Qt6 REQUIRED COMPONENTS Multimedia)
|
||||||
|
|
@ -680,7 +614,7 @@ if (ENABLE_QT)
|
||||||
## Components ##
|
## Components ##
|
||||||
|
|
||||||
# Best practice is to ask for all components at once, so they are from the same version
|
# Best practice is to ask for all components at once, so they are from the same version
|
||||||
set(YUZU_QT_COMPONENTS Core Widgets Concurrent)
|
set(YUZU_QT_COMPONENTS Core Widgets Charts Concurrent)
|
||||||
if (PLATFORM_LINUX)
|
if (PLATFORM_LINUX)
|
||||||
list(APPEND YUZU_QT_COMPONENTS DBus)
|
list(APPEND YUZU_QT_COMPONENTS DBus)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -36,14 +36,17 @@ set(GIT_DESC ${BUILD_VERSION})
|
||||||
# Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well
|
# Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well
|
||||||
|
|
||||||
# Auto-updater metadata! Must somewhat mirror GitHub API endpoint
|
# Auto-updater metadata! Must somewhat mirror GitHub API endpoint
|
||||||
set(BUILD_AUTO_UPDATE_WEBSITE "https://github.com")
|
|
||||||
set(BUILD_AUTO_UPDATE_API "http://api.github.com")
|
|
||||||
|
|
||||||
if (NIGHTLY_BUILD)
|
if (NIGHTLY_BUILD)
|
||||||
|
set(BUILD_AUTO_UPDATE_WEBSITE "https://github.com")
|
||||||
|
set(BUILD_AUTO_UPDATE_API "api.github.com")
|
||||||
|
set(BUILD_AUTO_UPDATE_API_PATH "/repos/")
|
||||||
set(BUILD_AUTO_UPDATE_REPO "Eden-CI/Nightly")
|
set(BUILD_AUTO_UPDATE_REPO "Eden-CI/Nightly")
|
||||||
set(REPO_NAME "Eden Nightly")
|
set(REPO_NAME "Eden Nightly")
|
||||||
else()
|
else()
|
||||||
set(BUILD_AUTO_UPDATE_REPO "eden-emulator/Releases")
|
set(BUILD_AUTO_UPDATE_WEBSITE "https://git.eden-emu.dev")
|
||||||
|
set(BUILD_AUTO_UPDATE_API "git.eden-emu.dev")
|
||||||
|
set(BUILD_AUTO_UPDATE_API_PATH "/api/v1/repos/")
|
||||||
|
set(BUILD_AUTO_UPDATE_REPO "eden-emu/eden")
|
||||||
set(REPO_NAME "Eden")
|
set(REPO_NAME "Eden")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
||||||
10
README.md
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
<h1 align="center">
|
<h1 align="center">
|
||||||
<br>
|
<br>
|
||||||
<a href="https://git.eden-emu.dev/eden-emu/eden"><img src="./dist/qt_themes/default/icons/256x256/eden_named.png" alt="Eden" width="200"></a>
|
<a href="https://git.eden-emu.dev/eden-emu/eden"><img src="./dist/qt_themes/default/icons/256x256/eden.png" alt="Eden" width="200"></a>
|
||||||
<br>
|
<br>
|
||||||
<b>Eden</b>
|
<b>Eden</b>
|
||||||
<br>
|
<br>
|
||||||
|
|
@ -61,6 +61,10 @@ See the [sign-up instructions](docs/SIGNUP.md) for information on registration.
|
||||||
|
|
||||||
Alternatively, if you wish to add translations, go to the [Eden project on Transifex](https://app.transifex.com/edenemu/eden-emulator) and review [the translations README](./dist/languages).
|
Alternatively, if you wish to add translations, go to the [Eden project on Transifex](https://app.transifex.com/edenemu/eden-emulator) and review [the translations README](./dist/languages).
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
We have a user manual! See our [User Handbook](./docs/user/README.md).
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
See the [General Build Guide](docs/Build.md)
|
See the [General Build Guide](docs/Build.md)
|
||||||
|
|
@ -69,7 +73,9 @@ For information on provided development tooling, see the [Tools directory](./too
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
You can download the latest releases from [here](https://github.com/eden-emulator/Releases/releases).
|
You can download the latest releases from [here](https://git.eden-emu.dev/eden-emu/eden/releases).
|
||||||
|
|
||||||
|
Save us some bandwidth! We have [mirrors available](./docs/user/ThirdParty.md#mirrors) as well.
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
"name": "openssl",
|
"name": "openssl",
|
||||||
"repo": "crueter-ci/OpenSSL",
|
"repo": "crueter-ci/OpenSSL",
|
||||||
"version": "3.6.0-1cb0d36b39",
|
"version": "3.6.0-1cb0d36b39",
|
||||||
"min_version": "1.1.1"
|
"min_version": "3"
|
||||||
},
|
},
|
||||||
"boost": {
|
"boost": {
|
||||||
"package": "Boost",
|
"package": "Boost",
|
||||||
|
|
|
||||||
111
dist/dev.eden_emu.eden.svg
vendored
|
|
@ -6,8 +6,8 @@
|
||||||
viewBox="0 0 512 512"
|
viewBox="0 0 512 512"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg7"
|
id="svg7"
|
||||||
sodipodi:docname="EdenLogoLoveWhiteV3.svg"
|
sodipodi:docname="saintpatrick2026_named.svg"
|
||||||
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
inkscape:export-filename="dev.eden_emu.eden.png"
|
inkscape:export-filename="dev.eden_emu.eden.png"
|
||||||
inkscape:export-xdpi="96"
|
inkscape:export-xdpi="96"
|
||||||
|
|
@ -47,20 +47,12 @@
|
||||||
style="stop-color:#66003b;stop-opacity:1;"
|
style="stop-color:#66003b;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop14" /></linearGradient><linearGradient
|
id="stop14" /></linearGradient><linearGradient
|
||||||
id="linearGradient1"
|
|
||||||
inkscape:collect="always"><stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:0.50980395;"
|
|
||||||
offset="0"
|
|
||||||
id="stop1" /><stop
|
|
||||||
style="stop-color:#000000;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop2" /></linearGradient><linearGradient
|
|
||||||
id="linearGradient11"
|
id="linearGradient11"
|
||||||
inkscape:collect="always"><stop
|
inkscape:collect="always"><stop
|
||||||
style="stop-color:#9523a7;stop-opacity:0.50980395;"
|
style="stop-color:#f6d512;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop11" /><stop
|
id="stop11" /><stop
|
||||||
style="stop-color:#ffabad;stop-opacity:1;"
|
style="stop-color:#1d8e53;stop-opacity:1;"
|
||||||
offset="0.99898213"
|
offset="0.99898213"
|
||||||
id="stop20" /><stop
|
id="stop20" /><stop
|
||||||
style="stop-color:#ffffff;stop-opacity:0;"
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
|
@ -75,16 +67,7 @@
|
||||||
y2="427.85461"
|
y2="427.85461"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
spreadMethod="reflect"
|
spreadMethod="reflect"
|
||||||
gradientTransform="matrix(1.0945321,0,0,1.0945321,-39.661525,-35.159057)" /><linearGradient
|
gradientTransform="matrix(1.0945321,0,0,1.0945321,-39.661525,-35.159057)" /><filter
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient1"
|
|
||||||
id="linearGradient2"
|
|
||||||
x1="125.40197"
|
|
||||||
y1="271.834"
|
|
||||||
x2="431.02424"
|
|
||||||
y2="271.834"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(1.0964243,0,0,1.0253208,-40.187969,-20.060025)" /><filter
|
|
||||||
inkscape:label="Light Contour"
|
inkscape:label="Light Contour"
|
||||||
inkscape:menu="Image Paint and Draw"
|
inkscape:menu="Image Paint and Draw"
|
||||||
inkscape:menu-tooltip="Uses vertical specular light to draw lines"
|
inkscape:menu-tooltip="Uses vertical specular light to draw lines"
|
||||||
|
|
@ -158,13 +141,13 @@
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pagecheckerboard="0"
|
inkscape:pagecheckerboard="0"
|
||||||
inkscape:deskcolor="#d1d1d1"
|
inkscape:deskcolor="#d1d1d1"
|
||||||
inkscape:zoom="1.35"
|
inkscape:zoom="0.6363961"
|
||||||
inkscape:cx="254.81481"
|
inkscape:cx="172.06265"
|
||||||
inkscape:cy="260.37037"
|
inkscape:cy="122.56518"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1600"
|
||||||
inkscape:window-height="1001"
|
inkscape:window-height="849"
|
||||||
inkscape:window-x="-9"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="-9"
|
inkscape:window-y="27"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:current-layer="svg7"
|
inkscape:current-layer="svg7"
|
||||||
showguides="false" /><circle
|
showguides="false" /><circle
|
||||||
|
|
@ -174,38 +157,40 @@
|
||||||
cy="257.2999"
|
cy="257.2999"
|
||||||
r="248.67769" /><path
|
r="248.67769" /><path
|
||||||
id="path15"
|
id="path15"
|
||||||
style="fill:url(#linearGradient2);fill-opacity:1;stroke:#ffffff;stroke-width:16.9642;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.52156866;paint-order:stroke fill markers"
|
style="fill:#f3ffeb;fill-opacity:1;stroke:#ffffff;stroke-width:16.9642;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.33910036;paint-order:stroke fill markers"
|
||||||
d="m 306.72111,24.233031 c 0,0 -11.98397,40.08696 -18.0546,60.431848 -12.96613,9.503601 -21.49377,18.397701 -21.49377,18.397701 0,0 -23.41313,-31.029398 -45.74145,-43.934598 -22.32833,-12.905201 -52.42065,-11.242483 -52.42065,-11.242483 0,0 -12.50052,4e-4 -27.63117,5.537132 -15.13066,5.536732 -21.27107,9.227888 -21.27107,9.227888 0,0 15.35165,-0.410529 37.93799,6.766716 22.58635,7.177243 32.45374,11.484796 32.45374,11.484796 l 31.02752,-6.562453 -8.44161,11.074275 c 0,0 14.80259,8.920284 22.80648,16.917787 8.0039,7.9975 11.73088,12.50812 11.73088,12.50812 0,0 -13.92373,-5.43341 -56.68427,-1.74226 -42.76055,3.69116 -84.86368,56.39265 -84.86368,56.39265 0,0 41.22428,-15.9958 65.5649,-21.32747 24.34062,-5.33166 47.58524,-7.9983 47.58524,-7.9983 0,0 -18.41865,7.3827 -38.15428,38.3474 -19.73564,30.96468 -14.0351,80.18128 -14.0351,80.18128 0,0 31.35774,-59.05848 61.39977,-78.94969 30.04203,-19.89124 36.182,-20.50642 36.182,-20.50642 0,0 -24.1209,48.39514 -33.55015,126.11445 -9.42924,77.71931 30.26089,207.72959 30.26089,207.72959 l 47.80367,-6.97298 c 0,0 -45.61041,-42.24281 -49.55753,-151.33695 -3.94713,-109.09413 16.66479,-174.30453 16.66479,-174.30453 0,0 17.10508,1.23039 42.54213,32.81027 25.43704,31.57987 40.34713,57.41795 40.34713,57.41795 0,0 9.65024,-51.26683 -11.4011,-74.64415 -21.05135,-23.3773 -53.50637,-33.62931 -53.50637,-33.62931 0,0 13.70573,-6.66419 42.10313,-4.71609 28.39738,1.94813 87.30278,27.12897 87.30278,27.12896 0,0 -15.8158,-25.5214 -52.87463,-43.21167 -37.05881,-17.69028 -81.35597,0.29238 -81.35597,0.29238 0,0 4.13589,-15.37277 29.10021,-32.628037 24.96432,-17.25527 56.907,-34.36427 56.907,-34.36427 0,0 -26.3595,1.160335 -55.20025,12.035504 -7.176,2.7059 -14.064,6.299542 -20.36309,10.173104 l 17.40574,-51.051762 z" /><path
|
d="m 306.72111,24.233031 c 0,0 -11.98397,40.08696 -18.0546,60.431848 -12.96613,9.503601 -21.49377,18.397701 -21.49377,18.397701 0,0 -23.41313,-31.029398 -45.74145,-43.934598 -22.32833,-12.905201 -52.42065,-11.242483 -52.42065,-11.242483 0,0 -12.50052,4e-4 -27.63117,5.537132 -15.13066,5.536732 -21.27107,9.227888 -21.27107,9.227888 0,0 15.35165,-0.410529 37.93799,6.766716 22.58635,7.177243 32.45374,11.484796 32.45374,11.484796 l 31.02752,-6.562453 -8.44161,11.074275 c 0,0 14.80259,8.920284 22.80648,16.917787 8.0039,7.9975 11.73088,12.50812 11.73088,12.50812 0,0 -13.92373,-5.43341 -56.68427,-1.74226 -42.76055,3.69116 -84.86368,56.39265 -84.86368,56.39265 0,0 41.22428,-15.9958 65.5649,-21.32747 24.34062,-5.33166 47.58524,-7.9983 47.58524,-7.9983 0,0 -18.41865,7.3827 -38.15428,38.3474 -19.73564,30.96468 -14.0351,80.18128 -14.0351,80.18128 0,0 31.35774,-59.05848 61.39977,-78.94969 30.04203,-19.89124 36.182,-20.50642 36.182,-20.50642 0,0 -24.1209,48.39514 -33.55015,126.11445 -9.42924,77.71931 30.26089,207.72959 30.26089,207.72959 l 47.80367,-6.97298 c 0,0 -45.61041,-42.24281 -49.55753,-151.33695 -3.94713,-109.09413 16.66479,-174.30453 16.66479,-174.30453 0,0 17.10508,1.23039 42.54213,32.81027 25.43704,31.57987 40.34713,57.41795 40.34713,57.41795 0,0 9.65024,-51.26683 -11.4011,-74.64415 -21.05135,-23.3773 -53.50637,-33.62931 -53.50637,-33.62931 0,0 13.70573,-6.66419 42.10313,-4.71609 28.39738,1.94813 87.30278,27.12897 87.30278,27.12896 0,0 -15.8158,-25.5214 -52.87463,-43.21167 -37.05881,-17.69028 -81.35597,0.29238 -81.35597,0.29238 0,0 4.13589,-15.37277 29.10021,-32.628037 24.96432,-17.25527 56.907,-34.36427 56.907,-34.36427 0,0 -26.3595,1.160335 -55.20025,12.035504 -7.176,2.7059 -14.064,6.299542 -20.36309,10.173104 l 17.40574,-51.051762 z" /><path
|
||||||
id="path4-2-6"
|
d="m 364.02341,369.59545 c -1.05628,0.0923 -4.67136,0.65996 -7.06652,1.09993 -1.73317,0.31934 -2.17946,0.41869 -2.99769,0.68125 -0.51326,0.15613 -0.62485,0.17032 -0.91495,0.0993 -0.43144,-0.10644 -2.3208,-0.2058 -4.86474,-0.26256 -4.47793,-0.10645 -6.76898,0.3761 -9.18647,1.91601 -1.68109,1.07865 -2.9754,2.40567 -4.18788,4.3075 -0.72897,1.14251 -0.92234,2.15729 -0.77357,4.17266 0.11901,1.59667 0.37935,2.58307 1.19757,4.54877 1.61417,3.84622 3.75641,6.6209 9.60302,12.41863 4.25482,4.22943 5.65324,5.72676 5.65324,6.07449 0,0.15612 -0.0298,0.17031 -0.40911,0.17031 -0.52812,0 -0.77362,-0.0993 -1.69599,-0.69545 -1.0711,-0.68834 -2.31333,-1.61087 -4.66389,-3.46302 -3.42913,-2.69661 -3.92749,-3.07982 -5.19948,-4.02364 -2.0307,-1.49024 -3.6374,-2.49082 -4.74571,-2.95209 -1.8968,-0.78769 -5.02097,-1.24895 -7.31945,-1.07864 -2.68526,0.20579 -4.72343,0.85866 -6.76156,2.16438 -1.98605,1.28445 -5.15484,4.17977 -5.58628,5.11648 -0.29009,0.62448 -0.46118,1.93022 -0.59505,4.4991 -0.11158,2.05794 -0.0373,3.37077 0.29011,5.40033 l 0.20083,1.24187 -0.45376,1.59667 c -0.70663,2.45535 -0.95956,4.18686 -1.04882,6.95444 -0.0819,2.76759 0.19338,4.45651 0.94467,5.90417 0.97445,1.85925 3.83081,4.98875 5.91358,6.46479 1.23478,0.87994 2.98284,1.48315 5.09534,1.7599 1.10831,0.14903 3.4663,0.12773 4.23992,-0.0355 1.02649,-0.21289 2.61833,-0.73092 3.39936,-1.10704 1.47284,-0.70253 3.91264,-2.36308 6.97727,-4.75455 4.66392,-3.63334 6.5235,-5.01713 7.28968,-5.40744 0.3868,-0.20579 0.51327,-0.23417 1.00417,-0.23417 0.49094,0 0.60253,0.0284 0.94471,0.21289 l 0.37936,0.21999 -1.78522,1.76698 c -8.50216,8.44468 -9.78157,9.89943 -11.44034,13.02184 -1.42817,2.69662 -2.41749,5.54225 -2.78942,8.01888 -0.23059,1.5825 -0.0892,4.59135 0.29753,6.03192 0.28267,1.06444 0.78846,2.24244 1.24966,2.87403 0.6546,0.90832 1.65877,2.09341 1.76292,2.09341 0.2901,0 1.77778,-1.12122 2.11996,-1.59668 0.14134,-0.1916 0.31243,-0.49673 0.37936,-0.67415 0.17852,-0.47546 0.20827,-1.52571 0.0744,-2.79596 -0.15619,-1.46186 -0.15619,-3.64754 -0.007,-4.48491 0.14877,-0.81607 0.60996,-2.44825 1.03396,-3.61204 0.78105,-2.18569 1.71829,-3.94559 3.35473,-6.31577 1.65877,-2.39857 4.64161,-6.0319 6.28548,-7.65697 0.66203,-0.65287 2.0456,-1.73151 2.12743,-1.66056 0.0297,0.0355 -0.61742,1.5683 -1.2199,2.85984 -0.41659,0.90123 -1.32407,2.62566 -2.13486,4.04493 -1.4505,2.54049 -1.98605,3.66882 -2.16458,4.55586 -0.29009,1.45476 -0.43143,3.34239 -0.43143,5.76934 0,2.12891 0.0147,2.48374 0.16362,3.40625 0.19341,1.15672 0.54301,2.77469 0.76619,3.49851 0.51322,1.67475 1.71084,3.49141 3.25803,4.94616 1.56209,1.47606 2.98283,2.16441 5.43008,2.63985 0.83307,0.15613 1.04881,0.16322 3.46631,0.0993 2.26129,-0.0639 2.98283,-0.23417 6.02513,-1.39088 1.74807,-0.66706 2.57372,-0.94382 3.64486,-1.22767 2.96051,-0.7806 5.22924,-0.9864 6.96983,-0.63158 0.78848,0.16322 0.7959,0.16322 1.07858,0.0284 0.15619,-0.0781 0.81822,-0.30515 1.46536,-0.50385 0.6546,-0.1987 1.4505,-0.49674 1.77778,-0.66705 2.14971,-1.09285 6.40453,-4.93907 7.26737,-6.57833 0.66945,-1.27735 1.17528,-3.87462 1.09345,-5.64871 -0.10415,-2.18568 -0.78103,-4.1017 -2.3059,-6.52156 -0.95956,-1.53281 -1.7555,-2.44825 -3.76387,-4.36426 -1.78521,-1.70313 -3.14646,-2.85984 -6.8136,-5.81901 -4.55235,-3.66173 -6.17394,-5.06681 -6.12187,-5.30809 0.0151,-0.071 0.0819,-0.11354 0.17109,-0.0993 0.27521,0.0497 1.85962,1.06446 6.00286,3.85334 4.28453,2.88111 6.06231,3.92428 7.81781,4.60554 3.94235,1.51151 8.04839,2.29922 11.44773,2.17857 1.95634,-0.0639 3.31758,-0.36901 4.85734,-1.08575 0.88516,-0.41157 2.40259,-1.3625 3.49606,-2.19986 1.07115,-0.81608 3.03487,-2.68952 3.51838,-3.34949 0.97443,-1.3412 1.65877,-3.95977 1.55462,-5.94674 -0.0595,-1.08575 -0.25287,-1.90184 -0.93723,-4.04494 -0.69179,-2.16438 -1.15298,-3.77526 -1.28684,-4.4636 -0.15624,-0.82319 -0.11901,-3.30691 0.0819,-4.8965 0.20827,-1.66764 0.28263,-4.11589 0.16362,-5.10938 -0.18594,-1.52571 -0.6397,-3.1153 -1.23476,-4.34298 -0.99674,-2.05794 -3.33244,-4.20814 -5.7276,-5.27968 -1.41332,-0.62449 -3.4961,-1.09994 -5.89127,-1.34831 -1.24965,-0.12065 -3.91264,-0.0497 -5.04324,0.14192 -1.815,0.30515 -4.71601,1.09994 -5.31849,1.44766 -0.80337,0.46836 -2.80432,2.24955 -7.21533,6.39382 -1.77778,1.67474 -3.8531,3.60496 -4.61181,4.28621 -1.24966,1.12832 -2.1051,1.79538 -2.19437,1.71022 -0.0967,-0.0993 1.34635,-2.19987 4.90939,-7.16023 4.95399,-6.89057 5.67552,-8.06147 6.44171,-10.41036 1.12318,-3.47012 0.052,-8.16082 -2.67041,-11.73029 -0.8852,-1.15671 -2.05303,-2.05085 -3.73412,-2.86694 -1.43561,-0.69544 -2.86379,-1.12122 -4.53745,-1.3554 -0.75872,-0.10644 -4.11344,-0.1987 -4.83498,-0.13482 z"
|
||||||
style="fill:#ffffff;fill-opacity:0.509804;stroke:#ffffff;stroke-width:8.49614;stroke-dasharray:none;stroke-opacity:0.521569"
|
id="path1"
|
||||||
d="m 105.64857,363.95957 a 27.851731,25.309928 0 0 0 -7.115581,35.20471 27.851731,25.309928 0 0 0 5.656921,5.48617 c 7.16052,5.83605 21.58543,14.65841 45.88391,17.847 37.57172,4.93039 41.7105,10.38005 41.71122,10.381 -4.5e-4,-6e-4 -4.13529,-5.45309 4.14459,-39.11953 5.35491,-21.77281 1.40624,-37.16078 -2.05217,-45.31698 a 27.851731,25.309928 0 0 0 -3.63281,-6.75471 27.851731,25.309928 0 0 0 -38.74027,-6.4662 27.851731,25.309928 0 0 0 -7.11556,35.20472 27.851731,25.309928 0 0 0 -38.74025,-6.46618 z" /><path
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00726536" /><path
|
||||||
id="path4-2-6-1"
|
d="m 83.20673,250.24331 c -1.05628,0.0923 -4.67136,0.65996 -7.06652,1.09993 -1.73317,0.31934 -2.17946,0.41869 -2.99769,0.68125 -0.51326,0.15613 -0.62485,0.17032 -0.91495,0.0993 -0.43144,-0.10644 -2.3208,-0.2058 -4.86474,-0.26256 -4.47793,-0.10645 -6.76898,0.3761 -9.18647,1.91601 -1.68109,1.07865 -2.9754,2.40567 -4.18788,4.3075 -0.72897,1.14251 -0.92234,2.15729 -0.77357,4.17266 0.11901,1.59667 0.37935,2.58307 1.19757,4.54877 1.61417,3.84622 3.75641,6.6209 9.60302,12.41863 4.25482,4.22943 5.65324,5.72676 5.65324,6.07449 0,0.15612 -0.0298,0.17031 -0.40911,0.17031 -0.52812,0 -0.77362,-0.0993 -1.69599,-0.69545 -1.0711,-0.68834 -2.31333,-1.61087 -4.66389,-3.46302 -3.42913,-2.69661 -3.92749,-3.07982 -5.19948,-4.02364 -2.0307,-1.49024 -3.6374,-2.49082 -4.74571,-2.95209 -1.8968,-0.78769 -5.02097,-1.24895 -7.31945,-1.07864 -2.68526,0.20579 -4.72343,0.85866 -6.76156,2.16438 -1.98605,1.28445 -5.15484,4.17977 -5.58628,5.11648 -0.29009,0.62448 -0.46118,1.93022 -0.59505,4.4991 -0.11158,2.05794 -0.0373,3.37077 0.29011,5.40033 l 0.20083,1.24187 -0.45376,1.59667 c -0.70663,2.45535 -0.95956,4.18686 -1.04882,6.95444 -0.0819,2.76759 0.19338,4.45651 0.94467,5.90417 0.97445,1.85925 3.83081,4.98875 5.91358,6.46479 1.23478,0.87994 2.98284,1.48315 5.09534,1.7599 1.10831,0.14903 3.4663,0.12773 4.23992,-0.0355 1.02649,-0.21289 2.61833,-0.73092 3.39936,-1.10704 1.47284,-0.70253 3.91264,-2.36308 6.97727,-4.75455 4.66392,-3.63334 6.5235,-5.01713 7.28968,-5.40744 0.3868,-0.20579 0.51327,-0.23417 1.00417,-0.23417 0.49094,0 0.60253,0.0284 0.94471,0.21289 l 0.37936,0.21999 -1.78522,1.76698 c -8.50216,8.44468 -9.78157,9.89943 -11.44034,13.02184 -1.42817,2.69662 -2.41749,5.54225 -2.78942,8.01888 -0.23059,1.5825 -0.0892,4.59135 0.29753,6.03192 0.28267,1.06444 0.78846,2.24244 1.24966,2.87403 0.6546,0.90832 1.65877,2.09341 1.76292,2.09341 0.2901,0 1.77778,-1.12122 2.11996,-1.59668 0.14134,-0.1916 0.31243,-0.49673 0.37936,-0.67415 0.17852,-0.47546 0.20827,-1.52571 0.0744,-2.79596 -0.15619,-1.46186 -0.15619,-3.64754 -0.007,-4.48491 0.14877,-0.81607 0.60996,-2.44825 1.03396,-3.61204 0.78105,-2.18569 1.71829,-3.94559 3.35473,-6.31577 1.65877,-2.39857 4.64161,-6.0319 6.28548,-7.65697 0.66203,-0.65287 2.0456,-1.73151 2.12743,-1.66056 0.0297,0.0355 -0.61742,1.5683 -1.2199,2.85984 -0.41659,0.90123 -1.32407,2.62566 -2.13486,4.04493 -1.4505,2.54049 -1.98605,3.66882 -2.16458,4.55586 -0.29009,1.45476 -0.43143,3.34239 -0.43143,5.76934 0,2.12891 0.0147,2.48374 0.16362,3.40625 0.19341,1.15672 0.54301,2.77469 0.76619,3.49851 0.51322,1.67475 1.71084,3.49141 3.25803,4.94616 1.56209,1.47606 2.98283,2.16441 5.43008,2.63985 0.83307,0.15613 1.04881,0.16322 3.46631,0.0993 2.26129,-0.0639 2.98283,-0.23417 6.02513,-1.39088 1.74807,-0.66706 2.57372,-0.94382 3.64486,-1.22767 2.96051,-0.7806 5.22924,-0.9864 6.96983,-0.63158 0.78848,0.16322 0.7959,0.16322 1.07858,0.0284 0.15619,-0.0781 0.81822,-0.30515 1.46536,-0.50385 0.6546,-0.1987 1.4505,-0.49674 1.77778,-0.66705 2.14971,-1.09285 6.40453,-4.93907 7.26737,-6.57833 0.66945,-1.27735 1.17528,-3.87462 1.09345,-5.64871 -0.10415,-2.18568 -0.78103,-4.1017 -2.3059,-6.52156 -0.95956,-1.53281 -1.7555,-2.44825 -3.76387,-4.36426 -1.78521,-1.70313 -3.14646,-2.85984 -6.8136,-5.81901 -4.55235,-3.66173 -6.17394,-5.06681 -6.12187,-5.30809 0.0151,-0.071 0.0819,-0.11354 0.17109,-0.0993 0.27521,0.0497 1.85962,1.06446 6.00286,3.85334 4.28453,2.88111 6.06231,3.92428 7.81781,4.60554 3.94235,1.51151 8.04839,2.29922 11.44773,2.17857 1.95634,-0.0639 3.31758,-0.36901 4.85734,-1.08575 0.88516,-0.41157 2.40259,-1.3625 3.49606,-2.19986 1.07115,-0.81608 3.03487,-2.68952 3.51838,-3.34949 0.97443,-1.3412 1.65877,-3.95977 1.55462,-5.94674 -0.0595,-1.08575 -0.25287,-1.90184 -0.93723,-4.04494 -0.69179,-2.16438 -1.15298,-3.77526 -1.28684,-4.4636 -0.15624,-0.82319 -0.11901,-3.30691 0.0819,-4.8965 0.20827,-1.66764 0.28263,-4.11589 0.16362,-5.10938 -0.18594,-1.52571 -0.6397,-3.1153 -1.23476,-4.34298 -0.99674,-2.05794 -3.33244,-4.20814 -5.7276,-5.27968 -1.41332,-0.62449 -3.4961,-1.09994 -5.89127,-1.34831 -1.24965,-0.12065 -3.91264,-0.0497 -5.04324,0.14192 -1.815,0.30515 -4.71601,1.09994 -5.31849,1.44766 -0.80337,0.46836 -2.80432,2.24955 -7.21533,6.39382 -1.77778,1.67474 -3.8531,3.60496 -4.61181,4.28621 -1.24966,1.12832 -2.1051,1.79538 -2.19437,1.71022 -0.0967,-0.0993 1.34635,-2.19987 4.90939,-7.16023 4.95399,-6.89057 5.67552,-8.06147 6.44171,-10.41036 1.12318,-3.47012 0.052,-8.16082 -2.67041,-11.73029 -0.8852,-1.15671 -2.05303,-2.05085 -3.73412,-2.86694 -1.43561,-0.69544 -2.86379,-1.12122 -4.53745,-1.3554 -0.75872,-0.10644 -4.11344,-0.1987 -4.83498,-0.13482 z"
|
||||||
style="fill:#ffffff;fill-opacity:0.50980395;stroke:#ffffff;stroke-width:6.89965;stroke-dasharray:none;stroke-opacity:0.519962"
|
id="path1-9"
|
||||||
d="m 351.29524,378.32915 a 20.862787,22.283365 87.929759 0 0 -28.94663,11.7882 20.862787,22.283365 87.929759 0 0 -1.50914,6.04125 c -1.09835,7.13663 -1.16134,20.16231 7.28339,36.72931 13.0577,25.61689 10.90177,30.69793 10.90138,30.69882 2.4e-4,-5.6e-4 2.16,-5.08045 30.49632,-15.43688 18.32576,-6.69765 27.84648,-16.23659 32.287,-22.14109 a 20.862787,22.283365 87.929759 0 0 3.33646,-5.36755 20.862787,22.283365 87.929759 0 0 -12.45108,-27.05014 20.862787,22.283365 87.929759 0 0 -28.94664,11.78822 20.862787,22.283365 87.929759 0 0 -12.45106,-27.05014 z" /><path
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00726536" /><path
|
||||||
id="path4-2-6-1-5"
|
d="m 439.21947,248.58317 c -1.32752,0.12081 -5.87092,0.86387 -8.88113,1.43979 -2.17823,0.41802 -2.73912,0.54806 -3.76747,0.89175 -0.64506,0.20437 -0.7853,0.22295 -1.1499,0.12998 -0.54223,-0.13933 -2.91676,-0.26938 -6.11395,-0.34369 -5.62782,-0.13934 -8.50719,0.49231 -11.54547,2.50804 -2.11277,1.41194 -3.73945,3.14899 -5.26329,5.63847 -0.91615,1.49553 -1.15918,2.82387 -0.97221,5.46197 0.14957,2.09002 0.47676,3.38121 1.5051,5.9543 2.02866,5.03465 4.72101,8.66669 12.06898,16.25585 5.34741,5.53628 7.10493,7.49627 7.10493,7.95145 0,0.20436 -0.0375,0.22293 -0.51416,0.22293 -0.66374,0 -0.97228,-0.12998 -2.13151,-0.91034 -1.34614,-0.90103 -2.90737,-2.10861 -5.86153,-4.53305 -4.30969,-3.52984 -4.93603,-4.03145 -6.53465,-5.26691 -2.55217,-1.95071 -4.57145,-3.26045 -5.96436,-3.86425 -2.38388,-1.03107 -6.3103,-1.63487 -9.19901,-1.41193 -3.37482,0.26938 -5.93636,1.12398 -8.49786,2.83315 -2.49604,1.68134 -6.47855,5.47127 -7.02078,6.69742 -0.36459,0.81743 -0.57961,2.52664 -0.74785,5.88927 -0.14024,2.69383 -0.0469,4.4123 0.3646,7.06898 l 0.25241,1.6256 -0.57028,2.09002 c -0.8881,3.21403 -1.20598,5.48056 -1.31815,9.10329 -0.10293,3.62275 0.24303,5.83353 1.18725,7.7285 1.22468,2.43373 4.81452,6.53023 7.43213,8.46235 1.55185,1.15183 3.7488,1.94142 6.40377,2.30368 1.39291,0.19508 4.35641,0.16719 5.32868,-0.0464 1.29009,-0.27867 3.29069,-0.95677 4.27229,-1.44911 1.85104,-0.91959 4.91736,-3.09324 8.76896,-6.22365 5.86156,-4.756 8.19866,-6.56736 9.1616,-7.07828 0.48612,-0.26938 0.64507,-0.30652 1.26203,-0.30652 0.617,0 0.75725,0.0371 1.1873,0.27867 l 0.47677,0.28796 -2.24364,2.31295 c -10.68543,11.05401 -12.29338,12.95826 -14.37811,17.04546 -1.79491,3.52986 -3.03827,7.25475 -3.50571,10.49663 -0.28981,2.07148 -0.11211,6.01003 0.37392,7.89573 0.35526,1.39333 0.99094,2.93533 1.57057,3.76207 0.82269,1.18898 2.08473,2.74025 2.21562,2.74025 0.36459,0 2.2343,-1.46767 2.66435,-2.09004 0.17763,-0.2508 0.39265,-0.65021 0.47676,-0.88245 0.22437,-0.62238 0.26176,-1.99714 0.0935,-3.65989 -0.19629,-1.91355 -0.19629,-4.77458 -0.009,-5.87069 0.18698,-1.06823 0.7666,-3.20474 1.29948,-4.72813 0.98162,-2.86105 2.15954,-5.16473 4.21619,-8.26728 2.08473,-3.13971 5.83353,-7.89569 7.89953,-10.02289 0.83203,-0.8546 2.57089,-2.26653 2.67373,-2.17366 0.0373,0.0465 -0.77596,2.05289 -1.53315,3.7435 -0.52357,1.17971 -1.66408,3.43696 -2.68307,5.29478 -1.82298,3.32547 -2.49605,4.80245 -2.72043,5.96357 -0.36458,1.90426 -0.54221,4.37516 -0.54221,7.55201 0,2.78672 0.0185,3.25118 0.20563,4.45874 0.24308,1.51413 0.68245,3.63204 0.96294,4.57952 0.64501,2.19223 2.15017,4.57021 4.09466,6.47447 1.96322,1.93214 3.74879,2.83318 6.82447,3.45554 1.04699,0.20437 1.31814,0.21365 4.35643,0.12998 2.84196,-0.0837 3.74879,-0.30652 7.57232,-1.82065 2.19695,-0.87318 3.23462,-1.23545 4.58082,-1.60701 3.72074,-1.0218 6.57206,-1.29118 8.75961,-0.82673 0.99096,0.21366 1.00028,0.21366 1.35555,0.0371 0.1963,-0.10223 1.02833,-0.39944 1.84165,-0.65953 0.8227,-0.26009 1.82298,-0.65022 2.2343,-0.87316 2.70173,-1.43052 8.04915,-6.46519 9.13355,-8.61097 0.84136,-1.67203 1.47709,-5.07183 1.37424,-7.3941 -0.13089,-2.86103 -0.98159,-5.36908 -2.89803,-8.53665 -1.20597,-2.00643 -2.2063,-3.20474 -4.73039,-5.71278 -2.24364,-2.22938 -3.95444,-3.74349 -8.56327,-7.61702 -5.72135,-4.79316 -7.75934,-6.6324 -7.6939,-6.94823 0.019,-0.093 0.10293,-0.14863 0.21502,-0.12998 0.34588,0.0651 2.33715,1.39336 7.54434,5.04398 5.38475,3.77133 7.61905,5.13684 9.82534,6.02861 4.95471,1.97854 10.11514,3.00965 14.38739,2.85172 2.45871,-0.0837 4.1695,-0.48304 6.10466,-1.42124 1.11246,-0.53874 3.01955,-1.7835 4.39381,-2.87959 1.34621,-1.06825 3.81419,-3.52055 4.42187,-4.38445 1.22465,-1.75562 2.08472,-5.1833 1.95383,-7.78422 -0.0748,-1.42123 -0.31781,-2.48949 -1.17791,-5.29478 -0.86943,-2.83316 -1.44905,-4.94178 -1.61728,-5.84282 -0.19636,-1.07754 -0.14957,-4.3287 0.10293,-6.40946 0.26175,-2.18293 0.35521,-5.38765 0.20563,-6.68813 -0.23368,-1.99714 -0.80396,-4.07789 -1.55183,-5.68491 -1.25269,-2.69382 -4.18818,-5.50842 -7.19839,-6.91105 -1.77624,-0.81744 -4.39386,-1.43981 -7.40409,-1.76492 -1.57055,-0.15793 -4.91736,-0.0651 -6.33829,0.18577 -2.28107,0.39944 -5.92703,1.43981 -6.68423,1.89497 -1.00966,0.61308 -3.52444,2.94464 -9.06815,8.36945 -2.2343,2.19222 -4.84254,4.71885 -5.79608,5.6106 -1.57056,1.47696 -2.64567,2.35014 -2.75786,2.23867 -0.12153,-0.12999 1.69208,-2.87962 6.17007,-9.37268 6.22613,-9.01968 7.13294,-10.55238 8.09588,-13.62705 1.4116,-4.54234 0.0654,-10.68243 -3.35615,-15.35482 -1.11251,-1.51413 -2.58022,-2.68454 -4.693,-3.75281 -1.80426,-0.91031 -3.59918,-1.46765 -5.70262,-1.77419 -0.95355,-0.13933 -5.16973,-0.2601 -6.07655,-0.17649 z"
|
||||||
style="fill:#ffffff;fill-opacity:0.50980395;stroke:#ffffff;stroke-width:6.89965;stroke-dasharray:none;stroke-opacity:0.52156866"
|
id="path1-1"
|
||||||
d="m 83.024352,249.4105 a 22.283365,20.862787 0 0 0 -29.353581,10.73482 22.283365,20.862787 0 0 0 -1.72639,5.98278 c -1.35544,7.0923 -1.88894,20.10721 5.951801,36.96846 12.12378,26.07187 9.7857,31.07171 9.78528,31.07259 2.6e-4,-5.5e-4 2.34212,-4.99911 31.03406,-14.32513 18.555748,-6.03127 28.414858,-15.22005 33.065768,-20.96029 a 22.283365,20.862787 0 0 0 3.52818,-5.24352 22.283365,20.862787 0 0 0 -11.46577,-27.48227 22.283365,20.862787 0 0 0 -29.353588,10.73483 22.283365,20.862787 0 0 0 -11.46576,-27.48227 z" /><path
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00931876" /><path
|
||||||
id="path4-2-6-1-9"
|
d="m 324.26695,283.12908 c -0.83436,0.0787 -3.6899,0.56207 -5.58184,0.93679 -1.36902,0.27198 -1.72154,0.3566 -2.36787,0.58021 -0.40542,0.13298 -0.49356,0.14506 -0.72272,0.0846 -0.34079,-0.0907 -1.83319,-0.17527 -3.84264,-0.22362 -3.53711,-0.0907 -5.34681,0.32032 -7.25638,1.63185 -1.32789,0.91866 -2.35026,2.04887 -3.308,3.66862 -0.57581,0.97307 -0.72855,1.83734 -0.61104,3.5538 0.094,1.35986 0.29964,2.19996 0.94596,3.87412 1.27502,3.27577 2.96718,5.63893 7.58541,10.57676 3.36087,3.60215 4.46548,4.87741 4.46548,5.17356 0,0.13297 -0.0236,0.14505 -0.32315,0.14505 -0.41716,0 -0.61108,-0.0846 -1.33966,-0.59231 -0.84606,-0.58625 -1.8273,-1.37195 -3.684,-2.9494 -2.70866,-2.29666 -3.10232,-2.62303 -4.10706,-3.42687 -1.60405,-1.26922 -2.87318,-2.12139 -3.74863,-2.51425 -1.49828,-0.67086 -3.96605,-1.06372 -5.78162,-0.91867 -2.12109,0.17527 -3.73103,0.73132 -5.34094,1.84337 -1.56877,1.09396 -4.0718,3.55984 -4.41259,4.35764 -0.22915,0.53185 -0.36429,1.64394 -0.47003,3.83181 -0.0881,1.75272 -0.0295,2.87083 0.22915,4.59939 l 0.15864,1.05768 -0.35842,1.35985 c -0.55818,2.0912 -0.75797,3.56589 -0.82846,5.923 -0.0647,2.35711 0.15274,3.79555 0.74619,5.0285 0.76971,1.58348 3.02595,4.24885 4.67113,5.50597 0.97534,0.74943 2.35613,1.26316 4.02479,1.49887 0.87545,0.12693 2.73803,0.10877 3.3491,-0.0302 0.81083,-0.1813 2.06822,-0.62251 2.68516,-0.94285 1.16338,-0.59832 3.09058,-2.01259 5.51133,-4.04938 3.68402,-3.09445 5.15289,-4.273 5.75811,-4.60543 0.30552,-0.17527 0.40543,-0.19943 0.79319,-0.19943 0.38779,0 0.47593,0.0241 0.74622,0.18132 l 0.29965,0.18735 -1.41013,1.5049 c -6.71585,7.19222 -7.72645,8.43121 -9.03671,11.09052 -1.12811,2.29668 -1.90957,4.72026 -2.20336,6.82956 -0.18214,1.34779 -0.0705,3.91039 0.23501,5.1373 0.22329,0.90657 0.62281,1.90985 0.98711,2.44777 0.51707,0.7736 1.31027,1.78292 1.39253,1.78292 0.22915,0 1.40427,-0.95492 1.67456,-1.35986 0.11164,-0.16318 0.24678,-0.42306 0.29964,-0.57417 0.14102,-0.40495 0.16452,-1.29942 0.0588,-2.38128 -0.12337,-1.24503 -0.12337,-3.10655 -0.006,-3.81973 0.11752,-0.69503 0.48181,-2.08513 0.81673,-3.07632 0.61695,-1.86152 1.35728,-3.36039 2.6499,-5.37905 1.31026,-2.04283 3.6664,-5.13728 4.96489,-6.52133 0.52293,-0.55603 1.61581,-1.47469 1.68045,-1.41427 0.0234,0.0302 -0.4877,1.3357 -0.96359,2.43569 -0.32907,0.76756 -1.04589,2.23623 -1.68633,3.44501 -1.14575,2.16368 -1.56877,3.12468 -1.7098,3.88015 -0.22914,1.23899 -0.34078,2.84667 -0.34078,4.91367 0,1.81315 0.0116,2.11536 0.12924,2.90105 0.15278,0.98516 0.42892,2.36316 0.60521,2.97963 0.40539,1.42635 1.35139,2.97357 2.57351,4.21257 1.2339,1.25713 2.35614,1.84339 4.28921,2.24832 0.65804,0.13298 0.82846,0.13901 2.73804,0.0846 1.78619,-0.0544 2.35613,-0.19944 4.75924,-1.18459 1.38079,-0.56813 2.03297,-0.80384 2.87906,-1.0456 2.33851,-0.66482 4.13057,-0.84009 5.50546,-0.5379 0.62282,0.13902 0.62868,0.13902 0.85197,0.0241 0.12337,-0.0665 0.64631,-0.25989 1.15748,-0.42912 0.51708,-0.16923 1.14576,-0.42306 1.40427,-0.56811 1.69805,-0.93077 5.05893,-4.20654 5.74048,-5.60268 0.5288,-1.08789 0.92836,-3.29995 0.86372,-4.81092 -0.0823,-1.8615 -0.61694,-3.49335 -1.82143,-5.55431 -0.75796,-1.30547 -1.38667,-2.08515 -2.97307,-3.71698 -1.41014,-1.45053 -2.48538,-2.43568 -5.38205,-4.95597 -3.5959,-3.11863 -4.87679,-4.31532 -4.83566,-4.52081 0.012,-0.0606 0.0647,-0.0967 0.13515,-0.0846 0.21738,0.0424 1.4689,0.90657 4.74165,3.28183 3.38434,2.45378 4.7886,3.34224 6.17527,3.92248 3.11406,1.28731 6.35741,1.9582 9.04254,1.85544 1.54531,-0.0544 2.62055,-0.31428 3.83681,-0.92471 0.69918,-0.35054 1.8978,-1.16042 2.76153,-1.87359 0.84609,-0.69505 2.39723,-2.29063 2.77916,-2.85272 0.7697,-1.14228 1.31026,-3.37248 1.22799,-5.06474 -0.047,-0.92472 -0.19974,-1.61977 -0.74032,-3.44502 -0.54644,-1.84337 -0.91073,-3.21533 -1.01647,-3.80159 -0.12341,-0.70109 -0.094,-2.81644 0.0647,-4.17027 0.16452,-1.42031 0.22326,-3.50544 0.12924,-4.35159 -0.14687,-1.29942 -0.50529,-2.65325 -0.97533,-3.69885 -0.78732,-1.75271 -2.63229,-3.58402 -4.52422,-4.49663 -1.11637,-0.53186 -2.76156,-0.9368 -4.6535,-1.14832 -0.9871,-0.10275 -3.09059,-0.0424 -3.98365,0.12086 -1.43366,0.2599 -3.72516,0.93681 -4.20107,1.23295 -0.63457,0.3989 -2.21512,1.91592 -5.69937,5.44552 -1.40427,1.42636 -3.04356,3.0703 -3.64286,3.65051 -0.98711,0.96097 -1.66282,1.5291 -1.73333,1.45657 -0.0764,-0.0846 1.06348,-1.8736 3.87792,-6.09827 3.91315,-5.86859 4.48308,-6.86583 5.08829,-8.86635 0.8872,-2.95544 0.0411,-6.95045 -2.10935,-9.9905 -0.69922,-0.98516 -1.62168,-1.74668 -2.94957,-2.44175 -1.13399,-0.59228 -2.26211,-0.95492 -3.58413,-1.15436 -0.59931,-0.0907 -3.2492,-0.16924 -3.81914,-0.11483 z"
|
||||||
style="fill:#ffffff;fill-opacity:0.50980395;stroke:#ffffff;stroke-width:5.01078;stroke-dasharray:none;stroke-opacity:0.519962"
|
id="path1-1-7"
|
||||||
d="m 320.97602,291.36362 a 16.625347,14.748181 0 0 0 -21.90036,7.58859 16.625347,14.748181 0 0 0 -1.28804,4.2293 c -1.01128,5.01364 -1.40932,14.21406 4.44057,26.1335 9.0454,18.43055 7.30098,21.965 7.30067,21.96562 2e-4,-3.9e-4 1.74743,-3.53394 23.15415,-10.12663 13.84423,-4.26358 21.19999,-10.75925 24.66998,-14.8171 a 16.625347,14.748181 0 0 0 2.63233,-3.70671 16.625347,14.748181 0 0 0 -8.55447,-19.42758 16.625347,14.748181 0 0 0 -21.90037,7.58859 16.625347,14.748181 0 0 0 -8.55446,-19.42758 z" /><path
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00595914" /><path
|
||||||
id="path4-2-6-1-9-8"
|
d="m 166.59227,332.97105 c -4.12429,0.42662 -8.02317,1.5205 -12.83475,3.62077 l -1.10432,0.4813 -1.82543,-0.86416 c -4.62007,-2.20966 -8.27101,-3.06288 -12.59815,-2.94255 -2.32129,0.0656 -3.39176,0.21877 -5.27361,0.79853 -6.5131,1.97994 -11.32468,7.43841 -12.77834,14.50492 -1.09306,5.25064 -0.38311,11.54049 1.78042,15.98166 1.83677,3.75203 4.57499,6.79303 12.23748,13.62981 3.52702,3.15038 8.64287,8.10569 10.52472,10.18408 1.88177,2.10025 3.4481,3.98173 3.4481,4.17864 0,0.16407 -0.45069,0.63444 -0.60853,0.63444 -0.0563,0 -0.67604,-0.60163 -1.39724,-1.34547 -15.06588,-15.45661 -24.88064,-22.01991 -35.1236,-23.5076 -0.68745,-0.0985 -2.14102,-0.1422 -4.56374,-0.1422 -3.84253,0.0109 -4.92426,0.10938 -7.944252,0.76572 -8.237179,1.78303 -14.479919,6.60706 -16.485689,12.74376 -0.61971,1.90335 -0.75496,2.78941 -0.74371,5.14126 0,1.88148 0.0453,2.29715 0.31552,3.55512 0.56344,2.60345 1.63392,5.31628 3.15516,7.97443 0.61978,1.08295 0.61978,1.09388 0.43952,1.47674 -1.81426,4.14583 -2.91856,7.76658 -3.42567,11.33266 -0.2141,1.45486 -0.18027,4.80214 0.0563,6.06012 0.66479,3.52231 2.3438,6.26796 5.03694,8.21511 4.10171,2.96443 10.49088,3.83951 17.826601,2.45029 8.69921,-1.65182 21.45505,-7.90882 31.46141,-15.45662 5.4877,-4.14582 10.08527,-8.7292 12.39531,-12.3609 0.41686,-0.65633 0.67604,-0.82042 0.80004,-0.50319 0.15775,0.38286 -2.77206,3.87235 -5.58913,6.66176 -2.36637,2.34091 -4.15805,3.93798 -8.56403,7.61344 -1.82543,1.52051 -3.95521,3.32541 -4.73275,4.00362 -8.38368,7.30718 -11.56135,12.63435 -13.01501,21.81209 -0.29294,1.82677 -0.34927,5.15214 -0.12393,6.67266 0.5747,3.76301 1.84802,6.45398 4.11297,8.65264 1.94944,1.89241 4.19188,3.01914 7.21179,3.6098 1.44233,0.28442 4.48483,0.3938 6.26525,0.21885 3.39176,-0.33911 7.66249,-1.37836 11.1895,-2.73471 0.76629,-0.29538 0.94655,-0.28442 1.52125,0.0656 0.83387,0.51414 2.91849,1.57522 3.85378,1.96901 3.32418,1.40019 5.88215,1.99085 8.95839,2.07841 1.65643,0.044 2.18612,0.0216 3.32418,-0.16408 8.23718,-1.3674 13.97282,-7.91972 15.42647,-17.63342 0.54087,-3.56607 0.49578,-7.97443 -0.11267,-11.09198 -0.10143,-0.56885 0.10142,-0.51415 1.02539,0.27346 6.24274,5.30535 11.43744,9.37459 16.85755,13.18124 5.97223,4.21151 10.27679,6.92431 14.90812,9.38556 1.90434,1.01734 5.08202,2.58159 5.22852,2.58159 0.11268,0 0.18034,-0.12034 0.94655,-1.85964 1.44233,-3.22694 2.23112,-6.18042 2.23112,-8.39004 0,-0.85325 -0.16901,-2.06744 -0.32677,-2.30813 -0.0453,-0.0763 -0.66479,-0.22973 -1.38599,-0.35006 -10.26554,-1.67365 -20.51974,-7.02273 -32.14877,-16.7474 -2.58047,-2.15492 -3.93271,-3.36912 -3.97779,-3.56602 -0.0454,-0.18596 0.10143,-0.12033 1.48749,0.66723 7.15538,4.12403 16.1701,5.75384 22.91995,4.16776 2.71565,-0.63448 5.09327,-1.89241 6.83986,-3.59892 1.84802,-1.8049 2.97491,-3.92703 3.57211,-6.73831 0.28168,-1.3783 0.39443,-4.37555 0.20284,-6.03825 -0.3606,-3.28166 -1.35224,-7.05555 -2.76073,-10.54505 -0.21417,-0.53601 -0.39444,-1.07201 -0.39444,-1.19233 0,-0.13128 0.2141,-0.56883 0.48453,-0.98451 1.96069,-3.10663 3.29042,-6.43204 3.74112,-9.35272 0.1465,-0.95167 0.18033,-1.67364 0.13525,-2.95348 -0.0902,-2.3628 -0.42819,-3.74109 -1.43107,-5.7429 -4.13555,-8.29165 -16.74489,-12.40465 -30.80787,-10.05281 -4.91301,0.82041 -9.9951,3.06289 -15.61798,6.89147 -3.92146,2.66909 -7.29072,5.49131 -12.23748,10.23877 -1.80301,1.73929 -3.31293,3.1504 -3.35801,3.1504 -0.13526,0 0.3606,-0.62352 1.78043,-2.24247 2.20861,-2.505 3.56077,-3.89423 9.25132,-9.46211 5.43136,-5.30534 6.94136,-6.84772 8.50769,-8.69639 4.01155,-4.69276 6.41167,-9.36365 7.53856,-14.65806 1.64517,-7.76658 0.60845,-14.51585 -2.90724,-18.77106 -2.45654,-2.98631 -5.93847,-4.51775 -10.5473,-4.62714 -0.99155,-0.0219 -2.00577,-0.0219 -2.25362,0 z"
|
||||||
style="fill:#ffffff;fill-opacity:0.50980395;stroke:#ffffff;stroke-width:4.22313;stroke-dasharray:none;stroke-opacity:0.519962"
|
id="path1-2"
|
||||||
d="m 416.90426,193.13811 a 12.322476,14.134158 82.30909 0 0 -17.56469,8.83612 12.322476,14.134158 82.30909 0 0 -0.59553,3.65007 c -0.27175,4.26676 0.45709,11.92642 6.76182,21.10665 9.74867,14.19503 8.68847,17.32338 8.68827,17.3239 1.2e-4,-3.3e-4 1.06282,-3.12827 18.32699,-11.08266 11.16516,-5.14424 16.60821,-11.37802 19.06101,-15.14093 a 12.322476,14.134158 82.30909 0 0 1.788,-3.37453 12.322476,14.134158 82.30909 0 0 -9.45059,-15.07737 12.322476,14.134158 82.30909 0 0 -17.5647,8.83612 12.322476,14.134158 82.30909 0 0 -9.45058,-15.07737 z" /><path
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.0111024" /><path
|
||||||
id="path4-2-6-1-9-8-4"
|
d="m 465.56025,185.2456 c -0.9371,0.0986 -1.47259,0.23385 -2.432,0.62118 -1.53059,0.61754 -3.04333,1.57124 -4.03846,2.55052 -0.5444,0.52983 -1.4815,1.67354 -1.80279,2.19242 -0.22312,0.36175 -0.33468,0.90619 -0.51317,2.52859 -0.0937,0.82946 -0.13387,1.2643 -0.33915,3.59921 -0.19634,2.21435 -0.33021,3.3142 -0.41946,3.44212 -0.0714,0.106 -0.22757,-0.82218 -0.67382,-3.97194 -0.63812,-4.51274 -0.80322,-5.28374 -1.38334,-6.39822 -0.8657,-1.65162 -2.88269,-3.02554 -5.42178,-3.69057 -1.27179,-0.33251 -2.30706,-0.33982 -3.6904,-0.0292 -1.20484,0.27404 -2.23118,0.72349 -3.37355,1.49083 -1.02635,0.68697 -1.602,1.19121 -2.93624,2.56148 -1.25394,1.28623 -1.96345,2.07549 -2.22673,2.47378 -0.0893,0.13886 -0.1785,0.21559 -0.30791,0.27041 -0.22311,0.095 -0.3079,0.1498 -1.41011,0.88792 -1.22716,0.82581 -1.75372,1.20583 -2.2535,1.63701 -1.03526,0.89158 -1.57968,1.62238 -1.93221,2.60532 -0.23651,0.65772 -0.29452,1.01947 -0.29452,1.827 0.005,0.98659 0.13834,1.71739 0.40607,2.15224 0.22759,0.37636 1.04867,1.17293 1.61093,1.56756 0.87463,0.6139 2.75329,1.42144 4.13216,1.77955 1.81173,0.46771 3.55652,0.69789 7.45663,0.98655 3.1549,0.23386 4.33744,0.35079 4.65873,0.46043 l 0.15172,0.0512 -0.15172,0.13155 c -0.18742,0.15714 -0.415,0.21559 -1.15576,0.28502 -0.7943,0.0767 -1.86527,0.12425 -3.88226,0.16807 -3.71271,0.0804 -5.30578,0.18272 -6.47045,0.42022 -1.55737,0.31792 -3.56545,1.43604 -4.73013,2.63091 -1.22269,1.26066 -1.6957,2.38609 -1.94114,4.62235 -0.0893,0.78928 -0.0893,1.53834 0,1.77588 0.12049,0.33616 0.78985,1.15466 1.75372,2.14489 0.7006,0.7162 1.2227,1.16564 2.03039,1.73932 l 0.76753,0.54811 0.39714,0.69793 c 0.21866,0.38368 0.49534,0.84041 0.61582,1.01582 0.72737,1.0414 1.95452,2.36051 2.905,3.1242 0.89694,0.71983 1.52168,1.01581 2.67297,1.2643 1.55737,0.3398 3.95367,0.48599 4.9934,0.30326 1.19145,-0.2046 2.68635,-0.91716 3.79749,-1.80509 0.49978,-0.39828 1.01742,-1.00851 1.44134,-1.70644 0.52211,-0.85867 0.9371,-2.26182 1.51721,-5.1741 0.42838,-2.12665 0.69613,-3.29958 0.87016,-3.75634 0.17404,-0.45676 0.43286,-0.66868 0.91033,-0.74178 l 0.16956,-0.0254 -0.0268,0.30694 c -0.0357,0.40192 -0.18741,3.10593 -0.25434,4.52734 -0.058,1.20218 -0.0312,3.1242 0.0491,3.69057 0.19635,1.40679 0.81215,3.084 1.67339,4.56024 0.62919,1.07427 1.16021,1.68085 2.22672,2.54685 0.83001,0.67599 1.31195,0.98292 1.99024,1.26063 0.52655,0.21559 0.94155,0.32523 1.83849,0.47502 0.78092,0.13521 0.80323,0.13156 0.88355,-0.10588 0.0223,-0.0731 0.0848,-0.32156 0.13833,-0.55178 0.12496,-0.55542 0.0982,-0.76369 -0.14726,-1.16928 -0.16956,-0.28502 -0.24989,-0.36542 -1.02634,-0.99755 -1.36103,-1.11448 -1.72694,-1.50547 -2.26689,-2.41899 -1.24054,-2.09376 -1.70909,-3.80747 -1.94114,-7.08881 -0.11601,-1.6041 -0.0893,-2.96707 0.067,-3.54439 0.0893,-0.3435 0.0937,-0.34715 0.18741,-0.12792 0.46409,1.10352 0.79877,2.09743 1.19146,3.56269 0.53995,1.98414 0.65151,2.22164 1.602,3.33248 1.29855,1.52007 2.29812,2.41896 3.71269,3.33615 1.24501,0.80751 2.15534,1.17656 3.42265,1.38487 1.66893,0.27403 2.90054,0.14615 4.25264,-0.44217 0.70952,-0.31057 1.13791,-0.56269 1.43689,-0.84404 0.15172,-0.14251 0.44624,-0.37637 0.65597,-0.52256 0.81661,-0.55174 1.16467,-0.97196 2.15533,-2.59069 0.70952,-1.15469 1.16468,-1.7576 1.99468,-2.63091 0.62027,-0.6504 1.14683,-1.05236 1.76264,-1.352 l 0.53102,-0.25578 0.20973,-0.32887 c 0.11603,-0.18269 0.3213,-0.48598 0.46409,-0.67599 0.415,-0.56637 0.60689,-1.04871 0.80769,-2.02432 0.18742,-0.92446 0.26329,-1.65893 0.26329,-2.5615 -0.005,-1.02677 -0.0402,-1.16928 -0.52656,-1.97315 -1.02635,-1.69184 -2.28921,-2.65285 -4.35529,-3.31788 -1.01742,-0.32521 -1.91881,-0.51521 -2.96748,-0.62482 -1.35656,-0.14252 -1.72694,-0.14983 -6.69357,-0.14983 -2.75774,0 -4.89076,-0.0145 -4.92646,-0.0329 -0.0491,-0.0254 -0.0491,-0.0365 0.005,-0.0621 0.1428,-0.0658 1.16021,-0.17174 3.94028,-0.41655 3.67253,-0.32521 4.65426,-0.4604 5.84571,-0.82215 1.91883,-0.57735 3.35571,-1.20949 4.864,-2.1376 1.70909,-1.05239 2.5614,-1.99877 3.07904,-3.42018 0.34806,-0.94275 0.60242,-2.36781 0.60242,-3.32152 -0.005,-0.76369 -0.12049,-1.15833 -0.58011,-1.91836 -0.6649,-1.09621 -1.36549,-1.73567 -2.61942,-2.40071 -0.35252,-0.18635 -1.1513,-0.61388 -1.77156,-0.95004 -1.60646,-0.86236 -2.02592,-1.20583 -3.22184,-2.6236 -0.67829,-0.8112 -1.13345,-1.28988 -1.63322,-1.74297 -1.17807,-1.05967 -2.6462,-1.78682 -4.09647,-2.02433 -0.49532,-0.0841 -1.75818,-0.12059 -2.27581,-0.0695 z"
|
||||||
style="fill:#ffffff;fill-opacity:0.50980395;stroke:#ffffff;stroke-width:3.48342;stroke-dasharray:none;stroke-opacity:0.519962"
|
id="path1-3-3"
|
||||||
d="m 96.169666,99.754795 a 10.296362,11.508677 62.365085 0 0 -7.330189,13.841365 10.296362,11.508677 62.365085 0 0 1.473186,2.6805 c 2.008889,2.93989 6.437543,7.66269 15.415927,10.84633 13.88288,4.92276 14.77391,7.47086 14.77407,7.4713 -1e-4,-2.8e-4 -0.88925,-2.54921 6.69094,-15.67164 4.90232,-8.48655 5.37758,-15.08279 5.10162,-18.6847 a 10.296362,11.508677 62.365085 0 0 -0.5257,-3.042454 10.296362,11.508677 62.365085 0 0 -14.1348,-5.641051 10.296362,11.508677 62.365085 0 0 -7.33021,13.841385 10.296362,11.508677 62.365085 0 0 -14.134844,-5.641035 z" /><path
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00403802" /><path
|
||||||
id="path4-2-6-1-9-8-4-9-2"
|
d="m 129.33803,187.58044 c -0.9371,0.10563 -1.47259,0.25052 -2.432,0.66548 -1.53059,0.66158 -3.04333,1.6833 -4.03846,2.73242 -0.5444,0.56761 -1.4815,1.79289 -1.80279,2.34878 -0.22312,0.38755 -0.33468,0.97082 -0.51317,2.70892 -0.0937,0.88862 -0.13387,1.35447 -0.33915,3.8559 -0.19634,2.37228 -0.33021,3.55057 -0.41946,3.68761 -0.0714,0.11356 -0.22757,-0.88082 -0.67382,-4.25521 -0.63812,-4.83459 -0.80322,-5.66057 -1.38334,-6.85453 -0.8657,-1.76942 -2.88269,-3.24132 -5.42178,-3.95378 -1.27179,-0.35622 -2.30706,-0.36406 -3.6904,-0.0313 -1.20484,0.29358 -2.23118,0.77509 -3.37355,1.59715 -1.02635,0.73596 -1.602,1.27617 -2.93624,2.74416 -1.25394,1.37796 -1.96345,2.22351 -2.22673,2.65021 -0.0893,0.14876 -0.178502,0.23096 -0.307912,0.28969 -0.22311,0.10178 -0.3079,0.16049 -1.41011,0.95125 -1.22716,0.8847 -1.75372,1.29183 -2.2535,1.75376 -1.03526,0.95516 -1.57968,1.73808 -1.93221,2.79112 -0.23651,0.70463 -0.29452,1.09218 -0.29452,1.9573 0.005,1.05695 0.13834,1.83987 0.40607,2.30574 0.22759,0.4032 1.04867,1.25658 1.61093,1.67935 0.87463,0.65769 2.75329,1.52282 4.132162,1.90647 1.81173,0.50106 3.55652,0.74766 7.45663,1.05691 3.1549,0.25054 4.33744,0.3758 4.65873,0.49326 l 0.15172,0.0549 -0.15172,0.14093 c -0.18742,0.16834 -0.415,0.23096 -1.15576,0.30534 -0.7943,0.0822 -1.86527,0.13312 -3.88226,0.18006 -3.71271,0.0861 -5.30578,0.19575 -6.47045,0.45019 -1.557372,0.34059 -3.565452,1.53846 -4.730132,2.81854 -1.22269,1.35057 -1.6957,2.55627 -1.94114,4.95201 -0.0893,0.84557 -0.0893,1.64805 0,1.90253 0.12049,0.36014 0.78985,1.23701 1.75372,2.29786 0.7006,0.76728 1.2227,1.24878 2.03039,1.86337 l 0.76753,0.5872 0.39714,0.74771 c 0.21866,0.41104 0.49534,0.90034 0.61582,1.08826 0.727372,1.11567 1.954522,2.52886 2.905002,3.34702 0.89694,0.77116 1.52168,1.08825 2.67297,1.35446 1.55737,0.36404 3.95367,0.52065 4.9934,0.32489 1.19145,-0.21919 2.68635,-0.98257 3.79749,-1.93382 0.49978,-0.42669 1.01742,-1.08044 1.44134,-1.82815 0.52211,-0.9199 0.9371,-2.42312 1.51721,-5.5431 0.42838,-2.27832 0.69613,-3.5349 0.87016,-4.02424 0.17404,-0.48934 0.43286,-0.71637 0.91033,-0.79468 l 0.16956,-0.0272 -0.0268,0.32883 c -0.0357,0.43058 -0.18741,3.32744 -0.25434,4.85022 -0.058,1.28792 -0.0312,3.34701 0.0491,3.95377 0.19635,1.50712 0.81215,3.30395 1.67339,4.88547 0.62919,1.15089 1.16021,1.80073 2.22672,2.72849 0.83001,0.7242 1.31195,1.05302 1.99024,1.35054 0.52655,0.23096 0.94155,0.34842 1.83849,0.50889 0.78092,0.14486 0.80323,0.14095 0.88355,-0.11343 0.0223,-0.0783 0.0848,-0.34449 0.13833,-0.59113 0.12496,-0.59503 0.0982,-0.81815 -0.14726,-1.25267 -0.16956,-0.30535 -0.24989,-0.39148 -1.02634,-1.06869 -1.36103,-1.19397 -1.72694,-1.61284 -2.26689,-2.59151 -1.24054,-2.24309 -1.70909,-4.07901 -1.94114,-7.59437 -0.11601,-1.71851 -0.0893,-3.17868 0.067,-3.79717 0.0893,-0.368 0.0937,-0.37191 0.18741,-0.13705 0.46409,1.18222 0.79877,2.24702 1.19146,3.81678 0.53995,2.12564 0.65151,2.38008 1.602,3.57014 1.29855,1.62848 2.29812,2.59148 3.71269,3.57408 1.24501,0.8651 2.15534,1.26047 3.42265,1.48364 1.66893,0.29357 2.90054,0.15657 4.25264,-0.4737 0.70952,-0.33272 1.13791,-0.60282 1.43689,-0.90424 0.15172,-0.15267 0.44624,-0.40321 0.65597,-0.55983 0.81661,-0.59109 1.16467,-1.04128 2.15533,-2.77545 0.70952,-1.23704 1.16468,-1.88295 1.99468,-2.81854 0.62027,-0.69679 1.14683,-1.12742 1.76264,-1.44843 l 0.53102,-0.27402 0.20973,-0.35232 c 0.11603,-0.19572 0.3213,-0.52064 0.46409,-0.7242 0.415,-0.60677 0.60689,-1.12351 0.80769,-2.1687 0.18742,-0.99039 0.26329,-1.77724 0.26329,-2.74418 -0.005,-1.09999 -0.0402,-1.25267 -0.52656,-2.11387 -1.02635,-1.8125 -2.28921,-2.84205 -4.35529,-3.55451 -1.01742,-0.3484 -1.91881,-0.55195 -2.96748,-0.66938 -1.35656,-0.15268 -1.72694,-0.16051 -6.69357,-0.16051 -2.75774,0 -4.89076,-0.0155 -4.92646,-0.0353 -0.0491,-0.0272 -0.0491,-0.0391 0.005,-0.0665 0.1428,-0.0705 1.16021,-0.18399 3.94028,-0.44625 3.67253,-0.34841 4.65426,-0.49324 5.84571,-0.88079 1.91883,-0.61853 3.35571,-1.29575 4.864,-2.29005 1.70909,-1.12744 2.5614,-2.14132 3.07904,-3.6641 0.34806,-1.00999 0.60242,-2.53668 0.60242,-3.55841 -0.005,-0.81815 -0.12049,-1.24094 -0.58011,-2.05517 -0.6649,-1.17439 -1.36549,-1.85946 -2.61942,-2.57193 -0.35252,-0.19964 -1.1513,-0.65766 -1.77156,-1.01779 -1.60646,-0.92386 -2.02592,-1.29183 -3.22184,-2.81071 -0.67829,-0.86906 -1.13345,-1.38187 -1.63322,-1.86728 -1.17807,-1.13524 -2.6462,-1.91425 -4.09647,-2.1687 -0.49532,-0.0901 -1.75818,-0.12919 -2.27581,-0.0745 z"
|
||||||
style="fill:#ffffff;fill-opacity:0.5117;stroke:#ffffff;stroke-width:3.05139;stroke-dasharray:none;stroke-opacity:0.519962"
|
id="path1-3-3-3"
|
||||||
d="m 296.64657,233.26347 a 8.8114666,10.319195 80.445391 0 0 -11.58972,8.06989 8.8114666,10.319195 80.445391 0 0 0.0366,2.62543 c 0.35019,3.02392 1.86017,8.32306 7.60386,14.09672 8.8812,8.92759 8.51432,11.23624 8.51426,11.23663 5e-5,-2.5e-4 0.36876,-2.30885 11.85385,-9.72788 7.4277,-4.79799 10.57103,-9.75243 11.86523,-12.65455 a 8.8114666,10.319195 80.445391 0 0 0.86244,-2.55882 8.8114666,10.319195 80.445391 0 0 -8.77837,-9.57865 8.8114666,10.319195 80.445391 0 0 -11.58975,8.06989 8.8114666,10.319195 80.445391 0 0 -8.77842,-9.57866 z" /><path
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00417953" /><path
|
||||||
id="path4-2-6-1-9-8-4-9-2-6"
|
d="m 181.97617,266.85651 c -0.67575,0.64029 -1.01388,1.06776 -1.53142,1.94677 -0.82591,1.402 -1.43323,3.05558 -1.61859,4.41795 -0.10501,0.74073 -0.14474,2.1965 -0.0812,2.79453 0.0449,0.41641 0.28862,0.90832 1.13586,2.28156 0.4312,0.70353 0.66429,1.06698 1.92402,3.01229 1.1934,1.84589 1.7576,2.78457 1.76538,2.93802 0.008,0.12563 -0.679,-0.50471 -2.94617,-2.69417 -3.24722,-3.13763 -3.84604,-3.63997 -4.97973,-4.16083 -1.68478,-0.76832 -4.10447,-0.62779 -6.50269,0.37974 -1.20085,0.50514 -2.01813,1.12178 -2.91522,2.19577 -0.77918,0.93815 -1.31147,1.90587 -1.74142,3.19138 -0.38776,1.15305 -0.53286,1.89258 -0.74653,3.76389 -0.20177,1.75747 -0.27852,2.79987 -0.24285,3.26893 0.0145,0.16203 -0.009,0.27552 -0.0772,0.3961 -0.11736,0.20827 -0.15058,0.30199 -0.56677,1.54057 -0.46093,1.38212 -0.64309,1.99519 -0.77308,2.63208 -0.27025,1.31807 -0.25296,2.21559 0.0684,3.19451 0.21449,0.65542 0.3892,0.97253 0.88059,1.60266 0.60431,0.7668 1.15373,1.25688 1.62856,1.43525 0.40772,0.15685 1.53713,0.2848 2.21873,0.25469 1.06028,-0.0468 3.02671,-0.54603 4.32722,-1.09559 1.70709,-0.72416 3.21702,-1.59353 6.45478,-3.71296 2.61931,-1.71416 3.6189,-2.33386 3.93789,-2.44144 l 0.15029,-0.0513 -0.0391,0.19387 c -0.0515,0.23528 -0.19464,0.41769 -0.73398,0.9172 -0.57692,0.53738 -1.38886,1.21831 -2.94579,2.46507 -2.86604,2.29471 -4.05453,3.33228 -4.82441,4.21777 -1.02926,1.18432 -1.92543,3.264 -2.11272,4.89652 -0.19279,1.71872 0.12071,2.88127 1.28889,4.77374 0.4102,0.66956 0.86603,1.25404 1.0807,1.3857 0.29919,0.18988 1.32282,0.42613 2.68218,0.61934 0.9859,0.13767 1.66933,0.17448 2.65257,0.13657 l 0.93618,-0.0338 0.73652,0.30584 c 0.40517,0.16793 0.90034,0.35798 1.10167,0.4224 1.20483,0.37532 2.97105,0.66689 4.18203,0.69137 1.14227,0.0225 1.8129,-0.12216 2.86802,-0.62038 1.42954,-0.67109 3.39989,-1.99764 4.10501,-2.76527 0.81094,-0.87594 1.551,-2.33064 1.88304,-3.69146 0.15001,-0.61124 0.18507,-1.39859 0.0932,-2.19803 -0.11263,-0.98388 -0.64069,-2.32822 -1.9575,-4.9494 -0.95783,-1.91694 -1.4614,-2.99312 -1.60274,-3.45416 -0.14127,-0.46104 -0.067,-0.782 0.26333,-1.12607 l 0.11765,-0.12184 0.16576,0.25561 c 0.21655,0.33508 1.74296,2.53621 2.55542,3.68556 0.68604,0.97289 1.87672,2.45652 2.28443,2.85018 1.01026,0.97967 2.51442,1.91816 4.08896,2.55231 1.14775,0.45998 1.9338,0.61405 3.29816,0.64862 1.06302,0.0285 1.6282,-0.0218 2.32975,-0.21281 0.5446,-0.14832 0.93714,-0.31233 1.73252,-0.73457 0.69541,-0.36398 0.71074,-0.3802 0.62928,-0.6138 -0.0268,-0.0705 -0.12909,-0.3019 -0.22718,-0.51371 -0.23993,-0.5085 -0.38765,-0.65493 -0.82719,-0.82384 -0.30658,-0.12047 -0.41856,-0.13492 -1.41286,-0.16137 -1.74681,-0.0514 -2.27202,-0.13652 -3.25188,-0.52473 -2.24814,-0.88795 -3.65889,-1.94345 -5.83794,-4.36435 -1.06726,-1.18192 -1.87572,-2.26149 -2.10432,-2.80592 -0.13894,-0.32171 -0.1378,-0.32718 0.0693,-0.21249 1.0359,0.58207 1.90353,1.15641 3.10353,2.06365 1.63136,1.22361 1.86349,1.34186 3.28575,1.63722 1.94456,0.40544 3.27637,0.50592 4.94514,0.37119 1.46891,-0.11838 2.40822,-0.37767 3.52998,-0.97701 1.47709,-0.78951 2.36624,-1.62971 3.0698,-2.90161 0.36807,-0.66889 0.55097,-1.12316 0.6145,-1.52243 0.0324,-0.20242 0.12132,-0.56194 0.19702,-0.8021 0.30538,-0.92146 0.32292,-1.45858 0.11565,-3.31723 -0.14562,-1.32753 -0.15518,-2.07161 -0.035,-3.25201 0.0912,-0.88041 0.25999,-1.5106 0.56112,-2.11463 l 0.26129,-0.51882 -0.0355,-0.38269 c -0.02,-0.21234 -0.0435,-0.57237 -0.047,-0.80647 -0.0188,-0.69142 -0.1617,-1.18315 -0.59777,-2.06513 -0.41543,-0.83401 -0.80282,-1.45273 -1.35208,-2.15699 -0.62876,-0.79817 -0.74312,-0.88822 -1.61417,-1.22307 -1.83539,-0.70311 -3.41173,-0.69377 -5.43857,0.0294 -0.9967,0.3579 -1.82002,0.75157 -2.71008,1.29644 -1.1518,0.70434 -1.44705,0.9213 -5.34648,3.90712 -2.16519,1.65789 -3.84869,2.92893 -3.88796,2.93596 -0.054,0.009 -0.0608,10e-4 -0.0338,-0.0515 0.0721,-0.13718 0.80639,-0.83149 2.84013,-2.69382 2.6855,-2.4616 3.37401,-3.15727 4.08931,-4.15582 1.15518,-1.60406 1.89863,-2.96113 2.51803,-4.59207 0.70142,-1.84864 0.79467,-3.09948 0.3361,-4.51978 -0.30049,-0.94486 -0.96796,-2.20974 -1.54836,-2.95392 -0.46865,-0.59288 -0.79949,-0.83139 -1.62286,-1.14813 -1.18913,-0.45564 -2.12833,-0.53342 -3.51754,-0.29852 -0.39015,0.0666 -1.27749,0.2131 -1.96905,0.3237 -1.78606,0.29293 -2.32442,0.27703 -4.12615,-0.11028 -1.02621,-0.2252 -1.67487,-0.32508 -2.34298,-0.37816 -1.5698,-0.11863 -3.16497,0.19659 -4.44811,0.88336 -0.44007,0.23218 -1.45377,0.96289 -1.82913,1.31389 z"
|
||||||
style="fill:#ffffff;fill-opacity:0.5117;stroke:#ffffff;stroke-width:2.49738;stroke-dasharray:none;stroke-opacity:0.519962"
|
id="path1-3-3-3-6"
|
||||||
d="m 403.95446,91.44744 a 7.0950375,8.5844443 82.142743 0 0 -9.64888,6.492875 7.0950375,8.5844443 82.142743 0 0 0.0305,2.112375 c 0.29155,2.43298 1.54866,6.69657 6.33049,11.34195 7.39392,7.18298 7.08848,9.04046 7.08843,9.04078 4e-5,-2.1e-4 0.307,-1.85765 9.86876,-7.82686 6.18383,-3.86038 8.80077,-7.84663 9.87824,-10.18161 a 7.0950375,8.5844443 82.142743 0 0 0.718,-2.05879 7.0950375,8.5844443 82.142743 0 0 -7.30831,-7.706798 7.0950375,8.5844443 82.142743 0 0 -9.64889,6.492875 7.0950375,8.5844443 82.142743 0 0 -7.30834,-7.706797 z" /><path
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00399432"
|
||||||
id="path4-2-6-1-9-8-4-9-5"
|
inkscape:transform-center-x="323.33333"
|
||||||
style="fill:#ffffff;fill-opacity:0.5117;stroke:#ffffff;stroke-width:7.54176;stroke-dasharray:none;stroke-opacity:0.521569"
|
inkscape:transform-center-y="-3.4874273" /><path
|
||||||
d="m 410.46352,265.86621 a 24.802737,22.39469 2.0523303 0 0 -30.17074,15.95063 24.802737,22.39469 2.0523303 0 0 -0.74427,6.61415 c -0.12337,7.7333 1.79614,21.62064 13.65297,38.28529 18.33368,25.76802 16.72835,31.4347 16.72811,31.43572 1.4e-4,-6.3e-4 1.60998,-5.66652 31.32518,-20.02007 19.21759,-9.28266 28.27643,-20.56192 32.27921,-27.37361 a 24.802737,22.39469 2.0523303 0 0 2.8654,-6.11021 24.802737,22.39469 2.0523303 0 0 -17.88248,-27.36631 24.802737,22.39469 2.0523303 0 0 -30.17081,15.95066 24.802737,22.39469 2.0523303 0 0 -17.88257,-27.36625 z" /><path
|
d="m 309.70135,218.68714 c -0.77928,0.0869 -1.22459,0.20605 -2.02242,0.54734 -1.27283,0.54414 -2.53081,1.38448 -3.35835,2.24735 -0.45271,0.46686 -1.232,1.47462 -1.49918,1.93182 -0.18554,0.31876 -0.27831,0.79848 -0.42674,2.22804 -0.0779,0.73086 -0.11133,1.11402 -0.28204,3.17139 -0.16327,1.95114 -0.2746,2.92026 -0.34882,3.03298 -0.0594,0.0934 -0.18924,-0.72446 -0.56034,-3.49982 -0.53065,-3.97634 -0.66795,-4.6557 -1.15037,-5.63771 -0.7199,-1.4553 -2.39721,-2.66591 -4.50869,-3.25189 -1.05761,-0.29299 -1.91853,-0.29943 -3.0689,-0.0257 -1.00193,0.24147 -1.85543,0.63749 -2.80541,1.31362 -0.8535,0.60532 -1.33221,1.04962 -2.44175,2.25702 -1.04276,1.13334 -1.63278,1.82879 -1.85172,2.17973 -0.0743,0.12236 -0.14844,0.18997 -0.25606,0.23827 -0.18553,0.0837 -0.25604,0.13199 -1.17263,0.78238 -1.02049,0.72765 -1.45837,1.0625 -1.87398,1.44243 -0.86092,0.7856 -1.31365,1.42953 -1.60681,2.29564 -0.19668,0.57954 -0.24492,0.89829 -0.24492,1.60983 0.004,0.86932 0.11504,1.51326 0.33768,1.89642 0.18926,0.33162 0.87207,1.03351 1.33964,1.38123 0.72733,0.54093 2.2896,1.25249 3.43626,1.56803 1.50661,0.41212 2.95756,0.61494 6.20085,0.86928 2.62358,0.20607 3.60697,0.3091 3.87415,0.40571 l 0.12617,0.0451 -0.12617,0.11591 c -0.15585,0.13846 -0.34511,0.18996 -0.96112,0.25114 -0.66053,0.0676 -1.55113,0.10948 -3.22844,0.14809 -3.08745,0.0708 -4.41223,0.161 -5.38076,0.37027 -1.29509,0.28013 -2.96499,1.26535 -3.93353,2.31819 -1.01677,1.11082 -1.41012,2.10247 -1.61423,4.07292 -0.0743,0.69547 -0.0743,1.35549 0,1.56479 0.1002,0.29621 0.65683,1.01742 1.45838,1.88994 0.58261,0.63107 1.01678,1.02709 1.68845,1.53258 l 0.63827,0.48296 0.33026,0.61497 c 0.18183,0.33808 0.41191,0.74052 0.5121,0.89508 0.60488,0.91761 1.62536,2.07993 2.41577,2.75284 0.74589,0.63427 1.26542,0.89507 2.22282,1.11402 1.29509,0.29941 3.28783,0.42823 4.15245,0.26722 0.9908,-0.18028 2.23394,-0.80815 3.15796,-1.59053 0.41561,-0.35094 0.84607,-0.88864 1.1986,-1.50361 0.43418,-0.7566 0.77928,-1.99297 1.2617,-4.55909 0.35623,-1.87386 0.57889,-2.90737 0.72361,-3.30984 0.14473,-0.40247 0.35996,-0.5892 0.75702,-0.65361 l 0.14101,-0.0224 -0.0223,0.27046 c -0.0297,0.35414 -0.15585,2.73674 -0.21151,3.9892 -0.0482,1.05928 -0.0259,2.75284 0.0408,3.25189 0.16328,1.23958 0.67537,2.71743 1.39157,4.01819 0.52323,0.94658 0.96482,1.48106 1.85172,2.24412 0.69022,0.59564 1.091,0.86609 1.65506,1.11079 0.43787,0.18996 0.78298,0.28657 1.52887,0.41856 0.6494,0.11914 0.66795,0.11592 0.73475,-0.0933 0.0185,-0.0644 0.0705,-0.28334 0.11503,-0.4862 0.10392,-0.4894 0.0817,-0.67291 -0.12246,-1.03029 -0.141,-0.25114 -0.2078,-0.32198 -0.85349,-0.87898 -1.13182,-0.98201 -1.43611,-1.32652 -1.88512,-2.13146 -1.03162,-1.84488 -1.42126,-3.35489 -1.61424,-6.2462 -0.0965,-1.41343 -0.0743,-2.61439 0.0557,-3.12309 0.0743,-0.30267 0.0779,-0.30589 0.15585,-0.11272 0.38593,0.97236 0.66425,1.84813 0.99081,3.13922 0.44901,1.7483 0.54178,1.95757 1.3322,2.93637 1.07986,1.33938 1.91109,2.13143 3.08744,2.9396 1.03533,0.71152 1.79235,1.03671 2.84623,1.22026 1.38787,0.24145 2.41206,0.12878 3.53646,-0.38961 0.59002,-0.27366 0.94627,-0.49581 1.1949,-0.74372 0.12617,-0.12557 0.37109,-0.33163 0.5455,-0.46045 0.67908,-0.48615 0.96852,-0.85642 1.79235,-2.28275 0.59002,-1.01743 0.96853,-1.54868 1.65875,-2.31818 0.51581,-0.5731 0.95369,-0.92728 1.46579,-1.1913 l 0.44159,-0.22538 0.17441,-0.28978 c 0.0965,-0.16097 0.26719,-0.42821 0.38594,-0.59564 0.34511,-0.49904 0.50468,-0.92405 0.67166,-1.7837 0.15586,-0.81457 0.21895,-1.46174 0.21895,-2.25703 -0.004,-0.90472 -0.0334,-1.03029 -0.43788,-1.73861 -0.8535,-1.49074 -1.90368,-2.33752 -3.62181,-2.9235 -0.84608,-0.28656 -1.59567,-0.45397 -2.46773,-0.55056 -1.1281,-0.12557 -1.4361,-0.13202 -5.5663,-0.13202 -2.29331,0 -4.06711,-0.0128 -4.09679,-0.029 -0.0408,-0.0224 -0.0408,-0.0322 0.004,-0.0547 0.11876,-0.058 0.96482,-0.15132 3.2767,-0.36703 3.05404,-0.28656 3.87043,-0.40568 4.86123,-0.72443 1.59568,-0.50872 2.79057,-1.06572 4.04485,-1.88352 1.42126,-0.92729 2.13004,-1.76118 2.5605,-3.01364 0.28944,-0.83069 0.50097,-2.08636 0.50097,-2.92671 -0.004,-0.67291 -0.1002,-1.02065 -0.48242,-1.69034 -0.55292,-0.96591 -1.13553,-1.52936 -2.17828,-2.11535 -0.29315,-0.1642 -0.95741,-0.54091 -1.47321,-0.83711 -1.33592,-0.75986 -1.68473,-1.0625 -2.67925,-2.31175 -0.56406,-0.71478 -0.94256,-1.13656 -1.35817,-1.53579 -0.97967,-0.93372 -2.20055,-1.57444 -3.40658,-1.78371 -0.4119,-0.0741 -1.46208,-0.10626 -1.89254,-0.0612 z"
|
||||||
id="path4-2-6-1-9-8-5"
|
id="path1-3-3-2"
|
||||||
style="fill:#ffffff;fill-opacity:0.50980395;stroke:#ffffff;stroke-width:3.6405;stroke-dasharray:none;stroke-opacity:0.519962"
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00345656" /><path
|
||||||
d="m 114.43099,189.33754 a 10.333135,12.525309 79.004057 0 0 -14.00848,9.75499 10.333135,12.525309 79.004057 0 0 0.0547,3.08382 c 0.43602,3.54457 2.28588,9.73496 9.26636,16.38295 10.79359,10.27954 10.35819,13.00063 10.3581,13.00111 6e-5,-3e-4 0.4377,-2.72141 14.32197,-11.70923 8.9793,-5.8126 12.76786,-11.70785 14.32433,-15.14812 a 10.333135,12.525309 79.004057 0 0 1.03481,-3.02677 10.333135,12.525309 79.004057 0 0 -10.67161,-11.04688 10.333135,12.525309 79.004057 0 0 -14.00848,9.75501 10.333135,12.525309 79.004057 0 0 -10.6716,-11.04688 z" /><path
|
d="m 434.17193,103.02813 c -0.71225,0.32793 -1.09736,0.58128 -1.74709,1.15649 -1.03665,0.91735 -1.96592,2.11115 -2.47956,3.19075 -0.28262,0.58569 -0.70482,1.78761 -0.8144,2.30569 -0.0757,0.36098 -0.0126,0.8455 0.29675,2.24905 0.15627,0.71819 0.24522,1.09238 0.73122,3.0988 0.45959,1.90326 0.65918,2.85811 0.62424,2.98847 -0.027,0.10736 -0.4078,-0.62798 -1.63417,-3.14519 -1.75608,-3.60681 -2.10037,-4.20834 -2.86754,-4.98842 -1.14163,-1.15448 -3.11488,-1.77516 -5.30345,-1.66626 -1.09607,0.055 -1.9152,0.3201 -2.9208,0.94223 -0.87487,0.54476 -1.56019,1.18945 -2.24886,2.13038 -0.6194,0.84334 -0.9338,1.41581 -1.60657,2.91123 -0.63271,1.40409 -0.97365,2.24998 -1.07091,2.65202 -0.032,0.13953 -0.0811,0.22706 -0.16798,0.30679 -0.14972,0.13788 -0.20143,0.20592 -0.86652,1.11191 -0.73935,1.01204 -1.04948,1.46776 -1.32427,1.95926 -0.56965,1.01678 -0.79652,1.77053 -0.80196,2.6849 -0.004,0.61199 0.0505,0.92971 0.2746,1.60503 0.27761,0.82381 0.58582,1.4 0.91781,1.69353 0.28408,0.25513 1.15321,0.70623 1.7065,0.88898 0.86069,0.28431 2.56757,0.46758 3.75525,0.40589 1.55973,-0.0834 3.00071,-0.34791 6.15903,-1.12806 2.55495,-0.63077 3.52074,-0.84273 3.80475,-0.83519 l 0.13395,0.003 -0.0832,0.14975 c -0.10431,0.1805 -0.26771,0.28899 -0.8331,0.54108 -0.60562,0.27221 -1.43769,0.59247 -3.01747,1.15742 -2.908,1.03966 -4.13694,1.54254 -4.99026,2.04621 -1.14094,0.67379 -2.41552,2.13484 -3.00315,3.43915 -0.61514,1.37454 -0.67613,2.43961 -0.24921,4.37405 0.14854,0.68348 0.35642,1.3099 0.49286,1.48515 0.1884,0.24957 0.94386,0.75875 1.97943,1.33439 0.75173,0.41544 1.28854,0.65456 2.08523,0.92276 l 0.7579,0.25734 0.50715,0.47965 c 0.27906,0.2636 0.62419,0.57308 0.76796,0.68822 0.86312,0.68038 2.19775,1.46212 3.15988,1.85182 0.9077,0.36705 1.48293,0.45094 2.46057,0.35719 1.32347,-0.12374 3.25536,-0.62914 4.02526,-1.05428 0.88358,-0.48318 1.86569,-1.47065 2.49625,-2.50425 0.28392,-0.46398 0.52311,-1.1099 0.66399,-1.8046 0.17378,-0.85485 0.11189,-2.13698 -0.2385,-4.72444 -0.25212,-1.89068 -0.36632,-2.94172 -0.35573,-3.36929 0.0106,-0.42757 0.15606,-0.67259 0.51262,-0.85878 l 0.12678,-0.0657 0.064,0.26371 c 0.0833,0.34547 0.71408,2.64653 1.05574,3.85278 0.2879,1.02054 0.84249,2.62088 1.06298,3.07352 0.5454,1.12506 1.49691,2.36639 2.58636,3.37536 0.79474,0.7336 1.3822,1.10178 2.4643,1.54666 0.8427,0.34792 1.30827,0.47837 1.92069,0.53295 0.47541,0.0424 0.83339,0.0254 1.58289,-0.0843 0.65387,-0.0915 0.67046,-0.10036 0.66796,-0.31997 -0.003,-0.067 -0.0223,-0.29113 -0.044,-0.49769 -0.0555,-0.49722 -0.13441,-0.66439 -0.44074,-0.93928 -0.21293,-0.19394 -0.29864,-0.24014 -1.08691,-0.56541 -1.38351,-0.57554 -1.78083,-0.80667 -2.46052,-1.42921 -1.56019,-1.42605 -2.40561,-2.73647 -3.49945,-5.41983 -0.53678,-1.3111 -0.89398,-2.45792 -0.93082,-2.98168 -0.0248,-0.31066 -0.0224,-0.31485 0.11241,-0.15607 0.67255,0.80131 1.21255,1.54485 1.92915,2.66736 0.97682,1.51789 1.13078,1.68729 2.18926,2.36731 1.44677,0.93108 2.48516,1.421 3.85619,1.81752 1.20674,0.3492 2.02765,0.4194 3.08571,0.26166 1.39327,-0.20798 2.32985,-0.6375 3.23374,-1.48366 0.47379,-0.44557 0.74194,-0.76863 0.89983,-1.08223 0.0802,-0.15892 0.24774,-0.43163 0.3727,-0.60883 0.49139,-0.6753 0.64948,-1.11789 0.98212,-2.7311 0.23953,-1.15148 0.43144,-1.77491 0.84416,-2.72265 0.30904,-0.70639 0.61308,-1.18046 1.01595,-1.59234 l 0.34813,-0.353 0.0743,-0.32997 c 0.0409,-0.18317 0.11872,-0.49057 0.17869,-0.68688 0.17036,-0.58234 0.18794,-1.03598 0.0756,-1.90446 -0.10864,-0.8222 -0.2526,-1.45631 -0.50309,-2.21112 -0.28876,-0.85741 -0.35622,-0.96733 -0.96321,-1.51219 -1.2796,-1.14604 -2.54304,-1.61894 -4.35828,-1.63393 -0.89328,-0.005 -1.65744,0.0717 -2.51554,0.25473 -1.11023,0.23614 -1.40459,0.32703 -5.32456,1.62793 -2.17659,0.72233 -3.86413,1.26888 -3.8974,1.26285 -0.0458,-0.008 -0.0489,-0.0177 -0.0134,-0.0532 0.0944,-0.0925 0.86805,-0.44751 2.99432,-1.38042 2.80833,-1.23391 3.54565,-1.60411 4.38562,-2.21871 1.35423,-0.98542 2.31286,-1.89043 3.24571,-3.06167 1.05685,-1.32775 1.4669,-2.34244 1.48096,-3.66673 0.0131,-0.87958 -0.18167,-2.13796 -0.44636,-2.93554 -0.21574,-0.6374 -0.41657,-0.93714 -0.99027,-1.45235 -0.82901,-0.74259 -1.55944,-1.09386 -2.73369,-1.32158 -0.32994,-0.0635 -1.07905,-0.21183 -1.66189,-0.33049 -1.50726,-0.3004 -1.93364,-0.47777 -3.27101,-1.35019 -0.76049,-0.50074 -1.25257,-0.78183 -1.77278,-1.02983 -1.2239,-0.57763 -2.58444,-0.80119 -3.795,-0.61995 -0.41428,0.0594 -1.42113,0.35967 -1.81549,0.53802 z"
|
||||||
id="path4-2-6-1-9-8-4-9-2-2"
|
id="path1-3-3-2-0"
|
||||||
style="fill:#ffffff;fill-opacity:0.5117;stroke:#ffffff;stroke-width:3.62674;stroke-dasharray:none;stroke-opacity:0.519962"
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00345656" /><path
|
||||||
d="m 178.56055,273.32338 a 10.656883,12.053184 66.089768 0 0 -7.97821,14.16205 10.656883,12.053184 66.089768 0 0 1.49012,2.79504 c 2.04675,3.07265 6.5954,8.03049 15.94965,11.48124 14.46412,5.33577 15.34612,7.98353 15.34628,7.98398 -8e-5,-2.8e-4 -0.88012,-2.64887 7.3455,-16.0639 5.31973,-8.67576 5.95524,-15.47956 5.74045,-19.20452 a 10.656883,12.053184 66.089768 0 0 -0.48843,-3.15169 10.656883,12.053184 66.089768 0 0 -14.7135,-6.08217 10.656883,12.053184 66.089768 0 0 -7.97826,14.1621 10.656883,12.053184 66.089768 0 0 -14.71355,-6.08215 z" /></svg>
|
d="m 99.090959,92.821662 c -0.71225,0.32793 -1.09736,0.58128 -1.74709,1.15649 -1.03665,0.91735 -1.96592,2.11115 -2.47956,3.19075 -0.28262,0.58569 -0.70482,1.78761 -0.8144,2.30569 -0.0757,0.36098 -0.0126,0.845498 0.29675,2.249048 0.15627,0.71819 0.24522,1.09238 0.73122,3.0988 0.45959,1.90326 0.65918,2.85811 0.62424,2.98847 -0.027,0.10736 -0.4078,-0.62798 -1.63417,-3.14519 -1.75608,-3.60681 -2.10037,-4.20834 -2.86754,-4.988418 -1.14163,-1.15448 -3.11488,-1.77516 -5.30345,-1.66626 -1.09607,0.055 -1.9152,0.3201 -2.9208,0.94223 -0.87487,0.54476 -1.56019,1.189448 -2.24886,2.130378 -0.6194,0.84334 -0.9338,1.41581 -1.60657,2.91123 -0.63271,1.40409 -0.97365,2.24998 -1.07091,2.65202 -0.032,0.13953 -0.0811,0.22706 -0.16798,0.30679 -0.14972,0.13788 -0.20143,0.20592 -0.86652,1.11191 -0.73935,1.01204 -1.04948,1.46776 -1.32427,1.95926 -0.56965,1.01678 -0.79652,1.77053 -0.80196,2.6849 -0.004,0.61199 0.0505,0.92971 0.2746,1.60503 0.27761,0.82381 0.58582,1.4 0.91781,1.69353 0.28408,0.25513 1.15321,0.70623 1.7065,0.88898 0.86069,0.28431 2.56757,0.46758 3.75525,0.40589 1.55973,-0.0834 3.00071,-0.34791 6.15903,-1.12806 2.55495,-0.63077 3.52074,-0.84273 3.80475,-0.83519 l 0.13395,0.003 -0.0832,0.14975 c -0.10431,0.1805 -0.26771,0.28899 -0.8331,0.54108 -0.60562,0.27221 -1.43769,0.59247 -3.01747,1.15742 -2.908,1.03966 -4.13694,1.54254 -4.99026,2.04621 -1.14094,0.67379 -2.41552,2.13484 -3.00315,3.43915 -0.61514,1.37454 -0.67613,2.43961 -0.24921,4.37405 0.14854,0.68348 0.35642,1.3099 0.49286,1.48515 0.1884,0.24957 0.94386,0.75875 1.97943,1.33439 0.75173,0.41544 1.28854,0.65456 2.08523,0.92276 l 0.7579,0.25734 0.50715,0.47965 c 0.27906,0.2636 0.62419,0.57308 0.76796,0.68822 0.86312,0.68038 2.19775,1.46212 3.15988,1.85182 0.9077,0.36705 1.48293,0.45094 2.46057,0.35719 1.32347,-0.12374 3.25536,-0.62914 4.02526,-1.05428 0.88358,-0.48318 1.86569,-1.47065 2.49625,-2.50425 0.28392,-0.46398 0.52311,-1.1099 0.66399,-1.8046 0.17378,-0.85485 0.11189,-2.13698 -0.2385,-4.72444 -0.25212,-1.89068 -0.36632,-2.94172 -0.35573,-3.36929 0.0106,-0.42757 0.15606,-0.67259 0.51262,-0.85878 l 0.12678,-0.0657 0.064,0.26371 c 0.0833,0.34547 0.71408,2.64653 1.055741,3.85278 0.2879,1.02054 0.84249,2.62088 1.06298,3.07352 0.5454,1.12506 1.49691,2.36639 2.58636,3.37536 0.79474,0.7336 1.3822,1.10178 2.4643,1.54666 0.8427,0.34792 1.30827,0.47837 1.92069,0.53295 0.47541,0.0424 0.83339,0.0254 1.58289,-0.0843 0.65387,-0.0915 0.67046,-0.10036 0.66796,-0.31997 -0.003,-0.067 -0.0223,-0.29113 -0.044,-0.49769 -0.0555,-0.49722 -0.13441,-0.66439 -0.44074,-0.93928 -0.21293,-0.19394 -0.29864,-0.24014 -1.08691,-0.56541 -1.38351,-0.57554 -1.78083,-0.80667 -2.46052,-1.42921 -1.56019,-1.42605 -2.40561,-2.73647 -3.49945,-5.41983 -0.53678,-1.3111 -0.89398,-2.45792 -0.93082,-2.98168 -0.0248,-0.31066 -0.0224,-0.31485 0.11241,-0.15607 0.67255,0.80131 1.21255,1.54485 1.92915,2.66736 0.97682,1.51789 1.13078,1.68729 2.18926,2.36731 1.44677,0.93108 2.48516,1.421 3.85619,1.81752 1.20674,0.3492 2.02765,0.4194 3.08571,0.26166 1.39327,-0.20798 2.32985,-0.6375 3.23374,-1.48366 0.47379,-0.44557 0.74194,-0.76863 0.89983,-1.08223 0.0802,-0.15892 0.24774,-0.43163 0.3727,-0.60883 0.49139,-0.6753 0.64948,-1.11789 0.98212,-2.7311 0.23953,-1.15148 0.43144,-1.77491 0.84416,-2.72265 0.30904,-0.70639 0.61308,-1.18046 1.01595,-1.59234 l 0.34813,-0.353 0.0743,-0.32997 c 0.0409,-0.18317 0.11872,-0.49057 0.17869,-0.68688 0.17036,-0.58234 0.18794,-1.03598 0.0756,-1.90446 -0.10864,-0.8222 -0.2526,-1.45631 -0.50309,-2.21112 -0.28876,-0.85741 -0.35622,-0.96733 -0.96321,-1.51219 -1.2796,-1.14604 -2.54304,-1.61894 -4.35828,-1.63393 -0.89328,-0.005 -1.65744,0.0717 -2.51554,0.25473 -1.11023,0.23614 -1.40459,0.32703 -5.32456,1.62793 -2.17659,0.72233 -3.86413,1.26888 -3.8974,1.26285 -0.0458,-0.008 -0.0489,-0.0177 -0.0134,-0.0532 0.0944,-0.0925 0.86805,-0.44751 2.99432,-1.38042 2.80833,-1.23391 3.54565,-1.60411 4.38562,-2.21871 1.35423,-0.98542 2.31286,-1.89043 3.24571,-3.06167 1.05685,-1.32775 1.4669,-2.34244 1.48096,-3.66673 0.0131,-0.87958 -0.18167,-2.137958 -0.44636,-2.935538 -0.21574,-0.6374 -0.41657,-0.93714 -0.99027,-1.45235 -0.82901,-0.74259 -1.55944,-1.09386 -2.73369,-1.32158 -0.32994,-0.0635 -1.07905,-0.21183 -1.66189,-0.33049 -1.50726,-0.3004 -1.93364,-0.47777 -3.27101,-1.35019 -0.76049,-0.50074 -1.25257,-0.78183 -1.77278,-1.02983 -1.2239,-0.57763 -2.58444,-0.80119 -3.795,-0.61995 -0.41428,0.0594 -1.421131,0.35967 -1.815491,0.53802 z"
|
||||||
|
id="path1-3-3-2-0-4"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00345656" /></svg>
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 56 KiB |
BIN
dist/eden.bmp
vendored
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
BIN
dist/eden.ico
vendored
|
Before Width: | Height: | Size: 379 KiB After Width: | Height: | Size: 352 KiB |
225
dist/icon_variations/2025_named.svg
vendored
|
Before Width: | Height: | Size: 21 KiB |
2
dist/icon_variations/README.md
vendored
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
These icons are licensed under GPLv3. Please see the [script for generating icons](../../tools/README.md) and appropriatedly redirect for seasonal icons.
|
These icons are licensed under GPLv3. Please see the [script for generating icons](../../tools/README.md) and appropriatedly redirect for seasonal icons.
|
||||||
|
|
||||||
- `base_named.svg` - Named variant.
|
- `base_named.svg` - Named variant (deprecated).
|
||||||
- `base_small.svg`: Variant used for tiny icons (16x16, 64x64, etc).
|
- `base_small.svg`: Variant used for tiny icons (16x16, 64x64, etc).
|
||||||
- `base.svg`: Variant without branding/naming.
|
- `base.svg`: Variant without branding/naming.
|
||||||
|
|
||||||
|
|
|
||||||
337
dist/icon_variations/base_named.svg
vendored
|
Before Width: | Height: | Size: 42 KiB |
110
dist/icon_variations/halloween2025_named.svg
vendored
|
Before Width: | Height: | Size: 39 KiB |
684
dist/icon_variations/newyear2025_named.svg
vendored
|
Before Width: | Height: | Size: 33 KiB |
81
dist/icon_variations/original_named.svg
vendored
|
Before Width: | Height: | Size: 37 KiB |
196
dist/icon_variations/saintpatrick2026.svg
vendored
Normal file
|
|
@ -0,0 +1,196 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="512"
|
||||||
|
height="512"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 512 512"
|
||||||
|
version="1.1"
|
||||||
|
id="svg7"
|
||||||
|
sodipodi:docname="saintpatrick2026_named.svg"
|
||||||
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
|
xml:space="preserve"
|
||||||
|
inkscape:export-filename="dev.eden_emu.eden.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||||
|
<metadata
|
||||||
|
id="metadata1">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
|
||||||
|
<dc:creator>
|
||||||
|
<cc:Agent>
|
||||||
|
<dc:title>Madeline_Dev</dc:title>
|
||||||
|
<dc:identifier>mailto:madelvidel@gmail.com</dc:identifier>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:creator>
|
||||||
|
<dc:date>2025</dc:date>
|
||||||
|
<dc:license
|
||||||
|
rdf:resource="https://www.gnu.org/licenses/gpl-3.0.html" />
|
||||||
|
<dc:rights>2025 Eden Emulator Project</dc:rights>
|
||||||
|
<dc:source>https://git.eden-emu.dev</dc:source>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs7"><linearGradient
|
||||||
|
id="swatch14"
|
||||||
|
inkscape:swatch="solid"><stop
|
||||||
|
style="stop-color:#66003b;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop14" /></linearGradient><linearGradient
|
||||||
|
id="linearGradient11"
|
||||||
|
inkscape:collect="always"><stop
|
||||||
|
style="stop-color:#f6d512;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop11" /><stop
|
||||||
|
style="stop-color:#1d8e53;stop-opacity:1;"
|
||||||
|
offset="0.99898213"
|
||||||
|
id="stop20" /><stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="0.99898213"
|
||||||
|
id="stop12" /></linearGradient><linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient11"
|
||||||
|
id="linearGradient12"
|
||||||
|
x1="109.74531"
|
||||||
|
y1="106.54533"
|
||||||
|
x2="431.05463"
|
||||||
|
y2="427.85461"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
spreadMethod="reflect"
|
||||||
|
gradientTransform="matrix(1.0945321,0,0,1.0945321,-39.661525,-35.159057)" /><filter
|
||||||
|
inkscape:label="Light Contour"
|
||||||
|
inkscape:menu="Image Paint and Draw"
|
||||||
|
inkscape:menu-tooltip="Uses vertical specular light to draw lines"
|
||||||
|
style="color-interpolation-filters:sRGB"
|
||||||
|
id="filter11"
|
||||||
|
x="-0.01907517"
|
||||||
|
y="-0.054959154"
|
||||||
|
width="1.0379885"
|
||||||
|
height="1.1092314"><feGaussianBlur
|
||||||
|
in="SourceGraphic"
|
||||||
|
stdDeviation="0.38250006"
|
||||||
|
result="result3"
|
||||||
|
id="feGaussianBlur9" /><feComponentTransfer
|
||||||
|
result="result1"
|
||||||
|
in="result3"
|
||||||
|
id="feComponentTransfer9"><feFuncR
|
||||||
|
type="discrete"
|
||||||
|
tableValues="0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1"
|
||||||
|
id="feFuncR9" /><feFuncG
|
||||||
|
type="discrete"
|
||||||
|
tableValues="0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1"
|
||||||
|
id="feFuncG9" /><feFuncB
|
||||||
|
type="discrete"
|
||||||
|
tableValues="0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1"
|
||||||
|
id="feFuncB9" /></feComponentTransfer><feGaussianBlur
|
||||||
|
result="result5"
|
||||||
|
stdDeviation="0.01"
|
||||||
|
id="feGaussianBlur10" /><feBlend
|
||||||
|
in2="result5"
|
||||||
|
result="result6"
|
||||||
|
mode="lighten"
|
||||||
|
in="result5"
|
||||||
|
id="feBlend10" /><feColorMatrix
|
||||||
|
in="result6"
|
||||||
|
type="luminanceToAlpha"
|
||||||
|
result="result2"
|
||||||
|
id="feColorMatrix10" /><feSpecularLighting
|
||||||
|
surfaceScale="5"
|
||||||
|
result="result9"
|
||||||
|
specularExponent="20"
|
||||||
|
in="result2"
|
||||||
|
specularConstant="1"
|
||||||
|
id="feSpecularLighting10"><feDistantLight
|
||||||
|
azimuth="180"
|
||||||
|
elevation="90"
|
||||||
|
id="feDistantLight10" /></feSpecularLighting><feComposite
|
||||||
|
in2="result6"
|
||||||
|
operator="arithmetic"
|
||||||
|
in="result9"
|
||||||
|
k1="0.4"
|
||||||
|
k3="0.7"
|
||||||
|
result="result3"
|
||||||
|
id="feComposite10"
|
||||||
|
k2="0"
|
||||||
|
k4="0" /><feBlend
|
||||||
|
in2="result1"
|
||||||
|
in="result3"
|
||||||
|
mode="normal"
|
||||||
|
result="result8"
|
||||||
|
id="feBlend11" /><feComposite
|
||||||
|
in2="SourceGraphic"
|
||||||
|
in="result8"
|
||||||
|
operator="in"
|
||||||
|
result="result7"
|
||||||
|
id="feComposite11" /></filter></defs><sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:zoom="0.6363961"
|
||||||
|
inkscape:cx="172.06265"
|
||||||
|
inkscape:cy="122.56518"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="849"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg7"
|
||||||
|
showguides="false" /><circle
|
||||||
|
style="fill:url(#linearGradient12);fill-opacity:1;stroke:#e4e4e4;stroke-width:14.0448;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
id="path8"
|
||||||
|
cx="256.2999"
|
||||||
|
cy="257.2999"
|
||||||
|
r="248.67769" /><path
|
||||||
|
id="path15"
|
||||||
|
style="fill:#f3ffeb;fill-opacity:1;stroke:#ffffff;stroke-width:16.9642;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.33910036;paint-order:stroke fill markers"
|
||||||
|
d="m 306.72111,24.233031 c 0,0 -11.98397,40.08696 -18.0546,60.431848 -12.96613,9.503601 -21.49377,18.397701 -21.49377,18.397701 0,0 -23.41313,-31.029398 -45.74145,-43.934598 -22.32833,-12.905201 -52.42065,-11.242483 -52.42065,-11.242483 0,0 -12.50052,4e-4 -27.63117,5.537132 -15.13066,5.536732 -21.27107,9.227888 -21.27107,9.227888 0,0 15.35165,-0.410529 37.93799,6.766716 22.58635,7.177243 32.45374,11.484796 32.45374,11.484796 l 31.02752,-6.562453 -8.44161,11.074275 c 0,0 14.80259,8.920284 22.80648,16.917787 8.0039,7.9975 11.73088,12.50812 11.73088,12.50812 0,0 -13.92373,-5.43341 -56.68427,-1.74226 -42.76055,3.69116 -84.86368,56.39265 -84.86368,56.39265 0,0 41.22428,-15.9958 65.5649,-21.32747 24.34062,-5.33166 47.58524,-7.9983 47.58524,-7.9983 0,0 -18.41865,7.3827 -38.15428,38.3474 -19.73564,30.96468 -14.0351,80.18128 -14.0351,80.18128 0,0 31.35774,-59.05848 61.39977,-78.94969 30.04203,-19.89124 36.182,-20.50642 36.182,-20.50642 0,0 -24.1209,48.39514 -33.55015,126.11445 -9.42924,77.71931 30.26089,207.72959 30.26089,207.72959 l 47.80367,-6.97298 c 0,0 -45.61041,-42.24281 -49.55753,-151.33695 -3.94713,-109.09413 16.66479,-174.30453 16.66479,-174.30453 0,0 17.10508,1.23039 42.54213,32.81027 25.43704,31.57987 40.34713,57.41795 40.34713,57.41795 0,0 9.65024,-51.26683 -11.4011,-74.64415 -21.05135,-23.3773 -53.50637,-33.62931 -53.50637,-33.62931 0,0 13.70573,-6.66419 42.10313,-4.71609 28.39738,1.94813 87.30278,27.12897 87.30278,27.12896 0,0 -15.8158,-25.5214 -52.87463,-43.21167 -37.05881,-17.69028 -81.35597,0.29238 -81.35597,0.29238 0,0 4.13589,-15.37277 29.10021,-32.628037 24.96432,-17.25527 56.907,-34.36427 56.907,-34.36427 0,0 -26.3595,1.160335 -55.20025,12.035504 -7.176,2.7059 -14.064,6.299542 -20.36309,10.173104 l 17.40574,-51.051762 z" /><path
|
||||||
|
d="m 364.02341,369.59545 c -1.05628,0.0923 -4.67136,0.65996 -7.06652,1.09993 -1.73317,0.31934 -2.17946,0.41869 -2.99769,0.68125 -0.51326,0.15613 -0.62485,0.17032 -0.91495,0.0993 -0.43144,-0.10644 -2.3208,-0.2058 -4.86474,-0.26256 -4.47793,-0.10645 -6.76898,0.3761 -9.18647,1.91601 -1.68109,1.07865 -2.9754,2.40567 -4.18788,4.3075 -0.72897,1.14251 -0.92234,2.15729 -0.77357,4.17266 0.11901,1.59667 0.37935,2.58307 1.19757,4.54877 1.61417,3.84622 3.75641,6.6209 9.60302,12.41863 4.25482,4.22943 5.65324,5.72676 5.65324,6.07449 0,0.15612 -0.0298,0.17031 -0.40911,0.17031 -0.52812,0 -0.77362,-0.0993 -1.69599,-0.69545 -1.0711,-0.68834 -2.31333,-1.61087 -4.66389,-3.46302 -3.42913,-2.69661 -3.92749,-3.07982 -5.19948,-4.02364 -2.0307,-1.49024 -3.6374,-2.49082 -4.74571,-2.95209 -1.8968,-0.78769 -5.02097,-1.24895 -7.31945,-1.07864 -2.68526,0.20579 -4.72343,0.85866 -6.76156,2.16438 -1.98605,1.28445 -5.15484,4.17977 -5.58628,5.11648 -0.29009,0.62448 -0.46118,1.93022 -0.59505,4.4991 -0.11158,2.05794 -0.0373,3.37077 0.29011,5.40033 l 0.20083,1.24187 -0.45376,1.59667 c -0.70663,2.45535 -0.95956,4.18686 -1.04882,6.95444 -0.0819,2.76759 0.19338,4.45651 0.94467,5.90417 0.97445,1.85925 3.83081,4.98875 5.91358,6.46479 1.23478,0.87994 2.98284,1.48315 5.09534,1.7599 1.10831,0.14903 3.4663,0.12773 4.23992,-0.0355 1.02649,-0.21289 2.61833,-0.73092 3.39936,-1.10704 1.47284,-0.70253 3.91264,-2.36308 6.97727,-4.75455 4.66392,-3.63334 6.5235,-5.01713 7.28968,-5.40744 0.3868,-0.20579 0.51327,-0.23417 1.00417,-0.23417 0.49094,0 0.60253,0.0284 0.94471,0.21289 l 0.37936,0.21999 -1.78522,1.76698 c -8.50216,8.44468 -9.78157,9.89943 -11.44034,13.02184 -1.42817,2.69662 -2.41749,5.54225 -2.78942,8.01888 -0.23059,1.5825 -0.0892,4.59135 0.29753,6.03192 0.28267,1.06444 0.78846,2.24244 1.24966,2.87403 0.6546,0.90832 1.65877,2.09341 1.76292,2.09341 0.2901,0 1.77778,-1.12122 2.11996,-1.59668 0.14134,-0.1916 0.31243,-0.49673 0.37936,-0.67415 0.17852,-0.47546 0.20827,-1.52571 0.0744,-2.79596 -0.15619,-1.46186 -0.15619,-3.64754 -0.007,-4.48491 0.14877,-0.81607 0.60996,-2.44825 1.03396,-3.61204 0.78105,-2.18569 1.71829,-3.94559 3.35473,-6.31577 1.65877,-2.39857 4.64161,-6.0319 6.28548,-7.65697 0.66203,-0.65287 2.0456,-1.73151 2.12743,-1.66056 0.0297,0.0355 -0.61742,1.5683 -1.2199,2.85984 -0.41659,0.90123 -1.32407,2.62566 -2.13486,4.04493 -1.4505,2.54049 -1.98605,3.66882 -2.16458,4.55586 -0.29009,1.45476 -0.43143,3.34239 -0.43143,5.76934 0,2.12891 0.0147,2.48374 0.16362,3.40625 0.19341,1.15672 0.54301,2.77469 0.76619,3.49851 0.51322,1.67475 1.71084,3.49141 3.25803,4.94616 1.56209,1.47606 2.98283,2.16441 5.43008,2.63985 0.83307,0.15613 1.04881,0.16322 3.46631,0.0993 2.26129,-0.0639 2.98283,-0.23417 6.02513,-1.39088 1.74807,-0.66706 2.57372,-0.94382 3.64486,-1.22767 2.96051,-0.7806 5.22924,-0.9864 6.96983,-0.63158 0.78848,0.16322 0.7959,0.16322 1.07858,0.0284 0.15619,-0.0781 0.81822,-0.30515 1.46536,-0.50385 0.6546,-0.1987 1.4505,-0.49674 1.77778,-0.66705 2.14971,-1.09285 6.40453,-4.93907 7.26737,-6.57833 0.66945,-1.27735 1.17528,-3.87462 1.09345,-5.64871 -0.10415,-2.18568 -0.78103,-4.1017 -2.3059,-6.52156 -0.95956,-1.53281 -1.7555,-2.44825 -3.76387,-4.36426 -1.78521,-1.70313 -3.14646,-2.85984 -6.8136,-5.81901 -4.55235,-3.66173 -6.17394,-5.06681 -6.12187,-5.30809 0.0151,-0.071 0.0819,-0.11354 0.17109,-0.0993 0.27521,0.0497 1.85962,1.06446 6.00286,3.85334 4.28453,2.88111 6.06231,3.92428 7.81781,4.60554 3.94235,1.51151 8.04839,2.29922 11.44773,2.17857 1.95634,-0.0639 3.31758,-0.36901 4.85734,-1.08575 0.88516,-0.41157 2.40259,-1.3625 3.49606,-2.19986 1.07115,-0.81608 3.03487,-2.68952 3.51838,-3.34949 0.97443,-1.3412 1.65877,-3.95977 1.55462,-5.94674 -0.0595,-1.08575 -0.25287,-1.90184 -0.93723,-4.04494 -0.69179,-2.16438 -1.15298,-3.77526 -1.28684,-4.4636 -0.15624,-0.82319 -0.11901,-3.30691 0.0819,-4.8965 0.20827,-1.66764 0.28263,-4.11589 0.16362,-5.10938 -0.18594,-1.52571 -0.6397,-3.1153 -1.23476,-4.34298 -0.99674,-2.05794 -3.33244,-4.20814 -5.7276,-5.27968 -1.41332,-0.62449 -3.4961,-1.09994 -5.89127,-1.34831 -1.24965,-0.12065 -3.91264,-0.0497 -5.04324,0.14192 -1.815,0.30515 -4.71601,1.09994 -5.31849,1.44766 -0.80337,0.46836 -2.80432,2.24955 -7.21533,6.39382 -1.77778,1.67474 -3.8531,3.60496 -4.61181,4.28621 -1.24966,1.12832 -2.1051,1.79538 -2.19437,1.71022 -0.0967,-0.0993 1.34635,-2.19987 4.90939,-7.16023 4.95399,-6.89057 5.67552,-8.06147 6.44171,-10.41036 1.12318,-3.47012 0.052,-8.16082 -2.67041,-11.73029 -0.8852,-1.15671 -2.05303,-2.05085 -3.73412,-2.86694 -1.43561,-0.69544 -2.86379,-1.12122 -4.53745,-1.3554 -0.75872,-0.10644 -4.11344,-0.1987 -4.83498,-0.13482 z"
|
||||||
|
id="path1"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00726536" /><path
|
||||||
|
d="m 83.20673,250.24331 c -1.05628,0.0923 -4.67136,0.65996 -7.06652,1.09993 -1.73317,0.31934 -2.17946,0.41869 -2.99769,0.68125 -0.51326,0.15613 -0.62485,0.17032 -0.91495,0.0993 -0.43144,-0.10644 -2.3208,-0.2058 -4.86474,-0.26256 -4.47793,-0.10645 -6.76898,0.3761 -9.18647,1.91601 -1.68109,1.07865 -2.9754,2.40567 -4.18788,4.3075 -0.72897,1.14251 -0.92234,2.15729 -0.77357,4.17266 0.11901,1.59667 0.37935,2.58307 1.19757,4.54877 1.61417,3.84622 3.75641,6.6209 9.60302,12.41863 4.25482,4.22943 5.65324,5.72676 5.65324,6.07449 0,0.15612 -0.0298,0.17031 -0.40911,0.17031 -0.52812,0 -0.77362,-0.0993 -1.69599,-0.69545 -1.0711,-0.68834 -2.31333,-1.61087 -4.66389,-3.46302 -3.42913,-2.69661 -3.92749,-3.07982 -5.19948,-4.02364 -2.0307,-1.49024 -3.6374,-2.49082 -4.74571,-2.95209 -1.8968,-0.78769 -5.02097,-1.24895 -7.31945,-1.07864 -2.68526,0.20579 -4.72343,0.85866 -6.76156,2.16438 -1.98605,1.28445 -5.15484,4.17977 -5.58628,5.11648 -0.29009,0.62448 -0.46118,1.93022 -0.59505,4.4991 -0.11158,2.05794 -0.0373,3.37077 0.29011,5.40033 l 0.20083,1.24187 -0.45376,1.59667 c -0.70663,2.45535 -0.95956,4.18686 -1.04882,6.95444 -0.0819,2.76759 0.19338,4.45651 0.94467,5.90417 0.97445,1.85925 3.83081,4.98875 5.91358,6.46479 1.23478,0.87994 2.98284,1.48315 5.09534,1.7599 1.10831,0.14903 3.4663,0.12773 4.23992,-0.0355 1.02649,-0.21289 2.61833,-0.73092 3.39936,-1.10704 1.47284,-0.70253 3.91264,-2.36308 6.97727,-4.75455 4.66392,-3.63334 6.5235,-5.01713 7.28968,-5.40744 0.3868,-0.20579 0.51327,-0.23417 1.00417,-0.23417 0.49094,0 0.60253,0.0284 0.94471,0.21289 l 0.37936,0.21999 -1.78522,1.76698 c -8.50216,8.44468 -9.78157,9.89943 -11.44034,13.02184 -1.42817,2.69662 -2.41749,5.54225 -2.78942,8.01888 -0.23059,1.5825 -0.0892,4.59135 0.29753,6.03192 0.28267,1.06444 0.78846,2.24244 1.24966,2.87403 0.6546,0.90832 1.65877,2.09341 1.76292,2.09341 0.2901,0 1.77778,-1.12122 2.11996,-1.59668 0.14134,-0.1916 0.31243,-0.49673 0.37936,-0.67415 0.17852,-0.47546 0.20827,-1.52571 0.0744,-2.79596 -0.15619,-1.46186 -0.15619,-3.64754 -0.007,-4.48491 0.14877,-0.81607 0.60996,-2.44825 1.03396,-3.61204 0.78105,-2.18569 1.71829,-3.94559 3.35473,-6.31577 1.65877,-2.39857 4.64161,-6.0319 6.28548,-7.65697 0.66203,-0.65287 2.0456,-1.73151 2.12743,-1.66056 0.0297,0.0355 -0.61742,1.5683 -1.2199,2.85984 -0.41659,0.90123 -1.32407,2.62566 -2.13486,4.04493 -1.4505,2.54049 -1.98605,3.66882 -2.16458,4.55586 -0.29009,1.45476 -0.43143,3.34239 -0.43143,5.76934 0,2.12891 0.0147,2.48374 0.16362,3.40625 0.19341,1.15672 0.54301,2.77469 0.76619,3.49851 0.51322,1.67475 1.71084,3.49141 3.25803,4.94616 1.56209,1.47606 2.98283,2.16441 5.43008,2.63985 0.83307,0.15613 1.04881,0.16322 3.46631,0.0993 2.26129,-0.0639 2.98283,-0.23417 6.02513,-1.39088 1.74807,-0.66706 2.57372,-0.94382 3.64486,-1.22767 2.96051,-0.7806 5.22924,-0.9864 6.96983,-0.63158 0.78848,0.16322 0.7959,0.16322 1.07858,0.0284 0.15619,-0.0781 0.81822,-0.30515 1.46536,-0.50385 0.6546,-0.1987 1.4505,-0.49674 1.77778,-0.66705 2.14971,-1.09285 6.40453,-4.93907 7.26737,-6.57833 0.66945,-1.27735 1.17528,-3.87462 1.09345,-5.64871 -0.10415,-2.18568 -0.78103,-4.1017 -2.3059,-6.52156 -0.95956,-1.53281 -1.7555,-2.44825 -3.76387,-4.36426 -1.78521,-1.70313 -3.14646,-2.85984 -6.8136,-5.81901 -4.55235,-3.66173 -6.17394,-5.06681 -6.12187,-5.30809 0.0151,-0.071 0.0819,-0.11354 0.17109,-0.0993 0.27521,0.0497 1.85962,1.06446 6.00286,3.85334 4.28453,2.88111 6.06231,3.92428 7.81781,4.60554 3.94235,1.51151 8.04839,2.29922 11.44773,2.17857 1.95634,-0.0639 3.31758,-0.36901 4.85734,-1.08575 0.88516,-0.41157 2.40259,-1.3625 3.49606,-2.19986 1.07115,-0.81608 3.03487,-2.68952 3.51838,-3.34949 0.97443,-1.3412 1.65877,-3.95977 1.55462,-5.94674 -0.0595,-1.08575 -0.25287,-1.90184 -0.93723,-4.04494 -0.69179,-2.16438 -1.15298,-3.77526 -1.28684,-4.4636 -0.15624,-0.82319 -0.11901,-3.30691 0.0819,-4.8965 0.20827,-1.66764 0.28263,-4.11589 0.16362,-5.10938 -0.18594,-1.52571 -0.6397,-3.1153 -1.23476,-4.34298 -0.99674,-2.05794 -3.33244,-4.20814 -5.7276,-5.27968 -1.41332,-0.62449 -3.4961,-1.09994 -5.89127,-1.34831 -1.24965,-0.12065 -3.91264,-0.0497 -5.04324,0.14192 -1.815,0.30515 -4.71601,1.09994 -5.31849,1.44766 -0.80337,0.46836 -2.80432,2.24955 -7.21533,6.39382 -1.77778,1.67474 -3.8531,3.60496 -4.61181,4.28621 -1.24966,1.12832 -2.1051,1.79538 -2.19437,1.71022 -0.0967,-0.0993 1.34635,-2.19987 4.90939,-7.16023 4.95399,-6.89057 5.67552,-8.06147 6.44171,-10.41036 1.12318,-3.47012 0.052,-8.16082 -2.67041,-11.73029 -0.8852,-1.15671 -2.05303,-2.05085 -3.73412,-2.86694 -1.43561,-0.69544 -2.86379,-1.12122 -4.53745,-1.3554 -0.75872,-0.10644 -4.11344,-0.1987 -4.83498,-0.13482 z"
|
||||||
|
id="path1-9"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00726536" /><path
|
||||||
|
d="m 439.21947,248.58317 c -1.32752,0.12081 -5.87092,0.86387 -8.88113,1.43979 -2.17823,0.41802 -2.73912,0.54806 -3.76747,0.89175 -0.64506,0.20437 -0.7853,0.22295 -1.1499,0.12998 -0.54223,-0.13933 -2.91676,-0.26938 -6.11395,-0.34369 -5.62782,-0.13934 -8.50719,0.49231 -11.54547,2.50804 -2.11277,1.41194 -3.73945,3.14899 -5.26329,5.63847 -0.91615,1.49553 -1.15918,2.82387 -0.97221,5.46197 0.14957,2.09002 0.47676,3.38121 1.5051,5.9543 2.02866,5.03465 4.72101,8.66669 12.06898,16.25585 5.34741,5.53628 7.10493,7.49627 7.10493,7.95145 0,0.20436 -0.0375,0.22293 -0.51416,0.22293 -0.66374,0 -0.97228,-0.12998 -2.13151,-0.91034 -1.34614,-0.90103 -2.90737,-2.10861 -5.86153,-4.53305 -4.30969,-3.52984 -4.93603,-4.03145 -6.53465,-5.26691 -2.55217,-1.95071 -4.57145,-3.26045 -5.96436,-3.86425 -2.38388,-1.03107 -6.3103,-1.63487 -9.19901,-1.41193 -3.37482,0.26938 -5.93636,1.12398 -8.49786,2.83315 -2.49604,1.68134 -6.47855,5.47127 -7.02078,6.69742 -0.36459,0.81743 -0.57961,2.52664 -0.74785,5.88927 -0.14024,2.69383 -0.0469,4.4123 0.3646,7.06898 l 0.25241,1.6256 -0.57028,2.09002 c -0.8881,3.21403 -1.20598,5.48056 -1.31815,9.10329 -0.10293,3.62275 0.24303,5.83353 1.18725,7.7285 1.22468,2.43373 4.81452,6.53023 7.43213,8.46235 1.55185,1.15183 3.7488,1.94142 6.40377,2.30368 1.39291,0.19508 4.35641,0.16719 5.32868,-0.0464 1.29009,-0.27867 3.29069,-0.95677 4.27229,-1.44911 1.85104,-0.91959 4.91736,-3.09324 8.76896,-6.22365 5.86156,-4.756 8.19866,-6.56736 9.1616,-7.07828 0.48612,-0.26938 0.64507,-0.30652 1.26203,-0.30652 0.617,0 0.75725,0.0371 1.1873,0.27867 l 0.47677,0.28796 -2.24364,2.31295 c -10.68543,11.05401 -12.29338,12.95826 -14.37811,17.04546 -1.79491,3.52986 -3.03827,7.25475 -3.50571,10.49663 -0.28981,2.07148 -0.11211,6.01003 0.37392,7.89573 0.35526,1.39333 0.99094,2.93533 1.57057,3.76207 0.82269,1.18898 2.08473,2.74025 2.21562,2.74025 0.36459,0 2.2343,-1.46767 2.66435,-2.09004 0.17763,-0.2508 0.39265,-0.65021 0.47676,-0.88245 0.22437,-0.62238 0.26176,-1.99714 0.0935,-3.65989 -0.19629,-1.91355 -0.19629,-4.77458 -0.009,-5.87069 0.18698,-1.06823 0.7666,-3.20474 1.29948,-4.72813 0.98162,-2.86105 2.15954,-5.16473 4.21619,-8.26728 2.08473,-3.13971 5.83353,-7.89569 7.89953,-10.02289 0.83203,-0.8546 2.57089,-2.26653 2.67373,-2.17366 0.0373,0.0465 -0.77596,2.05289 -1.53315,3.7435 -0.52357,1.17971 -1.66408,3.43696 -2.68307,5.29478 -1.82298,3.32547 -2.49605,4.80245 -2.72043,5.96357 -0.36458,1.90426 -0.54221,4.37516 -0.54221,7.55201 0,2.78672 0.0185,3.25118 0.20563,4.45874 0.24308,1.51413 0.68245,3.63204 0.96294,4.57952 0.64501,2.19223 2.15017,4.57021 4.09466,6.47447 1.96322,1.93214 3.74879,2.83318 6.82447,3.45554 1.04699,0.20437 1.31814,0.21365 4.35643,0.12998 2.84196,-0.0837 3.74879,-0.30652 7.57232,-1.82065 2.19695,-0.87318 3.23462,-1.23545 4.58082,-1.60701 3.72074,-1.0218 6.57206,-1.29118 8.75961,-0.82673 0.99096,0.21366 1.00028,0.21366 1.35555,0.0371 0.1963,-0.10223 1.02833,-0.39944 1.84165,-0.65953 0.8227,-0.26009 1.82298,-0.65022 2.2343,-0.87316 2.70173,-1.43052 8.04915,-6.46519 9.13355,-8.61097 0.84136,-1.67203 1.47709,-5.07183 1.37424,-7.3941 -0.13089,-2.86103 -0.98159,-5.36908 -2.89803,-8.53665 -1.20597,-2.00643 -2.2063,-3.20474 -4.73039,-5.71278 -2.24364,-2.22938 -3.95444,-3.74349 -8.56327,-7.61702 -5.72135,-4.79316 -7.75934,-6.6324 -7.6939,-6.94823 0.019,-0.093 0.10293,-0.14863 0.21502,-0.12998 0.34588,0.0651 2.33715,1.39336 7.54434,5.04398 5.38475,3.77133 7.61905,5.13684 9.82534,6.02861 4.95471,1.97854 10.11514,3.00965 14.38739,2.85172 2.45871,-0.0837 4.1695,-0.48304 6.10466,-1.42124 1.11246,-0.53874 3.01955,-1.7835 4.39381,-2.87959 1.34621,-1.06825 3.81419,-3.52055 4.42187,-4.38445 1.22465,-1.75562 2.08472,-5.1833 1.95383,-7.78422 -0.0748,-1.42123 -0.31781,-2.48949 -1.17791,-5.29478 -0.86943,-2.83316 -1.44905,-4.94178 -1.61728,-5.84282 -0.19636,-1.07754 -0.14957,-4.3287 0.10293,-6.40946 0.26175,-2.18293 0.35521,-5.38765 0.20563,-6.68813 -0.23368,-1.99714 -0.80396,-4.07789 -1.55183,-5.68491 -1.25269,-2.69382 -4.18818,-5.50842 -7.19839,-6.91105 -1.77624,-0.81744 -4.39386,-1.43981 -7.40409,-1.76492 -1.57055,-0.15793 -4.91736,-0.0651 -6.33829,0.18577 -2.28107,0.39944 -5.92703,1.43981 -6.68423,1.89497 -1.00966,0.61308 -3.52444,2.94464 -9.06815,8.36945 -2.2343,2.19222 -4.84254,4.71885 -5.79608,5.6106 -1.57056,1.47696 -2.64567,2.35014 -2.75786,2.23867 -0.12153,-0.12999 1.69208,-2.87962 6.17007,-9.37268 6.22613,-9.01968 7.13294,-10.55238 8.09588,-13.62705 1.4116,-4.54234 0.0654,-10.68243 -3.35615,-15.35482 -1.11251,-1.51413 -2.58022,-2.68454 -4.693,-3.75281 -1.80426,-0.91031 -3.59918,-1.46765 -5.70262,-1.77419 -0.95355,-0.13933 -5.16973,-0.2601 -6.07655,-0.17649 z"
|
||||||
|
id="path1-1"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00931876" /><path
|
||||||
|
d="m 324.26695,283.12908 c -0.83436,0.0787 -3.6899,0.56207 -5.58184,0.93679 -1.36902,0.27198 -1.72154,0.3566 -2.36787,0.58021 -0.40542,0.13298 -0.49356,0.14506 -0.72272,0.0846 -0.34079,-0.0907 -1.83319,-0.17527 -3.84264,-0.22362 -3.53711,-0.0907 -5.34681,0.32032 -7.25638,1.63185 -1.32789,0.91866 -2.35026,2.04887 -3.308,3.66862 -0.57581,0.97307 -0.72855,1.83734 -0.61104,3.5538 0.094,1.35986 0.29964,2.19996 0.94596,3.87412 1.27502,3.27577 2.96718,5.63893 7.58541,10.57676 3.36087,3.60215 4.46548,4.87741 4.46548,5.17356 0,0.13297 -0.0236,0.14505 -0.32315,0.14505 -0.41716,0 -0.61108,-0.0846 -1.33966,-0.59231 -0.84606,-0.58625 -1.8273,-1.37195 -3.684,-2.9494 -2.70866,-2.29666 -3.10232,-2.62303 -4.10706,-3.42687 -1.60405,-1.26922 -2.87318,-2.12139 -3.74863,-2.51425 -1.49828,-0.67086 -3.96605,-1.06372 -5.78162,-0.91867 -2.12109,0.17527 -3.73103,0.73132 -5.34094,1.84337 -1.56877,1.09396 -4.0718,3.55984 -4.41259,4.35764 -0.22915,0.53185 -0.36429,1.64394 -0.47003,3.83181 -0.0881,1.75272 -0.0295,2.87083 0.22915,4.59939 l 0.15864,1.05768 -0.35842,1.35985 c -0.55818,2.0912 -0.75797,3.56589 -0.82846,5.923 -0.0647,2.35711 0.15274,3.79555 0.74619,5.0285 0.76971,1.58348 3.02595,4.24885 4.67113,5.50597 0.97534,0.74943 2.35613,1.26316 4.02479,1.49887 0.87545,0.12693 2.73803,0.10877 3.3491,-0.0302 0.81083,-0.1813 2.06822,-0.62251 2.68516,-0.94285 1.16338,-0.59832 3.09058,-2.01259 5.51133,-4.04938 3.68402,-3.09445 5.15289,-4.273 5.75811,-4.60543 0.30552,-0.17527 0.40543,-0.19943 0.79319,-0.19943 0.38779,0 0.47593,0.0241 0.74622,0.18132 l 0.29965,0.18735 -1.41013,1.5049 c -6.71585,7.19222 -7.72645,8.43121 -9.03671,11.09052 -1.12811,2.29668 -1.90957,4.72026 -2.20336,6.82956 -0.18214,1.34779 -0.0705,3.91039 0.23501,5.1373 0.22329,0.90657 0.62281,1.90985 0.98711,2.44777 0.51707,0.7736 1.31027,1.78292 1.39253,1.78292 0.22915,0 1.40427,-0.95492 1.67456,-1.35986 0.11164,-0.16318 0.24678,-0.42306 0.29964,-0.57417 0.14102,-0.40495 0.16452,-1.29942 0.0588,-2.38128 -0.12337,-1.24503 -0.12337,-3.10655 -0.006,-3.81973 0.11752,-0.69503 0.48181,-2.08513 0.81673,-3.07632 0.61695,-1.86152 1.35728,-3.36039 2.6499,-5.37905 1.31026,-2.04283 3.6664,-5.13728 4.96489,-6.52133 0.52293,-0.55603 1.61581,-1.47469 1.68045,-1.41427 0.0234,0.0302 -0.4877,1.3357 -0.96359,2.43569 -0.32907,0.76756 -1.04589,2.23623 -1.68633,3.44501 -1.14575,2.16368 -1.56877,3.12468 -1.7098,3.88015 -0.22914,1.23899 -0.34078,2.84667 -0.34078,4.91367 0,1.81315 0.0116,2.11536 0.12924,2.90105 0.15278,0.98516 0.42892,2.36316 0.60521,2.97963 0.40539,1.42635 1.35139,2.97357 2.57351,4.21257 1.2339,1.25713 2.35614,1.84339 4.28921,2.24832 0.65804,0.13298 0.82846,0.13901 2.73804,0.0846 1.78619,-0.0544 2.35613,-0.19944 4.75924,-1.18459 1.38079,-0.56813 2.03297,-0.80384 2.87906,-1.0456 2.33851,-0.66482 4.13057,-0.84009 5.50546,-0.5379 0.62282,0.13902 0.62868,0.13902 0.85197,0.0241 0.12337,-0.0665 0.64631,-0.25989 1.15748,-0.42912 0.51708,-0.16923 1.14576,-0.42306 1.40427,-0.56811 1.69805,-0.93077 5.05893,-4.20654 5.74048,-5.60268 0.5288,-1.08789 0.92836,-3.29995 0.86372,-4.81092 -0.0823,-1.8615 -0.61694,-3.49335 -1.82143,-5.55431 -0.75796,-1.30547 -1.38667,-2.08515 -2.97307,-3.71698 -1.41014,-1.45053 -2.48538,-2.43568 -5.38205,-4.95597 -3.5959,-3.11863 -4.87679,-4.31532 -4.83566,-4.52081 0.012,-0.0606 0.0647,-0.0967 0.13515,-0.0846 0.21738,0.0424 1.4689,0.90657 4.74165,3.28183 3.38434,2.45378 4.7886,3.34224 6.17527,3.92248 3.11406,1.28731 6.35741,1.9582 9.04254,1.85544 1.54531,-0.0544 2.62055,-0.31428 3.83681,-0.92471 0.69918,-0.35054 1.8978,-1.16042 2.76153,-1.87359 0.84609,-0.69505 2.39723,-2.29063 2.77916,-2.85272 0.7697,-1.14228 1.31026,-3.37248 1.22799,-5.06474 -0.047,-0.92472 -0.19974,-1.61977 -0.74032,-3.44502 -0.54644,-1.84337 -0.91073,-3.21533 -1.01647,-3.80159 -0.12341,-0.70109 -0.094,-2.81644 0.0647,-4.17027 0.16452,-1.42031 0.22326,-3.50544 0.12924,-4.35159 -0.14687,-1.29942 -0.50529,-2.65325 -0.97533,-3.69885 -0.78732,-1.75271 -2.63229,-3.58402 -4.52422,-4.49663 -1.11637,-0.53186 -2.76156,-0.9368 -4.6535,-1.14832 -0.9871,-0.10275 -3.09059,-0.0424 -3.98365,0.12086 -1.43366,0.2599 -3.72516,0.93681 -4.20107,1.23295 -0.63457,0.3989 -2.21512,1.91592 -5.69937,5.44552 -1.40427,1.42636 -3.04356,3.0703 -3.64286,3.65051 -0.98711,0.96097 -1.66282,1.5291 -1.73333,1.45657 -0.0764,-0.0846 1.06348,-1.8736 3.87792,-6.09827 3.91315,-5.86859 4.48308,-6.86583 5.08829,-8.86635 0.8872,-2.95544 0.0411,-6.95045 -2.10935,-9.9905 -0.69922,-0.98516 -1.62168,-1.74668 -2.94957,-2.44175 -1.13399,-0.59228 -2.26211,-0.95492 -3.58413,-1.15436 -0.59931,-0.0907 -3.2492,-0.16924 -3.81914,-0.11483 z"
|
||||||
|
id="path1-1-7"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00595914" /><path
|
||||||
|
d="m 166.59227,332.97105 c -4.12429,0.42662 -8.02317,1.5205 -12.83475,3.62077 l -1.10432,0.4813 -1.82543,-0.86416 c -4.62007,-2.20966 -8.27101,-3.06288 -12.59815,-2.94255 -2.32129,0.0656 -3.39176,0.21877 -5.27361,0.79853 -6.5131,1.97994 -11.32468,7.43841 -12.77834,14.50492 -1.09306,5.25064 -0.38311,11.54049 1.78042,15.98166 1.83677,3.75203 4.57499,6.79303 12.23748,13.62981 3.52702,3.15038 8.64287,8.10569 10.52472,10.18408 1.88177,2.10025 3.4481,3.98173 3.4481,4.17864 0,0.16407 -0.45069,0.63444 -0.60853,0.63444 -0.0563,0 -0.67604,-0.60163 -1.39724,-1.34547 -15.06588,-15.45661 -24.88064,-22.01991 -35.1236,-23.5076 -0.68745,-0.0985 -2.14102,-0.1422 -4.56374,-0.1422 -3.84253,0.0109 -4.92426,0.10938 -7.944252,0.76572 -8.237179,1.78303 -14.479919,6.60706 -16.485689,12.74376 -0.61971,1.90335 -0.75496,2.78941 -0.74371,5.14126 0,1.88148 0.0453,2.29715 0.31552,3.55512 0.56344,2.60345 1.63392,5.31628 3.15516,7.97443 0.61978,1.08295 0.61978,1.09388 0.43952,1.47674 -1.81426,4.14583 -2.91856,7.76658 -3.42567,11.33266 -0.2141,1.45486 -0.18027,4.80214 0.0563,6.06012 0.66479,3.52231 2.3438,6.26796 5.03694,8.21511 4.10171,2.96443 10.49088,3.83951 17.826601,2.45029 8.69921,-1.65182 21.45505,-7.90882 31.46141,-15.45662 5.4877,-4.14582 10.08527,-8.7292 12.39531,-12.3609 0.41686,-0.65633 0.67604,-0.82042 0.80004,-0.50319 0.15775,0.38286 -2.77206,3.87235 -5.58913,6.66176 -2.36637,2.34091 -4.15805,3.93798 -8.56403,7.61344 -1.82543,1.52051 -3.95521,3.32541 -4.73275,4.00362 -8.38368,7.30718 -11.56135,12.63435 -13.01501,21.81209 -0.29294,1.82677 -0.34927,5.15214 -0.12393,6.67266 0.5747,3.76301 1.84802,6.45398 4.11297,8.65264 1.94944,1.89241 4.19188,3.01914 7.21179,3.6098 1.44233,0.28442 4.48483,0.3938 6.26525,0.21885 3.39176,-0.33911 7.66249,-1.37836 11.1895,-2.73471 0.76629,-0.29538 0.94655,-0.28442 1.52125,0.0656 0.83387,0.51414 2.91849,1.57522 3.85378,1.96901 3.32418,1.40019 5.88215,1.99085 8.95839,2.07841 1.65643,0.044 2.18612,0.0216 3.32418,-0.16408 8.23718,-1.3674 13.97282,-7.91972 15.42647,-17.63342 0.54087,-3.56607 0.49578,-7.97443 -0.11267,-11.09198 -0.10143,-0.56885 0.10142,-0.51415 1.02539,0.27346 6.24274,5.30535 11.43744,9.37459 16.85755,13.18124 5.97223,4.21151 10.27679,6.92431 14.90812,9.38556 1.90434,1.01734 5.08202,2.58159 5.22852,2.58159 0.11268,0 0.18034,-0.12034 0.94655,-1.85964 1.44233,-3.22694 2.23112,-6.18042 2.23112,-8.39004 0,-0.85325 -0.16901,-2.06744 -0.32677,-2.30813 -0.0453,-0.0763 -0.66479,-0.22973 -1.38599,-0.35006 -10.26554,-1.67365 -20.51974,-7.02273 -32.14877,-16.7474 -2.58047,-2.15492 -3.93271,-3.36912 -3.97779,-3.56602 -0.0454,-0.18596 0.10143,-0.12033 1.48749,0.66723 7.15538,4.12403 16.1701,5.75384 22.91995,4.16776 2.71565,-0.63448 5.09327,-1.89241 6.83986,-3.59892 1.84802,-1.8049 2.97491,-3.92703 3.57211,-6.73831 0.28168,-1.3783 0.39443,-4.37555 0.20284,-6.03825 -0.3606,-3.28166 -1.35224,-7.05555 -2.76073,-10.54505 -0.21417,-0.53601 -0.39444,-1.07201 -0.39444,-1.19233 0,-0.13128 0.2141,-0.56883 0.48453,-0.98451 1.96069,-3.10663 3.29042,-6.43204 3.74112,-9.35272 0.1465,-0.95167 0.18033,-1.67364 0.13525,-2.95348 -0.0902,-2.3628 -0.42819,-3.74109 -1.43107,-5.7429 -4.13555,-8.29165 -16.74489,-12.40465 -30.80787,-10.05281 -4.91301,0.82041 -9.9951,3.06289 -15.61798,6.89147 -3.92146,2.66909 -7.29072,5.49131 -12.23748,10.23877 -1.80301,1.73929 -3.31293,3.1504 -3.35801,3.1504 -0.13526,0 0.3606,-0.62352 1.78043,-2.24247 2.20861,-2.505 3.56077,-3.89423 9.25132,-9.46211 5.43136,-5.30534 6.94136,-6.84772 8.50769,-8.69639 4.01155,-4.69276 6.41167,-9.36365 7.53856,-14.65806 1.64517,-7.76658 0.60845,-14.51585 -2.90724,-18.77106 -2.45654,-2.98631 -5.93847,-4.51775 -10.5473,-4.62714 -0.99155,-0.0219 -2.00577,-0.0219 -2.25362,0 z"
|
||||||
|
id="path1-2"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.0111024" /><path
|
||||||
|
d="m 465.56025,185.2456 c -0.9371,0.0986 -1.47259,0.23385 -2.432,0.62118 -1.53059,0.61754 -3.04333,1.57124 -4.03846,2.55052 -0.5444,0.52983 -1.4815,1.67354 -1.80279,2.19242 -0.22312,0.36175 -0.33468,0.90619 -0.51317,2.52859 -0.0937,0.82946 -0.13387,1.2643 -0.33915,3.59921 -0.19634,2.21435 -0.33021,3.3142 -0.41946,3.44212 -0.0714,0.106 -0.22757,-0.82218 -0.67382,-3.97194 -0.63812,-4.51274 -0.80322,-5.28374 -1.38334,-6.39822 -0.8657,-1.65162 -2.88269,-3.02554 -5.42178,-3.69057 -1.27179,-0.33251 -2.30706,-0.33982 -3.6904,-0.0292 -1.20484,0.27404 -2.23118,0.72349 -3.37355,1.49083 -1.02635,0.68697 -1.602,1.19121 -2.93624,2.56148 -1.25394,1.28623 -1.96345,2.07549 -2.22673,2.47378 -0.0893,0.13886 -0.1785,0.21559 -0.30791,0.27041 -0.22311,0.095 -0.3079,0.1498 -1.41011,0.88792 -1.22716,0.82581 -1.75372,1.20583 -2.2535,1.63701 -1.03526,0.89158 -1.57968,1.62238 -1.93221,2.60532 -0.23651,0.65772 -0.29452,1.01947 -0.29452,1.827 0.005,0.98659 0.13834,1.71739 0.40607,2.15224 0.22759,0.37636 1.04867,1.17293 1.61093,1.56756 0.87463,0.6139 2.75329,1.42144 4.13216,1.77955 1.81173,0.46771 3.55652,0.69789 7.45663,0.98655 3.1549,0.23386 4.33744,0.35079 4.65873,0.46043 l 0.15172,0.0512 -0.15172,0.13155 c -0.18742,0.15714 -0.415,0.21559 -1.15576,0.28502 -0.7943,0.0767 -1.86527,0.12425 -3.88226,0.16807 -3.71271,0.0804 -5.30578,0.18272 -6.47045,0.42022 -1.55737,0.31792 -3.56545,1.43604 -4.73013,2.63091 -1.22269,1.26066 -1.6957,2.38609 -1.94114,4.62235 -0.0893,0.78928 -0.0893,1.53834 0,1.77588 0.12049,0.33616 0.78985,1.15466 1.75372,2.14489 0.7006,0.7162 1.2227,1.16564 2.03039,1.73932 l 0.76753,0.54811 0.39714,0.69793 c 0.21866,0.38368 0.49534,0.84041 0.61582,1.01582 0.72737,1.0414 1.95452,2.36051 2.905,3.1242 0.89694,0.71983 1.52168,1.01581 2.67297,1.2643 1.55737,0.3398 3.95367,0.48599 4.9934,0.30326 1.19145,-0.2046 2.68635,-0.91716 3.79749,-1.80509 0.49978,-0.39828 1.01742,-1.00851 1.44134,-1.70644 0.52211,-0.85867 0.9371,-2.26182 1.51721,-5.1741 0.42838,-2.12665 0.69613,-3.29958 0.87016,-3.75634 0.17404,-0.45676 0.43286,-0.66868 0.91033,-0.74178 l 0.16956,-0.0254 -0.0268,0.30694 c -0.0357,0.40192 -0.18741,3.10593 -0.25434,4.52734 -0.058,1.20218 -0.0312,3.1242 0.0491,3.69057 0.19635,1.40679 0.81215,3.084 1.67339,4.56024 0.62919,1.07427 1.16021,1.68085 2.22672,2.54685 0.83001,0.67599 1.31195,0.98292 1.99024,1.26063 0.52655,0.21559 0.94155,0.32523 1.83849,0.47502 0.78092,0.13521 0.80323,0.13156 0.88355,-0.10588 0.0223,-0.0731 0.0848,-0.32156 0.13833,-0.55178 0.12496,-0.55542 0.0982,-0.76369 -0.14726,-1.16928 -0.16956,-0.28502 -0.24989,-0.36542 -1.02634,-0.99755 -1.36103,-1.11448 -1.72694,-1.50547 -2.26689,-2.41899 -1.24054,-2.09376 -1.70909,-3.80747 -1.94114,-7.08881 -0.11601,-1.6041 -0.0893,-2.96707 0.067,-3.54439 0.0893,-0.3435 0.0937,-0.34715 0.18741,-0.12792 0.46409,1.10352 0.79877,2.09743 1.19146,3.56269 0.53995,1.98414 0.65151,2.22164 1.602,3.33248 1.29855,1.52007 2.29812,2.41896 3.71269,3.33615 1.24501,0.80751 2.15534,1.17656 3.42265,1.38487 1.66893,0.27403 2.90054,0.14615 4.25264,-0.44217 0.70952,-0.31057 1.13791,-0.56269 1.43689,-0.84404 0.15172,-0.14251 0.44624,-0.37637 0.65597,-0.52256 0.81661,-0.55174 1.16467,-0.97196 2.15533,-2.59069 0.70952,-1.15469 1.16468,-1.7576 1.99468,-2.63091 0.62027,-0.6504 1.14683,-1.05236 1.76264,-1.352 l 0.53102,-0.25578 0.20973,-0.32887 c 0.11603,-0.18269 0.3213,-0.48598 0.46409,-0.67599 0.415,-0.56637 0.60689,-1.04871 0.80769,-2.02432 0.18742,-0.92446 0.26329,-1.65893 0.26329,-2.5615 -0.005,-1.02677 -0.0402,-1.16928 -0.52656,-1.97315 -1.02635,-1.69184 -2.28921,-2.65285 -4.35529,-3.31788 -1.01742,-0.32521 -1.91881,-0.51521 -2.96748,-0.62482 -1.35656,-0.14252 -1.72694,-0.14983 -6.69357,-0.14983 -2.75774,0 -4.89076,-0.0145 -4.92646,-0.0329 -0.0491,-0.0254 -0.0491,-0.0365 0.005,-0.0621 0.1428,-0.0658 1.16021,-0.17174 3.94028,-0.41655 3.67253,-0.32521 4.65426,-0.4604 5.84571,-0.82215 1.91883,-0.57735 3.35571,-1.20949 4.864,-2.1376 1.70909,-1.05239 2.5614,-1.99877 3.07904,-3.42018 0.34806,-0.94275 0.60242,-2.36781 0.60242,-3.32152 -0.005,-0.76369 -0.12049,-1.15833 -0.58011,-1.91836 -0.6649,-1.09621 -1.36549,-1.73567 -2.61942,-2.40071 -0.35252,-0.18635 -1.1513,-0.61388 -1.77156,-0.95004 -1.60646,-0.86236 -2.02592,-1.20583 -3.22184,-2.6236 -0.67829,-0.8112 -1.13345,-1.28988 -1.63322,-1.74297 -1.17807,-1.05967 -2.6462,-1.78682 -4.09647,-2.02433 -0.49532,-0.0841 -1.75818,-0.12059 -2.27581,-0.0695 z"
|
||||||
|
id="path1-3-3"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00403802" /><path
|
||||||
|
d="m 129.33803,187.58044 c -0.9371,0.10563 -1.47259,0.25052 -2.432,0.66548 -1.53059,0.66158 -3.04333,1.6833 -4.03846,2.73242 -0.5444,0.56761 -1.4815,1.79289 -1.80279,2.34878 -0.22312,0.38755 -0.33468,0.97082 -0.51317,2.70892 -0.0937,0.88862 -0.13387,1.35447 -0.33915,3.8559 -0.19634,2.37228 -0.33021,3.55057 -0.41946,3.68761 -0.0714,0.11356 -0.22757,-0.88082 -0.67382,-4.25521 -0.63812,-4.83459 -0.80322,-5.66057 -1.38334,-6.85453 -0.8657,-1.76942 -2.88269,-3.24132 -5.42178,-3.95378 -1.27179,-0.35622 -2.30706,-0.36406 -3.6904,-0.0313 -1.20484,0.29358 -2.23118,0.77509 -3.37355,1.59715 -1.02635,0.73596 -1.602,1.27617 -2.93624,2.74416 -1.25394,1.37796 -1.96345,2.22351 -2.22673,2.65021 -0.0893,0.14876 -0.178502,0.23096 -0.307912,0.28969 -0.22311,0.10178 -0.3079,0.16049 -1.41011,0.95125 -1.22716,0.8847 -1.75372,1.29183 -2.2535,1.75376 -1.03526,0.95516 -1.57968,1.73808 -1.93221,2.79112 -0.23651,0.70463 -0.29452,1.09218 -0.29452,1.9573 0.005,1.05695 0.13834,1.83987 0.40607,2.30574 0.22759,0.4032 1.04867,1.25658 1.61093,1.67935 0.87463,0.65769 2.75329,1.52282 4.132162,1.90647 1.81173,0.50106 3.55652,0.74766 7.45663,1.05691 3.1549,0.25054 4.33744,0.3758 4.65873,0.49326 l 0.15172,0.0549 -0.15172,0.14093 c -0.18742,0.16834 -0.415,0.23096 -1.15576,0.30534 -0.7943,0.0822 -1.86527,0.13312 -3.88226,0.18006 -3.71271,0.0861 -5.30578,0.19575 -6.47045,0.45019 -1.557372,0.34059 -3.565452,1.53846 -4.730132,2.81854 -1.22269,1.35057 -1.6957,2.55627 -1.94114,4.95201 -0.0893,0.84557 -0.0893,1.64805 0,1.90253 0.12049,0.36014 0.78985,1.23701 1.75372,2.29786 0.7006,0.76728 1.2227,1.24878 2.03039,1.86337 l 0.76753,0.5872 0.39714,0.74771 c 0.21866,0.41104 0.49534,0.90034 0.61582,1.08826 0.727372,1.11567 1.954522,2.52886 2.905002,3.34702 0.89694,0.77116 1.52168,1.08825 2.67297,1.35446 1.55737,0.36404 3.95367,0.52065 4.9934,0.32489 1.19145,-0.21919 2.68635,-0.98257 3.79749,-1.93382 0.49978,-0.42669 1.01742,-1.08044 1.44134,-1.82815 0.52211,-0.9199 0.9371,-2.42312 1.51721,-5.5431 0.42838,-2.27832 0.69613,-3.5349 0.87016,-4.02424 0.17404,-0.48934 0.43286,-0.71637 0.91033,-0.79468 l 0.16956,-0.0272 -0.0268,0.32883 c -0.0357,0.43058 -0.18741,3.32744 -0.25434,4.85022 -0.058,1.28792 -0.0312,3.34701 0.0491,3.95377 0.19635,1.50712 0.81215,3.30395 1.67339,4.88547 0.62919,1.15089 1.16021,1.80073 2.22672,2.72849 0.83001,0.7242 1.31195,1.05302 1.99024,1.35054 0.52655,0.23096 0.94155,0.34842 1.83849,0.50889 0.78092,0.14486 0.80323,0.14095 0.88355,-0.11343 0.0223,-0.0783 0.0848,-0.34449 0.13833,-0.59113 0.12496,-0.59503 0.0982,-0.81815 -0.14726,-1.25267 -0.16956,-0.30535 -0.24989,-0.39148 -1.02634,-1.06869 -1.36103,-1.19397 -1.72694,-1.61284 -2.26689,-2.59151 -1.24054,-2.24309 -1.70909,-4.07901 -1.94114,-7.59437 -0.11601,-1.71851 -0.0893,-3.17868 0.067,-3.79717 0.0893,-0.368 0.0937,-0.37191 0.18741,-0.13705 0.46409,1.18222 0.79877,2.24702 1.19146,3.81678 0.53995,2.12564 0.65151,2.38008 1.602,3.57014 1.29855,1.62848 2.29812,2.59148 3.71269,3.57408 1.24501,0.8651 2.15534,1.26047 3.42265,1.48364 1.66893,0.29357 2.90054,0.15657 4.25264,-0.4737 0.70952,-0.33272 1.13791,-0.60282 1.43689,-0.90424 0.15172,-0.15267 0.44624,-0.40321 0.65597,-0.55983 0.81661,-0.59109 1.16467,-1.04128 2.15533,-2.77545 0.70952,-1.23704 1.16468,-1.88295 1.99468,-2.81854 0.62027,-0.69679 1.14683,-1.12742 1.76264,-1.44843 l 0.53102,-0.27402 0.20973,-0.35232 c 0.11603,-0.19572 0.3213,-0.52064 0.46409,-0.7242 0.415,-0.60677 0.60689,-1.12351 0.80769,-2.1687 0.18742,-0.99039 0.26329,-1.77724 0.26329,-2.74418 -0.005,-1.09999 -0.0402,-1.25267 -0.52656,-2.11387 -1.02635,-1.8125 -2.28921,-2.84205 -4.35529,-3.55451 -1.01742,-0.3484 -1.91881,-0.55195 -2.96748,-0.66938 -1.35656,-0.15268 -1.72694,-0.16051 -6.69357,-0.16051 -2.75774,0 -4.89076,-0.0155 -4.92646,-0.0353 -0.0491,-0.0272 -0.0491,-0.0391 0.005,-0.0665 0.1428,-0.0705 1.16021,-0.18399 3.94028,-0.44625 3.67253,-0.34841 4.65426,-0.49324 5.84571,-0.88079 1.91883,-0.61853 3.35571,-1.29575 4.864,-2.29005 1.70909,-1.12744 2.5614,-2.14132 3.07904,-3.6641 0.34806,-1.00999 0.60242,-2.53668 0.60242,-3.55841 -0.005,-0.81815 -0.12049,-1.24094 -0.58011,-2.05517 -0.6649,-1.17439 -1.36549,-1.85946 -2.61942,-2.57193 -0.35252,-0.19964 -1.1513,-0.65766 -1.77156,-1.01779 -1.60646,-0.92386 -2.02592,-1.29183 -3.22184,-2.81071 -0.67829,-0.86906 -1.13345,-1.38187 -1.63322,-1.86728 -1.17807,-1.13524 -2.6462,-1.91425 -4.09647,-2.1687 -0.49532,-0.0901 -1.75818,-0.12919 -2.27581,-0.0745 z"
|
||||||
|
id="path1-3-3-3"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00417953" /><path
|
||||||
|
d="m 181.97617,266.85651 c -0.67575,0.64029 -1.01388,1.06776 -1.53142,1.94677 -0.82591,1.402 -1.43323,3.05558 -1.61859,4.41795 -0.10501,0.74073 -0.14474,2.1965 -0.0812,2.79453 0.0449,0.41641 0.28862,0.90832 1.13586,2.28156 0.4312,0.70353 0.66429,1.06698 1.92402,3.01229 1.1934,1.84589 1.7576,2.78457 1.76538,2.93802 0.008,0.12563 -0.679,-0.50471 -2.94617,-2.69417 -3.24722,-3.13763 -3.84604,-3.63997 -4.97973,-4.16083 -1.68478,-0.76832 -4.10447,-0.62779 -6.50269,0.37974 -1.20085,0.50514 -2.01813,1.12178 -2.91522,2.19577 -0.77918,0.93815 -1.31147,1.90587 -1.74142,3.19138 -0.38776,1.15305 -0.53286,1.89258 -0.74653,3.76389 -0.20177,1.75747 -0.27852,2.79987 -0.24285,3.26893 0.0145,0.16203 -0.009,0.27552 -0.0772,0.3961 -0.11736,0.20827 -0.15058,0.30199 -0.56677,1.54057 -0.46093,1.38212 -0.64309,1.99519 -0.77308,2.63208 -0.27025,1.31807 -0.25296,2.21559 0.0684,3.19451 0.21449,0.65542 0.3892,0.97253 0.88059,1.60266 0.60431,0.7668 1.15373,1.25688 1.62856,1.43525 0.40772,0.15685 1.53713,0.2848 2.21873,0.25469 1.06028,-0.0468 3.02671,-0.54603 4.32722,-1.09559 1.70709,-0.72416 3.21702,-1.59353 6.45478,-3.71296 2.61931,-1.71416 3.6189,-2.33386 3.93789,-2.44144 l 0.15029,-0.0513 -0.0391,0.19387 c -0.0515,0.23528 -0.19464,0.41769 -0.73398,0.9172 -0.57692,0.53738 -1.38886,1.21831 -2.94579,2.46507 -2.86604,2.29471 -4.05453,3.33228 -4.82441,4.21777 -1.02926,1.18432 -1.92543,3.264 -2.11272,4.89652 -0.19279,1.71872 0.12071,2.88127 1.28889,4.77374 0.4102,0.66956 0.86603,1.25404 1.0807,1.3857 0.29919,0.18988 1.32282,0.42613 2.68218,0.61934 0.9859,0.13767 1.66933,0.17448 2.65257,0.13657 l 0.93618,-0.0338 0.73652,0.30584 c 0.40517,0.16793 0.90034,0.35798 1.10167,0.4224 1.20483,0.37532 2.97105,0.66689 4.18203,0.69137 1.14227,0.0225 1.8129,-0.12216 2.86802,-0.62038 1.42954,-0.67109 3.39989,-1.99764 4.10501,-2.76527 0.81094,-0.87594 1.551,-2.33064 1.88304,-3.69146 0.15001,-0.61124 0.18507,-1.39859 0.0932,-2.19803 -0.11263,-0.98388 -0.64069,-2.32822 -1.9575,-4.9494 -0.95783,-1.91694 -1.4614,-2.99312 -1.60274,-3.45416 -0.14127,-0.46104 -0.067,-0.782 0.26333,-1.12607 l 0.11765,-0.12184 0.16576,0.25561 c 0.21655,0.33508 1.74296,2.53621 2.55542,3.68556 0.68604,0.97289 1.87672,2.45652 2.28443,2.85018 1.01026,0.97967 2.51442,1.91816 4.08896,2.55231 1.14775,0.45998 1.9338,0.61405 3.29816,0.64862 1.06302,0.0285 1.6282,-0.0218 2.32975,-0.21281 0.5446,-0.14832 0.93714,-0.31233 1.73252,-0.73457 0.69541,-0.36398 0.71074,-0.3802 0.62928,-0.6138 -0.0268,-0.0705 -0.12909,-0.3019 -0.22718,-0.51371 -0.23993,-0.5085 -0.38765,-0.65493 -0.82719,-0.82384 -0.30658,-0.12047 -0.41856,-0.13492 -1.41286,-0.16137 -1.74681,-0.0514 -2.27202,-0.13652 -3.25188,-0.52473 -2.24814,-0.88795 -3.65889,-1.94345 -5.83794,-4.36435 -1.06726,-1.18192 -1.87572,-2.26149 -2.10432,-2.80592 -0.13894,-0.32171 -0.1378,-0.32718 0.0693,-0.21249 1.0359,0.58207 1.90353,1.15641 3.10353,2.06365 1.63136,1.22361 1.86349,1.34186 3.28575,1.63722 1.94456,0.40544 3.27637,0.50592 4.94514,0.37119 1.46891,-0.11838 2.40822,-0.37767 3.52998,-0.97701 1.47709,-0.78951 2.36624,-1.62971 3.0698,-2.90161 0.36807,-0.66889 0.55097,-1.12316 0.6145,-1.52243 0.0324,-0.20242 0.12132,-0.56194 0.19702,-0.8021 0.30538,-0.92146 0.32292,-1.45858 0.11565,-3.31723 -0.14562,-1.32753 -0.15518,-2.07161 -0.035,-3.25201 0.0912,-0.88041 0.25999,-1.5106 0.56112,-2.11463 l 0.26129,-0.51882 -0.0355,-0.38269 c -0.02,-0.21234 -0.0435,-0.57237 -0.047,-0.80647 -0.0188,-0.69142 -0.1617,-1.18315 -0.59777,-2.06513 -0.41543,-0.83401 -0.80282,-1.45273 -1.35208,-2.15699 -0.62876,-0.79817 -0.74312,-0.88822 -1.61417,-1.22307 -1.83539,-0.70311 -3.41173,-0.69377 -5.43857,0.0294 -0.9967,0.3579 -1.82002,0.75157 -2.71008,1.29644 -1.1518,0.70434 -1.44705,0.9213 -5.34648,3.90712 -2.16519,1.65789 -3.84869,2.92893 -3.88796,2.93596 -0.054,0.009 -0.0608,10e-4 -0.0338,-0.0515 0.0721,-0.13718 0.80639,-0.83149 2.84013,-2.69382 2.6855,-2.4616 3.37401,-3.15727 4.08931,-4.15582 1.15518,-1.60406 1.89863,-2.96113 2.51803,-4.59207 0.70142,-1.84864 0.79467,-3.09948 0.3361,-4.51978 -0.30049,-0.94486 -0.96796,-2.20974 -1.54836,-2.95392 -0.46865,-0.59288 -0.79949,-0.83139 -1.62286,-1.14813 -1.18913,-0.45564 -2.12833,-0.53342 -3.51754,-0.29852 -0.39015,0.0666 -1.27749,0.2131 -1.96905,0.3237 -1.78606,0.29293 -2.32442,0.27703 -4.12615,-0.11028 -1.02621,-0.2252 -1.67487,-0.32508 -2.34298,-0.37816 -1.5698,-0.11863 -3.16497,0.19659 -4.44811,0.88336 -0.44007,0.23218 -1.45377,0.96289 -1.82913,1.31389 z"
|
||||||
|
id="path1-3-3-3-6"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00399432"
|
||||||
|
inkscape:transform-center-x="323.33333"
|
||||||
|
inkscape:transform-center-y="-3.4874273" /><path
|
||||||
|
d="m 309.70135,218.68714 c -0.77928,0.0869 -1.22459,0.20605 -2.02242,0.54734 -1.27283,0.54414 -2.53081,1.38448 -3.35835,2.24735 -0.45271,0.46686 -1.232,1.47462 -1.49918,1.93182 -0.18554,0.31876 -0.27831,0.79848 -0.42674,2.22804 -0.0779,0.73086 -0.11133,1.11402 -0.28204,3.17139 -0.16327,1.95114 -0.2746,2.92026 -0.34882,3.03298 -0.0594,0.0934 -0.18924,-0.72446 -0.56034,-3.49982 -0.53065,-3.97634 -0.66795,-4.6557 -1.15037,-5.63771 -0.7199,-1.4553 -2.39721,-2.66591 -4.50869,-3.25189 -1.05761,-0.29299 -1.91853,-0.29943 -3.0689,-0.0257 -1.00193,0.24147 -1.85543,0.63749 -2.80541,1.31362 -0.8535,0.60532 -1.33221,1.04962 -2.44175,2.25702 -1.04276,1.13334 -1.63278,1.82879 -1.85172,2.17973 -0.0743,0.12236 -0.14844,0.18997 -0.25606,0.23827 -0.18553,0.0837 -0.25604,0.13199 -1.17263,0.78238 -1.02049,0.72765 -1.45837,1.0625 -1.87398,1.44243 -0.86092,0.7856 -1.31365,1.42953 -1.60681,2.29564 -0.19668,0.57954 -0.24492,0.89829 -0.24492,1.60983 0.004,0.86932 0.11504,1.51326 0.33768,1.89642 0.18926,0.33162 0.87207,1.03351 1.33964,1.38123 0.72733,0.54093 2.2896,1.25249 3.43626,1.56803 1.50661,0.41212 2.95756,0.61494 6.20085,0.86928 2.62358,0.20607 3.60697,0.3091 3.87415,0.40571 l 0.12617,0.0451 -0.12617,0.11591 c -0.15585,0.13846 -0.34511,0.18996 -0.96112,0.25114 -0.66053,0.0676 -1.55113,0.10948 -3.22844,0.14809 -3.08745,0.0708 -4.41223,0.161 -5.38076,0.37027 -1.29509,0.28013 -2.96499,1.26535 -3.93353,2.31819 -1.01677,1.11082 -1.41012,2.10247 -1.61423,4.07292 -0.0743,0.69547 -0.0743,1.35549 0,1.56479 0.1002,0.29621 0.65683,1.01742 1.45838,1.88994 0.58261,0.63107 1.01678,1.02709 1.68845,1.53258 l 0.63827,0.48296 0.33026,0.61497 c 0.18183,0.33808 0.41191,0.74052 0.5121,0.89508 0.60488,0.91761 1.62536,2.07993 2.41577,2.75284 0.74589,0.63427 1.26542,0.89507 2.22282,1.11402 1.29509,0.29941 3.28783,0.42823 4.15245,0.26722 0.9908,-0.18028 2.23394,-0.80815 3.15796,-1.59053 0.41561,-0.35094 0.84607,-0.88864 1.1986,-1.50361 0.43418,-0.7566 0.77928,-1.99297 1.2617,-4.55909 0.35623,-1.87386 0.57889,-2.90737 0.72361,-3.30984 0.14473,-0.40247 0.35996,-0.5892 0.75702,-0.65361 l 0.14101,-0.0224 -0.0223,0.27046 c -0.0297,0.35414 -0.15585,2.73674 -0.21151,3.9892 -0.0482,1.05928 -0.0259,2.75284 0.0408,3.25189 0.16328,1.23958 0.67537,2.71743 1.39157,4.01819 0.52323,0.94658 0.96482,1.48106 1.85172,2.24412 0.69022,0.59564 1.091,0.86609 1.65506,1.11079 0.43787,0.18996 0.78298,0.28657 1.52887,0.41856 0.6494,0.11914 0.66795,0.11592 0.73475,-0.0933 0.0185,-0.0644 0.0705,-0.28334 0.11503,-0.4862 0.10392,-0.4894 0.0817,-0.67291 -0.12246,-1.03029 -0.141,-0.25114 -0.2078,-0.32198 -0.85349,-0.87898 -1.13182,-0.98201 -1.43611,-1.32652 -1.88512,-2.13146 -1.03162,-1.84488 -1.42126,-3.35489 -1.61424,-6.2462 -0.0965,-1.41343 -0.0743,-2.61439 0.0557,-3.12309 0.0743,-0.30267 0.0779,-0.30589 0.15585,-0.11272 0.38593,0.97236 0.66425,1.84813 0.99081,3.13922 0.44901,1.7483 0.54178,1.95757 1.3322,2.93637 1.07986,1.33938 1.91109,2.13143 3.08744,2.9396 1.03533,0.71152 1.79235,1.03671 2.84623,1.22026 1.38787,0.24145 2.41206,0.12878 3.53646,-0.38961 0.59002,-0.27366 0.94627,-0.49581 1.1949,-0.74372 0.12617,-0.12557 0.37109,-0.33163 0.5455,-0.46045 0.67908,-0.48615 0.96852,-0.85642 1.79235,-2.28275 0.59002,-1.01743 0.96853,-1.54868 1.65875,-2.31818 0.51581,-0.5731 0.95369,-0.92728 1.46579,-1.1913 l 0.44159,-0.22538 0.17441,-0.28978 c 0.0965,-0.16097 0.26719,-0.42821 0.38594,-0.59564 0.34511,-0.49904 0.50468,-0.92405 0.67166,-1.7837 0.15586,-0.81457 0.21895,-1.46174 0.21895,-2.25703 -0.004,-0.90472 -0.0334,-1.03029 -0.43788,-1.73861 -0.8535,-1.49074 -1.90368,-2.33752 -3.62181,-2.9235 -0.84608,-0.28656 -1.59567,-0.45397 -2.46773,-0.55056 -1.1281,-0.12557 -1.4361,-0.13202 -5.5663,-0.13202 -2.29331,0 -4.06711,-0.0128 -4.09679,-0.029 -0.0408,-0.0224 -0.0408,-0.0322 0.004,-0.0547 0.11876,-0.058 0.96482,-0.15132 3.2767,-0.36703 3.05404,-0.28656 3.87043,-0.40568 4.86123,-0.72443 1.59568,-0.50872 2.79057,-1.06572 4.04485,-1.88352 1.42126,-0.92729 2.13004,-1.76118 2.5605,-3.01364 0.28944,-0.83069 0.50097,-2.08636 0.50097,-2.92671 -0.004,-0.67291 -0.1002,-1.02065 -0.48242,-1.69034 -0.55292,-0.96591 -1.13553,-1.52936 -2.17828,-2.11535 -0.29315,-0.1642 -0.95741,-0.54091 -1.47321,-0.83711 -1.33592,-0.75986 -1.68473,-1.0625 -2.67925,-2.31175 -0.56406,-0.71478 -0.94256,-1.13656 -1.35817,-1.53579 -0.97967,-0.93372 -2.20055,-1.57444 -3.40658,-1.78371 -0.4119,-0.0741 -1.46208,-0.10626 -1.89254,-0.0612 z"
|
||||||
|
id="path1-3-3-2"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00345656" /><path
|
||||||
|
d="m 434.17193,103.02813 c -0.71225,0.32793 -1.09736,0.58128 -1.74709,1.15649 -1.03665,0.91735 -1.96592,2.11115 -2.47956,3.19075 -0.28262,0.58569 -0.70482,1.78761 -0.8144,2.30569 -0.0757,0.36098 -0.0126,0.8455 0.29675,2.24905 0.15627,0.71819 0.24522,1.09238 0.73122,3.0988 0.45959,1.90326 0.65918,2.85811 0.62424,2.98847 -0.027,0.10736 -0.4078,-0.62798 -1.63417,-3.14519 -1.75608,-3.60681 -2.10037,-4.20834 -2.86754,-4.98842 -1.14163,-1.15448 -3.11488,-1.77516 -5.30345,-1.66626 -1.09607,0.055 -1.9152,0.3201 -2.9208,0.94223 -0.87487,0.54476 -1.56019,1.18945 -2.24886,2.13038 -0.6194,0.84334 -0.9338,1.41581 -1.60657,2.91123 -0.63271,1.40409 -0.97365,2.24998 -1.07091,2.65202 -0.032,0.13953 -0.0811,0.22706 -0.16798,0.30679 -0.14972,0.13788 -0.20143,0.20592 -0.86652,1.11191 -0.73935,1.01204 -1.04948,1.46776 -1.32427,1.95926 -0.56965,1.01678 -0.79652,1.77053 -0.80196,2.6849 -0.004,0.61199 0.0505,0.92971 0.2746,1.60503 0.27761,0.82381 0.58582,1.4 0.91781,1.69353 0.28408,0.25513 1.15321,0.70623 1.7065,0.88898 0.86069,0.28431 2.56757,0.46758 3.75525,0.40589 1.55973,-0.0834 3.00071,-0.34791 6.15903,-1.12806 2.55495,-0.63077 3.52074,-0.84273 3.80475,-0.83519 l 0.13395,0.003 -0.0832,0.14975 c -0.10431,0.1805 -0.26771,0.28899 -0.8331,0.54108 -0.60562,0.27221 -1.43769,0.59247 -3.01747,1.15742 -2.908,1.03966 -4.13694,1.54254 -4.99026,2.04621 -1.14094,0.67379 -2.41552,2.13484 -3.00315,3.43915 -0.61514,1.37454 -0.67613,2.43961 -0.24921,4.37405 0.14854,0.68348 0.35642,1.3099 0.49286,1.48515 0.1884,0.24957 0.94386,0.75875 1.97943,1.33439 0.75173,0.41544 1.28854,0.65456 2.08523,0.92276 l 0.7579,0.25734 0.50715,0.47965 c 0.27906,0.2636 0.62419,0.57308 0.76796,0.68822 0.86312,0.68038 2.19775,1.46212 3.15988,1.85182 0.9077,0.36705 1.48293,0.45094 2.46057,0.35719 1.32347,-0.12374 3.25536,-0.62914 4.02526,-1.05428 0.88358,-0.48318 1.86569,-1.47065 2.49625,-2.50425 0.28392,-0.46398 0.52311,-1.1099 0.66399,-1.8046 0.17378,-0.85485 0.11189,-2.13698 -0.2385,-4.72444 -0.25212,-1.89068 -0.36632,-2.94172 -0.35573,-3.36929 0.0106,-0.42757 0.15606,-0.67259 0.51262,-0.85878 l 0.12678,-0.0657 0.064,0.26371 c 0.0833,0.34547 0.71408,2.64653 1.05574,3.85278 0.2879,1.02054 0.84249,2.62088 1.06298,3.07352 0.5454,1.12506 1.49691,2.36639 2.58636,3.37536 0.79474,0.7336 1.3822,1.10178 2.4643,1.54666 0.8427,0.34792 1.30827,0.47837 1.92069,0.53295 0.47541,0.0424 0.83339,0.0254 1.58289,-0.0843 0.65387,-0.0915 0.67046,-0.10036 0.66796,-0.31997 -0.003,-0.067 -0.0223,-0.29113 -0.044,-0.49769 -0.0555,-0.49722 -0.13441,-0.66439 -0.44074,-0.93928 -0.21293,-0.19394 -0.29864,-0.24014 -1.08691,-0.56541 -1.38351,-0.57554 -1.78083,-0.80667 -2.46052,-1.42921 -1.56019,-1.42605 -2.40561,-2.73647 -3.49945,-5.41983 -0.53678,-1.3111 -0.89398,-2.45792 -0.93082,-2.98168 -0.0248,-0.31066 -0.0224,-0.31485 0.11241,-0.15607 0.67255,0.80131 1.21255,1.54485 1.92915,2.66736 0.97682,1.51789 1.13078,1.68729 2.18926,2.36731 1.44677,0.93108 2.48516,1.421 3.85619,1.81752 1.20674,0.3492 2.02765,0.4194 3.08571,0.26166 1.39327,-0.20798 2.32985,-0.6375 3.23374,-1.48366 0.47379,-0.44557 0.74194,-0.76863 0.89983,-1.08223 0.0802,-0.15892 0.24774,-0.43163 0.3727,-0.60883 0.49139,-0.6753 0.64948,-1.11789 0.98212,-2.7311 0.23953,-1.15148 0.43144,-1.77491 0.84416,-2.72265 0.30904,-0.70639 0.61308,-1.18046 1.01595,-1.59234 l 0.34813,-0.353 0.0743,-0.32997 c 0.0409,-0.18317 0.11872,-0.49057 0.17869,-0.68688 0.17036,-0.58234 0.18794,-1.03598 0.0756,-1.90446 -0.10864,-0.8222 -0.2526,-1.45631 -0.50309,-2.21112 -0.28876,-0.85741 -0.35622,-0.96733 -0.96321,-1.51219 -1.2796,-1.14604 -2.54304,-1.61894 -4.35828,-1.63393 -0.89328,-0.005 -1.65744,0.0717 -2.51554,0.25473 -1.11023,0.23614 -1.40459,0.32703 -5.32456,1.62793 -2.17659,0.72233 -3.86413,1.26888 -3.8974,1.26285 -0.0458,-0.008 -0.0489,-0.0177 -0.0134,-0.0532 0.0944,-0.0925 0.86805,-0.44751 2.99432,-1.38042 2.80833,-1.23391 3.54565,-1.60411 4.38562,-2.21871 1.35423,-0.98542 2.31286,-1.89043 3.24571,-3.06167 1.05685,-1.32775 1.4669,-2.34244 1.48096,-3.66673 0.0131,-0.87958 -0.18167,-2.13796 -0.44636,-2.93554 -0.21574,-0.6374 -0.41657,-0.93714 -0.99027,-1.45235 -0.82901,-0.74259 -1.55944,-1.09386 -2.73369,-1.32158 -0.32994,-0.0635 -1.07905,-0.21183 -1.66189,-0.33049 -1.50726,-0.3004 -1.93364,-0.47777 -3.27101,-1.35019 -0.76049,-0.50074 -1.25257,-0.78183 -1.77278,-1.02983 -1.2239,-0.57763 -2.58444,-0.80119 -3.795,-0.61995 -0.41428,0.0594 -1.42113,0.35967 -1.81549,0.53802 z"
|
||||||
|
id="path1-3-3-2-0"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00345656" /><path
|
||||||
|
d="m 99.090959,92.821662 c -0.71225,0.32793 -1.09736,0.58128 -1.74709,1.15649 -1.03665,0.91735 -1.96592,2.11115 -2.47956,3.19075 -0.28262,0.58569 -0.70482,1.78761 -0.8144,2.30569 -0.0757,0.36098 -0.0126,0.845498 0.29675,2.249048 0.15627,0.71819 0.24522,1.09238 0.73122,3.0988 0.45959,1.90326 0.65918,2.85811 0.62424,2.98847 -0.027,0.10736 -0.4078,-0.62798 -1.63417,-3.14519 -1.75608,-3.60681 -2.10037,-4.20834 -2.86754,-4.988418 -1.14163,-1.15448 -3.11488,-1.77516 -5.30345,-1.66626 -1.09607,0.055 -1.9152,0.3201 -2.9208,0.94223 -0.87487,0.54476 -1.56019,1.189448 -2.24886,2.130378 -0.6194,0.84334 -0.9338,1.41581 -1.60657,2.91123 -0.63271,1.40409 -0.97365,2.24998 -1.07091,2.65202 -0.032,0.13953 -0.0811,0.22706 -0.16798,0.30679 -0.14972,0.13788 -0.20143,0.20592 -0.86652,1.11191 -0.73935,1.01204 -1.04948,1.46776 -1.32427,1.95926 -0.56965,1.01678 -0.79652,1.77053 -0.80196,2.6849 -0.004,0.61199 0.0505,0.92971 0.2746,1.60503 0.27761,0.82381 0.58582,1.4 0.91781,1.69353 0.28408,0.25513 1.15321,0.70623 1.7065,0.88898 0.86069,0.28431 2.56757,0.46758 3.75525,0.40589 1.55973,-0.0834 3.00071,-0.34791 6.15903,-1.12806 2.55495,-0.63077 3.52074,-0.84273 3.80475,-0.83519 l 0.13395,0.003 -0.0832,0.14975 c -0.10431,0.1805 -0.26771,0.28899 -0.8331,0.54108 -0.60562,0.27221 -1.43769,0.59247 -3.01747,1.15742 -2.908,1.03966 -4.13694,1.54254 -4.99026,2.04621 -1.14094,0.67379 -2.41552,2.13484 -3.00315,3.43915 -0.61514,1.37454 -0.67613,2.43961 -0.24921,4.37405 0.14854,0.68348 0.35642,1.3099 0.49286,1.48515 0.1884,0.24957 0.94386,0.75875 1.97943,1.33439 0.75173,0.41544 1.28854,0.65456 2.08523,0.92276 l 0.7579,0.25734 0.50715,0.47965 c 0.27906,0.2636 0.62419,0.57308 0.76796,0.68822 0.86312,0.68038 2.19775,1.46212 3.15988,1.85182 0.9077,0.36705 1.48293,0.45094 2.46057,0.35719 1.32347,-0.12374 3.25536,-0.62914 4.02526,-1.05428 0.88358,-0.48318 1.86569,-1.47065 2.49625,-2.50425 0.28392,-0.46398 0.52311,-1.1099 0.66399,-1.8046 0.17378,-0.85485 0.11189,-2.13698 -0.2385,-4.72444 -0.25212,-1.89068 -0.36632,-2.94172 -0.35573,-3.36929 0.0106,-0.42757 0.15606,-0.67259 0.51262,-0.85878 l 0.12678,-0.0657 0.064,0.26371 c 0.0833,0.34547 0.71408,2.64653 1.055741,3.85278 0.2879,1.02054 0.84249,2.62088 1.06298,3.07352 0.5454,1.12506 1.49691,2.36639 2.58636,3.37536 0.79474,0.7336 1.3822,1.10178 2.4643,1.54666 0.8427,0.34792 1.30827,0.47837 1.92069,0.53295 0.47541,0.0424 0.83339,0.0254 1.58289,-0.0843 0.65387,-0.0915 0.67046,-0.10036 0.66796,-0.31997 -0.003,-0.067 -0.0223,-0.29113 -0.044,-0.49769 -0.0555,-0.49722 -0.13441,-0.66439 -0.44074,-0.93928 -0.21293,-0.19394 -0.29864,-0.24014 -1.08691,-0.56541 -1.38351,-0.57554 -1.78083,-0.80667 -2.46052,-1.42921 -1.56019,-1.42605 -2.40561,-2.73647 -3.49945,-5.41983 -0.53678,-1.3111 -0.89398,-2.45792 -0.93082,-2.98168 -0.0248,-0.31066 -0.0224,-0.31485 0.11241,-0.15607 0.67255,0.80131 1.21255,1.54485 1.92915,2.66736 0.97682,1.51789 1.13078,1.68729 2.18926,2.36731 1.44677,0.93108 2.48516,1.421 3.85619,1.81752 1.20674,0.3492 2.02765,0.4194 3.08571,0.26166 1.39327,-0.20798 2.32985,-0.6375 3.23374,-1.48366 0.47379,-0.44557 0.74194,-0.76863 0.89983,-1.08223 0.0802,-0.15892 0.24774,-0.43163 0.3727,-0.60883 0.49139,-0.6753 0.64948,-1.11789 0.98212,-2.7311 0.23953,-1.15148 0.43144,-1.77491 0.84416,-2.72265 0.30904,-0.70639 0.61308,-1.18046 1.01595,-1.59234 l 0.34813,-0.353 0.0743,-0.32997 c 0.0409,-0.18317 0.11872,-0.49057 0.17869,-0.68688 0.17036,-0.58234 0.18794,-1.03598 0.0756,-1.90446 -0.10864,-0.8222 -0.2526,-1.45631 -0.50309,-2.21112 -0.28876,-0.85741 -0.35622,-0.96733 -0.96321,-1.51219 -1.2796,-1.14604 -2.54304,-1.61894 -4.35828,-1.63393 -0.89328,-0.005 -1.65744,0.0717 -2.51554,0.25473 -1.11023,0.23614 -1.40459,0.32703 -5.32456,1.62793 -2.17659,0.72233 -3.86413,1.26888 -3.8974,1.26285 -0.0458,-0.008 -0.0489,-0.0177 -0.0134,-0.0532 0.0944,-0.0925 0.86805,-0.44751 2.99432,-1.38042 2.80833,-1.23391 3.54565,-1.60411 4.38562,-2.21871 1.35423,-0.98542 2.31286,-1.89043 3.24571,-3.06167 1.05685,-1.32775 1.4669,-2.34244 1.48096,-3.66673 0.0131,-0.87958 -0.18167,-2.137958 -0.44636,-2.935538 -0.21574,-0.6374 -0.41657,-0.93714 -0.99027,-1.45235 -0.82901,-0.74259 -1.55944,-1.09386 -2.73369,-1.32158 -0.32994,-0.0635 -1.07905,-0.21183 -1.66189,-0.33049 -1.50726,-0.3004 -1.93364,-0.47777 -3.27101,-1.35019 -0.76049,-0.50074 -1.25257,-0.78183 -1.77278,-1.02983 -1.2239,-0.57763 -2.58444,-0.80119 -3.795,-0.61995 -0.41428,0.0594 -1.421131,0.35967 -1.815491,0.53802 z"
|
||||||
|
id="path1-3-3-2-0-4"
|
||||||
|
style="fill:#e5ffd5;fill-opacity:1;stroke:none;stroke-width:0.00345656" /></svg>
|
||||||
|
After Width: | Height: | Size: 56 KiB |
1
dist/icon_variations/saintpatrick2026_bgcolor
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
#3cce5bff
|
||||||
225
dist/icon_variations/valentines2026_named.svg
vendored
|
Before Width: | Height: | Size: 42 KiB |
BIN
dist/qt_themes/default/icons/256x256/eden.png
vendored
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 54 KiB |
BIN
dist/qt_themes/default/icons/256x256/eden_named.png
vendored
|
Before Width: | Height: | Size: 79 KiB |
|
|
@ -91,7 +91,7 @@ After configuration, you may need to modify `externals/ffmpeg/CMakeFiles/ffmpeg-
|
||||||
|
|
||||||
`-lc++-experimental` doesn't exist in OpenBSD but the LLVM driver still tries to link against it, to solve just symlink `ln -s /usr/lib/libc++.a /usr/lib/libc++experimental.a`. Builds are currently not working due to lack of `std::jthread` and such, either compile libc++ manually or wait for ports to catch up.
|
`-lc++-experimental` doesn't exist in OpenBSD but the LLVM driver still tries to link against it, to solve just symlink `ln -s /usr/lib/libc++.a /usr/lib/libc++experimental.a`. Builds are currently not working due to lack of `std::jthread` and such, either compile libc++ manually or wait for ports to catch up.
|
||||||
|
|
||||||
If clang has errors, try using `g++-11`.
|
If clang has errors, try using `g++11`.
|
||||||
|
|
||||||
## FreeBSD
|
## FreeBSD
|
||||||
|
|
||||||
|
|
@ -107,6 +107,8 @@ hw.usb.usbhid.enable="0"
|
||||||
|
|
||||||
## NetBSD
|
## NetBSD
|
||||||
|
|
||||||
|
2026-02-07: `vulkan-headers` must not be installed, since the version found in `pkgsrc` is older than required. Either wait for binary packages to update or build newer versions from source.
|
||||||
|
|
||||||
Install `pkgin` if not already `pkg_add pkgin`, see also the general [pkgsrc guide](https://www.netbsd.org/docs/pkgsrc/using.html). For NetBSD 10.1 provide `echo 'PKG_PATH="https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/amd64/10.1/All/"' >/etc/pkg_install.conf`. If `pkgin` is taking too much time consider adding the following to `/etc/rc.conf`:
|
Install `pkgin` if not already `pkg_add pkgin`, see also the general [pkgsrc guide](https://www.netbsd.org/docs/pkgsrc/using.html). For NetBSD 10.1 provide `echo 'PKG_PATH="https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/amd64/10.1/All/"' >/etc/pkg_install.conf`. If `pkgin` is taking too much time consider adding the following to `/etc/rc.conf`:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|
@ -116,7 +118,7 @@ ip6addrctl_policy=ipv4_prefer
|
||||||
|
|
||||||
System provides a default `g++-10` which doesn't support the current C++ codebase; install `clang-19` with `pkgin install clang-19`. Or install `gcc14` (or `gcc15` with current pkgsrc). Provided that, the following CMake commands may work:
|
System provides a default `g++-10` which doesn't support the current C++ codebase; install `clang-19` with `pkgin install clang-19`. Or install `gcc14` (or `gcc15` with current pkgsrc). Provided that, the following CMake commands may work:
|
||||||
|
|
||||||
- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -Bbuild`
|
- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -Bbuild` (Recommended)
|
||||||
- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc14/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc14/bin/g++ -Bbuild`
|
- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc14/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc14/bin/g++ -Bbuild`
|
||||||
- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc15/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc15/bin/g++ -Bbuild`
|
- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc15/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc15/bin/g++ -Bbuild`
|
||||||
|
|
||||||
|
|
@ -138,8 +140,12 @@ cmake --install build
|
||||||
|
|
||||||
However, pkgsrc is highly recommended, see [getting pkgsrc](https://iso.us.netbsd.org/pub/pkgsrc/current/pkgsrc/doc/pkgsrc.html#getting). You must get `current` not the `2025Q2` version.
|
However, pkgsrc is highly recommended, see [getting pkgsrc](https://iso.us.netbsd.org/pub/pkgsrc/current/pkgsrc/doc/pkgsrc.html#getting). You must get `current` not the `2025Q2` version.
|
||||||
|
|
||||||
|
`QtCore` on NetBSD is included, but due to misconfigurations(!) we MUST include one of the standard headers that include `bits/c++config.h`, since source_location (required by `QtCore`) isn't properly configured to intake `bits/c++config.h` (none of the experimental library is). This is a bug with NetBSD packaging and not our fault, but alas.
|
||||||
|
|
||||||
## DragonFlyBSD
|
## DragonFlyBSD
|
||||||
|
|
||||||
|
2026-02-07: `vulkan-headers` and `vulkan-utility-libraries` must NOT be uninstalled, since they're too old: `1.3.289`. Either wait for binary packages to update or build newer versions from source.
|
||||||
|
|
||||||
If `libstdc++.so.6` is not found (`GLIBCXX_3.4.30`) then attempt:
|
If `libstdc++.so.6` is not found (`GLIBCXX_3.4.30`) then attempt:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|
|
||||||
|
|
@ -22,17 +22,25 @@ Debug logs can be found in General -> Debug -> Open Log Location on desktop, and
|
||||||
|
|
||||||
Ignoring SIGSEGV when debugging in host:
|
Ignoring SIGSEGV when debugging in host:
|
||||||
|
|
||||||
- **gdb**: `handle all nostop pass`.
|
- **gdb**: `handle SIGSEGV nostop pass`.
|
||||||
- **lldb**: `pro hand -p true -s false -n false SIGSEGV`.
|
- **lldb**: `pro hand -p true -s false -n false SIGSEGV`.
|
||||||
|
|
||||||
## Debugging (guest code)
|
## Debugging (guest code)
|
||||||
|
|
||||||
### gdb
|
### gdb
|
||||||
|
|
||||||
Run `./build/bin/eden-cli -c <path to your config file (see logs where you run eden normally to see where it is)> -d -g <path to game>`
|
You must have GDB installed for aarch64 to debug the target. Install it through your package manager, e.g.:
|
||||||
|
* On Arch:
|
||||||
|
* `sudo pacman -Syu aarch64-linux-gnu-gdb`
|
||||||
|
* On Gentoo:
|
||||||
|
* `sudo emerge --ask crossdev`
|
||||||
|
* `sudo crossdev -t aarch64-unknown-linux-gnu --ex-gdb`
|
||||||
|
|
||||||
Then hook up an aarch64-gdb (use `yay aarch64-gdb` or `sudo pkg in arch64-gdb` to install)
|
Run `./build/bin/eden-cli -c <path to your config file (see logs where you run eden normally to see where it is)> -d -g <path to game>`
|
||||||
Then type `target remote localhost:1234` and type `c` (for continue) - and then if it crashes just do a `bt` (backtrace) and `layout asm`.
|
Or `Enable GDB Stub` at General > Debug, then hook up an aarch64-gdb:
|
||||||
|
* `target remote localhost:6543`
|
||||||
|
|
||||||
|
Type `c` (for continue) and then if it crashes just do a `bt` (backtrace) and `layout asm`
|
||||||
|
|
||||||
### gdb cheatsheet
|
### gdb cheatsheet
|
||||||
|
|
||||||
|
|
|
||||||
30
docs/Deps.md
|
|
@ -51,12 +51,11 @@ All other dependencies will be downloaded and built by [CPM](https://github.com/
|
||||||
* [fmt](https://fmt.dev/) 8.0.1+
|
* [fmt](https://fmt.dev/) 8.0.1+
|
||||||
* [lz4](http://www.lz4.org)
|
* [lz4](http://www.lz4.org)
|
||||||
* [nlohmann\_json](https://github.com/nlohmann/json) 3.8+
|
* [nlohmann\_json](https://github.com/nlohmann/json) 3.8+
|
||||||
* [OpenSSL](https://www.openssl.org/source/) 1.1.1+
|
* [OpenSSL](https://www.openssl.org/source/) 3+
|
||||||
* [ZLIB](https://www.zlib.net/) 1.2+
|
* [ZLIB](https://www.zlib.net/) 1.2+
|
||||||
* [zstd](https://facebook.github.io/zstd/) 1.5+
|
* [zstd](https://facebook.github.io/zstd/) 1.5+
|
||||||
* [enet](http://enet.bespin.org/) 1.3+
|
* [enet](http://enet.bespin.org/) 1.3+
|
||||||
* [Opus](https://opus-codec.org/) 1.3+
|
* [Opus](https://opus-codec.org/) 1.3+
|
||||||
* [MbedTLS](https://github.com/Mbed-TLS/mbedtls) 3+
|
|
||||||
|
|
||||||
Vulkan 1.3.274+ is also needed:
|
Vulkan 1.3.274+ is also needed:
|
||||||
|
|
||||||
|
|
@ -121,7 +120,7 @@ sudo emerge -a \
|
||||||
dev-util/vulkan-utility-libraries dev-util/glslang \
|
dev-util/vulkan-utility-libraries dev-util/glslang \
|
||||||
media-gfx/renderdoc media-libs/libva media-libs/opus media-video/ffmpeg \
|
media-gfx/renderdoc media-libs/libva media-libs/opus media-video/ffmpeg \
|
||||||
media-libs/VulkanMemoryAllocator media-libs/libsdl2 media-libs/cubeb \
|
media-libs/VulkanMemoryAllocator media-libs/libsdl2 media-libs/cubeb \
|
||||||
net-libs/enet net-libs/mbedtls \
|
net-libs/enet \
|
||||||
sys-libs/zlib \
|
sys-libs/zlib \
|
||||||
dev-cpp/nlohmann_json dev-cpp/simpleini dev-cpp/cpp-httplib dev-cpp/cpp-jwt \
|
dev-cpp/nlohmann_json dev-cpp/simpleini dev-cpp/cpp-httplib dev-cpp/cpp-jwt \
|
||||||
games-util/gamemode \
|
games-util/gamemode \
|
||||||
|
|
@ -139,7 +138,6 @@ Required USE flags:
|
||||||
|
|
||||||
* `dev-qt/qtbase network concurrent dbus gui widgets`
|
* `dev-qt/qtbase network concurrent dbus gui widgets`
|
||||||
* `dev-libs/quazip qt6`
|
* `dev-libs/quazip qt6`
|
||||||
* `net-libs/mbedtls cmac`
|
|
||||||
* `media-libs/libsdl2 haptic joystick sound video`
|
* `media-libs/libsdl2 haptic joystick sound video`
|
||||||
* `dev-cpp/cpp-httplib ssl`
|
* `dev-cpp/cpp-httplib ssl`
|
||||||
|
|
||||||
|
|
@ -151,7 +149,7 @@ Required USE flags:
|
||||||
<summary>Arch Linux</summary>
|
<summary>Arch Linux</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 mbedtls ninja nlohmann-json openssl opus qt6-base qt6-multimedia sdl2 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers
|
sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 ninja nlohmann-json openssl opus qt6-base qt6-multimedia qt6-charts sdl2 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers
|
||||||
```
|
```
|
||||||
|
|
||||||
* Building with QT Web Engine requires `qt6-webengine` as well.
|
* Building with QT Web Engine requires `qt6-webengine` as well.
|
||||||
|
|
@ -164,7 +162,7 @@ sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glsl
|
||||||
<summary>Ubuntu, Debian, Mint Linux</summary>
|
<summary>Ubuntu, Debian, Mint Linux</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev libmbedtls-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl2-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev
|
sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev qt6-charts-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl2-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
* Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required.
|
* Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required.
|
||||||
|
|
@ -178,7 +176,7 @@ sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev l
|
||||||
Fedora:
|
Fedora:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo dnf install autoconf cmake fmt-devel gcc{,-c++} glslang hidapi-devel json-devel libtool libusb1-devel libzstd-devel lz4-devel nasm ninja-build openssl-devel pulseaudio-libs-devel qt6-linguist qt6-qtbase{-private,}-devel qt6-qtwebengine-devel qt6-qtmultimedia-devel speexdsp-devel wayland-devel zlib-devel ffmpeg-devel libXext-devel boost jq
|
sudo dnf install autoconf cmake fmt-devel gcc{,-c++} glslang hidapi-devel json-devel libtool libusb1-devel libzstd-devel lz4-devel nasm ninja-build openssl-devel pulseaudio-libs-devel qt6-linguist qt6-qtbase{-private,}-devel qt6-qtwebengine-devel qt6-qtmultimedia-devel qt6-charts-devel speexdsp-devel wayland-devel zlib-devel ffmpeg-devel libXext-devel boost jq
|
||||||
```
|
```
|
||||||
|
|
||||||
AlmaLinux (use `YUZU_USE_CPM=ON`):
|
AlmaLinux (use `YUZU_USE_CPM=ON`):
|
||||||
|
|
@ -211,17 +209,15 @@ First, enable the community repository; [see here](https://wiki.alpinelinux.org/
|
||||||
# Enable the community repository
|
# Enable the community repository
|
||||||
setup-apkrepos -c
|
setup-apkrepos -c
|
||||||
# Install
|
# Install
|
||||||
apk add g++ git cmake make mbedtls-dev mbedtls-static mesa-dev qt6-qtbase-dev qt6-qtbase-private-dev libquazip1-qt6 ffmpeg-dev libusb-dev libtool boost-dev sdl2-dev zstd-dev vulkan-utility-libraries spirv-tools-dev openssl-dev nlohmann-json lz4-dev opus-dev jq patch
|
apk add g++ git cmake make mesa-dev qt6-qtbase-dev qt6-qtbase-private-dev libquazip1-qt6 ffmpeg-dev qt6-charts-dev libusb-dev libtool boost-dev sdl2-dev zstd-dev vulkan-utility-libraries spirv-tools-dev openssl-dev nlohmann-json lz4-dev opus-dev jq patch
|
||||||
```
|
```
|
||||||
|
|
||||||
`mbedtls-static` has to be specified otherwise `libeverest.a` and `libp256m.a` will fail to be found.
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>Void Linux</summary>
|
<summary>Void Linux</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
xbps-install -Su git make cmake clang pkg-config patch mbedtls-devel SPIRV-Tools-devel SPIRV-Headers lz4 liblz4-devel boost-devel ffmpeg6-devel catch2 Vulkan-Utility-Libraries Vulkan-Headers glslang openssl-devel SDL2-devel quazip-qt6-devel qt6-base-devel qt6-qt5compat-devel fmt-devel json-c++ libenet-devel libusb-devel
|
xbps-install -Su git make cmake clang pkg-config patch SPIRV-Tools-devel SPIRV-Headers lz4 liblz4-devel boost-devel ffmpeg6-devel catch2 Vulkan-Utility-Libraries Vulkan-Headers glslang openssl-devel SDL2-devel quazip-qt6-devel qt6-base-devel qt6-qt5compat-devel qt6-charts-devel fmt-devel json-c++ libenet-devel libusb-devel
|
||||||
```
|
```
|
||||||
|
|
||||||
Yes, `nlohmann-json` is just named `json-c++`. Why?
|
Yes, `nlohmann-json` is just named `json-c++`. Why?
|
||||||
|
|
@ -233,6 +229,8 @@ Yes, `nlohmann-json` is just named `json-c++`. Why?
|
||||||
|
|
||||||
A convenience script is provided on the root of this project [shell.nix](../shell.nix). Run the usual `nix-shell`.
|
A convenience script is provided on the root of this project [shell.nix](../shell.nix). Run the usual `nix-shell`.
|
||||||
|
|
||||||
|
If you're going for a pure build (i.e no downloaded deps), use `-DYUZU_USE_CPM=ON -DCPMUTIL_FORCE_SYSTEM=ON`.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
<summary>macOS</summary>
|
<summary>macOS</summary>
|
||||||
|
|
@ -257,7 +255,7 @@ brew install molten-vk
|
||||||
<details>
|
<details>
|
||||||
<summary>FreeBSD</summary>
|
<summary>FreeBSD</summary>
|
||||||
|
|
||||||
As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/unordered-dense mbedtls3 vulkan-headers quazip-qt6`
|
As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/qt6-charts devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/unordered-dense vulkan-headers quazip-qt6`
|
||||||
|
|
||||||
If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
|
If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
|
||||||
|
|
||||||
|
|
@ -267,7 +265,7 @@ If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
|
||||||
<details>
|
<details>
|
||||||
<summary>NetBSD</summary>
|
<summary>NetBSD</summary>
|
||||||
|
|
||||||
For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq libopus qt6 mbedtls3 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx`.
|
For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq libopus qt6 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx`.
|
||||||
|
|
||||||
[Caveats](./Caveats.md#netbsd).
|
[Caveats](./Caveats.md#netbsd).
|
||||||
|
|
||||||
|
|
@ -287,7 +285,7 @@ pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gm
|
||||||
<summary>DragonFlyBSD</summary>
|
<summary>DragonFlyBSD</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmake jq nlohmann-json enet spirv-tools sdl2 vulkan-utility-libraries vulkan-headers catch2 libfmt openssl liblz4 boost-libs cpp-httplib qt6-base quazip-qt6 unordered-dense libva-vdpau-driver libva-utils libva-intel-driver
|
pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmake jq nlohmann-json enet spirv-tools sdl2 vulkan-utility-libraries vulkan-headers catch2 libfmt openssl liblz4 boost-libs cpp-httplib qt6-base qt6-charts quazip-qt6 unordered-dense libva-vdpau-driver libva-utils libva-intel-driver
|
||||||
```
|
```
|
||||||
|
|
||||||
[Caveats](./Caveats.md#dragonflybsd).
|
[Caveats](./Caveats.md#dragonflybsd).
|
||||||
|
|
@ -311,7 +309,7 @@ sudo pkg install qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json ope
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
BASE="git make autoconf libtool automake-wrapper jq patch"
|
BASE="git make autoconf libtool automake-wrapper jq patch"
|
||||||
MINGW="qt6-base qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet opus mbedtls libusb unordered_dense openssl SDL2"
|
MINGW="qt6-base qt6-charts qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet opus libusb unordered_dense openssl SDL2"
|
||||||
# Either x86_64 or clang-aarch64 (Windows on ARM)
|
# Either x86_64 or clang-aarch64 (Windows on ARM)
|
||||||
packages="$BASE"
|
packages="$BASE"
|
||||||
for pkg in $MINGW; do
|
for pkg in $MINGW; do
|
||||||
|
|
@ -337,7 +335,7 @@ pacman -Syuu --needed --noconfirm $packages
|
||||||
<summary>HaikuOS</summary>
|
<summary>HaikuOS</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel mbedtls3_devel glslang qt6_devel
|
pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel
|
||||||
```
|
```
|
||||||
|
|
||||||
[Caveats](./Caveats.md#haikuos).
|
[Caveats](./Caveats.md#haikuos).
|
||||||
|
|
|
||||||
100
docs/Options.md
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
# CMake Options
|
||||||
|
|
||||||
|
To change these options, add `-DOPTION_NAME=NEWVALUE` to the command line.
|
||||||
|
|
||||||
|
- On Qt Creator, go to Project -> Current Configuration
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- Defaults are marked per-platform.
|
||||||
|
- "Non-UNIX" just means Windows/MSVC and Android (yes, macOS is UNIX
|
||||||
|
- Android generally doesn't need to change anything; if you do, go to `src/android/app/build.gradle.kts`
|
||||||
|
- To set a boolean variable to on, use `ON` for the value; to turn it off, use `OFF`
|
||||||
|
- If a variable is mentioned as being e.g. "ON" for a specific platform(s), that means it is defaulted to OFF on others
|
||||||
|
- TYPE is always boolean unless otherwise specified
|
||||||
|
- Format:
|
||||||
|
- `OPTION_NAME` (TYPE DEFAULT) DESCRIPTION
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
These options control dependencies.
|
||||||
|
|
||||||
|
- `YUZU_USE_BUNDLED_FFMPEG` (ON for non-UNIX) Download a pre-built and configured FFmpeg
|
||||||
|
- `YUZU_USE_EXTERNAL_FFMPEG` (ON for Solaris) Build FFmpeg from source
|
||||||
|
- `YUZU_DOWNLOAD_ANDROID_VVL` (ON) Download validation layer binary for Android
|
||||||
|
- `YUZU_DOWNLOAD_TIME_ZONE_DATA` (ON) Always download time zone binaries
|
||||||
|
- Currently, build fails without this
|
||||||
|
- `YUZU_TZDB_PATH` (string) Path to a pre-downloaded timezone database (useful for nixOS and Gentoo)
|
||||||
|
- `YUZU_USE_BUNDLED_MOLTENVK` (ON, macOS only) Download bundled MoltenVK lib
|
||||||
|
- `YUZU_USE_BUNDLED_OPENSSL` (ON for MSVC, Android, Solaris, and OpenBSD) Download bundled OpenSSL build
|
||||||
|
- `YUZU_USE_EXTERNAL_SDL2` (OFF) Compiles SDL2 from source
|
||||||
|
- `YUZU_USE_BUNDLED_SDL2` (ON for MSVC) Download a prebuilt SDL2
|
||||||
|
|
||||||
|
### Miscellaneous
|
||||||
|
|
||||||
|
- `ENABLE_WEB_SERVICE` (ON) Enable multiplayer service
|
||||||
|
- `ENABLE_WIFI_SCAN` (OFF) Enable WiFi scanning (requires iw on Linux) - experimental
|
||||||
|
- `ENABLE_CUBEB` (ON) Enables the cubeb audio backend
|
||||||
|
- This option is subject for removal.
|
||||||
|
- `YUZU_TESTS` (ON) Compile tests - requires Catch2
|
||||||
|
- `ENABLE_LTO` (OFF) Enable link-time optimization
|
||||||
|
- Not recommended on Windows
|
||||||
|
- UNIX may be better off appending `-flto=thin` to compiler args
|
||||||
|
- `USE_FASTER_LINKER` (OFF) Check if a faster linker is available
|
||||||
|
- Not recommended outside of Linux
|
||||||
|
|
||||||
|
### Flavors
|
||||||
|
|
||||||
|
These options control executables and build flavors.
|
||||||
|
|
||||||
|
- `YUZU_LEGACY` (OFF): Apply patches to improve compatibility on some older GPUs at the cost of performance
|
||||||
|
- `NIGHTLY_BUILD` (OFF): This is only used by CI. Do not use this unless you're making your own distribution and know what you're doing.
|
||||||
|
- `YUZU_STATIC_BUILD` (OFF) Attempt to build using static libraries if possible
|
||||||
|
- Not supported on Linux
|
||||||
|
- Automatically set if `YUZU_USE_BUNDLED_QT` is on for non-Linux
|
||||||
|
- `ENABLE_UPDATE_CHECKER` (OFF) Enable update checking functionality
|
||||||
|
- `YUZU_DISABLE_LLVM` (OFF) Do not attempt to link to the LLVM demangler
|
||||||
|
- Really only useful for CI or distribution builds
|
||||||
|
|
||||||
|
**Desktop only**:
|
||||||
|
|
||||||
|
- `YUZU_CMD` (ON) Compile the SDL2 frontend (eden-cli)
|
||||||
|
- `YUZU_ROOM` (OFF) Compile dedicated room functionality into the main executable
|
||||||
|
- `YUZU_ROOM_STANDALONE` (OFF) Compile a separate executable for room functionality
|
||||||
|
- `YUZU_STATIC_ROOM` (OFF) Compile the room executable *only* as a static, portable executable
|
||||||
|
- This is only usable on Alpine Linux.
|
||||||
|
|
||||||
|
### Desktop
|
||||||
|
|
||||||
|
The following options are desktop only.
|
||||||
|
|
||||||
|
- `ENABLE_LIBUSB` (ON) Enable the use of the libusb input frontend (HIGHLY RECOMMENDED)
|
||||||
|
- `ENABLE_OPENGL` (ON) Enable the OpenGL graphics frontend
|
||||||
|
- Unavailable on Windows/ARM64
|
||||||
|
- You probably shouldn't turn this off.
|
||||||
|
|
||||||
|
### Qt
|
||||||
|
|
||||||
|
Also desktop-only, but apply strictly to Qt
|
||||||
|
|
||||||
|
- `ENABLE_QT` (ON) Enable the Qt frontend (recommended)
|
||||||
|
- `ENABLE_QT_TRANSLATION` (OFF) Enable translations for the Qt frontend
|
||||||
|
- `YUZU_USE_BUNDLED_QT` (ON for MSVC) Download bundled Qt binaries
|
||||||
|
- Not recommended on Linux. For Windows and macOS, the provided build is statically linked.
|
||||||
|
- `YUZU_QT_MIRROR` (string) What mirror to use for downloading the bundled Qt libraries
|
||||||
|
- `YUZU_USE_QT_MULTIMEDIA` (OFF) Use QtMultimedia for camera support
|
||||||
|
- `YUZU_USE_QT_WEB_ENGINE` (OFF) Use QtWebEngine for web applet implementation (requires the huge QtWebEngine dependency; not recommended)
|
||||||
|
- `USE_DISCORD_PRESENCE` (OFF) Enables Discord Rich Presence (Qt frontend only)
|
||||||
|
|
||||||
|
### Retired Options
|
||||||
|
|
||||||
|
The following options were a part of Eden at one point, but have since been retired.
|
||||||
|
|
||||||
|
- `ENABLE_OPENSSL` - MbedTLS was fully replaced with OpenSSL in [#3606](https://git.eden-emu.dev/eden-emu/eden/pulls/3606), because OpenSSL straight-up performs better.
|
||||||
|
- `ENABLE_SDL2` - While technically possible to *not* use SDL2 on desktop, this is **NOT** a supported configuration under any means, and adding this matrix to our build system was not worth the effort.
|
||||||
|
- `YUZU_USE_CPM` - This option once had a purpose, but that purpose has long since passed us by. *All* builds use CPMUtil to manage dependencies now.
|
||||||
|
- If you want to *force* the usage of system dependencies, use `-DCPMUTIL_FORCE_SYSTEM=ON`.
|
||||||
|
|
||||||
|
See `src/dynarmic/CMakeLists.txt` for additional options--usually, these don't need changed
|
||||||
|
|
@ -1,8 +1,11 @@
|
||||||
# Eden Build Documentation
|
# Eden Build Documentation
|
||||||
|
|
||||||
|
Are you just a casual user? Take a look at our [User Handbook](./user) then!
|
||||||
|
|
||||||
This contains documentation created by developers. This contains build instructions, guidelines, instructions/layouts for [cool stuff we made](./CPMUtil), and more.
|
This contains documentation created by developers. This contains build instructions, guidelines, instructions/layouts for [cool stuff we made](./CPMUtil), and more.
|
||||||
|
|
||||||
- **[General Build Instructions](Build.md)**
|
- **[General Build Instructions](Build.md)**
|
||||||
|
- **[CMake Options](Options.md)**
|
||||||
- **[Cross Compiling](CrossCompile.md)**
|
- **[Cross Compiling](CrossCompile.md)**
|
||||||
- **[Development Guidelines](Development.md)**
|
- **[Development Guidelines](Development.md)**
|
||||||
- **[Dependencies](Deps.md)**
|
- **[Dependencies](Deps.md)**
|
||||||
|
|
@ -10,7 +13,6 @@ This contains documentation created by developers. This contains build instructi
|
||||||
- **[CPM - CMake Package Manager](./CPMUtil)**
|
- **[CPM - CMake Package Manager](./CPMUtil)**
|
||||||
- **[Platform-Specific Caveats](Caveats.md)**
|
- **[Platform-Specific Caveats](Caveats.md)**
|
||||||
- **[The NVIDIA SM86 (Maxwell) GPU](./NvidiaGpu.md)**
|
- **[The NVIDIA SM86 (Maxwell) GPU](./NvidiaGpu.md)**
|
||||||
- **[User Handbook](./user)**
|
|
||||||
- **[Dynarmic](./dynarmic)**
|
- **[Dynarmic](./dynarmic)**
|
||||||
- **[Cross compilation](./CrossCompile.md)**
|
- **[Cross compilation](./CrossCompile.md)**
|
||||||
- **[Driver Bugs](./DriverBugs.md)**
|
- **[Driver Bugs](./DriverBugs.md)**
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ First of all, you MUST have a valid reason to sign up for our Git. Valid reasons
|
||||||
The following are not valid reasons to sign up:
|
The following are not valid reasons to sign up:
|
||||||
|
|
||||||
- I want to contribute to Eden.
|
- I want to contribute to Eden.
|
||||||
* Be at least somewhat specific!
|
* Be at least somewhat specific! We always welcome contributors and developers, but generic "I want to contribute" messages don't give us enough information.
|
||||||
- I want to support Eden.
|
- I want to support Eden.
|
||||||
* If you wish to support us through development, be more specific; otherwise, to support us, check out our [donations page](https://eden-emu.dev/donations).
|
* If you wish to support us through development, be more specific; otherwise, to support us, check out our [donations page](https://eden-emu.dev/donations).
|
||||||
- I want to report issues.
|
- I want to report issues.
|
||||||
|
|
@ -41,17 +41,36 @@ Email: <Your Desired Email>
|
||||||
I wish to sign up because... <your reason here>
|
I wish to sign up because... <your reason here>
|
||||||
```
|
```
|
||||||
|
|
||||||
Email notifications are disabled for the time being, so you don't have to use a real email. If you wish to remain anonymous, either send a separate email asking for access to a shared anonymous account, *or* create a fake username and email.
|
Email notifications are disabled for the time being, so you don't have to use a real email. If you wish to remain anonymous, either send a separate email asking for access to a shared anonymous account, *or* create a fake username and email. Do note that the email you sign up with is used to accredit commits on the web UI, and *must* match your configured GPG key.
|
||||||
|
|
||||||
|
## Patches
|
||||||
|
|
||||||
|
In general, PRs are the preferred method of tracking patches, as they allow us to go through our standard triage, CI, and testing process without having to deal with the minutiae of incremental patches. However, we also understand that many people prefer to use raw patches, and that's totally okay! While we currently don't have a mailing list, we do accept email patches. To do so:
|
||||||
|
|
||||||
|
1. Make your changes on a clean copy of the master branch
|
||||||
|
2. Commit your changes with a descriptive, well-formed message (see the [commit message docs](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/Development.md#pull-requests)), and a proper description thoroughly explaining your changes.
|
||||||
|
* Note that we don't need to know all the individual details about your code. A description explaining the motivation and general implementation of your changes is enough, alongside caveats and any potential blockers.
|
||||||
|
3. Format your patch with `git format-patch -1 HEAD`.
|
||||||
|
4. Email us with the subject `[Eden] [PATCH] <brief patch description...>`, with a brief description of your patch, and the previously-formatted patch file as an attachment.
|
||||||
|
* If you don't include the first two bracketed parts, your email may be lost!
|
||||||
|
|
||||||
|
The following emails are currently set up to receive and process patches:
|
||||||
|
|
||||||
|
- [eden@eden-emu.dev](mailto:eden@eden-emu.dev]
|
||||||
|
- [crueter@eden-emu.dev](mailto:eden@eden-emu.dev)
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
|
|
||||||
If you have read everything above and affirm that you will not abuse your access, click the summary below to get the email to send your request to.
|
If you have read everything above and affirm that you will not abuse your access, click the summary below to get the email to send your request to.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>I affirm that I have read ALL of the information above, and will not abuse my access to Eden, nor will I send unnecessary spam requests or the following email.</summary>
|
<summary>I affirm that I have read ALL of the information above, and will not abuse my access to Eden, nor will I send unnecessary spam to the following email.</summary>
|
||||||
|
|
||||||
Email [crueter@crueter.xyz](mailto:crueter@crueter.xyz) with the format above.
|
Email [crueter@crueter.xyz](mailto:crueter@crueter.xyz) with the format above.
|
||||||
|
|
||||||
Once your request is processed, you should receive a confirmation email from crueter with your password alongside a link to a repository containing instructions on SSH, etc. Note that you are required to change your password. If your request is rejected, you will receive a notice as such, asking for clarification if needed. If you do not receive a response in 48 hours, you may send another email.
|
Once your request is processed, you should receive a confirmation email from crueter with your password alongside a link to a repository containing instructions on SSH, etc. Note that you are required to change your password. If your request is rejected, you will receive a notice as such, asking for clarification if needed. If you do not receive a response in 48 hours, you may send another email.
|
||||||
|
|
||||||
</details>
|
> [!WARNING]
|
||||||
|
> Some email providers may place the response email in your spam/junk folder; notable offenders include Gmail and Outlook. *Always* ensure to check your Spam/Junk folder, until Google/Microsoft finally end their vendetta against the great evil of my `.xyz` domain.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
|
||||||
|
|
@ -286,15 +286,6 @@ Exclusive OR (i.e.: XOR)
|
||||||
|
|
||||||
Memory access.
|
Memory access.
|
||||||
|
|
||||||
### Terminal: Interpret
|
|
||||||
|
|
||||||
```c++
|
|
||||||
SetTerm(IR::Term::Interpret{next})
|
|
||||||
```
|
|
||||||
|
|
||||||
This terminal instruction calls the interpreter, starting at `next`.
|
|
||||||
The interpreter must interpret exactly one instruction.
|
|
||||||
|
|
||||||
### Terminal: ReturnToDispatch
|
### Terminal: ReturnToDispatch
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
|
|
|
||||||
|
|
@ -117,11 +117,6 @@ public:
|
||||||
MemoryWrite32(vaddr + 4, u32(value >> 32));
|
MemoryWrite32(vaddr + 4, u32(value >> 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterFallback(u32 pc, size_t num_instructions) override {
|
|
||||||
// This is never called in practice.
|
|
||||||
std::terminate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CallSVC(u32 swi) override {
|
void CallSVC(u32 swi) override {
|
||||||
// Do something.
|
// Do something.
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,9 @@ AI is notorious for hallucinating facts out of thin air and sometimes outright l
|
||||||
- Code that works, but is extraordinarily verbose or not nearly as efficient as it can be
|
- Code that works, but is extraordinarily verbose or not nearly as efficient as it can be
|
||||||
- Code that works well and is written well, but solves a different problem than was intended, or solves the same problem but in a completely incorrect way that will break other things horribly.
|
- Code that works well and is written well, but solves a different problem than was intended, or solves the same problem but in a completely incorrect way that will break other things horribly.
|
||||||
|
|
||||||
Human-written code will, without exception, always be of infinitely higher quality when properly researched and implemented by someone both familiar with the surrounding code and the programming language in use. LLMs may produce a "good enough" result, but this result is often subpar. Keep in mind: all code is held under a standard of excellence. If your code sucks, it will be rejected. AI-generated code just so happens to be a particularly sucky genre of code, and will thus be held to this same standard.
|
Human-written code will, without exception, always be of infinitely higher quality when properly researched and implemented by someone familiar with *both* the surrounding code and the programming language in use. LLMs may produce a "good enough" result, but this result is often subpar.
|
||||||
|
|
||||||
|
**All code is held under a STRICT STANDARD OF EXCELLENCE**. AI code is no different, and since it often produces subpar or outright terrible code, it will often fail to meet this excellence standard.
|
||||||
|
|
||||||
On a lesser-known note, LLM outputs often contain unicode symbols such as emojis or the arrow symbol. Please don't put Unicode symbols in your code. It messes with many an IDE, and the three people viewing your code on Lynx will be very unhappy.
|
On a lesser-known note, LLM outputs often contain unicode symbols such as emojis or the arrow symbol. Please don't put Unicode symbols in your code. It messes with many an IDE, and the three people viewing your code on Lynx will be very unhappy.
|
||||||
|
|
||||||
|
|
@ -25,7 +27,8 @@ On a lesser-known note, LLM outputs often contain unicode symbols such as emojis
|
||||||
|
|
||||||
## Acceptable Use
|
## Acceptable Use
|
||||||
|
|
||||||
- As stated previously, AI is good in a few *very specific* cases. In these cases, it's usually fine to use AI, as long as you **explicitly provide notice that it was used**.
|
As stated previously, AI is good in a few *very specific* cases. In these cases, it's usually fine to use AI, as long as you **explicitly provide notice that it was used**.
|
||||||
|
|
||||||
- Anything directly outside of the realm of the code written in your PR or patch is none of our business.
|
- Anything directly outside of the realm of the code written in your PR or patch is none of our business.
|
||||||
- This primarily covers research.
|
- This primarily covers research.
|
||||||
- However, we *still* strongly discourage this for the reasons mentioned above.
|
- However, we *still* strongly discourage this for the reasons mentioned above.
|
||||||
|
|
@ -104,4 +107,6 @@ This consolidates profile removal behavior, fixes potential race conditions in t
|
||||||
|
|
||||||
This has all of the same problems as the other one. Needlessly verbose, doesn't address *what* it actually fixes ("consolidates profile removal behavior"... okay, why? What does it fix?), etc. It even has the bonus of totally hallucinating the addition of a method!
|
This has all of the same problems as the other one. Needlessly verbose, doesn't address *what* it actually fixes ("consolidates profile removal behavior"... okay, why? What does it fix?), etc. It even has the bonus of totally hallucinating the addition of a method!
|
||||||
|
|
||||||
|
On a more "philosophical" note, LLMs tend to be geared towards *corporate language*, as that's what they're trained on. This is why AI-generated commit messages feel like "word salad", and typically pad out the commit message to make it *look* like a lot of things were changed (trust me, it's like that in the corporate world). They typically also drift towards unneeded buzzwords and useless implementation details.
|
||||||
|
|
||||||
**Don't use AI for commit messages**.
|
**Don't use AI for commit messages**.
|
||||||
|
|
|
||||||
|
|
@ -1,100 +0,0 @@
|
||||||
# Importing Games into Steam with Steam Rom Manager
|
|
||||||
|
|
||||||
Use this when you want to import your games inside Eden into Steam to launch with artwork from Steam Game Mode without needing to launch Eden first.
|
|
||||||
|
|
||||||
**Click [Here](https://evilperson1337.notion.site/Importing-Games-into-Steam-with-Steam-Rom-Manager-2b757c2edaf680d7a491c92b138f1fcc) for a version of this guide with images & visual elements.**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Pre-Requisites
|
|
||||||
|
|
||||||
- Steam Deck Set up and Configured
|
|
||||||
- Eden set up and Configured
|
|
||||||
- Internet Access
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Steps
|
|
||||||
|
|
||||||
1. Press the **STEAM** button and then go to *Power → Switch to Desktop* to enter the Desktop mode.
|
|
||||||
|
|
||||||
1. Install ***Steam ROM Manager***, there are 2 ways you can accomplish this, either manually or through [*EmuDeck*](https://www.emudeck.com/#downloads).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Manual Installation
|
|
||||||
|
|
||||||
1. Open the *Discover Store* and search for *Steam ROM Manager.*
|
|
||||||
2. Select the **Install** button to install the program.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Installing Through *EmuDeck*
|
|
||||||
|
|
||||||
<aside>
|
|
||||||
|
|
||||||
***NOTE***: This assumes you have already set up EmuDeck, if not - just run through the guided installation and select *Steam ROM Manager* as one of the options.
|
|
||||||
|
|
||||||
</aside>
|
|
||||||
|
|
||||||
1. Open **EmuDeck**, then navigate to *Manage Emulators.*
|
|
||||||
2. Scroll down to the bottom of the page to the *Manage your Tools & Frontends* section. Click **Steam ROM Manager**.
|
|
||||||
|
|
||||||
3. Click the **Install** button on the right hand side to install it.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
2. Open the Start Menu and Launch ***Steam ROM Manager***
|
|
||||||
|
|
||||||
1. The program will now launch and show you a window with parsers.
|
|
||||||
|
|
||||||
<aside>
|
|
||||||
|
|
||||||
***TIP***: Your layout may look different depending on how you installed *Steam ROM Manager*. You may need to go to **Settings → Theme** and change it to *Classic* to follow along.
|
|
||||||
|
|
||||||
</aside>
|
|
||||||
|
|
||||||
2. Switch off all Parsers by hitting the *Toggle Parsers* switch.
|
|
||||||
3. Scroll down the list on the left-hand side and look for a parser called *Nintendo Switch - Eden* and switch it on. This parser may not exist depending on how you installed *Steam ROM Manager* (EmuDeck creates it for you). Follow these steps to create it if it is missing.
|
|
||||||
|
|
||||||
---
|
|
||||||
### Creating the Eden Parser
|
|
||||||
|
|
||||||
1. Select Create Parser and in the *Community Presets* option look for **Nintendo Switch - Yuzu**.
|
|
||||||
2. Change the **Parser title** from *Nintendo Switch - Yuzu* to *Nintendo Switch - Eden.*
|
|
||||||
3. Hit the **Browse** option under the *ROMs directory* section. Select the directory containing your Switch ROMs.
|
|
||||||
4. Under *Steam collections*, you can add a Steam category name. This just organizes the games under a common category in your Steam Library, this is optional but recommended.
|
|
||||||
5. Scroll down slightly to the **Executable Configuration → Executable**, select **Browse** and select the Eden AppImage.
|
|
||||||
6. Leave everything else the same and hit **Save** to save the parser.
|
|
||||||
---
|
|
||||||
|
|
||||||
4. Click the Eden parser to view the options on the right, select **Test** at the bottom of the screen to ensure that *Steam ROM Manager* detects your games correctly.
|
|
||||||
1. *Steam ROM Manager* will start to scan the specified ROMs directory and match them to games. Look over the results to ensure they are accurate. If you do not see any entries - check your parsers ROMs directory field.
|
|
||||||
1. When you are happy with the results, click the **Add Games** → **Parse** to start the actual Parsing.
|
|
||||||
1. The program will now identify the games and pull artwork from [*SteamGridDB*](https://www.steamgriddb.com/).
|
|
||||||
2. Review the game matches and ensure everything is there.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Correcting a Mismatch
|
|
||||||
|
|
||||||
If the game is not identified correctly, you may need to tell *Steam ROM Manager* what the game is manually.
|
|
||||||
|
|
||||||
1. Hover over the game card and click the magnifying glass icon.
|
|
||||||
2. Search for the game on the *Search SteamGridDB* section and scroll through the results, selecting the one you want.
|
|
||||||
3. Ensure the *Name* and *Game ID* update in the **Per-App Exceptions** and press **Save and close**. The game should now update.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Excluding Matches
|
|
||||||
|
|
||||||
You may want to tell Steam ROM Manager to ignore some files (updates/DLC/etc.) that it finds in the directory. This is how you do so.
|
|
||||||
|
|
||||||
1. Hit the **Exclude Games** button in the bottom right.
|
|
||||||
2. Deselect the game you want to exclude, the poster artwork should go dim and the **Number Excluded** number should increment up. Repeat with any other exclusions you want to add.
|
|
||||||
3. Hit **Save Excludes** when you are happy with your selections.
|
|
||||||
---
|
|
||||||
3. When you are happy with the results, select **Save to Steam** to save the results.
|
|
||||||
1. The program will now start writing the entries into the Steam Library. You should get pop up notifications of the progress, but you can monitor the progress by selecting the **Log** on the left-hand side if needed.
|
|
||||||
2. Restart Steam to have the changes take effect. Check your library to ensure that your games are there, in a category if you defined one in the parser.
|
|
||||||
3. Try to launch a game and ensure everything is working. You are now good to go.
|
|
||||||
|
|
@ -12,12 +12,13 @@ The setting ranges from 0 to 65535 (0x0000 to 0xFFFF), where each bit represents
|
||||||
* [Accessing Debug Knobs (dev side)](#accessing-debug-knobs-dev-side)
|
* [Accessing Debug Knobs (dev side)](#accessing-debug-knobs-dev-side)
|
||||||
* [Setting Debug Knobs (user side)](#setting-debug-knobs-user-side)
|
* [Setting Debug Knobs (user side)](#setting-debug-knobs-user-side)
|
||||||
* [Bit Manipulation Examples](#bit-manipulation-examples)
|
* [Bit Manipulation Examples](#bit-manipulation-examples)
|
||||||
3. [Examples](#examples)
|
3. [Terminology and user communication](#terminology-and-user-communication)
|
||||||
|
4. [Examples](#examples)
|
||||||
|
|
||||||
* [Example 1: Conditional Debug Logging](#example-1-conditional-debug-logging)
|
* [Example 1: Conditional Debug Logging](#example-1-conditional-debug-logging)
|
||||||
* [Example 2: Performance Tuning](#example-2-performance-tuning)
|
* [Example 2: Performance Tuning](#example-2-performance-tuning)
|
||||||
* [Example 3: Feature Gating](#example-3-feature-gating)
|
* [Example 3: Feature Gating](#example-3-feature-gating)
|
||||||
4. [Best Practices](#best-practices)
|
5. [Best Practices](#best-practices)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -77,6 +78,44 @@ To enable specific features, calculate the decimal value by setting the appropri
|
||||||
* **Enable bits 0 and 1**: Value = 3 (2^0 + 2^1)
|
* **Enable bits 0 and 1**: Value = 3 (2^0 + 2^1)
|
||||||
* **Enable bit 15**: Value = 32768 (2^15)
|
* **Enable bit 15**: Value = 32768 (2^15)
|
||||||
|
|
||||||
|
## Terminology and user communication
|
||||||
|
|
||||||
|
There are two main confusions when talking about knobs:
|
||||||
|
|
||||||
|
### Whether it's zero-based or one-based
|
||||||
|
|
||||||
|
Sometimes when an user reports: knobs 1 and 2 gets better performance, dev may get confuse whether he means the knobs 1 and 2 literally, or the 1st and 2nd knobs (knobs 0 and 1).
|
||||||
|
|
||||||
|
Debug knobs are **zero-based**, which means:
|
||||||
|
* The first knob is the knob(0) (or knob0 henceforth), and the last one is the 15 (knob15, likewise)
|
||||||
|
* You can talk: "knob0 is enabled/disabled", "In this video i was using only knobs 0 and 2", etc.
|
||||||
|
|
||||||
|
### Whether one is talking about the knob itself or about the entire parameter value (which represents all knobs)
|
||||||
|
|
||||||
|
Sometimes when an user reports: knob 3 results, it's unclear whether he's referring to knob setting with value 3 (which means both knob 0 and 1 are enabled), or to knob(3) specifically.
|
||||||
|
Whenever you're instructing tests or reporting results, be precise about whether one you're talking to avoid confusion:
|
||||||
|
|
||||||
|
### Setting based terminology
|
||||||
|
|
||||||
|
ALWAYS use the word in PLURAL (knobs), without mentioning which one, to refer to the setting, aka multiple knobs at once:
|
||||||
|
Examples:
|
||||||
|
- **knobs=0**: no knobs enabled
|
||||||
|
- **knobs=1**: knob0 enabled, others disabled
|
||||||
|
- **knobs=2**: knob1 enabled, others disabled
|
||||||
|
- **knobs=3**: knobs 0 and 1 enabled, others disabled
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
### Knob based terminology
|
||||||
|
|
||||||
|
Use the word in SINGULAR (knob), or in plural but referring which ones, when meaning multiple knobs at once:
|
||||||
|
Examples:
|
||||||
|
- **knob0**: knob 0 enabled, others disabled
|
||||||
|
- **knob1**: knob 1 enabled, others disabled
|
||||||
|
- **knobs 0 and 1**: knobs 0 and 1 enabled, others disabled
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
### Example 1: Conditional Debug Logging
|
### Example 1: Conditional Debug Logging
|
||||||
|
|
|
||||||
11
docs/user/CFW.md
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# User Handbook - Custom Firmware (CFW)
|
||||||
|
|
||||||
|
At the moment of writing, we do not support CFW such as Atmosphere, due to:
|
||||||
|
|
||||||
|
- Lacking the required LLE emulation capabilities to properly emulate the full firmware.
|
||||||
|
- Lack of implementation on some of the key internals.
|
||||||
|
- Nobody has bothered to do it (PRs always welcome!)
|
||||||
|
|
||||||
|
We do however, maintain HLE compatibility with the former mentioned CFW, applications that require Atmosphere to run will run fine in the emulator without any adjustments.
|
||||||
|
|
||||||
|
If they don't run - then that's a bug!
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
# User Handbook - Graphics
|
# User Handbook - Graphics
|
||||||
|
|
||||||
|
Graphical enhancements and visual quality improvments. This doesn't cover texture mods.
|
||||||
|
|
||||||
## Visual Enhancements
|
## Visual Enhancements
|
||||||
|
|
||||||
### Anti-aliasing
|
### Anti-aliasing
|
||||||
|
|
@ -89,7 +91,7 @@ The OpenGL backend would invoke behaviour that would result in swarst/LLVMpipe w
|
||||||
|
|
||||||
### HaikuOS compatibility
|
### HaikuOS compatibility
|
||||||
|
|
||||||
HaikuOS bundles a Mesa library that doesn't support full core OpenGL 4.6 (required by the emulator). This leads to HaikuOS being one of the few computer platforms where Vulkan is the only available option for users. If OpenGL is desired, Mesa has to be built manually from source. For debugging purpouses `lavapipe` is recommended over the GPU driver; there is in-kernel support for NVIDIA cards through.
|
HaikuOS bundles a Mesa library that doesn't support full core OpenGL 4.6 (required by the emulator). This leads to HaikuOS being one of the few computer platforms where Vulkan is the only available option for users. If OpenGL is desired, Mesa has to be built manually from source. For debugging purposes `lavapipe` is recommended over the GPU driver; there is in-kernel support for NVIDIA cards through.
|
||||||
|
|
||||||
### Fixes for Windows 10 and above having "Device loss"
|
### Fixes for Windows 10 and above having "Device loss"
|
||||||
|
|
||||||
|
|
|
||||||
206
docs/user/Mods.md
Normal file
|
|
@ -0,0 +1,206 @@
|
||||||
|
# User Handbook - Installing Mods
|
||||||
|
|
||||||
|
## General Notes
|
||||||
|
|
||||||
|
**Note:** When installing a mod, always read the mod's installation instructions.
|
||||||
|
|
||||||
|
This is especially important if a mod uses a framework such as **ARCropolis**, **Skyline**, or **Atmosphere plugins**. In those cases, follow the framework's instructions instead of using Eden's normal mod folder.
|
||||||
|
|
||||||
|
For example, **Super Smash Bros. Ultimate** uses such a framework. See the related section below for details.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Installing Mods for Most Games
|
||||||
|
|
||||||
|
1. Right click a game in the game list.
|
||||||
|
2. Click **"Open Mod Data Location"**.
|
||||||
|
3. Extract the mod into that folder.
|
||||||
|
|
||||||
|
Each mod should be placed inside **its own subfolder**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Enabling or Disabling Mods
|
||||||
|
|
||||||
|
1. Right click the game in the game list.
|
||||||
|
2. Click **Configure Game**.
|
||||||
|
3. In the **Add-Ons** tab, enable or disable mods, updates, and DLC by ticking or unticking their boxes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Important Note About SD Card Paths
|
||||||
|
|
||||||
|
Some mods are designed for real Nintendo Switch consoles and refer to the **SD card root**.
|
||||||
|
|
||||||
|
The emulated SD card is located at:
|
||||||
|
|
||||||
|
```
|
||||||
|
%AppData%\eden\sdmc
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
Switch instruction: sd:/ultimate/mods
|
||||||
|
Eden equivalent: sdmc/ultimate/mods
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Framework-Based Mods (Super Smash Bros. Ultimate)
|
||||||
|
|
||||||
|
Some games require external mod frameworks instead of the built-in mod loader.
|
||||||
|
|
||||||
|
The most common example is **Super Smash Bros. Ultimate**.
|
||||||
|
|
||||||
|
These mods are installed directly to the **emulated SD card**, not the normal Eden mod folder.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Installing the ARCropolis Modding Framework
|
||||||
|
|
||||||
|
**Note:** Some mod packs bundle ARCropolis with their installer (for example, Smash Ult-S).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Download ARCropolis
|
||||||
|
|
||||||
|
Download the latest release:
|
||||||
|
|
||||||
|
https://github.com/Raytwo/ARCropolis/releases/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Install ARCropolis
|
||||||
|
|
||||||
|
Extract the **`atmosphere`** folder into:
|
||||||
|
|
||||||
|
```
|
||||||
|
%AppData%\eden\sdmc
|
||||||
|
```
|
||||||
|
|
||||||
|
This is the **emulated SD card directory**.
|
||||||
|
|
||||||
|
Verify installation by checking that the following file exists:
|
||||||
|
|
||||||
|
```
|
||||||
|
sdmc\atmosphere\contents\01006A800016E000\romfs\skyline\plugins\libarcropolis.nro
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Download Skyline
|
||||||
|
|
||||||
|
Download the latest Skyline release:
|
||||||
|
|
||||||
|
https://github.com/skyline-dev/skyline/releases
|
||||||
|
|
||||||
|
Skyline used to be bundled with ARCropolis but is now distributed separately to avoid compatibility issues caused by outdated bundled versions.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Install Skyline
|
||||||
|
|
||||||
|
Extract the **`exefs`** folder into:
|
||||||
|
|
||||||
|
```
|
||||||
|
sdmc\atmosphere\contents\01006A800016E000
|
||||||
|
```
|
||||||
|
|
||||||
|
The `exefs` folder should be **next to the `romfs` folder**.
|
||||||
|
|
||||||
|
Verify installation by checking that the following file exists:
|
||||||
|
|
||||||
|
```
|
||||||
|
%AppData%\eden\sdmc\atmosphere\contents\01006A800016E000\exefs\subsdk9
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Launch the Game Once
|
||||||
|
|
||||||
|
Start the game and make sure you see the **ARCropolis version text on the title screen**.
|
||||||
|
|
||||||
|
This will also create the folders required for installing mods.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Install Smash Ultimate Mods
|
||||||
|
|
||||||
|
Install mods inside:
|
||||||
|
|
||||||
|
```
|
||||||
|
sdmc\ultimate\mods
|
||||||
|
```
|
||||||
|
|
||||||
|
Each mod must be placed inside **its own subfolder**.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
sdmc\ultimate\mods\ExampleMod
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
## ARCropolis text does not appear on startup
|
||||||
|
|
||||||
|
Check the following:
|
||||||
|
|
||||||
|
- `libarcropolis.nro` exists in:
|
||||||
|
|
||||||
|
```
|
||||||
|
sdmc\atmosphere\contents\01006A800016E000\romfs\skyline\plugins
|
||||||
|
```
|
||||||
|
|
||||||
|
- `subsdk9` exists in:
|
||||||
|
|
||||||
|
```
|
||||||
|
sdmc\atmosphere\contents\01006A800016E000\exefs
|
||||||
|
```
|
||||||
|
|
||||||
|
- Files were extracted to:
|
||||||
|
|
||||||
|
```
|
||||||
|
%AppData%\eden\sdmc
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mods are not loading
|
||||||
|
|
||||||
|
Make sure mods are installed inside:
|
||||||
|
|
||||||
|
```
|
||||||
|
sdmc\ultimate\mods
|
||||||
|
```
|
||||||
|
|
||||||
|
Each mod must have its **own subfolder**.
|
||||||
|
|
||||||
|
Correct example:
|
||||||
|
|
||||||
|
```
|
||||||
|
sdmc\ultimate\mods\ExampleMod
|
||||||
|
```
|
||||||
|
|
||||||
|
Incorrect example:
|
||||||
|
|
||||||
|
```
|
||||||
|
sdmc\ultimate\mods\ExampleMod\ExampleMod
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installing mods in the wrong folder
|
||||||
|
|
||||||
|
ARCropolis mods **do not go in Eden's normal mod folder**.
|
||||||
|
|
||||||
|
Do **not** install Smash mods here:
|
||||||
|
|
||||||
|
```
|
||||||
|
user\load\01006A800016E000
|
||||||
|
```
|
||||||
|
|
||||||
|
That folder is only used for traditional **RomFS mods**, not ARCropolis.
|
||||||
|
|
@ -6,7 +6,4 @@ Debugging on physical hardware can get tedious and time consuming. Users are emp
|
||||||
|
|
||||||
**Standard key prefix**: Allows to redirect the key manager to a file other than `prod.keys` (for example `other` would redirect to `other.keys`). This is useful for testing multiple keysets. Default is `prod`.
|
**Standard key prefix**: Allows to redirect the key manager to a file other than `prod.keys` (for example `other` would redirect to `other.keys`). This is useful for testing multiple keysets. Default is `prod`.
|
||||||
|
|
||||||
**Changing serial**: Very basic way to set debug values for the serial (and battery number). Developers do not need to write the full serial as it will be writen in-place (that is, it will be filled with the default serial and then overwrite the serial from the beginning).
|
**Changing serial**: Very basic way to set debug values for the serial (and battery number). Developers do not need to write the full serial as only the first digits (excluding the last) will be accoutned for. Region settings will affect the generated serial. The serial corresponds to a non-OLED/Lite console.
|
||||||
- Battery serial: `YUZU0EMULATOR14022024`
|
|
||||||
- Board serial: `YUZ10000000001`
|
|
||||||
If the user were to set their board serial as `ABC`, then it will be written in-place and the resulting serial would be `ABC10000000001`. There are no underlying checks to ensure correctness of serials other than a hard limit of 16-characters for both.
|
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,14 @@ The "FAQ".
|
||||||
|
|
||||||
This handbook is primarily aimed at the end-user - baking useful knowledge for enhancing their emulation experience.
|
This handbook is primarily aimed at the end-user - baking useful knowledge for enhancing their emulation experience.
|
||||||
|
|
||||||
|
A copy of this handbook is [available online](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/README.md).
|
||||||
|
|
||||||
## Basics
|
## Basics
|
||||||
|
|
||||||
- **[The Basics](Basics.md)**
|
- **[The Basics](Basics.md)**
|
||||||
- **[Quickstart](./QuickStart.md)**
|
- **[Quickstart](./QuickStart.md)**
|
||||||
|
- **[Settings](./Settings.md)**
|
||||||
|
- **[Installing Mods](./Mods.md)**
|
||||||
- **[Run On macOS](./RunOnMacOS.md)**
|
- **[Run On macOS](./RunOnMacOS.md)**
|
||||||
- **[Audio](Audio.md)**
|
- **[Audio](Audio.md)**
|
||||||
- **[Graphics](Graphics.md)**
|
- **[Graphics](Graphics.md)**
|
||||||
|
|
@ -17,22 +21,29 @@ This handbook is primarily aimed at the end-user - baking useful knowledge for e
|
||||||
- **[Using Amiibo](./UsingAmiibo.md)**
|
- **[Using Amiibo](./UsingAmiibo.md)**
|
||||||
- **[Using Cheats](./UsingCheats.md)**
|
- **[Using Cheats](./UsingCheats.md)**
|
||||||
- **[Importing Saves](./ImportingSaves.md)**
|
- **[Importing Saves](./ImportingSaves.md)**
|
||||||
- **[Add Eden to Steam ROM Manager](./AddEdenToSRM.md)**
|
|
||||||
- **[Add Games to Steam ROM Manager](./AddGamesToSRM.md)**
|
|
||||||
- **[Installing Atmosphere Mods](./InstallingAtmosphereMods.md)**
|
- **[Installing Atmosphere Mods](./InstallingAtmosphereMods.md)**
|
||||||
- **[Installing Updates & DLCs](./InstallingUpdatesDLC.md)**
|
- **[Installing Updates & DLCs](./InstallingUpdatesDLC.md)**
|
||||||
- **[Controller Profiles](./ControllerProfiles.md)**
|
- **[Controller Profiles](./ControllerProfiles.md)**
|
||||||
- **[Alter Date & Time](./AlterDateTime.md)**
|
- **[Alter Date & Time](./AlterDateTime.md)**
|
||||||
|
|
||||||
|
## 3rd-party Integration
|
||||||
|
|
||||||
|
- **[Configuring Steam ROM Manager](./SteamROM.md)**
|
||||||
|
- **[Server hosting](ServerHosting.md)**
|
||||||
|
- **[Syncthing Guide](./SyncthingGuide.md)**
|
||||||
|
- **[Third Party](./ThirdParty.md)**
|
||||||
|
- **[Obtainium](./ThirdParty.md#configuring-obtainium)**
|
||||||
|
- **[ES-DE](./ThirdParty.md#configuring-es-de)**
|
||||||
|
- **[Mirrors](./ThirdParty.md#mirrors)**
|
||||||
|
|
||||||
## Advanced
|
## Advanced
|
||||||
|
|
||||||
|
- **[Custom Firmware](./CFW.md)**
|
||||||
- **[How To Access Logs](./HowToAccessLogs.md)**
|
- **[How To Access Logs](./HowToAccessLogs.md)**
|
||||||
- **[Gyro Controls](./GyroControls.md)**
|
- **[Gyro Controls](./GyroControls.md)**
|
||||||
- **[Platforms and Architectures](Architectures.md)**
|
- **[Platforms and Architectures](Architectures.md)**
|
||||||
- **[Server hosting](ServerHosting.md)**
|
|
||||||
- **[Command Line](CommandLine.md)**
|
- **[Command Line](CommandLine.md)**
|
||||||
- **[Native Application Development](Native.md)**
|
- **[Native Application Development](Native.md)**
|
||||||
- **[Adding Boolean Settings Toggles](AddingBooleanToggles.md)**
|
- **[Adding Boolean Settings Toggles](AddingBooleanToggles.md)**
|
||||||
- **[Adding Debug Knobs](./AddingDebugKnobs.md)**
|
- **[Adding Debug Knobs](./AddingDebugKnobs.md)**
|
||||||
- **[Syncthing Guide](./SyncthingGuide.md)**
|
|
||||||
- **[Testing](Testing.md)**
|
- **[Testing](Testing.md)**
|
||||||
|
|
|
||||||
54
docs/user/Settings.md
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
# User Handbook - Settings
|
||||||
|
|
||||||
|
As the emulator continues to grow, so does the number of settings that come and go.
|
||||||
|
|
||||||
|
Most of the development adds new settings that enhance performance/compatibility, only to be removed later in newer versions due to newfound discoveries or because they were "a hacky workaround".
|
||||||
|
|
||||||
|
As such, this guide will NOT mention those kind of settings, we'd rather mention settings which have a long shelf time (i.e won't get removed in future releases) and are likely to be unchanged.
|
||||||
|
|
||||||
|
Some of the options are self explainatory, and they do exactly what they say they do (i.e "Pause when not in focus"); such options will be also skipped due to triviality.
|
||||||
|
|
||||||
|
## Foreword
|
||||||
|
|
||||||
|
Before touching the settings, please see the game boots with stock options. We try our best to ensure users can boot any game using the default settings. If they don't work, then you may try fiddling with options - but please, first use stock options.
|
||||||
|
|
||||||
|
## General
|
||||||
|
|
||||||
|
- `General/Force X11 as Graphics Backend`: Wayland on *NIX has prominent issues that are unlikely to be resolved; the kind that are "not our fault, it's Wayland issue", this "temporary" hack forces X11 as the backend, regardless of the desktop manager's default.
|
||||||
|
- `General/Enable Gamemode`: This only does anything when you have Feral Interactive's Gamemode library installed somewhere, if you do, this will help boost FPS by telling the OS to explicitly prioritize *this* application for "gaming" - only for *NIX systems.
|
||||||
|
- `Hotkeys`: Deceptively to remove a hotkey you must right click and a menu will appear to remove that specific hotkey.
|
||||||
|
- `UI/Language`: Changes language *of the interface* NOT the emulated program!
|
||||||
|
- `Debug/Enable Auto Stub`: May help to "fix" some games by just lying and saying that everything they do returns "success" instead of outright crashing for any function/service that is NOT implemented.
|
||||||
|
- `Debug/Show log in console`: Does as said, note that the program may need to be reopened (Windows) for changes to take effect.
|
||||||
|
- `Debug/Flush log output`: Classically, every write to the log is "buffered", that is, changes aren't written to the disk UNTIL the program has decided it is time to write, until then it keeps data in a buffer which resides on RAM. If the program crashes, the OS will automatically discard said buffer (any RAM associated with a dead process is automatically discarded/reused for some other purpose); this means critical data may not be logged to the disk on time, which may lead to missing log lines. Use this if you're wanting to remove that factor when debugging, sometimes a hard crash may "eat" some of the log lines IF this option isn't enabled.
|
||||||
|
- `Debug/Disable Macro HLE:` The emulator has HLE emulation of macro programs for Maxwell, this means that some details are purpousefully skipped; this option forces all macro programs to be ran without skipping anything.
|
||||||
|
|
||||||
|
## System
|
||||||
|
|
||||||
|
- `System/RNG Seed`: Set to 0 (and uncheck) to disable ASLR systemwide (this makes mods like CTGP to stop working); by default it enables ASLR to replicate console behaviour.
|
||||||
|
- `Network/Enable Airplane Mode`: Enable this if a game is crashing before loading AND the logs mention anything related to "web" or "internet" services.
|
||||||
|
|
||||||
|
## CPU
|
||||||
|
|
||||||
|
- `CPU/Virtual table bouncing`: Some games have the tendency to crash on loading due to an indirect bad jump (Pokemon ZA being the worst offender); this option lies to the game and tells it to just pretend it never executed a given function. This is fine for most casual users, but developers of switch applications **must** disable this. This temporary "hack" should hopefully be gone in 6-7 months from now on.
|
||||||
|
- `Fastmem`, aka. `CPU/Enable Host MMU`: Enables "fastmem"; a detailed description of fastmem can be found [here](../dynarmic/Design.md#fast-memory-fastmem).
|
||||||
|
- `CPU/Unsafe FMA`: Enables deliberate innacurate FMA behaviour which may affect how FMA returns any given operation - this may introduce tiny floating point errors which can cascade in sensitive code (i.e FFmpeg).
|
||||||
|
- `CPU/Faster FRSQRTE and FRECPE`: Introduces accuracy errors on square root and reciprocals in exchange for less checks - this introduces inaccuracies with some cases but it's mostly safe.
|
||||||
|
- `CPU/Faster ASIMD Instructions`: Skips rounding mode checks for ARM ASIMD instructions - this means some code dpeending on these rounding modes may misbehave.
|
||||||
|
- `CPU/Disable address space checks`: Before each memory access, the emulator checks the address is in range, if not it faults; this option makes it so the emulator skips the check entirely (which may be expensive for a myriad of reasons). However at the same time this allows the guest program to "break out" of the emulation context by writing to arbitrary addresses.
|
||||||
|
- `CPU/Ignore global monitor`: This relies on a quirk present on x86 to avoid the ARM global monitor emulation, this may increase performance in mutex-heavy contexts (i.e games waiting for next frames or such); but also can cause deadlocks and fun to debug issues.
|
||||||
|
|
||||||
|
It is important to note the majority of precision-reducing instructions do not benefit cases where they are not used, which means the performance gains will vary per game.
|
||||||
|
|
||||||
|
# Graphics
|
||||||
|
|
||||||
|
See also [an extended breakdown of some options](./Graphics.md).
|
||||||
|
|
||||||
|
- `Extras/Extended Dynamic State` and `Extras/Vertex Input Dynamic State`: These Vulkan extensions essentially allow you to reuse the same pipeline but just change the state between calls (so called "dynamic state"); the "extended" levels signifies how much state can be placed on this "dynamic" range, for example the amount of depth culling to use can be placed on the dynamic state, avoiding costly reloads and flushes. While this by itself is a fine option, SOME vendors (notably PowerVR and Mali) have problems with anything related to EDS3. EDS3 contains EDS2, and EDS2 contains EDS1. Essentially this means more extended data the driver has to keep track of, at the benefit of avoiding costly flushes.
|
||||||
|
- `Advanced/Use persistent cache`: This saves compiled shaders onto the disk, independent of any driver's own disk saved shaders (yes, some drivers, notably NVIDIA, save a secondary shader cache onto disk) - disable this only if you're debugging or working on the GPU backend. This option is meant to massively help to reduce shader stutters (after playing for one session that compiles them).
|
||||||
|
- `Advanced/Use Vulkan pipeline cache`: This is NOT the same as `Use persistent cache`; it's a separate flag that tells the Vulkan backend to create pipeline caches, which are a detail that can be used to massively improve performance and remove pipeline creation overhead. This is a Vulkan feature.
|
||||||
|
|
||||||
|
## Controls
|
||||||
|
|
||||||
|
Most of the controls should work out of the box. If not, please use a joystick calibrator to ensure it's not an issue with your own controller, for example:
|
||||||
|
- https://github.com/dkosmari/calibrate-joystick
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
# Importing Eden into Steam with Steam Rom Manager
|
# User Handbook - Configuring Steam ROM Manager
|
||||||
|
|
||||||
|
## Importing Eden into Steam with Steam Rom Manager
|
||||||
|
|
||||||
Use this when you want to import the Eden AppImage into your Steam Library along with artwork using *Steam ROM Manager.*
|
Use this when you want to import the Eden AppImage into your Steam Library along with artwork using *Steam ROM Manager.*
|
||||||
|
|
||||||
|
|
@ -6,7 +8,7 @@ Use this when you want to import the Eden AppImage into your Steam Library along
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Pre-Requisites
|
#### Pre-Requisites
|
||||||
|
|
||||||
- Eden set up and configured
|
- Eden set up and configured
|
||||||
- Internet Connection
|
- Internet Connection
|
||||||
|
|
@ -14,9 +16,9 @@ Use this when you want to import the Eden AppImage into your Steam Library along
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Steps
|
### Steps
|
||||||
|
|
||||||
### Initial Setup
|
#### Initial Setup
|
||||||
|
|
||||||
1. Press the **STEAM** button and then go to *Power → Switch to Desktop* to enter the Desktop mode.
|
1. Press the **STEAM** button and then go to *Power → Switch to Desktop* to enter the Desktop mode.
|
||||||
|
|
||||||
|
|
@ -24,14 +26,14 @@ Use this when you want to import the Eden AppImage into your Steam Library along
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Manual Installation
|
#### Manual Installation
|
||||||
|
|
||||||
1. Open the *Discover Store* and search for *Steam ROM Manager.*
|
1. Open the *Discover Store* and search for *Steam ROM Manager.*
|
||||||
2. Select the **Install** button to install the program.
|
2. Select the **Install** button to install the program.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Installing Through *EmuDeck*
|
#### Installing Through *EmuDeck*
|
||||||
|
|
||||||
<aside>
|
<aside>
|
||||||
|
|
||||||
|
|
@ -45,9 +47,9 @@ Use this when you want to import the Eden AppImage into your Steam Library along
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Adding Eden into *Steam ROM Manager*
|
#### Adding Eden into *Steam ROM Manager*
|
||||||
|
|
||||||
### EmuDeck Users
|
#### EmuDeck Users
|
||||||
|
|
||||||
EmuDeck will automatically create an *Emulators - Emulators* parser for ***Steam ROM Manager*** that uses shell scripts to launch them. We will follow this convention.
|
EmuDeck will automatically create an *Emulators - Emulators* parser for ***Steam ROM Manager*** that uses shell scripts to launch them. We will follow this convention.
|
||||||
|
|
||||||
|
|
@ -87,7 +89,7 @@ EmuDeck will automatically create an *Emulators - Emulators* parser for ***Steam
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Non-EmuDeck Users
|
#### Non-EmuDeck Users
|
||||||
|
|
||||||
We will need to create a new parser for the Emulators. Unlike with the EmuDeck model, we will have the parser look for AppImages.
|
We will need to create a new parser for the Emulators. Unlike with the EmuDeck model, we will have the parser look for AppImages.
|
||||||
|
|
||||||
|
|
@ -126,7 +128,7 @@ We will need to create a new parser for the Emulators. Unlike with the EmuDeck
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Adding Eden to Steam
|
#### Adding Eden to Steam
|
||||||
|
|
||||||
Now that we have the parser or shell script created, we can actually add it to Steam.
|
Now that we have the parser or shell script created, we can actually add it to Steam.
|
||||||
|
|
||||||
|
|
@ -137,7 +139,7 @@ Now that we have the parser or shell script created, we can actually add it to S
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Correcting a Mismatch
|
#### Correcting a Mismatch
|
||||||
|
|
||||||
If the emulator is not identified correctly, you may need to tell *Steam ROM Manager* what the game is manually.
|
If the emulator is not identified correctly, you may need to tell *Steam ROM Manager* what the game is manually.
|
||||||
|
|
||||||
|
|
@ -147,7 +149,7 @@ Now that we have the parser or shell script created, we can actually add it to S
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Excluding Matches
|
#### Excluding Matches
|
||||||
|
|
||||||
You may want to tell Steam ROM Manager to ignore some files that it finds in the directory. This is how you do so.
|
You may want to tell Steam ROM Manager to ignore some files that it finds in the directory. This is how you do so.
|
||||||
|
|
||||||
|
|
@ -159,4 +161,105 @@ Now that we have the parser or shell script created, we can actually add it to S
|
||||||
|
|
||||||
5. The program will now start writing the entries into the Steam Library. You should get pop up notifications of the progress, but you can monitor the progress by selecting the **Log** on the left-hand side if needed.
|
5. The program will now start writing the entries into the Steam Library. You should get pop up notifications of the progress, but you can monitor the progress by selecting the **Log** on the left-hand side if needed.
|
||||||
6. Restart Steam to have the changes take effect. Check your library to ensure that your games are there, in a category if you defined one in the parser.
|
6. Restart Steam to have the changes take effect. Check your library to ensure that your games are there, in a category if you defined one in the parser.
|
||||||
7. Try to launch the Emulator from Steam and ensure everything is working. You are now good to go.
|
7. Try to launch the Emulator from Steam and ensure everything is working. You are now good to go.
|
||||||
|
|
||||||
|
## Importing Games into Steam with Steam Rom Manager
|
||||||
|
|
||||||
|
Use this when you want to import your games inside Eden into Steam to launch with artwork from Steam Game Mode without needing to launch Eden first.
|
||||||
|
|
||||||
|
**Click [Here](https://evilperson1337.notion.site/Importing-Games-into-Steam-with-Steam-Rom-Manager-2b757c2edaf680d7a491c92b138f1fcc) for a version of this guide with images & visual elements.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Pre-Requisites
|
||||||
|
|
||||||
|
- Steam Deck Set up and Configured
|
||||||
|
- Eden set up and Configured
|
||||||
|
- Internet Access
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Steps
|
||||||
|
|
||||||
|
1. Press the **STEAM** button and then go to *Power → Switch to Desktop* to enter the Desktop mode.
|
||||||
|
|
||||||
|
1. Install ***Steam ROM Manager***, there are 2 ways you can accomplish this, either manually or through [*EmuDeck*](https://www.emudeck.com/#downloads).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Manual Installation
|
||||||
|
|
||||||
|
1. Open the *Discover Store* and search for *Steam ROM Manager.*
|
||||||
|
2. Select the **Install** button to install the program.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Installing Through *EmuDeck*
|
||||||
|
|
||||||
|
<aside>
|
||||||
|
|
||||||
|
***NOTE***: This assumes you have already set up EmuDeck, if not - just run through the guided installation and select *Steam ROM Manager* as one of the options.
|
||||||
|
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
1. Open **EmuDeck**, then navigate to *Manage Emulators.*
|
||||||
|
2. Scroll down to the bottom of the page to the *Manage your Tools & Frontends* section. Click **Steam ROM Manager**.
|
||||||
|
|
||||||
|
3. Click the **Install** button on the right hand side to install it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
2. Open the Start Menu and Launch ***Steam ROM Manager***
|
||||||
|
|
||||||
|
1. The program will now launch and show you a window with parsers.
|
||||||
|
|
||||||
|
<aside>
|
||||||
|
|
||||||
|
***TIP***: Your layout may look different depending on how you installed *Steam ROM Manager*. You may need to go to **Settings → Theme** and change it to *Classic* to follow along.
|
||||||
|
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
2. Switch off all Parsers by hitting the *Toggle Parsers* switch.
|
||||||
|
3. Scroll down the list on the left-hand side and look for a parser called *Nintendo Switch - Eden* and switch it on. This parser may not exist depending on how you installed *Steam ROM Manager* (EmuDeck creates it for you). Follow these steps to create it if it is missing.
|
||||||
|
|
||||||
|
---
|
||||||
|
#### Creating the Eden Parser
|
||||||
|
|
||||||
|
1. Select Create Parser and in the *Community Presets* option look for **Nintendo Switch - Yuzu**.
|
||||||
|
2. Change the **Parser title** from *Nintendo Switch - Yuzu* to *Nintendo Switch - Eden.*
|
||||||
|
3. Hit the **Browse** option under the *ROMs directory* section. Select the directory containing your Switch ROMs.
|
||||||
|
4. Under *Steam collections*, you can add a Steam category name. This just organizes the games under a common category in your Steam Library, this is optional but recommended.
|
||||||
|
5. Scroll down slightly to the **Executable Configuration → Executable**, select **Browse** and select the Eden AppImage.
|
||||||
|
6. Leave everything else the same and hit **Save** to save the parser.
|
||||||
|
---
|
||||||
|
|
||||||
|
4. Click the Eden parser to view the options on the right, select **Test** at the bottom of the screen to ensure that *Steam ROM Manager* detects your games correctly.
|
||||||
|
1. *Steam ROM Manager* will start to scan the specified ROMs directory and match them to games. Look over the results to ensure they are accurate. If you do not see any entries - check your parsers ROMs directory field.
|
||||||
|
1. When you are happy with the results, click the **Add Games** → **Parse** to start the actual Parsing.
|
||||||
|
1. The program will now identify the games and pull artwork from [*SteamGridDB*](https://www.steamgriddb.com/).
|
||||||
|
2. Review the game matches and ensure everything is there.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Correcting a Mismatch
|
||||||
|
|
||||||
|
If the game is not identified correctly, you may need to tell *Steam ROM Manager* what the game is manually.
|
||||||
|
|
||||||
|
1. Hover over the game card and click the magnifying glass icon.
|
||||||
|
2. Search for the game on the *Search SteamGridDB* section and scroll through the results, selecting the one you want.
|
||||||
|
3. Ensure the *Name* and *Game ID* update in the **Per-App Exceptions** and press **Save and close**. The game should now update.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Excluding Matches
|
||||||
|
|
||||||
|
You may want to tell Steam ROM Manager to ignore some files (updates/DLC/etc.) that it finds in the directory. This is how you do so.
|
||||||
|
|
||||||
|
1. Hit the **Exclude Games** button in the bottom right.
|
||||||
|
2. Deselect the game you want to exclude, the poster artwork should go dim and the **Number Excluded** number should increment up. Repeat with any other exclusions you want to add.
|
||||||
|
3. Hit **Save Excludes** when you are happy with your selections.
|
||||||
|
---
|
||||||
|
3. When you are happy with the results, select **Save to Steam** to save the results.
|
||||||
|
1. The program will now start writing the entries into the Steam Library. You should get pop up notifications of the progress, but you can monitor the progress by selecting the **Log** on the left-hand side if needed.
|
||||||
|
2. Restart Steam to have the changes take effect. Check your library to ensure that your games are there, in a category if you defined one in the parser.
|
||||||
|
3. Try to launch a game and ensure everything is working. You are now good to go.
|
||||||
|
|
@ -7,3 +7,62 @@ While most of the links mentioned in this guide are relatively "safe"; we urge u
|
||||||
- [Nightly Eden builds](https://github.com/pflyly/eden-nightly)
|
- [Nightly Eden builds](https://github.com/pflyly/eden-nightly)
|
||||||
- [NixOS Eden Flake](https://github.com/Grantimatter/eden-flake)
|
- [NixOS Eden Flake](https://github.com/Grantimatter/eden-flake)
|
||||||
- [ES-DE Frontend Support](https://github.com/GlazedBelmont/es-de-android-custom-systems)
|
- [ES-DE Frontend Support](https://github.com/GlazedBelmont/es-de-android-custom-systems)
|
||||||
|
|
||||||
|
## Mirrors
|
||||||
|
|
||||||
|
The main origin repository is always at https://git.eden-emu.dev/eden-emu/eden.
|
||||||
|
|
||||||
|
- https://github.com/eden-emulator/mirror
|
||||||
|
- https://git.crueter.xyz/mirror/eden
|
||||||
|
- https://collective.taymaerz.de/eden/eden
|
||||||
|
|
||||||
|
Other mirrors obviously exist on the internet, but we can't guarantee their reliability and/or availability.
|
||||||
|
|
||||||
|
If you're someone wanting to make a mirror, simply setup forgejo and automatically mirror from the origin repository. Or you could mirror a mirror to save us bandwidth... your choice!
|
||||||
|
|
||||||
|
## Configuring Obtainium
|
||||||
|
|
||||||
|
Very nice handy app, here's a quick rundown how to configure:
|
||||||
|
|
||||||
|
1. Copy the URL: https://git.eden-emu.dev/eden-emu/eden/ (or one of your favourite mirrors)
|
||||||
|
2. Open Obtainium and tap `Add App`.
|
||||||
|
3. Paste the URL into the `App Source URL` field.
|
||||||
|
4. Override Source: Look for the `Override Source` dropdown menu and select `Forgejo (Codeberg)`.
|
||||||
|
5. Click `Add:` Obtainium should now be able to parse the releases and find the APK files.
|
||||||
|
|
||||||
|
Note: Even though the site isn't Codeberg, it uses the same Forgejo/Gitea backend, and this setting tells Obtainium how to read the release data.
|
||||||
|
|
||||||
|
## Configuring ES-DE
|
||||||
|
|
||||||
|
### Method 1
|
||||||
|
|
||||||
|
1. Download ZIP from [here](https://github.com/GlazedBelmont/es-de-android-custom-systems)
|
||||||
|
2. Unzip the file and extract `es_systems.xml` and `es_find_rules.xml` to `\Odin2\Internal shared storage\ES-DE\custom_systems`.
|
||||||
|
3. Press `Start -> Other Settings -> Alternative Emulators` and set it to Eden (Standalone).
|
||||||
|
|
||||||
|
### Method 2
|
||||||
|
|
||||||
|
1. Navigate to `\Odin2\Internal shared storage\ES-DE\custom_systems`.
|
||||||
|
2. Add this to your `es_find_rules.xml`:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<!-- Standard aka. normal release -->
|
||||||
|
<emulator name="EDEN">
|
||||||
|
<rule type="androidpackage">
|
||||||
|
<entry>dev.eden.eden_emulator/org.yuzu.yuzu_emu.activities.EmulationActivity</entry>
|
||||||
|
</rule>
|
||||||
|
</emulator>
|
||||||
|
|
||||||
|
<!-- Optimized -->
|
||||||
|
<emulator name="EDEN">
|
||||||
|
<rule type="androidpackage">
|
||||||
|
<entry>com.miHoYo.Yuanshen/org.yuzu.yuzu_emu.activities.EmulationActivity</entry>
|
||||||
|
</rule>
|
||||||
|
</emulator>
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Add this line of text to your `es_systems.xml` underneath where the rest of your switch system entries are:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<command label="Eden (Standalone)">%EMULATOR_EDEN% %ACTION%=android.nfc.action.TECH_DISCOVERED %DATA%=%ROMPROVIDER%</command>
|
||||||
|
```
|
||||||
|
|
|
||||||
14
externals/CMakeLists.txt
vendored
|
|
@ -41,9 +41,6 @@ if (NOT TARGET enet::enet)
|
||||||
add_library(enet::enet ALIAS enet)
|
add_library(enet::enet ALIAS enet)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# mbedtls
|
|
||||||
AddJsonPackage(mbedtls)
|
|
||||||
|
|
||||||
# stb
|
# stb
|
||||||
add_library(stb stb/stb_dxt.cpp)
|
add_library(stb stb/stb_dxt.cpp)
|
||||||
target_include_directories(stb PUBLIC ./stb)
|
target_include_directories(stb PUBLIC ./stb)
|
||||||
|
|
@ -136,8 +133,7 @@ if(ENABLE_CUBEB)
|
||||||
endif()
|
endif()
|
||||||
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 (NOT ANDROID)
|
||||||
if (ENABLE_SDL2)
|
|
||||||
if (YUZU_USE_EXTERNAL_SDL2)
|
if (YUZU_USE_EXTERNAL_SDL2)
|
||||||
message(STATUS "Using SDL2 from externals.")
|
message(STATUS "Using SDL2 from externals.")
|
||||||
if (NOT WIN32)
|
if (NOT WIN32)
|
||||||
|
|
@ -234,9 +230,7 @@ if (VulkanMemoryAllocator_ADDED)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# httplib
|
# httplib
|
||||||
if (ENABLE_WEB_SERVICE OR ENABLE_UPDATE_CHECKER OR USE_DISCORD_PRESENCE OR ENABLE_OPENSSL)
|
AddJsonPackage(httplib)
|
||||||
AddJsonPackage(httplib)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# cpp-jwt
|
# cpp-jwt
|
||||||
if (ENABLE_WEB_SERVICE OR ENABLE_UPDATE_CHECKER)
|
if (ENABLE_WEB_SERVICE OR ENABLE_UPDATE_CHECKER)
|
||||||
|
|
@ -407,12 +401,10 @@ if (APPLE)
|
||||||
# moltenvk
|
# moltenvk
|
||||||
if (NOT YUZU_USE_BUNDLED_MOLTENVK)
|
if (NOT YUZU_USE_BUNDLED_MOLTENVK)
|
||||||
find_library(MOLTENVK_LIBRARY MoltenVK)
|
find_library(MOLTENVK_LIBRARY MoltenVK)
|
||||||
else()
|
|
||||||
unset(MOLTENVK_LIBRARY)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# TODO: kosmickrisp?
|
# TODO: kosmickrisp?
|
||||||
if (NOT MOLTENVK_LIBRARY)
|
if (NOT MOLTENVK_LIBRARY OR YUZU_USE_BUNDLED_MOLTENVK)
|
||||||
AddJsonPackage(moltenvk)
|
AddJsonPackage(moltenvk)
|
||||||
|
|
||||||
set(MOLTENVK_LIBRARY "${moltenvk_SOURCE_DIR}/MoltenVK/dylib/macOS/libMoltenVK.dylib" CACHE STRING "" FORCE)
|
set(MOLTENVK_LIBRARY "${moltenvk_SOURCE_DIR}/MoltenVK/dylib/macOS/libMoltenVK.dylib" CACHE STRING "" FORCE)
|
||||||
|
|
|
||||||
23
externals/cpmfile.json
vendored
|
|
@ -33,6 +33,9 @@
|
||||||
"find_args": "MODULE GLOBAL",
|
"find_args": "MODULE GLOBAL",
|
||||||
"patches": [
|
"patches": [
|
||||||
"0001-mingw.patch"
|
"0001-mingw.patch"
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
"HTTPLIB_REQUIRE_OPENSSL ON"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"cpp-jwt": {
|
"cpp-jwt": {
|
||||||
|
|
@ -88,20 +91,6 @@
|
||||||
"0001-avoid-memset-when-clearing-an-empty-table.patch"
|
"0001-avoid-memset-when-clearing-an-empty-table.patch"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"mbedtls": {
|
|
||||||
"package": "MbedTLS",
|
|
||||||
"repo": "Mbed-TLS/mbedtls",
|
|
||||||
"tag": "mbedtls-%VERSION%",
|
|
||||||
"hash": "6671fb8fcaa832e5b115dfdce8f78baa6a4aea71f5c89a640583634cdee27aefe3bf4be075744da91f7c3ae5ea4e0c765c8fc3937b5cfd9ea73d87ef496524da",
|
|
||||||
"version": "3",
|
|
||||||
"git_version": "3.6.4",
|
|
||||||
"artifact": "%TAG%.tar.bz2",
|
|
||||||
"skip_updates": true,
|
|
||||||
"patches": [
|
|
||||||
"0001-aesni-fix.patch",
|
|
||||||
"0002-arm64-aes-fix.patch"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"enet": {
|
"enet": {
|
||||||
"repo": "lsalzman/enet",
|
"repo": "lsalzman/enet",
|
||||||
"tag": "v%VERSION%",
|
"tag": "v%VERSION%",
|
||||||
|
|
@ -242,8 +231,8 @@
|
||||||
},
|
},
|
||||||
"ffmpeg": {
|
"ffmpeg": {
|
||||||
"repo": "FFmpeg/FFmpeg",
|
"repo": "FFmpeg/FFmpeg",
|
||||||
"sha": "5e56937b74",
|
"sha": "c7b5f1537d",
|
||||||
"hash": "9ab0457dcd6ce6359b5053c1662f57910d332f68ca0cca9d4134d858464840917027374de3d97e0863c3a7daaea2fe4f4cd17d1c6d8e7f740f4ad91e71c2932b",
|
"hash": "ed177621176b3961bdcaa339187d3a7688c1c8b060b79c4bb0257cbc67ad7021ae5d5adca5303b45625abbbe3d9aafdd87ce777b8690ac295290d744c875489a",
|
||||||
"bundled": true
|
"bundled": true
|
||||||
},
|
},
|
||||||
"ffmpeg-ci": {
|
"ffmpeg-ci": {
|
||||||
|
|
@ -251,7 +240,7 @@
|
||||||
"package": "FFmpeg",
|
"package": "FFmpeg",
|
||||||
"name": "ffmpeg",
|
"name": "ffmpeg",
|
||||||
"repo": "crueter-ci/FFmpeg",
|
"repo": "crueter-ci/FFmpeg",
|
||||||
"version": "8.0.1-5e56937b74",
|
"version": "8.0.1-c7b5f1537d",
|
||||||
"min_version": "4.1"
|
"min_version": "4.1"
|
||||||
},
|
},
|
||||||
"tzdb": {
|
"tzdb": {
|
||||||
|
|
|
||||||
139
externals/ffmpeg/CMakeLists.txt
vendored
|
|
@ -1,4 +1,4 @@
|
||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2021 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2021 yuzu Emulator Project
|
||||||
|
|
@ -11,18 +11,60 @@ set(FFmpeg_HWACCEL_FLAGS)
|
||||||
set(FFmpeg_HWACCEL_INCLUDE_DIRS)
|
set(FFmpeg_HWACCEL_INCLUDE_DIRS)
|
||||||
set(FFmpeg_HWACCEL_LDFLAGS)
|
set(FFmpeg_HWACCEL_LDFLAGS)
|
||||||
|
|
||||||
if (UNIX AND NOT ANDROID)
|
if (NOT YUZU_USE_BUNDLED_FFMPEG)
|
||||||
|
set(FFmpeg_CROSS_COMPILE_FLAGS "")
|
||||||
|
if (ANDROID)
|
||||||
|
# TODO: Maybe use CMAKE_SYSROOT? and probably provide a toolchain file for android
|
||||||
|
# I mean isn't that the "proper" way anyways?
|
||||||
|
string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" FFmpeg_HOST_SYSTEM_NAME)
|
||||||
|
set(TOOLCHAIN "${ANDROID_NDK}/toolchains/llvm/prebuilt/${FFmpeg_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}")
|
||||||
|
set(SYSROOT "${TOOLCHAIN}/sysroot")
|
||||||
|
set(FFmpeg_CPU "armv8-a")
|
||||||
|
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS
|
||||||
|
--enable-cross-compile
|
||||||
|
--arch=arm64
|
||||||
|
#--cpu=${FFmpeg_CPU}
|
||||||
|
--cross-prefix="${TOOLCHAIN}/bin/aarch64-linux-android-"
|
||||||
|
--sysroot="${SYSROOT}"
|
||||||
|
--target-os=android
|
||||||
|
--extra-ldflags="--ld-path=${TOOLCHAIN}/bin/ld.lld"
|
||||||
|
--extra-ldflags="-nostdlib"
|
||||||
|
)
|
||||||
|
set(FFmpeg_IS_CROSS_COMPILING TRUE)
|
||||||
|
# User attempts to do a FFmpeg cross compilation because...
|
||||||
|
# Here we just quickly test against host/system processors not matching
|
||||||
|
# TODO: Test for versions not matching as well?
|
||||||
|
elseif (NOT CMAKE_HOST_SYSTEM_PROCESSOR MATCHES CMAKE_SYSTEM_PROCESSOR OR NOT CMAKE_HOST_SYSTEM_NAME MATCHES CMAKE_SYSTEM_NAME)
|
||||||
|
string(TOLOWER "${CMAKE_SYSTEM_NAME}" FFmpeg_SYSTEM_NAME)
|
||||||
|
# TODO: Can we really do better? Auto-detection? Something clever?
|
||||||
|
if (NOT DEFINED FFmpeg_CROSS_PREFIX)
|
||||||
|
message(ERROR "Please set FFmpeg_CROSS_PREFIX to your cross toolchain prefix, for example: \${CMAKE_STAGING_PREFIX}/bin/${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}-")
|
||||||
|
endif()
|
||||||
|
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS
|
||||||
|
--enable-cross-compile
|
||||||
|
--arch="${CMAKE_SYSTEM_PROCESSOR}"
|
||||||
|
--target-os="${FFmpeg_SYSTEM_NAME}"
|
||||||
|
--sysroot="${CMAKE_SYSROOT}"
|
||||||
|
--cross-prefix="${FFmpeg_CROSS_PREFIX}"
|
||||||
|
)
|
||||||
|
set(FFmpeg_IS_CROSS_COMPILING TRUE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (UNIX AND NOT ANDROID AND NOT DEFINED FFmpeg_IS_CROSS_COMPILING)
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
if (NOT ANDROID)
|
if (NOT ANDROID)
|
||||||
pkg_check_modules(LIBVA libva)
|
pkg_check_modules(LIBVA libva)
|
||||||
pkg_check_modules(CUDA cuda)
|
pkg_check_modules(CUDA cuda)
|
||||||
pkg_check_modules(FFNVCODEC ffnvcodec)
|
pkg_check_modules(FFNVCODEC ffnvcodec)
|
||||||
pkg_check_modules(VDPAU vdpau)
|
pkg_check_modules(VDPAU vdpau)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT APPLE)
|
find_package(X11)
|
||||||
# In Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so
|
if(X11_FOUND)
|
||||||
if(PLATFORM_SUN)
|
if (NOT APPLE)
|
||||||
|
# In Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so
|
||||||
|
if(PLATFORM_SUN)
|
||||||
find_library(LIBDRM_LIB libdrm PATHS /usr/lib/64 /usr/lib/amd64 /usr/lib)
|
find_library(LIBDRM_LIB libdrm PATHS /usr/lib/64 /usr/lib/amd64 /usr/lib)
|
||||||
if(LIBDRM_LIB)
|
if(LIBDRM_LIB)
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
||||||
|
|
@ -34,40 +76,42 @@ if (UNIX AND NOT ANDROID)
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
list(APPEND FFmpeg_HWACCEL_FLAGS
|
||||||
--disable-libdrm)
|
--disable-libdrm)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
pkg_check_modules(LIBDRM libdrm REQUIRED)
|
pkg_check_modules(LIBDRM libdrm REQUIRED)
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
||||||
${LIBDRM_LIBRARIES})
|
${LIBDRM_LIBRARIES})
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS
|
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS
|
||||||
${LIBDRM_INCLUDE_DIRS})
|
${LIBDRM_INCLUDE_DIRS})
|
||||||
|
endif()
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
list(APPEND FFmpeg_HWACCEL_FLAGS
|
||||||
--enable-libdrm)
|
--enable-libdrm)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
if(LIBVA_FOUND)
|
||||||
|
pkg_check_modules(LIBVA-DRM libva-drm REQUIRED)
|
||||||
if(LIBVA_FOUND)
|
pkg_check_modules(LIBVA-X11 libva-x11 REQUIRED)
|
||||||
find_package(X11 REQUIRED)
|
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
||||||
pkg_check_modules(LIBVA-DRM libva-drm REQUIRED)
|
${X11_LIBRARIES}
|
||||||
pkg_check_modules(LIBVA-X11 libva-x11 REQUIRED)
|
${LIBVA-DRM_LIBRARIES}
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
${LIBVA-X11_LIBRARIES}
|
||||||
${X11_LIBRARIES}
|
${LIBVA_LIBRARIES})
|
||||||
${LIBVA-DRM_LIBRARIES}
|
list(APPEND FFmpeg_HWACCEL_FLAGS
|
||||||
${LIBVA-X11_LIBRARIES}
|
--enable-hwaccel=h264_vaapi
|
||||||
${LIBVA_LIBRARIES})
|
--enable-hwaccel=vp8_vaapi
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
--enable-hwaccel=vp9_vaapi)
|
||||||
--enable-hwaccel=h264_vaapi
|
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS
|
||||||
--enable-hwaccel=vp8_vaapi
|
${X11_INCLUDE_DIRS}
|
||||||
--enable-hwaccel=vp9_vaapi)
|
${LIBVA-DRM_INCLUDE_DIRS}
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS
|
${LIBVA-X11_INCLUDE_DIRS}
|
||||||
${X11_INCLUDE_DIRS}
|
${LIBVA_INCLUDE_DIRS}
|
||||||
${LIBVA-DRM_INCLUDE_DIRS}
|
)
|
||||||
${LIBVA-X11_INCLUDE_DIRS}
|
message(STATUS "ffmpeg: va-api libraries version ${LIBVA_VERSION} found")
|
||||||
${LIBVA_INCLUDE_DIRS}
|
else()
|
||||||
)
|
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi)
|
||||||
message(STATUS "ffmpeg: va-api libraries version ${LIBVA_VERSION} found")
|
message(WARNING "ffmpeg: libva-dev not found, disabling Video Acceleration API (VA-API)...")
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi)
|
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi)
|
||||||
message(WARNING "ffmpeg: libva-dev not found, disabling Video Acceleration API (VA-API)...")
|
message(WARNING "ffmpeg: X11 libraries not found, disabling VA-API...")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (FFNVCODEC_FOUND)
|
if (FFNVCODEC_FOUND)
|
||||||
|
|
@ -181,24 +225,6 @@ else()
|
||||||
|
|
||||||
find_program(BASH_PROGRAM bash REQUIRED)
|
find_program(BASH_PROGRAM bash REQUIRED)
|
||||||
|
|
||||||
set(FFmpeg_CROSS_COMPILE_FLAGS "")
|
|
||||||
if (ANDROID)
|
|
||||||
string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" FFmpeg_HOST_SYSTEM_NAME)
|
|
||||||
set(TOOLCHAIN "${ANDROID_NDK}/toolchains/llvm/prebuilt/${FFmpeg_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}")
|
|
||||||
set(SYSROOT "${TOOLCHAIN}/sysroot")
|
|
||||||
set(FFmpeg_CPU "armv8-a")
|
|
||||||
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS
|
|
||||||
--arch=arm64
|
|
||||||
#--cpu=${FFmpeg_CPU}
|
|
||||||
--enable-cross-compile
|
|
||||||
--cross-prefix=${TOOLCHAIN}/bin/aarch64-linux-android-
|
|
||||||
--sysroot=${SYSROOT}
|
|
||||||
--target-os=android
|
|
||||||
--extra-ldflags="--ld-path=${TOOLCHAIN}/bin/ld.lld"
|
|
||||||
--extra-ldflags="-nostdlib"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# `configure` parameters builds only exactly what yuzu needs from FFmpeg
|
# `configure` parameters builds only exactly what yuzu needs from FFmpeg
|
||||||
# `--disable-vdpau` is needed to avoid linking issues
|
# `--disable-vdpau` is needed to avoid linking issues
|
||||||
set(FFmpeg_CC ${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER})
|
set(FFmpeg_CC ${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER})
|
||||||
|
|
@ -223,6 +249,7 @@ else()
|
||||||
--enable-pic
|
--enable-pic
|
||||||
--cc="${FFmpeg_CC}"
|
--cc="${FFmpeg_CC}"
|
||||||
--cxx="${FFmpeg_CXX}"
|
--cxx="${FFmpeg_CXX}"
|
||||||
|
${FFmpeg_CROSS_COMPILE_FLAG}
|
||||||
${FFmpeg_HWACCEL_FLAGS}
|
${FFmpeg_HWACCEL_FLAGS}
|
||||||
${FFmpeg_CROSS_COMPILE_FLAGS}
|
${FFmpeg_CROSS_COMPILE_FLAGS}
|
||||||
WORKING_DIRECTORY
|
WORKING_DIRECTORY
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ pkgs.mkShellNoCC {
|
||||||
# libraries
|
# libraries
|
||||||
openssl boost fmt nlohmann_json lz4 zlib zstd
|
openssl boost fmt nlohmann_json lz4 zlib zstd
|
||||||
enet libopus vulkan-headers vulkan-utility-libraries
|
enet libopus vulkan-headers vulkan-utility-libraries
|
||||||
spirv-tools spirv-headers vulkan-loader unzip mbedtls
|
spirv-tools spirv-headers vulkan-loader unzip
|
||||||
glslang python3 httplib cpp-jwt ffmpeg-headless
|
glslang python3 httplib cpp-jwt ffmpeg-headless
|
||||||
libusb1 cubeb
|
libusb1 cubeb
|
||||||
# eden
|
# eden
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,10 @@ if (MSVC AND NOT CXX_CLANG)
|
||||||
/wd4324 # 'struct_name': structure was padded due to __declspec(align())
|
/wd4324 # 'struct_name': structure was padded due to __declspec(align())
|
||||||
/wd4201 # nonstandard extension used : nameless struct/union
|
/wd4201 # nonstandard extension used : nameless struct/union
|
||||||
/wd4702 # unreachable code (when used with LTO)
|
/wd4702 # unreachable code (when used with LTO)
|
||||||
|
|
||||||
|
$<$<CONFIG:Release>:/GS-> # No stack buffer overflow checks
|
||||||
|
/Gy # Enable function level linking
|
||||||
|
/GR- # Disable run time type information
|
||||||
)
|
)
|
||||||
|
|
||||||
if (NOT CXX_CLANG)
|
if (NOT CXX_CLANG)
|
||||||
|
|
@ -108,15 +112,14 @@ if (MSVC AND NOT CXX_CLANG)
|
||||||
add_compile_options(/QIntel-jcc-erratum)
|
add_compile_options(/QIntel-jcc-erratum)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# /GS- - No stack buffer overflow checks
|
|
||||||
add_compile_options("$<$<CONFIG:Release>:/GS->")
|
|
||||||
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE)
|
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE)
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
|
||||||
else()
|
else()
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
add_compile_options(
|
add_compile_options(
|
||||||
-fwrapv
|
-fwrapv
|
||||||
|
-fno-rtti # Disable RTTI
|
||||||
|
-pipe
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
@ -232,7 +235,7 @@ if (YUZU_TESTS)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_SDL2 AND YUZU_CMD)
|
if (YUZU_CMD)
|
||||||
add_subdirectory(yuzu_cmd)
|
add_subdirectory(yuzu_cmd)
|
||||||
set_target_properties(yuzu-cmd PROPERTIES OUTPUT_NAME "eden-cli")
|
set_target_properties(yuzu-cmd PROPERTIES OUTPUT_NAME "eden-cli")
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -79,9 +79,7 @@ android {
|
||||||
arguments.addAll(
|
arguments.addAll(
|
||||||
listOf(
|
listOf(
|
||||||
"-DENABLE_QT=0", // Don't use QT
|
"-DENABLE_QT=0", // Don't use QT
|
||||||
"-DENABLE_SDL2=0", // Don't use SDL
|
|
||||||
"-DENABLE_WEB_SERVICE=1", // Enable web service
|
"-DENABLE_WEB_SERVICE=1", // Enable web service
|
||||||
"-DENABLE_OPENSSL=ON",
|
|
||||||
"-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work
|
"-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work
|
||||||
"-DYUZU_USE_CPM=ON",
|
"-DYUZU_USE_CPM=ON",
|
||||||
"-DCPMUTIL_FORCE_BUNDLED=ON",
|
"-DCPMUTIL_FORCE_BUNDLED=ON",
|
||||||
|
|
|
||||||
|
|
@ -152,6 +152,10 @@ object NativeLibrary {
|
||||||
|
|
||||||
external fun surfaceDestroyed()
|
external fun surfaceDestroyed()
|
||||||
|
|
||||||
|
external fun getAppletCaptureBuffer(): ByteArray
|
||||||
|
external fun getAppletCaptureWidth(): Int
|
||||||
|
external fun getAppletCaptureHeight(): Int
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unpauses emulation from a paused state.
|
* Unpauses emulation from a paused state.
|
||||||
*/
|
*/
|
||||||
|
|
@ -603,6 +607,12 @@ object NativeLibrary {
|
||||||
*/
|
*/
|
||||||
external fun addFileToFilesystemProvider(path: String)
|
external fun addFileToFilesystemProvider(path: String)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a game-folder file to the manual filesystem provider, respecting the internal gate for
|
||||||
|
* game-folder external-content mounting.
|
||||||
|
*/
|
||||||
|
external fun addGameFolderFileToFilesystemProvider(path: String)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears all files added to the manual filesystem provider in our EmulationSession instance
|
* Clears all files added to the manual filesystem provider in our EmulationSession instance
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
|
@ -24,6 +24,7 @@ import org.yuzu.yuzu_emu.utils.DocumentsTree
|
||||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||||
import org.yuzu.yuzu_emu.utils.Log
|
import org.yuzu.yuzu_emu.utils.Log
|
||||||
import org.yuzu.yuzu_emu.utils.PowerStateUpdater
|
import org.yuzu.yuzu_emu.utils.PowerStateUpdater
|
||||||
|
import org.yuzu.yuzu_emu.utils.ControllerNavigationGlobalHook
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
fun Context.getPublicFilesDir(): File = getExternalFilesDir(null) ?: filesDir
|
fun Context.getPublicFilesDir(): File = getExternalFilesDir(null) ?: filesDir
|
||||||
|
|
@ -72,6 +73,7 @@ class YuzuApplication : Application() {
|
||||||
NativeLibrary.logDeviceInfo()
|
NativeLibrary.logDeviceInfo()
|
||||||
PowerStateUpdater.start()
|
PowerStateUpdater.start()
|
||||||
Log.logDeviceInfo()
|
Log.logDeviceInfo()
|
||||||
|
ControllerNavigationGlobalHook.install(this)
|
||||||
|
|
||||||
createNotificationChannels()
|
createNotificationChannels()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
|
@ -204,9 +204,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
super.onPause()
|
|
||||||
nfcReader.stopScanning()
|
nfcReader.stopScanning()
|
||||||
stopMotionSensorListener()
|
stopMotionSensorListener()
|
||||||
|
super.onPause()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
|
|
@ -339,6 +339,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSensorChanged(event: SensorEvent) {
|
override fun onSensorChanged(event: SensorEvent) {
|
||||||
|
if (!NativeLibrary.isRunning() || NativeLibrary.isPaused()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
val rotation = this.display?.rotation
|
val rotation = this.display?.rotation
|
||||||
if (rotation == Surface.ROTATION_90) {
|
if (rotation == Surface.ROTATION_90) {
|
||||||
flipMotionOrientation = true
|
flipMotionOrientation = true
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
|
@ -10,6 +10,8 @@ import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.core.content.res.ResourcesCompat
|
import androidx.core.content.res.ResourcesCompat
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
|
import com.google.android.material.button.MaterialButton
|
||||||
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.databinding.CardInstallableIconBinding
|
import org.yuzu.yuzu_emu.databinding.CardInstallableIconBinding
|
||||||
import org.yuzu.yuzu_emu.databinding.CardSimpleOutlinedBinding
|
import org.yuzu.yuzu_emu.databinding.CardSimpleOutlinedBinding
|
||||||
import org.yuzu.yuzu_emu.model.GameProperty
|
import org.yuzu.yuzu_emu.model.GameProperty
|
||||||
|
|
@ -89,29 +91,33 @@ class GamePropertiesAdapter(
|
||||||
|
|
||||||
|
|
||||||
val hasVisibleActions = submenuProperty.secondaryActions?.any { it.isShown } == true
|
val hasVisibleActions = submenuProperty.secondaryActions?.any { it.isShown } == true
|
||||||
|
binding.layoutSecondaryActions.removeAllViews()
|
||||||
|
binding.dividerSecondaryActions.setVisible(false)
|
||||||
|
|
||||||
if (hasVisibleActions) {
|
if (hasVisibleActions) {
|
||||||
binding.dividerSecondaryActions.setVisible(true)
|
|
||||||
binding.layoutSecondaryActions.setVisible(true)
|
binding.layoutSecondaryActions.setVisible(true)
|
||||||
|
|
||||||
submenuProperty.secondaryActions!!.forEach { secondaryAction ->
|
val visibleActions = submenuProperty.secondaryActions!!.filter { it.isShown }
|
||||||
if (secondaryAction.isShown) {
|
val inflater = LayoutInflater.from(binding.root.context)
|
||||||
val button = com.google.android.material.button.MaterialButton(
|
visibleActions.forEachIndexed { index, secondaryAction ->
|
||||||
binding.root.context,
|
val button = inflater.inflate(
|
||||||
null,
|
R.layout.item_secondary_action_button,
|
||||||
com.google.android.material.R.attr.materialButtonOutlinedStyle
|
binding.layoutSecondaryActions,
|
||||||
).apply {
|
false
|
||||||
setIconResource(secondaryAction.iconId)
|
) as MaterialButton
|
||||||
iconSize = (18 * binding.root.context.resources.displayMetrics.density).toInt()
|
button.setIconResource(secondaryAction.iconId)
|
||||||
text = binding.root.context.getString(secondaryAction.descriptionId)
|
button.text = ""
|
||||||
contentDescription = binding.root.context.getString(secondaryAction.descriptionId)
|
button.contentDescription = binding.root.context
|
||||||
setOnClickListener { secondaryAction.action.invoke() }
|
.getString(secondaryAction.descriptionId)
|
||||||
}
|
button.tooltipText = binding.root.context
|
||||||
binding.layoutSecondaryActions.addView(button)
|
.getString(secondaryAction.descriptionId)
|
||||||
|
if (index == visibleActions.lastIndex) {
|
||||||
|
(button.layoutParams as ViewGroup.MarginLayoutParams).marginEnd = 0
|
||||||
}
|
}
|
||||||
|
button.setOnClickListener { secondaryAction.action.invoke() }
|
||||||
|
binding.layoutSecondaryActions.addView(button)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
binding.dividerSecondaryActions.setVisible(false)
|
|
||||||
binding.layoutSecondaryActions.setVisible(false)
|
binding.layoutSecondaryActions.setVisible(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.dialogs
|
package org.yuzu.yuzu_emu.dialogs
|
||||||
|
|
@ -14,6 +14,7 @@ import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
import android.view.inputmethod.InputMethodManager
|
import android.view.inputmethod.InputMethodManager
|
||||||
|
import android.widget.FrameLayout
|
||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.getSystemService
|
||||||
import androidx.core.widget.doOnTextChanged
|
import androidx.core.widget.doOnTextChanged
|
||||||
import androidx.recyclerview.widget.DividerItemDecoration
|
import androidx.recyclerview.widget.DividerItemDecoration
|
||||||
|
|
@ -58,6 +59,30 @@ class LobbyBrowser(context: Context) : BottomSheetDialog(context) {
|
||||||
setupSearchBar()
|
setupSearchBar()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onStart() {
|
||||||
|
super.onStart()
|
||||||
|
|
||||||
|
window?.setLayout(
|
||||||
|
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||||
|
ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
)
|
||||||
|
|
||||||
|
val bottomSheet =
|
||||||
|
findViewById<FrameLayout>(com.google.android.material.R.id.design_bottom_sheet)
|
||||||
|
if (bottomSheet != null) {
|
||||||
|
bottomSheet.layoutParams = bottomSheet.layoutParams.apply {
|
||||||
|
width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
height = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
}
|
||||||
|
bottomSheet.requestLayout()
|
||||||
|
}
|
||||||
|
|
||||||
|
behavior.isFitToContents = false
|
||||||
|
behavior.expandedOffset = 0
|
||||||
|
behavior.skipCollapsed = true
|
||||||
|
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||||
|
}
|
||||||
|
|
||||||
private fun setupRecyclerView() {
|
private fun setupRecyclerView() {
|
||||||
adapter = LobbyRoomAdapter { room -> handleRoomSelection(room) }
|
adapter = LobbyRoomAdapter { room -> handleRoomSelection(room) }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.fetcher
|
package org.yuzu.yuzu_emu.features.fetcher
|
||||||
|
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
|
||||||
class SpacingItemDecoration(private val spacing: Int) : RecyclerView.ItemDecoration() {
|
class SpacingItemDecoration(private val spacing: Int) : RecyclerView.ItemDecoration() {
|
||||||
|
|
@ -15,8 +16,20 @@ class SpacingItemDecoration(private val spacing: Int) : RecyclerView.ItemDecorat
|
||||||
state: RecyclerView.State
|
state: RecyclerView.State
|
||||||
) {
|
) {
|
||||||
outRect.bottom = spacing
|
outRect.bottom = spacing
|
||||||
if (parent.getChildAdapterPosition(view) == 0) {
|
|
||||||
|
val position = parent.getChildAdapterPosition(view)
|
||||||
|
if (position == RecyclerView.NO_POSITION) return
|
||||||
|
|
||||||
|
if (position == 0) {
|
||||||
outRect.top = spacing
|
outRect.top = spacing
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the item is in the first row, but NOT in first column add top spacing as well
|
||||||
|
val layoutManager = parent.layoutManager
|
||||||
|
if (layoutManager is GridLayoutManager && layoutManager.spanSizeLookup.getSpanGroupIndex(position, layoutManager.spanCount) == 0) {
|
||||||
|
outRect.top = spacing
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
||||||
RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
|
RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
|
||||||
RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
|
RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
|
||||||
ENABLE_BUFFER_HISTORY("enable_buffer_history"),
|
ENABLE_BUFFER_HISTORY("enable_buffer_history"),
|
||||||
|
USE_OPTIMIZED_VERTEX_BUFFERS("use_optimized_vertex_buffers"),
|
||||||
SYNC_MEMORY_OPERATIONS("sync_memory_operations"),
|
SYNC_MEMORY_OPERATIONS("sync_memory_operations"),
|
||||||
BUFFER_REORDER_DISABLE("disable_buffer_reorder"),
|
BUFFER_REORDER_DISABLE("disable_buffer_reorder"),
|
||||||
RENDERER_DEBUG("debug"),
|
RENDERER_DEBUG("debug"),
|
||||||
|
|
@ -37,6 +38,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
||||||
PICTURE_IN_PICTURE("picture_in_picture"),
|
PICTURE_IN_PICTURE("picture_in_picture"),
|
||||||
USE_CUSTOM_RTC("custom_rtc_enabled"),
|
USE_CUSTOM_RTC("custom_rtc_enabled"),
|
||||||
BLACK_BACKGROUNDS("black_backgrounds"),
|
BLACK_BACKGROUNDS("black_backgrounds"),
|
||||||
|
INVERT_CONFIRM_BACK_CONTROLLER_BUTTONS("invert_confirm_back_controller_buttons"),
|
||||||
|
|
||||||
ENABLE_FOLDER_BUTTON("enable_folder_button"),
|
ENABLE_FOLDER_BUTTON("enable_folder_button"),
|
||||||
ENABLE_QLAUNCH_BUTTON("enable_qlaunch_button"),
|
ENABLE_QLAUNCH_BUTTON("enable_qlaunch_button"),
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
|
||||||
MAX_ANISOTROPY("max_anisotropy"),
|
MAX_ANISOTROPY("max_anisotropy"),
|
||||||
THEME("theme"),
|
THEME("theme"),
|
||||||
THEME_MODE("theme_mode"),
|
THEME_MODE("theme_mode"),
|
||||||
|
STATIC_THEME_COLOR("static_theme_color"),
|
||||||
APP_LANGUAGE("app_language"),
|
APP_LANGUAGE("app_language"),
|
||||||
OVERLAY_SCALE("control_scale"),
|
OVERLAY_SCALE("control_scale"),
|
||||||
OVERLAY_OPACITY("control_opacity"),
|
OVERLAY_OPACITY("control_opacity"),
|
||||||
|
|
@ -68,7 +69,6 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
|
||||||
MY_PAGE_APPLET("my_page_applet_mode"),
|
MY_PAGE_APPLET("my_page_applet_mode"),
|
||||||
INPUT_OVERLAY_AUTO_HIDE("input_overlay_auto_hide"),
|
INPUT_OVERLAY_AUTO_HIDE("input_overlay_auto_hide"),
|
||||||
OVERLAY_GRID_SIZE("overlay_grid_size"),
|
OVERLAY_GRID_SIZE("overlay_grid_size"),
|
||||||
DEBUG_KNOBS("debug_knobs"),
|
|
||||||
GPU_LOG_RING_BUFFER_SIZE("gpu_log_ring_buffer_size")
|
GPU_LOG_RING_BUFFER_SIZE("gpu_log_ring_buffer_size")
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.model
|
package org.yuzu.yuzu_emu.features.settings.model
|
||||||
|
|
@ -27,7 +27,7 @@ object Settings {
|
||||||
SECTION_APP_SETTINGS(R.string.app_settings),
|
SECTION_APP_SETTINGS(R.string.app_settings),
|
||||||
SECTION_CUSTOM_PATHS(R.string.preferences_custom_paths),
|
SECTION_CUSTOM_PATHS(R.string.preferences_custom_paths),
|
||||||
SECTION_DEBUG(R.string.preferences_debug),
|
SECTION_DEBUG(R.string.preferences_debug),
|
||||||
SECTION_FREEDRENO(R.string.gpu_driver_settings),
|
SECTION_FREEDRENO(R.string.freedreno_settings_title),
|
||||||
SECTION_APPLETS(R.string.applets_menu);
|
SECTION_APPLETS(R.string.applets_menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ enum class ShortSetting(override val key: String) : AbstractShortSetting {
|
||||||
RENDERER_SPEED_LIMIT("speed_limit"),
|
RENDERER_SPEED_LIMIT("speed_limit"),
|
||||||
RENDERER_TURBO_SPEED_LIMIT("turbo_speed_limit"),
|
RENDERER_TURBO_SPEED_LIMIT("turbo_speed_limit"),
|
||||||
RENDERER_SLOW_SPEED_LIMIT("slow_speed_limit"),
|
RENDERER_SLOW_SPEED_LIMIT("slow_speed_limit"),
|
||||||
|
DEBUG_KNOBS("debug_knobs")
|
||||||
;
|
;
|
||||||
|
|
||||||
override fun getShort(needsGlobal: Boolean): Short = NativeConfig.getShort(key, needsGlobal)
|
override fun getShort(needsGlobal: Boolean): Short = NativeConfig.getShort(key, needsGlobal)
|
||||||
|
|
@ -28,4 +29,4 @@ enum class ShortSetting(override val key: String) : AbstractShortSetting {
|
||||||
override fun getValueAsString(needsGlobal: Boolean): String = getShort(needsGlobal).toString()
|
override fun getValueAsString(needsGlobal: Boolean): String = getShort(needsGlobal).toString()
|
||||||
|
|
||||||
override fun reset() = NativeConfig.setShort(key, defaultValue)
|
override fun reset() = NativeConfig.setShort(key, defaultValue)
|
||||||
}
|
}
|
||||||
|
|
@ -378,6 +378,13 @@ abstract class SettingsItem(
|
||||||
warningMessage = R.string.warning_resolution
|
warningMessage = R.string.warning_resolution
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.INVERT_CONFIRM_BACK_CONTROLLER_BUTTONS,
|
||||||
|
titleId = R.string.invert_confirm_back_controller_buttons,
|
||||||
|
descriptionId = R.string.invert_confirm_back_controller_buttons_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.SHOW_INPUT_OVERLAY,
|
BooleanSetting.SHOW_INPUT_OVERLAY,
|
||||||
|
|
@ -788,6 +795,13 @@ abstract class SettingsItem(
|
||||||
descriptionId = R.string.enable_buffer_history_description
|
descriptionId = R.string.enable_buffer_history_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS,
|
||||||
|
titleId = R.string.use_optimized_vertex_buffers,
|
||||||
|
descriptionId = R.string.use_optimized_vertex_buffers_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.SYNC_MEMORY_OPERATIONS,
|
BooleanSetting.SYNC_MEMORY_OPERATIONS,
|
||||||
|
|
@ -896,7 +910,7 @@ abstract class SettingsItem(
|
||||||
)
|
)
|
||||||
put(
|
put(
|
||||||
SpinBoxSetting(
|
SpinBoxSetting(
|
||||||
IntSetting.DEBUG_KNOBS,
|
ShortSetting.DEBUG_KNOBS,
|
||||||
titleId = R.string.debug_knobs,
|
titleId = R.string.debug_knobs,
|
||||||
descriptionId = R.string.debug_knobs_description,
|
descriptionId = R.string.debug_knobs_description,
|
||||||
valueHint = R.string.debug_knobs_hint,
|
valueHint = R.string.debug_knobs_hint,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
|
@ -111,10 +111,18 @@ class SettingsActivity : AppCompatActivity() {
|
||||||
if (navHostFragment.childFragmentManager.backStackEntryCount > 0) {
|
if (navHostFragment.childFragmentManager.backStackEntryCount > 0) {
|
||||||
navHostFragment.navController.popBackStack()
|
navHostFragment.navController.popBackStack()
|
||||||
} else {
|
} else {
|
||||||
finish()
|
finishWithFragmentLikeAnimation()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun finishWithFragmentLikeAnimation() {
|
||||||
|
finish()
|
||||||
|
overridePendingTransition(
|
||||||
|
androidx.navigation.ui.R.anim.nav_default_pop_enter_anim,
|
||||||
|
androidx.navigation.ui.R.anim.nav_default_pop_exit_anim
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
super.onStart()
|
super.onStart()
|
||||||
if (!DirectoryInitialization.areDirectoriesReady) {
|
if (!DirectoryInitialization.areDirectoriesReady) {
|
||||||
|
|
@ -170,7 +178,7 @@ class SettingsActivity : AppCompatActivity() {
|
||||||
getString(R.string.settings_reset),
|
getString(R.string.settings_reset),
|
||||||
Toast.LENGTH_LONG
|
Toast.LENGTH_LONG
|
||||||
).show()
|
).show()
|
||||||
finish()
|
finishWithFragmentLikeAnimation()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setInsets() {
|
private fun setInsets() {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
|
@ -68,7 +68,9 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
|
||||||
MaterialAlertDialogBuilder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setMessage(R.string.reset_setting_confirmation)
|
.setMessage(R.string.reset_setting_confirmation)
|
||||||
.setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int ->
|
.setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int ->
|
||||||
when (val item = settingsViewModel.clickedItem) {
|
val item = settingsViewModel.clickedItem ?: return@setPositiveButton
|
||||||
|
clearDialogState()
|
||||||
|
when (item) {
|
||||||
is AnalogInputSetting -> {
|
is AnalogInputSetting -> {
|
||||||
val stickParam = NativeInput.getStickParam(
|
val stickParam = NativeInput.getStickParam(
|
||||||
item.playerIndex,
|
item.playerIndex,
|
||||||
|
|
@ -107,12 +109,17 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
settingsViewModel.clickedItem!!.setting.reset()
|
item.setting.reset()
|
||||||
settingsViewModel.setAdapterItemChanged(position)
|
settingsViewModel.setAdapterItemChanged(position)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel) { _: DialogInterface, _: Int ->
|
||||||
|
clearDialogState()
|
||||||
|
}
|
||||||
|
.setOnCancelListener {
|
||||||
|
clearDialogState()
|
||||||
|
}
|
||||||
.create()
|
.create()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -186,27 +193,6 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
|
||||||
updateButtonState(isValid)
|
updateButtonState(isValid)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* xbzk: these two events, along with attachRepeat feature,
|
|
||||||
* were causing spinbox buttons to respond twice per press
|
|
||||||
* cutting these out to retain accelerated press functionality
|
|
||||||
* TODO: clean this out later if no issues arise
|
|
||||||
*
|
|
||||||
spinboxBinding.buttonDecrement.setOnClickListener {
|
|
||||||
val current = spinboxBinding.editValue.text.toString().toIntOrNull() ?: currentValue
|
|
||||||
val newValue = current - 1
|
|
||||||
spinboxBinding.editValue.setText(newValue.toString())
|
|
||||||
updateValidity(newValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
spinboxBinding.buttonIncrement.setOnClickListener {
|
|
||||||
val current = spinboxBinding.editValue.text.toString().toIntOrNull() ?: currentValue
|
|
||||||
val newValue = current + 1
|
|
||||||
spinboxBinding.editValue.setText(newValue.toString())
|
|
||||||
updateValidity(newValue)
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
fun attachRepeat(button: View, delta: Int) {
|
fun attachRepeat(button: View, delta: Int) {
|
||||||
val handler = Handler(Looper.getMainLooper())
|
val handler = Handler(Looper.getMainLooper())
|
||||||
var runnable: Runnable? = null
|
var runnable: Runnable? = null
|
||||||
|
|
@ -439,9 +425,13 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
|
||||||
|
|
||||||
private fun closeDialog() {
|
private fun closeDialog() {
|
||||||
settingsViewModel.setAdapterItemChanged(position)
|
settingsViewModel.setAdapterItemChanged(position)
|
||||||
|
clearDialogState()
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun clearDialogState() {
|
||||||
settingsViewModel.clickedItem = null
|
settingsViewModel.clickedItem = null
|
||||||
settingsViewModel.setSliderProgress(-1f)
|
settingsViewModel.setSliderProgress(-1f)
|
||||||
dismiss()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getValueForSingleChoiceSelection(item: SingleChoiceSetting, which: Int): Int {
|
private fun getValueForSingleChoiceSelection(item: SingleChoiceSetting, which: Int): Int {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
|
@ -98,23 +98,8 @@ class SettingsFragment : Fragment() {
|
||||||
activity
|
activity
|
||||||
)
|
)
|
||||||
|
|
||||||
binding.toolbarSettingsLayout.title = if (args.menuTag == Settings.MenuTag.SECTION_ROOT &&
|
val toolbarTitle = resolveToolbarTitle()
|
||||||
args.game != null
|
configureToolbar(toolbarTitle)
|
||||||
) {
|
|
||||||
args.game!!.title
|
|
||||||
} else {
|
|
||||||
when (args.menuTag) {
|
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_ONE -> Settings.getPlayerString(1)
|
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_TWO -> Settings.getPlayerString(2)
|
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_THREE -> Settings.getPlayerString(3)
|
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_FOUR -> Settings.getPlayerString(4)
|
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_FIVE -> Settings.getPlayerString(5)
|
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_SIX -> Settings.getPlayerString(6)
|
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_SEVEN -> Settings.getPlayerString(7)
|
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_EIGHT -> Settings.getPlayerString(8)
|
|
||||||
else -> getString(args.menuTag.titleId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
binding.listSettings.apply {
|
binding.listSettings.apply {
|
||||||
adapter = settingsAdapter
|
adapter = settingsAdapter
|
||||||
|
|
@ -193,11 +178,9 @@ class SettingsFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
presenter.onViewCreated()
|
presenter.onViewCreated()
|
||||||
|
|
||||||
setInsets()
|
setInsets()
|
||||||
}
|
}
|
||||||
|
private fun getPlayerIndex(): Int =
|
||||||
private fun getPlayerIndex(): Int =
|
|
||||||
when (args.menuTag) {
|
when (args.menuTag) {
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_ONE -> 0
|
Settings.MenuTag.SECTION_INPUT_PLAYER_ONE -> 0
|
||||||
Settings.MenuTag.SECTION_INPUT_PLAYER_TWO -> 1
|
Settings.MenuTag.SECTION_INPUT_PLAYER_TWO -> 1
|
||||||
|
|
@ -210,6 +193,27 @@ class SettingsFragment : Fragment() {
|
||||||
else -> -1
|
else -> -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun resolveToolbarTitle(): String {
|
||||||
|
if (args.menuTag == Settings.MenuTag.SECTION_ROOT && args.game != null) {
|
||||||
|
return args.game!!.title
|
||||||
|
}
|
||||||
|
return when (args.menuTag) {
|
||||||
|
Settings.MenuTag.SECTION_INPUT_PLAYER_ONE -> Settings.getPlayerString(1)
|
||||||
|
Settings.MenuTag.SECTION_INPUT_PLAYER_TWO -> Settings.getPlayerString(2)
|
||||||
|
Settings.MenuTag.SECTION_INPUT_PLAYER_THREE -> Settings.getPlayerString(3)
|
||||||
|
Settings.MenuTag.SECTION_INPUT_PLAYER_FOUR -> Settings.getPlayerString(4)
|
||||||
|
Settings.MenuTag.SECTION_INPUT_PLAYER_FIVE -> Settings.getPlayerString(5)
|
||||||
|
Settings.MenuTag.SECTION_INPUT_PLAYER_SIX -> Settings.getPlayerString(6)
|
||||||
|
Settings.MenuTag.SECTION_INPUT_PLAYER_SEVEN -> Settings.getPlayerString(7)
|
||||||
|
Settings.MenuTag.SECTION_INPUT_PLAYER_EIGHT -> Settings.getPlayerString(8)
|
||||||
|
else -> getString(args.menuTag.titleId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun configureToolbar(title: String) {
|
||||||
|
binding.toolbarSettings.title = title
|
||||||
|
}
|
||||||
|
|
||||||
private fun setInsets() {
|
private fun setInsets() {
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(
|
ViewCompat.setOnApplyWindowInsetsListener(
|
||||||
binding.root
|
binding.root
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ package org.yuzu.yuzu_emu.features.settings.ui
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.preference.PreferenceManager
|
|
||||||
import org.yuzu.yuzu_emu.NativeLibrary
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.YuzuApplication
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
|
|
@ -27,11 +26,9 @@ import org.yuzu.yuzu_emu.features.settings.model.Settings.MenuTag
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.ShortSetting
|
import org.yuzu.yuzu_emu.features.settings.model.ShortSetting
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.StringSetting
|
import org.yuzu.yuzu_emu.features.settings.model.StringSetting
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.*
|
import org.yuzu.yuzu_emu.features.settings.model.view.*
|
||||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
|
||||||
import org.yuzu.yuzu_emu.utils.InputHandler
|
import org.yuzu.yuzu_emu.utils.InputHandler
|
||||||
import org.yuzu.yuzu_emu.utils.NativeConfig
|
import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||||
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
||||||
import androidx.core.content.edit
|
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
|
import org.yuzu.yuzu_emu.fragments.MessageDialogFragment
|
||||||
|
|
||||||
|
|
@ -183,16 +180,6 @@ class SettingsFragmentPresenter(
|
||||||
menuKey = MenuTag.SECTION_DEBUG
|
menuKey = MenuTag.SECTION_DEBUG
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if (GpuDriverHelper.isAdrenoGpu() && !NativeConfig.isPerGameConfigLoaded()) {
|
|
||||||
add(
|
|
||||||
SubmenuSetting(
|
|
||||||
titleId = R.string.gpu_driver_settings,
|
|
||||||
descriptionId = R.string.freedreno_settings_title,
|
|
||||||
iconId = R.drawable.ic_graphics,
|
|
||||||
menuKey = MenuTag.SECTION_FREEDRENO
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
add(
|
add(
|
||||||
SubmenuSetting(
|
SubmenuSetting(
|
||||||
titleId = R.string.applets_menu,
|
titleId = R.string.applets_menu,
|
||||||
|
|
@ -278,6 +265,7 @@ class SettingsFragmentPresenter(
|
||||||
add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
|
add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
|
||||||
add(BooleanSetting.RENDERER_REACTIVE_FLUSHING.key)
|
add(BooleanSetting.RENDERER_REACTIVE_FLUSHING.key)
|
||||||
add(BooleanSetting.ENABLE_BUFFER_HISTORY.key)
|
add(BooleanSetting.ENABLE_BUFFER_HISTORY.key)
|
||||||
|
add(BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS.key)
|
||||||
|
|
||||||
add(HeaderSetting(R.string.hacks))
|
add(HeaderSetting(R.string.hacks))
|
||||||
|
|
||||||
|
|
@ -1065,7 +1053,10 @@ class SettingsFragmentPresenter(
|
||||||
IntSetting.THEME.getValueAsString()
|
IntSetting.THEME.getValueAsString()
|
||||||
|
|
||||||
override val defaultValue: Int = IntSetting.THEME.defaultValue
|
override val defaultValue: Int = IntSetting.THEME.defaultValue
|
||||||
override fun reset() = IntSetting.THEME.setInt(defaultValue)
|
override fun reset() {
|
||||||
|
IntSetting.THEME.setInt(defaultValue)
|
||||||
|
settingsViewModel.setShouldRecreate(true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
add(HeaderSetting(R.string.app_settings))
|
add(HeaderSetting(R.string.app_settings))
|
||||||
|
|
@ -1076,30 +1067,10 @@ class SettingsFragmentPresenter(
|
||||||
}
|
}
|
||||||
|
|
||||||
add(BooleanSetting.ENABLE_QUICK_SETTINGS.key)
|
add(BooleanSetting.ENABLE_QUICK_SETTINGS.key)
|
||||||
|
add(BooleanSetting.INVERT_CONFIRM_BACK_CONTROLLER_BUTTONS.key)
|
||||||
|
|
||||||
add(HeaderSetting(R.string.theme_and_color))
|
add(HeaderSetting(R.string.theme_and_color))
|
||||||
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
|
||||||
add(
|
|
||||||
SingleChoiceSetting(
|
|
||||||
theme,
|
|
||||||
titleId = R.string.change_app_theme,
|
|
||||||
choicesId = R.array.themeEntriesA12,
|
|
||||||
valuesId = R.array.themeValuesA12
|
|
||||||
)
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
add(
|
|
||||||
SingleChoiceSetting(
|
|
||||||
theme,
|
|
||||||
titleId = R.string.change_app_theme,
|
|
||||||
choicesId = R.array.themeEntries,
|
|
||||||
valuesId = R.array.themeValues
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val themeMode: AbstractIntSetting = object : AbstractIntSetting {
|
val themeMode: AbstractIntSetting = object : AbstractIntSetting {
|
||||||
override fun getInt(needsGlobal: Boolean): Int = IntSetting.THEME_MODE.getInt()
|
override fun getInt(needsGlobal: Boolean): Int = IntSetting.THEME_MODE.getInt()
|
||||||
override fun setInt(value: Int) {
|
override fun setInt(value: Int) {
|
||||||
|
|
@ -1121,28 +1092,6 @@ class SettingsFragmentPresenter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val staticThemeColor: AbstractIntSetting = object : AbstractIntSetting {
|
|
||||||
val preferences = PreferenceManager.getDefaultSharedPreferences(
|
|
||||||
YuzuApplication.appContext
|
|
||||||
)
|
|
||||||
override fun getInt(needsGlobal: Boolean): Int =
|
|
||||||
preferences.getInt(Settings.PREF_STATIC_THEME_COLOR, 0)
|
|
||||||
override fun setInt(value: Int) {
|
|
||||||
preferences.edit() { putInt(Settings.PREF_STATIC_THEME_COLOR, value) }
|
|
||||||
settingsViewModel.setShouldRecreate(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
override val key: String = Settings.PREF_STATIC_THEME_COLOR
|
|
||||||
override val isRuntimeModifiable: Boolean = true
|
|
||||||
override fun getValueAsString(needsGlobal: Boolean): String =
|
|
||||||
preferences.getInt(Settings.PREF_STATIC_THEME_COLOR, 0).toString()
|
|
||||||
override val defaultValue: Any = 0
|
|
||||||
override fun reset() {
|
|
||||||
preferences.edit() { putInt(Settings.PREF_STATIC_THEME_COLOR, 0) }
|
|
||||||
settingsViewModel.setShouldRecreate(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
add(
|
add(
|
||||||
SingleChoiceSetting(
|
SingleChoiceSetting(
|
||||||
themeMode,
|
themeMode,
|
||||||
|
|
@ -1152,6 +1101,49 @@ class SettingsFragmentPresenter(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
add(
|
||||||
|
SingleChoiceSetting(
|
||||||
|
theme,
|
||||||
|
titleId = R.string.change_app_theme,
|
||||||
|
choicesId = R.array.themeEntriesA12,
|
||||||
|
valuesId = R.array.themeValuesA12
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
add(
|
||||||
|
SingleChoiceSetting(
|
||||||
|
theme,
|
||||||
|
titleId = R.string.change_app_theme,
|
||||||
|
choicesId = R.array.themeEntries,
|
||||||
|
valuesId = R.array.themeValues
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val staticThemeColor: AbstractIntSetting = object : AbstractIntSetting {
|
||||||
|
override fun getInt(needsGlobal: Boolean): Int =
|
||||||
|
IntSetting.STATIC_THEME_COLOR.getInt(needsGlobal)
|
||||||
|
|
||||||
|
override fun setInt(value: Int) {
|
||||||
|
IntSetting.STATIC_THEME_COLOR.setInt(value)
|
||||||
|
settingsViewModel.setShouldRecreate(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override val key: String = IntSetting.STATIC_THEME_COLOR.key
|
||||||
|
override val isRuntimeModifiable: Boolean = true
|
||||||
|
|
||||||
|
override fun getValueAsString(needsGlobal: Boolean): String =
|
||||||
|
IntSetting.STATIC_THEME_COLOR.getValueAsString(needsGlobal)
|
||||||
|
|
||||||
|
override val defaultValue: Any = IntSetting.STATIC_THEME_COLOR.defaultValue
|
||||||
|
|
||||||
|
override fun reset() {
|
||||||
|
IntSetting.STATIC_THEME_COLOR.reset()
|
||||||
|
settingsViewModel.setShouldRecreate(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (IntSetting.THEME.getInt() != 1) {
|
if (IntSetting.THEME.getInt() != 1) {
|
||||||
add(
|
add(
|
||||||
SingleChoiceSetting(
|
SingleChoiceSetting(
|
||||||
|
|
@ -1229,7 +1221,7 @@ class SettingsFragmentPresenter(
|
||||||
|
|
||||||
add(HeaderSetting(R.string.general))
|
add(HeaderSetting(R.string.general))
|
||||||
|
|
||||||
add(IntSetting.DEBUG_KNOBS.key)
|
add(ShortSetting.DEBUG_KNOBS.key)
|
||||||
|
|
||||||
add(HeaderSetting(R.string.gpu_logging_header))
|
add(HeaderSetting(R.string.gpu_logging_header))
|
||||||
add(BooleanSetting.GPU_LOGGING_ENABLED.key)
|
add(BooleanSetting.GPU_LOGGING_ENABLED.key)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.fragments
|
package org.yuzu.yuzu_emu.fragments
|
||||||
|
|
@ -54,8 +51,8 @@ class AboutFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
homeViewModel.setStatusBarShadeVisibility(visible = false)
|
homeViewModel.setStatusBarShadeVisibility(visible = false)
|
||||||
|
|
||||||
binding.toolbarAbout.setNavigationOnClickListener {
|
binding.toolbarAbout.setNavigationOnClickListener {
|
||||||
binding.root.findNavController().popBackStack()
|
binding.root.findNavController().popBackStack()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.fragments
|
package org.yuzu.yuzu_emu.fragments
|
||||||
|
|
@ -19,7 +19,6 @@ import androidx.navigation.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import com.google.android.material.transition.MaterialSharedAxis
|
import com.google.android.material.transition.MaterialSharedAxis
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.adapters.AddonAdapter
|
import org.yuzu.yuzu_emu.adapters.AddonAdapter
|
||||||
import org.yuzu.yuzu_emu.databinding.FragmentAddonsBinding
|
import org.yuzu.yuzu_emu.databinding.FragmentAddonsBinding
|
||||||
|
|
@ -42,7 +41,7 @@ class AddonsFragment : Fragment() {
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
addonViewModel.onOpenAddons(args.game)
|
addonViewModel.onAddonsViewCreated(args.game)
|
||||||
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
|
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
|
||||||
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
||||||
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
|
||||||
|
|
@ -122,12 +121,14 @@ class AddonsFragment : Fragment() {
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
addonViewModel.refreshAddons()
|
addonViewModel.onAddonsViewStarted(args.game)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
|
if (activity?.isChangingConfigurations != true) {
|
||||||
|
addonViewModel.onCloseAddons()
|
||||||
|
}
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
addonViewModel.onCloseAddons()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val installAddon =
|
val installAddon =
|
||||||
|
|
@ -167,7 +168,7 @@ class AddonsFragment : Fragment() {
|
||||||
} catch (_: Exception) {
|
} catch (_: Exception) {
|
||||||
return@newInstance errorMessage
|
return@newInstance errorMessage
|
||||||
}
|
}
|
||||||
addonViewModel.refreshAddons()
|
addonViewModel.refreshAddons(force = true)
|
||||||
return@newInstance getString(R.string.addon_installed_successfully)
|
return@newInstance getString(R.string.addon_installed_successfully)
|
||||||
}.show(parentFragmentManager, ProgressDialogFragment.TAG)
|
}.show(parentFragmentManager, ProgressDialogFragment.TAG)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.databinding.FragmentDriverFetcherBinding
|
import org.yuzu.yuzu_emu.databinding.FragmentDriverFetcherBinding
|
||||||
import org.yuzu.yuzu_emu.features.fetcher.DriverGroupAdapter
|
import org.yuzu.yuzu_emu.features.fetcher.DriverGroupAdapter
|
||||||
import org.yuzu.yuzu_emu.model.DriverViewModel
|
import org.yuzu.yuzu_emu.model.DriverViewModel
|
||||||
|
import org.yuzu.yuzu_emu.model.HomeViewModel
|
||||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||||
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
|
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
@ -87,6 +88,7 @@ class DriverFetcherFragment : Fragment() {
|
||||||
|
|
||||||
private lateinit var driverGroupAdapter: DriverGroupAdapter
|
private lateinit var driverGroupAdapter: DriverGroupAdapter
|
||||||
private val driverViewModel: DriverViewModel by activityViewModels()
|
private val driverViewModel: DriverViewModel by activityViewModels()
|
||||||
|
private val homeViewModel: HomeViewModel by activityViewModels()
|
||||||
|
|
||||||
private fun parseAdrenoModel(): Int {
|
private fun parseAdrenoModel(): Int {
|
||||||
if (gpuModel == null) {
|
if (gpuModel == null) {
|
||||||
|
|
@ -138,7 +140,7 @@ class DriverFetcherFragment : Fragment() {
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
homeViewModel.setStatusBarShadeVisibility(visible = false)
|
||||||
binding.toolbarDrivers.setNavigationOnClickListener {
|
binding.toolbarDrivers.setNavigationOnClickListener {
|
||||||
binding.root.findNavController().popBackStack()
|
binding.root.findNavController().popBackStack()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import android.content.pm.ActivityInfo
|
import android.content.pm.ActivityInfo
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
|
import android.graphics.Bitmap
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.BatteryManager
|
import android.os.BatteryManager
|
||||||
import android.os.BatteryManager.*
|
import android.os.BatteryManager.*
|
||||||
|
|
@ -97,6 +98,7 @@ import org.yuzu.yuzu_emu.utils.collect
|
||||||
import org.yuzu.yuzu_emu.utils.CustomSettingsHandler
|
import org.yuzu.yuzu_emu.utils.CustomSettingsHandler
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.nio.ByteBuffer
|
||||||
import kotlin.coroutines.resume
|
import kotlin.coroutines.resume
|
||||||
import kotlin.coroutines.suspendCoroutine
|
import kotlin.coroutines.suspendCoroutine
|
||||||
import kotlin.or
|
import kotlin.or
|
||||||
|
|
@ -141,6 +143,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
|
|
||||||
private var wasInputOverlayAutoHidden = false
|
private var wasInputOverlayAutoHidden = false
|
||||||
private var overlayTouchActive = false
|
private var overlayTouchActive = false
|
||||||
|
private var pausedFrameBitmap: Bitmap? = null
|
||||||
|
|
||||||
var shouldUseCustom = false
|
var shouldUseCustom = false
|
||||||
private var isQuickSettingsMenuOpen = false
|
private var isQuickSettingsMenuOpen = false
|
||||||
|
|
@ -703,6 +706,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
binding.inGameMenu.menu.findItem(R.id.menu_quick_settings)?.isVisible =
|
binding.inGameMenu.menu.findItem(R.id.menu_quick_settings)?.isVisible =
|
||||||
BooleanSetting.ENABLE_QUICK_SETTINGS.getBoolean()
|
BooleanSetting.ENABLE_QUICK_SETTINGS.getBoolean()
|
||||||
|
|
||||||
|
binding.pausedIcon.setOnClickListener {
|
||||||
|
if (this::emulationState.isInitialized && emulationState.isPaused) {
|
||||||
|
resumeEmulationFromUi()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
binding.inGameMenu.menu.findItem(R.id.menu_lock_drawer).apply {
|
binding.inGameMenu.menu.findItem(R.id.menu_lock_drawer).apply {
|
||||||
val lockMode = IntSetting.LOCK_DRAWER.getInt()
|
val lockMode = IntSetting.LOCK_DRAWER.getInt()
|
||||||
val titleId = if (lockMode == DrawerLayout.LOCK_MODE_LOCKED_CLOSED) {
|
val titleId = if (lockMode == DrawerLayout.LOCK_MODE_LOCKED_CLOSED) {
|
||||||
|
|
@ -728,11 +737,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
when (it.itemId) {
|
when (it.itemId) {
|
||||||
R.id.menu_pause_emulation -> {
|
R.id.menu_pause_emulation -> {
|
||||||
if (emulationState.isPaused) {
|
if (emulationState.isPaused) {
|
||||||
emulationState.run(false)
|
resumeEmulationFromUi()
|
||||||
updatePauseMenuEntry(false)
|
|
||||||
} else {
|
} else {
|
||||||
emulationState.pause()
|
pauseEmulationAndCaptureFrame()
|
||||||
updatePauseMenuEntry(true)
|
|
||||||
}
|
}
|
||||||
binding.inGameMenu.requestFocus()
|
binding.inGameMenu.requestFocus()
|
||||||
true
|
true
|
||||||
|
|
@ -826,6 +833,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.menu_exit -> {
|
R.id.menu_exit -> {
|
||||||
|
clearPausedFrame()
|
||||||
emulationState.stop()
|
emulationState.stop()
|
||||||
NativeConfig.reloadGlobalConfig()
|
NativeConfig.reloadGlobalConfig()
|
||||||
emulationViewModel.setIsEmulationStopping(true)
|
emulationViewModel.setIsEmulationStopping(true)
|
||||||
|
|
@ -1197,6 +1205,71 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun pauseEmulationAndCaptureFrame() {
|
||||||
|
emulationState.pause()
|
||||||
|
updatePauseMenuEntry(true)
|
||||||
|
capturePausedFrameFromCore()
|
||||||
|
updatePausedFrameVisibility()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun capturePausedFrameFromCore() {
|
||||||
|
lifecycleScope.launch(Dispatchers.Default) {
|
||||||
|
val frameData = NativeLibrary.getAppletCaptureBuffer()
|
||||||
|
val width = NativeLibrary.getAppletCaptureWidth()
|
||||||
|
val height = NativeLibrary.getAppletCaptureHeight()
|
||||||
|
if (frameData.isEmpty() || width <= 0 || height <= 0) {
|
||||||
|
Log.warning(
|
||||||
|
"[EmulationFragment] Paused frame capture returned empty/invalid data. " +
|
||||||
|
"size=${frameData.size}, width=$width, height=$height"
|
||||||
|
)
|
||||||
|
return@launch
|
||||||
|
}
|
||||||
|
|
||||||
|
val expectedSize = width * height * 4
|
||||||
|
if (frameData.size < expectedSize) {
|
||||||
|
Log.warning(
|
||||||
|
"[EmulationFragment] Paused frame buffer smaller than expected. " +
|
||||||
|
"size=${frameData.size}, expected=$expectedSize"
|
||||||
|
)
|
||||||
|
return@launch
|
||||||
|
}
|
||||||
|
|
||||||
|
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
||||||
|
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(frameData, 0, expectedSize))
|
||||||
|
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
pausedFrameBitmap?.recycle()
|
||||||
|
pausedFrameBitmap = bitmap
|
||||||
|
updatePausedFrameVisibility()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updatePausedFrameVisibility() {
|
||||||
|
val b = _binding ?: return
|
||||||
|
val showPausedUi = this::emulationState.isInitialized && emulationState.isPaused
|
||||||
|
b.pausedIcon.setVisible(showPausedUi)
|
||||||
|
|
||||||
|
val bitmap = if (showPausedUi) pausedFrameBitmap else null
|
||||||
|
b.pausedFrameImage.setImageBitmap(bitmap)
|
||||||
|
b.pausedFrameImage.setVisible(bitmap != null)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun resumeEmulationFromUi() {
|
||||||
|
clearPausedFrame()
|
||||||
|
emulationState.resume()
|
||||||
|
updatePauseMenuEntry(emulationState.isPaused)
|
||||||
|
updatePausedFrameVisibility()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun clearPausedFrame() {
|
||||||
|
val b = _binding
|
||||||
|
b?.pausedFrameImage?.setVisible(false)
|
||||||
|
b?.pausedFrameImage?.setImageDrawable(null)
|
||||||
|
pausedFrameBitmap?.recycle()
|
||||||
|
pausedFrameBitmap = null
|
||||||
|
}
|
||||||
|
|
||||||
private fun handleLoadAmiiboSelection(): Boolean {
|
private fun handleLoadAmiiboSelection(): Boolean {
|
||||||
val binding = _binding ?: return true
|
val binding = _binding ?: return true
|
||||||
|
|
||||||
|
|
@ -1290,8 +1363,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
if (this::emulationState.isInitialized) {
|
if (this::emulationState.isInitialized) {
|
||||||
if (emulationState.isRunning && emulationActivity?.isInPictureInPictureMode != true) {
|
if (emulationState.isRunning && emulationActivity?.isInPictureInPictureMode != true) {
|
||||||
emulationState.pause()
|
pauseEmulationAndCaptureFrame()
|
||||||
updatePauseMenuEntry(true)
|
} else {
|
||||||
|
updatePausedFrameVisibility()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super.onPause()
|
super.onPause()
|
||||||
|
|
@ -1301,6 +1375,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
amiiboLoadJob?.cancel()
|
amiiboLoadJob?.cancel()
|
||||||
amiiboLoadJob = null
|
amiiboLoadJob = null
|
||||||
|
clearPausedFrame()
|
||||||
_binding?.surfaceInputOverlay?.touchEventListener = null
|
_binding?.surfaceInputOverlay?.touchEventListener = null
|
||||||
_binding = null
|
_binding = null
|
||||||
isAmiiboPickerOpen = false
|
isAmiiboPickerOpen = false
|
||||||
|
|
@ -1321,6 +1396,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
b.inGameMenu.post {
|
b.inGameMenu.post {
|
||||||
if (!this::emulationState.isInitialized || _binding == null) return@post
|
if (!this::emulationState.isInitialized || _binding == null) return@post
|
||||||
updatePauseMenuEntry(emulationState.isPaused)
|
updatePauseMenuEntry(emulationState.isPaused)
|
||||||
|
updatePausedFrameVisibility()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1760,6 +1836,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
// Only update surface reference, don't trigger state changes
|
// Only update surface reference, don't trigger state changes
|
||||||
emulationState.updateSurfaceReference(holder.surface)
|
emulationState.updateSurfaceReference(holder.surface)
|
||||||
}
|
}
|
||||||
|
updatePausedFrameVisibility()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun surfaceDestroyed(holder: SurfaceHolder) {
|
override fun surfaceDestroyed(holder: SurfaceHolder) {
|
||||||
|
|
@ -2090,6 +2167,29 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
fun resume() {
|
||||||
|
if (state != State.PAUSED) {
|
||||||
|
Log.warning("[EmulationFragment] Resume called while emulation is not paused.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!emulationCanStart.invoke()) {
|
||||||
|
Log.warning("[EmulationFragment] Resume blocked by emulationCanStart check.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val currentSurface = surface
|
||||||
|
if (currentSurface == null || !currentSurface.isValid) {
|
||||||
|
Log.debug("[EmulationFragment] Resume requested with invalid surface.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
NativeLibrary.surfaceChanged(currentSurface)
|
||||||
|
Log.debug("[EmulationFragment] Resuming emulation.")
|
||||||
|
NativeLibrary.unpauseEmulation()
|
||||||
|
NativeLibrary.playTimeManagerStart()
|
||||||
|
state = State.RUNNING
|
||||||
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun changeProgram(programIndex: Int) {
|
fun changeProgram(programIndex: Int) {
|
||||||
emulationThread.join()
|
emulationThread.join()
|
||||||
|
|
@ -2111,7 +2211,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun updateSurface() {
|
fun updateSurface() {
|
||||||
if (surface != null) {
|
if (surface != null && state == State.RUNNING) {
|
||||||
NativeLibrary.surfaceChanged(surface)
|
NativeLibrary.surfaceChanged(surface)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2127,20 +2227,20 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun clearSurface() {
|
fun clearSurface() {
|
||||||
if (surface == null) {
|
if (surface == null) {
|
||||||
Log.warning("[EmulationFragment] clearSurface called, but surface already null.")
|
Log.debug("[EmulationFragment] clearSurface called, but surface already null.")
|
||||||
} else {
|
} else {
|
||||||
|
if (state == State.RUNNING) {
|
||||||
|
pause()
|
||||||
|
}
|
||||||
|
NativeLibrary.surfaceDestroyed()
|
||||||
surface = null
|
surface = null
|
||||||
Log.debug("[EmulationFragment] Surface destroyed.")
|
Log.debug("[EmulationFragment] Surface destroyed.")
|
||||||
when (state) {
|
when (state) {
|
||||||
State.RUNNING -> {
|
State.PAUSED -> Log.debug(
|
||||||
state = State.PAUSED
|
|
||||||
}
|
|
||||||
|
|
||||||
State.PAUSED -> Log.warning(
|
|
||||||
"[EmulationFragment] Surface cleared while emulation paused."
|
"[EmulationFragment] Surface cleared while emulation paused."
|
||||||
)
|
)
|
||||||
|
|
||||||
else -> Log.warning(
|
else -> Log.debug(
|
||||||
"[EmulationFragment] Surface cleared while emulation stopped."
|
"[EmulationFragment] Surface cleared while emulation stopped."
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -2148,29 +2248,35 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun runWithValidSurface(programIndex: Int = 0) {
|
private fun runWithValidSurface(programIndex: Int = 0) {
|
||||||
NativeLibrary.surfaceChanged(surface)
|
|
||||||
if (!emulationCanStart.invoke()) {
|
if (!emulationCanStart.invoke()) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
val currentSurface = surface
|
||||||
|
if (currentSurface == null || !currentSurface.isValid) {
|
||||||
|
Log.debug("[EmulationFragment] runWithValidSurface called with invalid surface.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
when (state) {
|
when (state) {
|
||||||
State.STOPPED -> {
|
State.STOPPED -> {
|
||||||
|
NativeLibrary.surfaceChanged(currentSurface)
|
||||||
emulationThread = Thread({
|
emulationThread = Thread({
|
||||||
Log.debug("[EmulationFragment] Starting emulation thread.")
|
Log.debug("[EmulationFragment] Starting emulation thread.")
|
||||||
NativeLibrary.run(gamePath, programIndex, true)
|
NativeLibrary.run(gamePath, programIndex, true)
|
||||||
}, "NativeEmulation")
|
}, "NativeEmulation")
|
||||||
emulationThread.start()
|
emulationThread.start()
|
||||||
|
state = State.RUNNING
|
||||||
}
|
}
|
||||||
|
|
||||||
State.PAUSED -> {
|
State.PAUSED -> {
|
||||||
Log.debug("[EmulationFragment] Resuming emulation.")
|
Log.debug(
|
||||||
NativeLibrary.unpauseEmulation()
|
"[EmulationFragment] Surface restored while emulation paused; " +
|
||||||
NativeLibrary.playTimeManagerStart()
|
"waiting for explicit resume."
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> Log.debug("[EmulationFragment] Bug, run called while already running.")
|
else -> Log.debug("[EmulationFragment] Bug, run called while already running.")
|
||||||
}
|
}
|
||||||
state = State.RUNNING
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum class State {
|
private enum class State {
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentFreedrenoSettingsBinding
|
||||||
import org.yuzu.yuzu_emu.model.Game
|
import org.yuzu.yuzu_emu.model.Game
|
||||||
import org.yuzu.yuzu_emu.utils.NativeFreedrenoConfig
|
import org.yuzu.yuzu_emu.utils.NativeFreedrenoConfig
|
||||||
import org.yuzu.yuzu_emu.utils.FreedrenoPresets
|
import org.yuzu.yuzu_emu.utils.FreedrenoPresets
|
||||||
|
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
|
||||||
|
|
||||||
|
|
||||||
class FreedrenoSettingsFragment : Fragment() {
|
class FreedrenoSettingsFragment : Fragment() {
|
||||||
|
|
@ -74,10 +75,15 @@ class FreedrenoSettingsFragment : Fragment() {
|
||||||
binding.toolbarFreedreno.setNavigationOnClickListener {
|
binding.toolbarFreedreno.setNavigationOnClickListener {
|
||||||
requireActivity().onBackPressedDispatcher.onBackPressed()
|
requireActivity().onBackPressedDispatcher.onBackPressed()
|
||||||
}
|
}
|
||||||
if (isPerGameConfig) {
|
|
||||||
binding.toolbarFreedreno.title = getString(R.string.freedreno_per_game_title)
|
binding.toolbarFreedreno.title = getString(
|
||||||
binding.toolbarFreedreno.subtitle = game!!.title
|
if (isPerGameConfig) {
|
||||||
}
|
R.string.freedreno_per_game_title
|
||||||
|
} else {
|
||||||
|
R.string.freedreno_settings_title
|
||||||
|
}
|
||||||
|
)
|
||||||
|
binding.toolbarFreedreno.subtitle = null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupAdapters() {
|
private fun setupAdapters() {
|
||||||
|
|
@ -175,17 +181,19 @@ class FreedrenoSettingsFragment : Fragment() {
|
||||||
|
|
||||||
private fun setupWindowInsets() {
|
private fun setupWindowInsets() {
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->
|
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->
|
||||||
val systemInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
val barInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||||
binding.root.updatePadding(
|
val cutoutInsets = insets.getInsets(WindowInsetsCompat.Type.displayCutout())
|
||||||
left = systemInsets.left,
|
|
||||||
right = systemInsets.right,
|
val leftInsets = barInsets.left + cutoutInsets.left
|
||||||
bottom = systemInsets.bottom
|
val rightInsets = barInsets.right + cutoutInsets.right
|
||||||
)
|
|
||||||
|
binding.appbarFreedreno.updateMargins(left = leftInsets, right = rightInsets)
|
||||||
|
binding.scrollFreedreno.updateMargins(left = leftInsets, right = rightInsets)
|
||||||
|
binding.scrollFreedreno.updatePadding(bottom = barInsets.bottom)
|
||||||
insets
|
insets
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private fun showSnackbar(message: String) {
|
||||||
private fun showSnackbar(message: String) {
|
|
||||||
Snackbar.make(binding.root, message, Snackbar.LENGTH_SHORT).show()
|
Snackbar.make(binding.root, message, Snackbar.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.fragments
|
package org.yuzu.yuzu_emu.fragments
|
||||||
|
|
@ -310,6 +310,21 @@ class GamePropertiesFragment : Fragment() {
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (!args.game.isHomebrew) {
|
||||||
|
add(
|
||||||
|
SubmenuProperty(
|
||||||
|
R.string.add_ons,
|
||||||
|
R.string.add_ons_description,
|
||||||
|
R.drawable.ic_edit,
|
||||||
|
action = {
|
||||||
|
val action = GamePropertiesFragmentDirections
|
||||||
|
.actionPerGamePropertiesFragmentToAddonsFragment(args.game)
|
||||||
|
binding.root.findNavController().navigate(action)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (GpuDriverHelper.supportsCustomDriverLoading()) {
|
if (GpuDriverHelper.supportsCustomDriverLoading()) {
|
||||||
add(
|
add(
|
||||||
SubmenuProperty(
|
SubmenuProperty(
|
||||||
|
|
@ -341,18 +356,6 @@ class GamePropertiesFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!args.game.isHomebrew) {
|
if (!args.game.isHomebrew) {
|
||||||
add(
|
|
||||||
SubmenuProperty(
|
|
||||||
R.string.add_ons,
|
|
||||||
R.string.add_ons_description,
|
|
||||||
R.drawable.ic_edit,
|
|
||||||
action = {
|
|
||||||
val action = GamePropertiesFragmentDirections
|
|
||||||
.actionPerGamePropertiesFragmentToAddonsFragment(args.game)
|
|
||||||
binding.root.findNavController().navigate(action)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
add(
|
add(
|
||||||
InstallableProperty(
|
InstallableProperty(
|
||||||
R.string.save_data,
|
R.string.save_data,
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,6 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.fragments
|
package org.yuzu.yuzu_emu.fragments
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
|
|
@ -44,7 +41,9 @@ import org.yuzu.yuzu_emu.model.HomeSetting
|
||||||
import org.yuzu.yuzu_emu.model.HomeViewModel
|
import org.yuzu.yuzu_emu.model.HomeViewModel
|
||||||
import org.yuzu.yuzu_emu.ui.main.MainActivity
|
import org.yuzu.yuzu_emu.ui.main.MainActivity
|
||||||
import org.yuzu.yuzu_emu.utils.FileUtil
|
import org.yuzu.yuzu_emu.utils.FileUtil
|
||||||
|
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||||
import org.yuzu.yuzu_emu.utils.Log
|
import org.yuzu.yuzu_emu.utils.Log
|
||||||
|
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
|
||||||
|
|
||||||
class HomeSettingsFragment : Fragment() {
|
class HomeSettingsFragment : Fragment() {
|
||||||
private var _binding: FragmentHomeSettingsBinding? = null
|
private var _binding: FragmentHomeSettingsBinding? = null
|
||||||
|
|
@ -71,8 +70,12 @@ class HomeSettingsFragment : Fragment() {
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
homeViewModel.setStatusBarShadeVisibility(visible = true)
|
homeViewModel.setStatusBarShadeVisibility(visible = false)
|
||||||
mainActivity = requireActivity() as MainActivity
|
mainActivity = requireActivity() as MainActivity
|
||||||
|
binding.toolbarHomeSettings.setNavigationOnClickListener {
|
||||||
|
findNavController().popBackStack()
|
||||||
|
}
|
||||||
|
binding.toolbarHomeSettings.title = getString(R.string.preferences_settings)
|
||||||
|
|
||||||
val optionsList: MutableList<HomeSetting> = mutableListOf<HomeSetting>().apply {
|
val optionsList: MutableList<HomeSetting> = mutableListOf<HomeSetting>().apply {
|
||||||
add(
|
add(
|
||||||
|
|
@ -144,6 +147,18 @@ class HomeSettingsFragment : Fragment() {
|
||||||
driverViewModel.selectedDriverTitle
|
driverViewModel.selectedDriverTitle
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
if (GpuDriverHelper.isAdrenoGpu()) {
|
||||||
|
add(
|
||||||
|
HomeSetting(
|
||||||
|
R.string.freedreno_settings_title,
|
||||||
|
R.string.gpu_driver_settings,
|
||||||
|
R.drawable.ic_graphics,
|
||||||
|
{
|
||||||
|
binding.root.findNavController().navigate(R.id.freedrenoSettingsFragment)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
add(
|
add(
|
||||||
HomeSetting(
|
HomeSetting(
|
||||||
R.string.multiplayer,
|
R.string.multiplayer,
|
||||||
|
|
@ -465,19 +480,22 @@ class HomeSettingsFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setInsets() =
|
private fun setInsets() =
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets ->
|
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
|
||||||
val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
|
val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||||
val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
|
val cutoutInsets = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout())
|
||||||
|
|
||||||
|
binding.appbarHomeSettings.updateMargins(
|
||||||
|
left = barInsets.left + cutoutInsets.left,
|
||||||
|
right = barInsets.right + cutoutInsets.right
|
||||||
|
)
|
||||||
|
|
||||||
binding.scrollViewSettings.updatePadding(
|
binding.scrollViewSettings.updatePadding(
|
||||||
top = barInsets.top
|
bottom = barInsets.bottom
|
||||||
)
|
)
|
||||||
|
|
||||||
binding.homeSettingsList.updatePadding(
|
binding.homeSettingsList.updatePadding(
|
||||||
left = barInsets.left + cutoutInsets.left,
|
left = barInsets.left + cutoutInsets.left,
|
||||||
top = cutoutInsets.top,
|
right = barInsets.right + cutoutInsets.right
|
||||||
right = barInsets.right + cutoutInsets.right,
|
|
||||||
bottom = barInsets.bottom
|
|
||||||
)
|
)
|
||||||
|
|
||||||
windowInsets
|
windowInsets
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
|
|
||||||
class AddonViewModel : ViewModel() {
|
class AddonViewModel : ViewModel() {
|
||||||
private val _patchList = MutableStateFlow(mutableListOf<Patch>())
|
private val _patchList = MutableStateFlow<List<Patch>>(emptyList())
|
||||||
val addonList get() = _patchList.asStateFlow()
|
val addonList get() = _patchList.asStateFlow()
|
||||||
|
|
||||||
private val _showModInstallPicker = MutableStateFlow(false)
|
private val _showModInstallPicker = MutableStateFlow(false)
|
||||||
|
|
@ -31,34 +31,62 @@ class AddonViewModel : ViewModel() {
|
||||||
val addonToDelete = _addonToDelete.asStateFlow()
|
val addonToDelete = _addonToDelete.asStateFlow()
|
||||||
|
|
||||||
var game: Game? = null
|
var game: Game? = null
|
||||||
|
private var loadedGameKey: String? = null
|
||||||
|
|
||||||
private val isRefreshing = AtomicBoolean(false)
|
private val isRefreshing = AtomicBoolean(false)
|
||||||
|
private val pendingRefresh = AtomicBoolean(false)
|
||||||
|
|
||||||
fun onOpenAddons(game: Game) {
|
fun onAddonsViewCreated(game: Game) {
|
||||||
this.game = game
|
this.game = game
|
||||||
refreshAddons()
|
refreshAddons(commitEmpty = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun refreshAddons() {
|
fun onAddonsViewStarted(game: Game) {
|
||||||
if (isRefreshing.get() || game == null) {
|
this.game = game
|
||||||
|
val hasLoadedCurrentGame = loadedGameKey == gameKey(game)
|
||||||
|
refreshAddons(force = !hasLoadedCurrentGame)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun refreshAddons(force: Boolean = false, commitEmpty: Boolean = true) {
|
||||||
|
val currentGame = game ?: return
|
||||||
|
val currentGameKey = gameKey(currentGame)
|
||||||
|
if (!force && loadedGameKey == currentGameKey) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
isRefreshing.set(true)
|
if (!isRefreshing.compareAndSet(false, true)) {
|
||||||
|
if (force) {
|
||||||
|
pendingRefresh.set(true)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
withContext(Dispatchers.IO) {
|
try {
|
||||||
val patchList = (
|
val patches = withContext(Dispatchers.IO) {
|
||||||
NativeLibrary.getPatchesForFile(game!!.path, game!!.programId)
|
NativeLibrary.getPatchesForFile(currentGame.path, currentGame.programId)
|
||||||
?: emptyArray()
|
} ?: return@launch
|
||||||
).toMutableList()
|
|
||||||
|
val patchList = patches.toMutableList()
|
||||||
patchList.sortBy { it.name }
|
patchList.sortBy { it.name }
|
||||||
|
|
||||||
// Ensure only one update is enabled
|
// Ensure only one update is enabled
|
||||||
ensureSingleUpdateEnabled(patchList)
|
ensureSingleUpdateEnabled(patchList)
|
||||||
|
|
||||||
removeDuplicates(patchList)
|
removeDuplicates(patchList)
|
||||||
|
if (patchList.isEmpty() && !commitEmpty) {
|
||||||
|
return@launch
|
||||||
|
}
|
||||||
|
if (gameKey(game ?: return@launch) != currentGameKey) {
|
||||||
|
return@launch
|
||||||
|
}
|
||||||
|
|
||||||
_patchList.value = patchList
|
_patchList.value = patchList.toList()
|
||||||
|
loadedGameKey = currentGameKey
|
||||||
|
} finally {
|
||||||
isRefreshing.set(false)
|
isRefreshing.set(false)
|
||||||
|
if (pendingRefresh.compareAndSet(true, false)) {
|
||||||
|
refreshAddons(force = true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -119,28 +147,33 @@ class AddonViewModel : ViewModel() {
|
||||||
PatchType.DLC -> NativeLibrary.removeDLC(patch.programId)
|
PatchType.DLC -> NativeLibrary.removeDLC(patch.programId)
|
||||||
PatchType.Mod -> NativeLibrary.removeMod(patch.programId, patch.name)
|
PatchType.Mod -> NativeLibrary.removeMod(patch.programId, patch.name)
|
||||||
}
|
}
|
||||||
refreshAddons()
|
refreshAddons(force = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onCloseAddons() {
|
fun onCloseAddons() {
|
||||||
if (_patchList.value.isEmpty()) {
|
val currentGame = game ?: run {
|
||||||
|
_patchList.value = emptyList()
|
||||||
|
loadedGameKey = null
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val currentList = _patchList.value
|
||||||
|
if (currentList.isEmpty()) {
|
||||||
|
_patchList.value = emptyList()
|
||||||
|
loadedGameKey = null
|
||||||
|
game = null
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if there are multiple update versions
|
|
||||||
val updates = _patchList.value.filter { PatchType.from(it.type) == PatchType.Update }
|
|
||||||
val hasMultipleUpdates = updates.size > 1
|
|
||||||
|
|
||||||
NativeConfig.setDisabledAddons(
|
NativeConfig.setDisabledAddons(
|
||||||
game!!.programId,
|
currentGame.programId,
|
||||||
_patchList.value.mapNotNull {
|
currentList.mapNotNull {
|
||||||
if (it.enabled) {
|
if (it.enabled) {
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
if (PatchType.from(it.type) == PatchType.Update) {
|
if (PatchType.from(it.type) == PatchType.Update) {
|
||||||
if (it.name.contains("(NAND)") || it.name.contains("(SDMC)")) {
|
if (it.name.contains("(NAND)") || it.name.contains("(SDMC)")) {
|
||||||
it.name
|
it.name
|
||||||
} else if (hasMultipleUpdates) {
|
} else if (it.numericVersion != 0L) {
|
||||||
"Update@${it.numericVersion}"
|
"Update@${it.numericVersion}"
|
||||||
} else {
|
} else {
|
||||||
it.name
|
it.name
|
||||||
|
|
@ -152,7 +185,8 @@ class AddonViewModel : ViewModel() {
|
||||||
}.toTypedArray()
|
}.toTypedArray()
|
||||||
)
|
)
|
||||||
NativeConfig.saveGlobalConfig()
|
NativeConfig.saveGlobalConfig()
|
||||||
_patchList.value.clear()
|
_patchList.value = emptyList()
|
||||||
|
loadedGameKey = null
|
||||||
game = null
|
game = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -163,4 +197,8 @@ class AddonViewModel : ViewModel() {
|
||||||
fun showModNoticeDialog(show: Boolean) {
|
fun showModNoticeDialog(show: Boolean) {
|
||||||
_showModNoticeDialog.value = show
|
_showModNoticeDialog.value = show
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun gameKey(game: Game): String {
|
||||||
|
return "${game.programId}|${game.path}"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.overlay
|
package org.yuzu.yuzu_emu.overlay
|
||||||
|
|
@ -20,7 +20,6 @@ import android.os.Looper
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.HapticFeedbackConstants
|
import android.view.HapticFeedbackConstants
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.SurfaceView
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.OnTouchListener
|
import android.view.View.OnTouchListener
|
||||||
import android.view.WindowInsets
|
import android.view.WindowInsets
|
||||||
|
|
@ -42,10 +41,10 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws the interactive input overlay on top of the
|
* Draws the interactive input overlay on top of the
|
||||||
* [SurfaceView] that is rendering emulation.
|
* emulation rendering surface.
|
||||||
*/
|
*/
|
||||||
class InputOverlay(context: Context, attrs: AttributeSet?) :
|
class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
SurfaceView(context, attrs),
|
View(context, attrs),
|
||||||
OnTouchListener {
|
OnTouchListener {
|
||||||
private val overlayButtons: MutableSet<InputOverlayDrawableButton> = HashSet()
|
private val overlayButtons: MutableSet<InputOverlayDrawableButton> = HashSet()
|
||||||
private val overlayDpads: MutableSet<InputOverlayDrawableDpad> = HashSet()
|
private val overlayDpads: MutableSet<InputOverlayDrawableDpad> = HashSet()
|
||||||
|
|
|
||||||
|
|
@ -424,7 +424,9 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
)
|
)
|
||||||
|
|
||||||
val uriString = result.toString()
|
val uriString = result.toString()
|
||||||
val folder = gamesViewModel.folders.value.firstOrNull { it.uriString == uriString }
|
val folder = gamesViewModel.folders.value.firstOrNull {
|
||||||
|
it.uriString == uriString && it.type == org.yuzu.yuzu_emu.model.DirectoryType.EXTERNAL_CONTENT
|
||||||
|
}
|
||||||
if (folder != null) {
|
if (folder != null) {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
applicationContext,
|
applicationContext,
|
||||||
|
|
@ -640,7 +642,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addonViewModel.refreshAddons()
|
addonViewModel.refreshAddons(force = true)
|
||||||
|
|
||||||
val separator = System.lineSeparator() ?: "\n"
|
val separator = System.lineSeparator() ?: "\n"
|
||||||
val installResult = StringBuilder()
|
val installResult = StringBuilder()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,168 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
package org.yuzu.yuzu_emu.utils
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.app.Application
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.InputDevice
|
||||||
|
import android.view.KeyEvent
|
||||||
|
import android.view.View
|
||||||
|
import android.view.Window
|
||||||
|
import androidx.activity.ComponentActivity
|
||||||
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
|
import org.yuzu.yuzu_emu.R
|
||||||
|
import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
|
|
||||||
|
object ControllerNavigationGlobalHook {
|
||||||
|
private val installed = AtomicBoolean(false)
|
||||||
|
|
||||||
|
fun install(application: Application) {
|
||||||
|
if (!installed.compareAndSet(false, true)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
application.registerActivityLifecycleCallbacks(HookInstaller)
|
||||||
|
}
|
||||||
|
|
||||||
|
private object HookInstaller : Application.ActivityLifecycleCallbacks {
|
||||||
|
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
|
||||||
|
installHookIfNeeded(activity)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActivityResumed(activity: Activity) {
|
||||||
|
installHookIfNeeded(activity)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActivityStarted(activity: Activity) = Unit
|
||||||
|
override fun onActivityPaused(activity: Activity) = Unit
|
||||||
|
override fun onActivityStopped(activity: Activity) = Unit
|
||||||
|
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit
|
||||||
|
override fun onActivityDestroyed(activity: Activity) = Unit
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun installHookIfNeeded(activity: Activity) {
|
||||||
|
val window = activity.window ?: return
|
||||||
|
val currentCallback = window.callback ?: return
|
||||||
|
if (currentCallback is ControllerNavigationWindowCallback) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
window.callback = ControllerNavigationWindowCallback(activity, currentCallback)
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ControllerNavigationWindowCallback(
|
||||||
|
private val activity: Activity,
|
||||||
|
private val delegate: Window.Callback
|
||||||
|
) : Window.Callback by delegate {
|
||||||
|
private val componentActivity = activity as? ComponentActivity
|
||||||
|
|
||||||
|
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
|
||||||
|
if (activity.isFinishing || activity.isDestroyed) {
|
||||||
|
return delegate.dispatchKeyEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!BooleanSetting.INVERT_CONFIRM_BACK_CONTROLLER_BUTTONS.getBoolean()) {
|
||||||
|
return delegate.dispatchKeyEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isControllerInput(event) || componentActivity == null) {
|
||||||
|
return delegate.dispatchKeyEvent(event)
|
||||||
|
}
|
||||||
|
if (shouldBypassInGameplay()) {
|
||||||
|
return delegate.dispatchKeyEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isConfirmAction(event.keyCode)) {
|
||||||
|
return when (event.action) {
|
||||||
|
KeyEvent.ACTION_DOWN -> {
|
||||||
|
if (event.repeatCount == 0) {
|
||||||
|
componentActivity.onBackPressedDispatcher.onBackPressed()
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
KeyEvent.ACTION_UP -> true
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isBackAction(event.keyCode)) {
|
||||||
|
val remappedEvent = KeyEvent(
|
||||||
|
event.downTime,
|
||||||
|
event.eventTime,
|
||||||
|
event.action,
|
||||||
|
KeyEvent.KEYCODE_DPAD_CENTER,
|
||||||
|
event.repeatCount,
|
||||||
|
event.metaState,
|
||||||
|
event.deviceId,
|
||||||
|
event.scanCode,
|
||||||
|
event.flags,
|
||||||
|
event.source
|
||||||
|
)
|
||||||
|
return delegate.dispatchKeyEvent(remappedEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate.dispatchKeyEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun shouldBypassInGameplay(): Boolean {
|
||||||
|
if (activity.javaClass.name != "org.yuzu.yuzu_emu.activities.EmulationActivity") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (!NativeLibrary.isRunning()) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
val surface = activity.findViewById<View?>(R.id.surface_emulation) ?: return false
|
||||||
|
if (!surface.isShown || surface.visibility != View.VISIBLE) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
val focused = activity.currentFocus
|
||||||
|
if (focused != null) {
|
||||||
|
val inputOverlay = activity.findViewById<View?>(R.id.surface_input_overlay)
|
||||||
|
if (!isDescendantOf(focused, inputOverlay)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isDescendantOf(view: View, parent: View?): Boolean {
|
||||||
|
if (parent == null) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var current: View? = view
|
||||||
|
while (current != null) {
|
||||||
|
if (current === parent) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
current = current.parent as? View
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isControllerInput(event: KeyEvent): Boolean {
|
||||||
|
val source = event.source
|
||||||
|
val deviceSources = event.device?.sources ?: InputDevice.getDevice(event.deviceId)?.sources ?: 0
|
||||||
|
return hasControllerSource(source) || hasControllerSource(deviceSources)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isConfirmAction(keyCode: Int): Boolean {
|
||||||
|
return keyCode == KeyEvent.KEYCODE_BUTTON_A
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isBackAction(keyCode: Int): Boolean {
|
||||||
|
return keyCode == KeyEvent.KEYCODE_BUTTON_B
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hasControllerSource(source: Int): Boolean {
|
||||||
|
return source and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD ||
|
||||||
|
source and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK ||
|
||||||
|
source and InputDevice.SOURCE_DPAD == InputDevice.SOURCE_DPAD
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -61,6 +61,12 @@ object DirectoryInitialization {
|
||||||
saveConfig = true
|
saveConfig = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val staticThemeColor = preferences.migratePreference<Int>(Settings.PREF_STATIC_THEME_COLOR)
|
||||||
|
if (staticThemeColor != null) {
|
||||||
|
IntSetting.STATIC_THEME_COLOR.setInt(staticThemeColor)
|
||||||
|
saveConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
val blackBackgrounds =
|
val blackBackgrounds =
|
||||||
preferences.migratePreference<Boolean>(Settings.PREF_BLACK_BACKGROUNDS)
|
preferences.migratePreference<Boolean>(Settings.PREF_BLACK_BACKGROUNDS)
|
||||||
if (blackBackgrounds != null) {
|
if (blackBackgrounds != null) {
|
||||||
|
|
|
||||||
|
|
@ -51,11 +51,24 @@ object GameHelper {
|
||||||
|
|
||||||
// Scan External Content directories and register all NSP/XCI files
|
// Scan External Content directories and register all NSP/XCI files
|
||||||
val externalContentDirs = NativeConfig.getExternalContentDirs()
|
val externalContentDirs = NativeConfig.getExternalContentDirs()
|
||||||
for (externalDir in externalContentDirs) {
|
val uniqueExternalContentDirs = linkedSetOf<String>()
|
||||||
|
externalContentDirs.forEach { externalDir ->
|
||||||
|
if (externalDir.isNotEmpty()) {
|
||||||
|
uniqueExternalContentDirs.add(externalDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val mountedContainerUris = mutableSetOf<String>()
|
||||||
|
for (externalDir in uniqueExternalContentDirs) {
|
||||||
if (externalDir.isNotEmpty()) {
|
if (externalDir.isNotEmpty()) {
|
||||||
val externalDirUri = externalDir.toUri()
|
val externalDirUri = externalDir.toUri()
|
||||||
if (FileUtil.isTreeUriValid(externalDirUri)) {
|
if (FileUtil.isTreeUriValid(externalDirUri)) {
|
||||||
scanExternalContentRecursive(FileUtil.listFiles(externalDirUri), 3)
|
scanContentContainersRecursive(FileUtil.listFiles(externalDirUri), 3) {
|
||||||
|
val containerUri = it.uri.toString()
|
||||||
|
if (mountedContainerUris.add(containerUri)) {
|
||||||
|
NativeLibrary.addFileToFilesystemProvider(containerUri)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -65,10 +78,13 @@ object GameHelper {
|
||||||
val gameDirUri = gameDir.uriString.toUri()
|
val gameDirUri = gameDir.uriString.toUri()
|
||||||
val isValid = FileUtil.isTreeUriValid(gameDirUri)
|
val isValid = FileUtil.isTreeUriValid(gameDirUri)
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
|
val scanDepth = if (gameDir.deepScan) 3 else 1
|
||||||
|
|
||||||
addGamesRecursive(
|
addGamesRecursive(
|
||||||
games,
|
games,
|
||||||
FileUtil.listFiles(gameDirUri),
|
FileUtil.listFiles(gameDirUri),
|
||||||
if (gameDir.deepScan) 3 else 1
|
scanDepth,
|
||||||
|
mountedContainerUris
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
badDirs.add(index)
|
badDirs.add(index)
|
||||||
|
|
@ -103,9 +119,10 @@ object GameHelper {
|
||||||
// be done better imo.
|
// be done better imo.
|
||||||
private val externalContentExtensions = setOf("nsp", "xci")
|
private val externalContentExtensions = setOf("nsp", "xci")
|
||||||
|
|
||||||
private fun scanExternalContentRecursive(
|
private fun scanContentContainersRecursive(
|
||||||
files: Array<MinimalDocumentFile>,
|
files: Array<MinimalDocumentFile>,
|
||||||
depth: Int
|
depth: Int,
|
||||||
|
onContainerFound: (MinimalDocumentFile) -> Unit
|
||||||
) {
|
) {
|
||||||
if (depth <= 0) {
|
if (depth <= 0) {
|
||||||
return
|
return
|
||||||
|
|
@ -113,14 +130,15 @@ object GameHelper {
|
||||||
|
|
||||||
files.forEach {
|
files.forEach {
|
||||||
if (it.isDirectory) {
|
if (it.isDirectory) {
|
||||||
scanExternalContentRecursive(
|
scanContentContainersRecursive(
|
||||||
FileUtil.listFiles(it.uri),
|
FileUtil.listFiles(it.uri),
|
||||||
depth - 1
|
depth - 1,
|
||||||
|
onContainerFound
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
val extension = FileUtil.getExtension(it.uri).lowercase()
|
val extension = FileUtil.getExtension(it.uri).lowercase()
|
||||||
if (externalContentExtensions.contains(extension)) {
|
if (externalContentExtensions.contains(extension)) {
|
||||||
NativeLibrary.addFileToFilesystemProvider(it.uri.toString())
|
onContainerFound(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -129,7 +147,8 @@ object GameHelper {
|
||||||
private fun addGamesRecursive(
|
private fun addGamesRecursive(
|
||||||
games: MutableList<Game>,
|
games: MutableList<Game>,
|
||||||
files: Array<MinimalDocumentFile>,
|
files: Array<MinimalDocumentFile>,
|
||||||
depth: Int
|
depth: Int,
|
||||||
|
mountedContainerUris: MutableSet<String>
|
||||||
) {
|
) {
|
||||||
if (depth <= 0) {
|
if (depth <= 0) {
|
||||||
return
|
return
|
||||||
|
|
@ -140,11 +159,20 @@ object GameHelper {
|
||||||
addGamesRecursive(
|
addGamesRecursive(
|
||||||
games,
|
games,
|
||||||
FileUtil.listFiles(it.uri),
|
FileUtil.listFiles(it.uri),
|
||||||
depth - 1
|
depth - 1,
|
||||||
|
mountedContainerUris
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
if (Game.extensions.contains(FileUtil.getExtension(it.uri))) {
|
val extension = FileUtil.getExtension(it.uri).lowercase()
|
||||||
val game = getGame(it.uri, true)
|
val filePath = it.uri.toString()
|
||||||
|
|
||||||
|
if (externalContentExtensions.contains(extension) &&
|
||||||
|
mountedContainerUris.add(filePath)) {
|
||||||
|
NativeLibrary.addGameFolderFileToFilesystemProvider(filePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Game.extensions.contains(extension)) {
|
||||||
|
val game = getGame(it.uri, true, false)
|
||||||
if (game != null) {
|
if (game != null) {
|
||||||
games.add(game)
|
games.add(game)
|
||||||
}
|
}
|
||||||
|
|
@ -153,14 +181,20 @@ object GameHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getGame(uri: Uri, addedToLibrary: Boolean): Game? {
|
fun getGame(
|
||||||
|
uri: Uri,
|
||||||
|
addedToLibrary: Boolean,
|
||||||
|
registerFilesystemProvider: Boolean = true
|
||||||
|
): Game? {
|
||||||
val filePath = uri.toString()
|
val filePath = uri.toString()
|
||||||
if (!GameMetadata.getIsValid(filePath)) {
|
if (!GameMetadata.getIsValid(filePath)) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
// Needed to update installed content information
|
if (registerFilesystemProvider) {
|
||||||
NativeLibrary.addFileToFilesystemProvider(filePath)
|
// Needed to update installed content information
|
||||||
|
NativeLibrary.addFileToFilesystemProvider(filePath)
|
||||||
|
}
|
||||||
|
|
||||||
var name = GameMetadata.getTitle(filePath)
|
var name = GameMetadata.getTitle(filePath)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.utils
|
package org.yuzu.yuzu_emu.utils
|
||||||
|
|
@ -80,16 +80,14 @@ object PathUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This really shouldn't be necessary, but the Android API seemingly
|
|
||||||
// doesn't have a way of doing this?
|
|
||||||
// Apparently, on certain devices the mount location can vary, so add
|
|
||||||
// extra cases here if we discover any new ones.
|
|
||||||
fun getRemovableStoragePath(idString: String): String? {
|
fun getRemovableStoragePath(idString: String): String? {
|
||||||
var pathFile: File
|
val possibleMountPaths = listOf("/mnt/media_rw/$idString", "/storage/$idString")
|
||||||
|
|
||||||
pathFile = File("/mnt/media_rw/$idString");
|
for (mountPath in possibleMountPaths) {
|
||||||
if (pathFile.exists()) {
|
val pathFile = File(mountPath);
|
||||||
return pathFile.absolutePath
|
if (pathFile.exists()) {
|
||||||
|
return pathFile.absolutePath
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.utils
|
package org.yuzu.yuzu_emu.utils
|
||||||
|
|
@ -52,7 +52,7 @@ object ThemeHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getSelectedStaticThemeColor(): Int {
|
private fun getSelectedStaticThemeColor(): Int {
|
||||||
val themeIndex = preferences.getInt(Settings.PREF_STATIC_THEME_COLOR, 0)
|
val themeIndex = IntSetting.STATIC_THEME_COLOR.getInt(false)
|
||||||
val themes = arrayOf(
|
val themes = arrayOf(
|
||||||
R.style.Theme_Eden_Main,
|
R.style.Theme_Eden_Main,
|
||||||
R.style.Theme_Yuzu_Main_Violet,
|
R.style.Theme_Yuzu_Main_Violet,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
|
@ -11,8 +11,7 @@ import android.graphics.*
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import com.google.android.material.card.MaterialCardView
|
import com.google.android.material.card.MaterialCardView
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
import org.yuzu.yuzu_emu.features.settings.model.IntSetting
|
||||||
import androidx.preference.PreferenceManager
|
|
||||||
|
|
||||||
class GradientBorderCardView @JvmOverloads constructor(
|
class GradientBorderCardView @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
|
@ -44,12 +43,7 @@ class GradientBorderCardView @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateThemeState() {
|
private fun updateThemeState() {
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
val themeIndex = IntSetting.STATIC_THEME_COLOR.getInt(false)
|
||||||
val themeIndex = try {
|
|
||||||
prefs.getInt(Settings.PREF_STATIC_THEME_COLOR, 0)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
0 // Default to Eden theme if error
|
|
||||||
}
|
|
||||||
isEdenTheme = themeIndex == 0
|
isEdenTheme = themeIndex == 0
|
||||||
invalidate()
|
invalidate()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
|
@ -27,10 +27,7 @@ if (ARCHITECTURE_arm64)
|
||||||
target_link_libraries(yuzu-android PRIVATE adrenotools)
|
target_link_libraries(yuzu-android PRIVATE adrenotools)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_OPENSSL OR ENABLE_WEB_SERVICE)
|
target_link_libraries(yuzu-android PRIVATE OpenSSL::SSL cpp-jwt::cpp-jwt)
|
||||||
target_link_libraries(yuzu-android PRIVATE OpenSSL::SSL cpp-jwt::cpp-jwt)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_UPDATE_CHECKER)
|
if (ENABLE_UPDATE_CHECKER)
|
||||||
target_compile_definitions(yuzu-android PUBLIC ENABLE_UPDATE_CHECKER)
|
target_compile_definitions(yuzu-android PUBLIC ENABLE_UPDATE_CHECKER)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,12 @@ void AndroidConfig::ReadAndroidValues() {
|
||||||
if (global) {
|
if (global) {
|
||||||
ReadAndroidUIValues();
|
ReadAndroidUIValues();
|
||||||
ReadUIValues();
|
ReadUIValues();
|
||||||
|
BeginGroup(Settings::TranslateCategory(Settings::Category::DataStorage));
|
||||||
|
Settings::values.ext_content_from_game_dirs = ReadBooleanSetting(
|
||||||
|
std::string("ext_content_from_game_dirs"),
|
||||||
|
std::make_optional(
|
||||||
|
Settings::values.ext_content_from_game_dirs.GetDefault()));
|
||||||
|
EndGroup();
|
||||||
ReadOverlayValues();
|
ReadOverlayValues();
|
||||||
}
|
}
|
||||||
ReadDriverValues();
|
ReadDriverValues();
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ namespace AndroidSettings {
|
||||||
|
|
||||||
Settings::Setting<s32> theme{linkage, 0, "theme", Settings::Category::Android};
|
Settings::Setting<s32> theme{linkage, 0, "theme", Settings::Category::Android};
|
||||||
Settings::Setting<s32> theme_mode{linkage, -1, "theme_mode", Settings::Category::Android};
|
Settings::Setting<s32> theme_mode{linkage, -1, "theme_mode", Settings::Category::Android};
|
||||||
|
Settings::Setting<s32> static_theme_color{linkage, 5, "static_theme_color", Settings::Category::Android};
|
||||||
Settings::Setting<bool> black_backgrounds{linkage, false, "black_backgrounds",
|
Settings::Setting<bool> black_backgrounds{linkage, false, "black_backgrounds",
|
||||||
Settings::Category::Android};
|
Settings::Category::Android};
|
||||||
Settings::Setting<s32> app_language{linkage, 0, "app_language", Settings::Category::Android};
|
Settings::Setting<s32> app_language{linkage, 0, "app_language", Settings::Category::Android};
|
||||||
|
|
@ -65,6 +66,8 @@ namespace AndroidSettings {
|
||||||
Settings::Category::Android};
|
Settings::Category::Android};
|
||||||
Settings::Setting<bool> enable_qlaunch_button{linkage, false, "enable_qlaunch_button",
|
Settings::Setting<bool> enable_qlaunch_button{linkage, false, "enable_qlaunch_button",
|
||||||
Settings::Category::Android};
|
Settings::Category::Android};
|
||||||
|
Settings::Setting<bool> invert_confirm_back_controller_buttons{
|
||||||
|
linkage, false, "invert_confirm_back_controller_buttons", Settings::Category::Android};
|
||||||
|
|
||||||
// Input/performance overlay settings
|
// Input/performance overlay settings
|
||||||
std::vector<OverlayControlData> overlay_control_data;
|
std::vector<OverlayControlData> overlay_control_data;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
|
@ -14,6 +17,14 @@
|
||||||
#include "jni/native.h"
|
#include "jni/native.h"
|
||||||
|
|
||||||
void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) {
|
void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) {
|
||||||
|
if (!surface) {
|
||||||
|
LOG_INFO(Frontend, "EmuWindow_Android::OnSurfaceChanged received null surface");
|
||||||
|
m_window_width = 0;
|
||||||
|
m_window_height = 0;
|
||||||
|
window_info.render_surface = nullptr;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_window_width = ANativeWindow_getWidth(surface);
|
m_window_width = ANativeWindow_getWidth(surface);
|
||||||
m_window_height = ANativeWindow_getHeight(surface);
|
m_window_height = ANativeWindow_getHeight(surface);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,11 @@ jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobj
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((file_type == Loader::FileType::NSP || file_type == Loader::FileType::XCI) &&
|
||||||
|
!Loader::IsBootableGameContainer(file, file_type)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
u64 program_id = 0;
|
u64 program_id = 0;
|
||||||
Loader::ResultStatus res = loader->ReadProgramId(program_id);
|
Loader::ResultStatus res = loader->ReadProgramId(program_id);
|
||||||
if (res != Loader::ResultStatus::Success) {
|
if (res != Loader::ResultStatus::Success) {
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,8 @@
|
||||||
#include "jni/native.h"
|
#include "jni/native.h"
|
||||||
#include "video_core/renderer_base.h"
|
#include "video_core/renderer_base.h"
|
||||||
#include "video_core/renderer_vulkan/renderer_vulkan.h"
|
#include "video_core/renderer_vulkan/renderer_vulkan.h"
|
||||||
|
#include "video_core/capture.h"
|
||||||
|
#include "video_core/textures/decoders.h"
|
||||||
#include "video_core/vulkan_common/vulkan_instance.h"
|
#include "video_core/vulkan_common/vulkan_instance.h"
|
||||||
#include "video_core/vulkan_common/vulkan_surface.h"
|
#include "video_core/vulkan_common/vulkan_surface.h"
|
||||||
#include "video_core/shader_notify.h"
|
#include "video_core/shader_notify.h"
|
||||||
|
|
@ -215,107 +217,8 @@ void EmulationSession::ConfigureFilesystemProvider(const std::string& filepath)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto extension = Common::ToLower(filepath.substr(filepath.find_last_of('.') + 1));
|
if (m_manual_provider->AddEntriesFromContainer(file)) {
|
||||||
|
return;
|
||||||
if (extension == "nsp") {
|
|
||||||
auto nsp = std::make_shared<FileSys::NSP>(file);
|
|
||||||
if (nsp->GetStatus() == Loader::ResultStatus::Success) {
|
|
||||||
std::map<u64, u32> nsp_versions;
|
|
||||||
std::map<u64, std::string> nsp_version_strings;
|
|
||||||
|
|
||||||
for (const auto& [title_id, nca_map] : nsp->GetNCAs()) {
|
|
||||||
for (const auto& [type_pair, nca] : nca_map) {
|
|
||||||
const auto& [title_type, content_type] = type_pair;
|
|
||||||
|
|
||||||
if (content_type == FileSys::ContentRecordType::Meta) {
|
|
||||||
const auto meta_nca = std::make_shared<FileSys::NCA>(nca->GetBaseFile());
|
|
||||||
if (meta_nca->GetStatus() == Loader::ResultStatus::Success) {
|
|
||||||
const auto section0 = meta_nca->GetSubdirectories();
|
|
||||||
if (!section0.empty()) {
|
|
||||||
for (const auto& meta_file : section0[0]->GetFiles()) {
|
|
||||||
if (meta_file->GetExtension() == "cnmt") {
|
|
||||||
FileSys::CNMT cnmt(meta_file);
|
|
||||||
nsp_versions[cnmt.GetTitleID()] = cnmt.GetTitleVersion();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (content_type == FileSys::ContentRecordType::Control &&
|
|
||||||
title_type == FileSys::TitleType::Update) {
|
|
||||||
auto romfs = nca->GetRomFS();
|
|
||||||
if (romfs) {
|
|
||||||
auto extracted = FileSys::ExtractRomFS(romfs);
|
|
||||||
if (extracted) {
|
|
||||||
auto nacp_file = extracted->GetFile("control.nacp");
|
|
||||||
if (!nacp_file) {
|
|
||||||
nacp_file = extracted->GetFile("Control.nacp");
|
|
||||||
}
|
|
||||||
if (nacp_file) {
|
|
||||||
FileSys::NACP nacp(nacp_file);
|
|
||||||
auto ver_str = nacp.GetVersionString();
|
|
||||||
if (!ver_str.empty()) {
|
|
||||||
nsp_version_strings[title_id] = ver_str;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto& [title_id, nca_map] : nsp->GetNCAs()) {
|
|
||||||
for (const auto& [type_pair, nca] : nca_map) {
|
|
||||||
const auto& [title_type, content_type] = type_pair;
|
|
||||||
|
|
||||||
if (title_type == FileSys::TitleType::Update) {
|
|
||||||
u32 version = 0;
|
|
||||||
auto ver_it = nsp_versions.find(title_id);
|
|
||||||
if (ver_it != nsp_versions.end()) {
|
|
||||||
version = ver_it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string version_string;
|
|
||||||
auto str_it = nsp_version_strings.find(title_id);
|
|
||||||
if (str_it != nsp_version_strings.end()) {
|
|
||||||
version_string = str_it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_manual_provider->AddEntryWithVersion(
|
|
||||||
title_type, content_type, title_id, version, version_string,
|
|
||||||
nca->GetBaseFile());
|
|
||||||
|
|
||||||
LOG_DEBUG(Frontend, "Added NSP update entry - TitleID: {:016X}, Version: {}, VersionStr: {}",
|
|
||||||
title_id, version, version_string);
|
|
||||||
} else {
|
|
||||||
// Use regular AddEntry for non-updates
|
|
||||||
m_manual_provider->AddEntry(title_type, content_type, title_id,
|
|
||||||
nca->GetBaseFile());
|
|
||||||
LOG_DEBUG(Frontend, "Added NSP entry - TitleID: {:016X}, TitleType: {}, ContentType: {}",
|
|
||||||
title_id, static_cast<int>(title_type), static_cast<int>(content_type));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle XCI files
|
|
||||||
if (extension == "xci") {
|
|
||||||
FileSys::XCI xci{file};
|
|
||||||
if (xci.GetStatus() == Loader::ResultStatus::Success) {
|
|
||||||
const auto nsp = xci.GetSecurePartitionNSP();
|
|
||||||
if (nsp) {
|
|
||||||
for (const auto& title : nsp->GetNCAs()) {
|
|
||||||
for (const auto& entry : title.second) {
|
|
||||||
m_manual_provider->AddEntry(entry.first.first, entry.first.second, title.first,
|
|
||||||
entry.second->GetBaseFile());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto loader = Loader::GetLoader(m_system, file);
|
auto loader = Loader::GetLoader(m_system, file);
|
||||||
|
|
@ -337,6 +240,13 @@ void EmulationSession::ConfigureFilesystemProvider(const std::string& filepath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EmulationSession::ConfigureFilesystemProviderFromGameFolder(const std::string& filepath) {
|
||||||
|
if (!Settings::values.ext_content_from_game_dirs.GetValue()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ConfigureFilesystemProvider(filepath);
|
||||||
|
}
|
||||||
|
|
||||||
void EmulationSession::InitializeSystem(bool reload) {
|
void EmulationSession::InitializeSystem(bool reload) {
|
||||||
if (!reload) {
|
if (!reload) {
|
||||||
// Initialize logging system
|
// Initialize logging system
|
||||||
|
|
@ -780,9 +690,10 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_surfaceChanged(JNIEnv* env, jobject i
|
||||||
}
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env, jobject instance) {
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env, jobject instance) {
|
||||||
ANativeWindow_release(EmulationSession::GetInstance().NativeWindow());
|
if (auto* native_window = EmulationSession::GetInstance().NativeWindow(); native_window) {
|
||||||
|
ANativeWindow_release(native_window);
|
||||||
|
}
|
||||||
EmulationSession::GetInstance().SetNativeWindow(nullptr);
|
EmulationSession::GetInstance().SetNativeWindow(nullptr);
|
||||||
EmulationSession::GetInstance().SurfaceChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject instance,
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject instance,
|
||||||
|
|
@ -969,6 +880,40 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isPaused(JNIEnv* env, jclass claz
|
||||||
return static_cast<jboolean>(EmulationSession::GetInstance().IsPaused());
|
return static_cast<jboolean>(EmulationSession::GetInstance().IsPaused());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jbyteArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getAppletCaptureBuffer(JNIEnv* env, jclass clazz) {
|
||||||
|
using namespace VideoCore::Capture;
|
||||||
|
|
||||||
|
if (!EmulationSession::GetInstance().IsRunning()) {
|
||||||
|
return env->NewByteArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto tiled = EmulationSession::GetInstance().System().GPU().GetAppletCaptureBuffer();
|
||||||
|
if (tiled.size() < TiledSize) {
|
||||||
|
return env->NewByteArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<u8> linear(LinearWidth * LinearHeight * BytesPerPixel);
|
||||||
|
Tegra::Texture::UnswizzleTexture(linear, tiled, BytesPerPixel, LinearWidth, LinearHeight,
|
||||||
|
LinearDepth, BlockHeight, BlockDepth);
|
||||||
|
|
||||||
|
auto buffer = env->NewByteArray(static_cast<jsize>(linear.size()));
|
||||||
|
if (!buffer) {
|
||||||
|
return env->NewByteArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
env->SetByteArrayRegion(buffer, 0, static_cast<jsize>(linear.size()),
|
||||||
|
reinterpret_cast<const jbyte*>(linear.data()));
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
jint Java_org_yuzu_yuzu_1emu_NativeLibrary_getAppletCaptureWidth(JNIEnv* env, jclass clazz) {
|
||||||
|
return static_cast<jint>(VideoCore::Capture::LinearWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
jint Java_org_yuzu_yuzu_1emu_NativeLibrary_getAppletCaptureHeight(JNIEnv* env, jclass clazz) {
|
||||||
|
return static_cast<jint>(VideoCore::Capture::LinearHeight);
|
||||||
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass clazz,
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass clazz,
|
||||||
jboolean reload) {
|
jboolean reload) {
|
||||||
// Initialize the emulated system.
|
// Initialize the emulated system.
|
||||||
|
|
@ -1572,6 +1517,12 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_addFileToFilesystemProvider(JNIEnv* e
|
||||||
Common::Android::GetJString(env, jpath));
|
Common::Android::GetJString(env, jpath));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_addGameFolderFileToFilesystemProvider(
|
||||||
|
JNIEnv* env, jobject jobj, jstring jpath) {
|
||||||
|
EmulationSession::GetInstance().ConfigureFilesystemProviderFromGameFolder(
|
||||||
|
Common::Android::GetJString(env, jpath));
|
||||||
|
}
|
||||||
|
|
||||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env, jobject jobj) {
|
void Java_org_yuzu_yuzu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env, jobject jobj) {
|
||||||
EmulationSession::GetInstance().GetContentProvider()->ClearAllEntries();
|
EmulationSession::GetInstance().GetContentProvider()->ClearAllEntries();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -46,6 +49,7 @@ public:
|
||||||
const Core::PerfStatsResults& PerfStats();
|
const Core::PerfStatsResults& PerfStats();
|
||||||
int ShadersBuilding();
|
int ShadersBuilding();
|
||||||
void ConfigureFilesystemProvider(const std::string& filepath);
|
void ConfigureFilesystemProvider(const std::string& filepath);
|
||||||
|
void ConfigureFilesystemProviderFromGameFolder(const std::string& filepath);
|
||||||
void InitializeSystem(bool reload);
|
void InitializeSystem(bool reload);
|
||||||
void SetAppletId(int applet_id);
|
void SetAppletId(int applet_id);
|
||||||
Core::SystemResultStatus InitializeEmulation(const std::string& filepath,
|
Core::SystemResultStatus InitializeEmulation(const std::string& filepath,
|
||||||
|
|
|
||||||
4
src/android/app/src/main/res/drawable/circle_white.xml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
|
||||||
|
<solid android:color="#E6FFFFFF" />
|
||||||
|
</shape>
|
||||||
|
Before Width: | Height: | Size: 288 KiB After Width: | Height: | Size: 206 KiB |
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 79 KiB |
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:shape="rectangle">
|
android:shape="rectangle">
|
||||||
<solid android:color="?attr/colorSurface" />
|
<solid android:color="@android:color/transparent" />
|
||||||
<stroke
|
<stroke
|
||||||
android:width="1dp"
|
android:width="1dp"
|
||||||
android:color="?attr/colorOutline" />
|
android:color="?attr/colorOutline" />
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,237 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/colorSurface">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appbar"
|
||||||
|
style="@style/Widget.Eden.TransparentTopAppBarLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingTop="16dp"
|
||||||
|
android:paddingHorizontal="16dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:gravity="start|center_vertical"
|
||||||
|
android:text="@string/multiplayer_room_browser"
|
||||||
|
android:textAppearance="@style/TextAppearance.Material3.TitleLarge"
|
||||||
|
android:textColor="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:id="@+id/search_background"
|
||||||
|
style="?attr/materialCardViewFilledStyle"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
app:cardBackgroundColor="?attr/colorSurfaceVariant"
|
||||||
|
app:cardCornerRadius="24dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/search_container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:contentDescription="@string/home_search"
|
||||||
|
android:src="@drawable/ic_search"
|
||||||
|
app:tint="?attr/colorOnSurfaceVariant" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/search_text"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:autofillHints=""
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:hint="@string/multiplayer_search_public_lobbies"
|
||||||
|
android:imeOptions="flagNoFullscreen"
|
||||||
|
android:inputType="text"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textColor="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/clear_button"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_gravity="center_vertical|end"
|
||||||
|
android:layout_marginEnd="48dp"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:contentDescription="@string/clear"
|
||||||
|
android:src="@drawable/ic_clear"
|
||||||
|
android:visibility="invisible"
|
||||||
|
app:tint="?attr/colorOnSurfaceVariant"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/btn_submit"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_gravity="center_vertical|end"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:contentDescription="@string/submit"
|
||||||
|
android:src="@drawable/ic_send"
|
||||||
|
app:tint="?attr/colorOnSurfaceVariant"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp">
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/refresh_button"
|
||||||
|
style="@style/Widget.Material3.Button.IconButton"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:text="@string/refresh"
|
||||||
|
app:icon="@drawable/ic_refresh" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progress_bar"
|
||||||
|
style="?android:attr/progressBarStyleSmall"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:visibility="gone" />
|
||||||
|
</FrameLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<HorizontalScrollView
|
||||||
|
android:id="@+id/horizontalScrollView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginVertical="8dp"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:fadingEdge="horizontal"
|
||||||
|
android:paddingHorizontal="16dp"
|
||||||
|
android:scrollbars="none">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/chips"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clipToPadding="false">
|
||||||
|
|
||||||
|
<com.google.android.material.chip.Chip
|
||||||
|
android:id="@+id/chip_hide_empty"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:checkable="true"
|
||||||
|
android:checked="false"
|
||||||
|
android:paddingStart="8dp"
|
||||||
|
android:paddingTop="6dp"
|
||||||
|
android:paddingEnd="8dp"
|
||||||
|
android:paddingBottom="6dp"
|
||||||
|
android:text="@string/multiplayer_hide_empty_rooms"
|
||||||
|
app:chipCornerRadius="16dp"
|
||||||
|
app:chipIconSize="18dp"
|
||||||
|
app:chipIconTint="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<com.google.android.material.chip.Chip
|
||||||
|
android:id="@+id/chip_hide_full"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:checkable="true"
|
||||||
|
android:checked="false"
|
||||||
|
android:paddingStart="8dp"
|
||||||
|
android:paddingTop="6dp"
|
||||||
|
android:paddingEnd="8dp"
|
||||||
|
android:paddingBottom="6dp"
|
||||||
|
android:text="@string/multiplayer_hide_full_rooms"
|
||||||
|
app:chipCornerRadius="16dp"
|
||||||
|
app:chipIconSize="18dp"
|
||||||
|
app:chipIconTint="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</HorizontalScrollView>
|
||||||
|
</LinearLayout>
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/room_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:contentDescription="@string/room_list"
|
||||||
|
android:paddingBottom="16dp"
|
||||||
|
android:scrollbars="vertical"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/empty_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="32dp"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="72dp"
|
||||||
|
android:layout_height="72dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:alpha="0.5"
|
||||||
|
android:contentDescription="@string/refresh"
|
||||||
|
android:src="@drawable/ic_refresh"
|
||||||
|
app:tint="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/multiplayer_no_rooms_found"
|
||||||
|
android:textAppearance="@style/TextAppearance.Material3.TitleMedium"
|
||||||
|
android:textColor="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:text="@string/multiplayer_tap_refresh_to_check_again"
|
||||||
|
android:textAppearance="@style/TextAppearance.Material3.BodyMedium"
|
||||||
|
android:textColor="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/empty_refresh_button"
|
||||||
|
style="@style/Widget.Material3.Button.ElevatedButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="@string/refresh"
|
||||||
|
app:icon="@drawable/ic_refresh" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|
@ -0,0 +1,112 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/theme_dialog_background"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.google.android.material.bottomsheet.BottomSheetDragHandleView
|
||||||
|
android:id="@+id/drag_handle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginEnd="20dp"
|
||||||
|
android:layout_weight="0.75">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="120dp"
|
||||||
|
android:layout_height="120dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:contentDescription="@string/multiplayer"
|
||||||
|
android:src="@drawable/ic_network"
|
||||||
|
app:tint="?attr/colorPrimary" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1.25"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_title"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/multiplayer"
|
||||||
|
android:textAppearance="?attr/textAppearanceHeadline6"
|
||||||
|
android:textColor="?attr/colorOnSurface" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/btn_lobby_browser"
|
||||||
|
style="@style/Widget.Material3.Button.TonalButton"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:minHeight="56dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
android:text="@string/multiplayer_public_room"
|
||||||
|
android:textColor="?attr/colorOnPrimary"
|
||||||
|
app:backgroundTint="?attr/colorPrimary"
|
||||||
|
app:cornerRadius="16dp"
|
||||||
|
app:icon="@drawable/ic_search"
|
||||||
|
app:iconPadding="12dp"
|
||||||
|
app:iconTint="?attr/colorOnPrimary" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/btn_join"
|
||||||
|
style="@style/Widget.Material3.Button.ElevatedButton"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:minHeight="56dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
android:text="@string/multiplayer_join_room"
|
||||||
|
app:cornerRadius="16dp"
|
||||||
|
app:icon="@drawable/ic_install"
|
||||||
|
app:iconPadding="12dp" />
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:layout_width="16dp"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/btn_create"
|
||||||
|
style="@style/Widget.Material3.Button.ElevatedButton"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:minHeight="56dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
android:text="@string/multiplayer_create_room"
|
||||||
|
app:cornerRadius="16dp"
|
||||||
|
app:icon="@drawable/ic_add"
|
||||||
|
app:iconPadding="12dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
@ -44,7 +44,12 @@
|
||||||
style="@style/EdenCard"
|
style="@style/EdenCard"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
app:cardCornerRadius="24dp"
|
app:cardCornerRadius="24dp"
|
||||||
|
app:cardBackgroundColor="@android:color/transparent"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeColor="?attr/colorOutline"
|
||||||
|
app:strokeWidth="1dp"
|
||||||
android:padding="4dp"
|
android:padding="4dp"
|
||||||
>
|
>
|
||||||
|
|
||||||
|
|
@ -103,7 +108,12 @@
|
||||||
style="@style/EdenCard"
|
style="@style/EdenCard"
|
||||||
android:layout_width="42dp"
|
android:layout_width="42dp"
|
||||||
android:layout_height="42dp"
|
android:layout_height="42dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
app:cardCornerRadius="21dp"
|
app:cardCornerRadius="21dp"
|
||||||
|
app:cardBackgroundColor="@android:color/transparent"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeColor="?attr/colorOutline"
|
||||||
|
app:strokeWidth="1dp"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
>
|
>
|
||||||
|
|
||||||
|
|
@ -127,7 +137,12 @@
|
||||||
style="@style/EdenCard"
|
style="@style/EdenCard"
|
||||||
android:layout_width="42dp"
|
android:layout_width="42dp"
|
||||||
android:layout_height="42dp"
|
android:layout_height="42dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
app:cardCornerRadius="21dp"
|
app:cardCornerRadius="21dp"
|
||||||
|
app:cardBackgroundColor="@android:color/transparent"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeColor="?attr/colorOutline"
|
||||||
|
app:strokeWidth="1dp"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
>
|
>
|
||||||
|
|
||||||
|
|
@ -151,7 +166,12 @@
|
||||||
style="@style/EdenCard"
|
style="@style/EdenCard"
|
||||||
android:layout_width="42dp"
|
android:layout_width="42dp"
|
||||||
android:layout_height="42dp"
|
android:layout_height="42dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
app:cardCornerRadius="21dp"
|
app:cardCornerRadius="21dp"
|
||||||
|
app:cardBackgroundColor="@android:color/transparent"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeColor="?attr/colorOutline"
|
||||||
|
app:strokeWidth="1dp"
|
||||||
android:padding="8dp"
|
android:padding="8dp"
|
||||||
>
|
>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,70 +12,83 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:orientation="horizontal"
|
android:orientation="vertical"
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:paddingHorizontal="24dp"
|
android:paddingHorizontal="24dp"
|
||||||
android:paddingVertical="16dp">
|
android:paddingVertical="16dp">
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/icon"
|
|
||||||
android:layout_width="24dp"
|
|
||||||
android:layout_height="24dp"
|
|
||||||
android:layout_marginEnd="20dp"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
app:tint="?attr/colorOnSurface"
|
|
||||||
tools:src="@drawable/ic_settings" />
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="0dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="16dp"
|
android:gravity="center_vertical"
|
||||||
android:layout_weight="1"
|
android:orientation="horizontal">
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<ImageView
|
||||||
android:id="@+id/title"
|
android:id="@+id/icon"
|
||||||
style="@style/TextAppearance.Material3.TitleMedium"
|
android:layout_width="24dp"
|
||||||
android:layout_width="match_parent"
|
android:layout_height="24dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_marginEnd="20dp"
|
||||||
android:text="@string/user_data"
|
android:layout_gravity="center_vertical"
|
||||||
android:textAlignment="viewStart" />
|
app:tint="?attr/colorOnSurface"
|
||||||
|
tools:src="@drawable/ic_settings" />
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<LinearLayout
|
||||||
android:id="@+id/description"
|
android:layout_width="0dp"
|
||||||
style="@style/TextAppearance.Material3.BodyMedium"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="6dp"
|
android:layout_weight="1"
|
||||||
android:text="@string/user_data_description"
|
android:orientation="vertical">
|
||||||
android:textAlignment="viewStart" />
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
android:id="@+id/title"
|
||||||
|
style="@style/TextAppearance.Material3.TitleMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/user_data"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
android:id="@+id/description"
|
||||||
|
style="@style/TextAppearance.Material3.BodyMedium"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:text="@string/user_data_description"
|
||||||
|
android:textAlignment="viewStart" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<Button
|
<LinearLayout
|
||||||
android:id="@+id/button_export"
|
android:layout_width="match_parent"
|
||||||
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_marginTop="10dp"
|
||||||
android:contentDescription="@string/export"
|
android:gravity="end|center_vertical"
|
||||||
android:tooltipText="@string/export"
|
android:orientation="horizontal">
|
||||||
android:visibility="gone"
|
|
||||||
app:icon="@drawable/ic_export"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/button_install"
|
android:id="@+id/button_install"
|
||||||
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
|
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical"
|
android:contentDescription="@string/string_import"
|
||||||
android:layout_marginStart="12dp"
|
android:tooltipText="@string/string_import"
|
||||||
android:contentDescription="@string/string_import"
|
android:visibility="gone"
|
||||||
android:tooltipText="@string/string_import"
|
app:icon="@drawable/ic_import"
|
||||||
android:visibility="gone"
|
tools:visibility="visible" />
|
||||||
app:icon="@drawable/ic_import"
|
|
||||||
tools:visibility="visible" />
|
<Button
|
||||||
|
android:id="@+id/button_export"
|
||||||
|
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
|
android:contentDescription="@string/export"
|
||||||
|
android:tooltipText="@string/export"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:icon="@drawable/ic_export"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
android:id="@+id/coordinator_about"
|
android:id="@+id/coordinator_about"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/colorSurface"
|
||||||
>
|
>
|
||||||
|
|
||||||
<com.google.android.material.appbar.AppBarLayout
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
|
@ -48,7 +49,7 @@
|
||||||
android:layout_height="200dp"
|
android:layout_height="200dp"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
android:layout_marginEnd="32dp"
|
android:layout_marginEnd="32dp"
|
||||||
android:src="@drawable/ic_yuzu_named" />
|
android:src="@drawable/ic_yuzu" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,13 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:layout_marginHorizontal="16dp"
|
||||||
android:layout_marginVertical="12dp"
|
android:layout_marginVertical="12dp"
|
||||||
android:background="?attr/selectableItemBackground"
|
android:background="@android:color/transparent"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:focusable="true">
|
android:focusable="true"
|
||||||
|
app:cardBackgroundColor="@android:color/transparent"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeColor="?attr/colorOutline"
|
||||||
|
app:strokeWidth="1dp">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,15 @@
|
||||||
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
style="?attr/materialCardViewOutlinedStyle"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:layout_marginHorizontal="16dp"
|
||||||
android:layout_marginVertical="12dp">
|
android:layout_marginVertical="12dp"
|
||||||
|
app:cardBackgroundColor="@android:color/transparent"
|
||||||
|
app:cardCornerRadius="16dp"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeColor="?attr/colorOutline"
|
||||||
|
app:strokeWidth="1dp">
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
||||||
|
|
@ -27,10 +27,10 @@
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingTop="14dp"
|
android:paddingTop="4dp"
|
||||||
android:paddingLeft="6dp"
|
android:paddingLeft="4dp"
|
||||||
android:paddingRight="6dp"
|
android:paddingRight="4dp"
|
||||||
android:paddingBottom="6dp">
|
android:paddingBottom="2dp">
|
||||||
|
|
||||||
<com.google.android.material.imageview.ShapeableImageView
|
<com.google.android.material.imageview.ShapeableImageView
|
||||||
android:id="@+id/image_game_screen"
|
android:id="@+id/image_game_screen"
|
||||||
|
|
@ -48,11 +48,14 @@
|
||||||
style="@style/SynthwaveText.Body"
|
style="@style/SynthwaveText.Body"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="2dp"
|
||||||
|
android:gravity="center"
|
||||||
android:requiresFadingEdge="horizontal"
|
android:requiresFadingEdge="horizontal"
|
||||||
android:textAlignment="center"
|
android:textAlignment="center"
|
||||||
android:textSize="14sp"
|
android:textSize="14sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:ellipsize="end"
|
||||||
app:layout_constraintEnd_toEndOf="@+id/image_game_screen"
|
app:layout_constraintEnd_toEndOf="@+id/image_game_screen"
|
||||||
app:layout_constraintStart_toStartOf="@+id/image_game_screen"
|
app:layout_constraintStart_toStartOf="@+id/image_game_screen"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/image_game_screen"
|
app:layout_constraintTop_toBottomOf="@+id/image_game_screen"
|
||||||
|
|
|
||||||
|
|
@ -27,10 +27,10 @@
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingTop="14dp"
|
android:paddingTop="3dp"
|
||||||
android:paddingLeft="6dp"
|
android:paddingLeft="4dp"
|
||||||
android:paddingRight="6dp"
|
android:paddingRight="4dp"
|
||||||
android:paddingBottom="6dp">
|
android:paddingBottom="3dp">
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/image_container"
|
android:id="@+id/image_container"
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
android:transitionName="card_game"
|
android:transitionName="card_game"
|
||||||
app:cardCornerRadius="16dp"
|
app:cardCornerRadius="16dp"
|
||||||
app:cardElevation="0dp"
|
app:cardElevation="0dp"
|
||||||
app:cardBackgroundColor="@color/eden_card_background"
|
app:cardBackgroundColor="@android:color/transparent"
|
||||||
app:strokeWidth="0dp">
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
|
@ -27,6 +27,8 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Medium"
|
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Medium"
|
||||||
|
app:strokeColor="@color/eden_card_background"
|
||||||
|
app:strokeWidth="4dp"
|
||||||
tools:src="@drawable/default_icon" />
|
tools:src="@drawable/default_icon" />
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
|
|
||||||