diff --git a/3rdParty/SDL3/CMakeLists.txt b/3rdParty/SDL3/CMakeLists.txt new file mode 100644 index 000000000..c2e1d812c --- /dev/null +++ b/3rdParty/SDL3/CMakeLists.txt @@ -0,0 +1,22 @@ +if(DEVILUTIONX_STATIC_SDL3) + set(BUILD_SHARED_LIBS OFF) + set(SDL_SHARED OFF) + set(SDL_STATIC ON) + if(PIE) + set(SDL_STATIC_PIC ON) + endif() +else() + set(BUILD_SHARED_LIBS ON) + set(SDL_SHARED ON) + set(SDL_STATIC OFF) +endif() +set(SDL_TEST_ENABLED_BY_DEFAULT OFF) + +include(functions/FetchContent_ExcludeFromAll_backport) +include(FetchContent) + +FetchContent_Declare(SDL3 + URL https://github.com/libsdl-org/SDL/releases/download/release-3.2.24/SDL3-3.2.24.tar.gz + URL_HASH SHA256=81cc0fc17e5bf2c1754eeca9af9c47a76789ac5efdd165b3b91cbbe4b90bfb76 +) +FetchContent_MakeAvailable_ExcludeFromAll(SDL3) diff --git a/3rdParty/SDL3_image/CMakeLists.txt b/3rdParty/SDL3_image/CMakeLists.txt new file mode 100644 index 000000000..9347d8c1a --- /dev/null +++ b/3rdParty/SDL3_image/CMakeLists.txt @@ -0,0 +1,53 @@ +include(functions/dependency_options) + +if(NOT DEFINED DEVILUTIONX_SYSTEM_LIBPNG) + find_package(PNG QUIET) + if(PNG_FOUND) + message("-- Found png ${PNG_VERSION_STRING}") + else() + message("-- Suitable system png package not found, will use png from source") + set(DEVILUTIONX_SYSTEM_LIBPNG OFF) + endif() +endif() +dependency_options("libpng" DEVILUTIONX_SYSTEM_LIBPNG ON DEVILUTIONX_STATIC_LIBPNG) +if(DEVILUTIONX_SYSTEM_LIBPNG) + find_package(PNG REQUIRED) +else() + add_subdirectory(../libpng libpng) +endif() + +include(functions/FetchContent_ExcludeFromAll_backport) +include(FetchContent) + +if(DEVILUTIONX_STATIC_SDL_IMAGE) + set(BUILD_SHARED_LIBS OFF) +else() + set(BUILD_SHARED_LIBS ON) +endif() + +set(SDLIMAGE_AVIF OFF) +set(SDLIMAGE_BMP OFF) +set(SDLIMAGE_GIF OFF) +set(SDLIMAGE_JPG OFF) +set(SDLIMAGE_JXL OFF) +set(SDLIMAGE_LBM OFF) +set(SDLIMAGE_PCX OFF) +set(SDLIMAGE_PNG ON) +set(SDLIMAGE_PNM OFF) +set(SDLIMAGE_QOI OFF) +set(SDLIMAGE_SVG OFF) +set(SDLIMAGE_TGA OFF) +set(SDLIMAGE_TIF OFF) +set(SDLIMAGE_WEBP OFF) +set(SDLIMAGE_XCF OFF) +set(SDLIMAGE_XPM OFF) +set(SDLIMAGE_XV OFF) +set(SDLIMAGE_AVIF_SAVE OFF) +set(SDLIMAGE_JPG_SAVE OFF) +set(SDLIMAGE_PNG_SAVE ON) + +FetchContent_Declare_ExcludeFromAll(SDL_image + URL https://github.com/libsdl-org/SDL_image/releases/download/release-3.2.4/SDL3_image-3.2.4.tar.gz + URL_HASH SHA256=a725bd6d04261fdda0dd8d950659e1dc15a8065d025275ef460d32ae7dcfc182 +) +FetchContent_MakeAvailable_ExcludeFromAll(SDL_image) diff --git a/CMake/Dependencies.cmake b/CMake/Dependencies.cmake index 118a0a9bd..02c56eef0 100644 --- a/CMake/Dependencies.cmake +++ b/CMake/Dependencies.cmake @@ -63,6 +63,13 @@ if(EMSCRIPTEN) elseif(USE_SDL1) find_package(SDL 1.2.10 REQUIRED) include_directories(${SDL_INCLUDE_DIR}) +elseif(USE_SDL3) + dependency_options("SDL3" DEVILUTIONX_SYSTEM_SDL3 ON DEVILUTIONX_STATIC_SDL3) + if(DEVILUTIONX_SYSTEM_SDL3) + find_package(SDL3 3.2.24 REQUIRED CONFIG REQUIRED COMPONENTS SDL3) + else() + add_subdirectory(3rdParty/SDL3) + endif() else() dependency_options("SDL2" DEVILUTIONX_SYSTEM_SDL2 ON DEVILUTIONX_STATIC_SDL2) if(DEVILUTIONX_SYSTEM_SDL2) @@ -103,6 +110,9 @@ add_library(DevilutionX::SDL INTERFACE IMPORTED GLOBAL) if(USE_SDL1) target_link_libraries(DevilutionX::SDL INTERFACE ${SDL_LIBRARY}) target_compile_definitions(DevilutionX::SDL INTERFACE USE_SDL1) +elseif(USE_SDL3) + target_link_libraries(DevilutionX::SDL INTERFACE SDL3::SDL3) + target_compile_definitions(DevilutionX::SDL INTERFACE USE_SDL3) else() if(TARGET SDL2::SDL2 AND NOT (DEVILUTIONX_STATIC_SDL2 AND TARGET SDL2::SDL2-static)) target_link_libraries(DevilutionX::SDL INTERFACE SDL2::SDL2) @@ -126,7 +136,28 @@ macro(_find_SDL_image QUIET_OR_REQUIRED) endif() endmacro() -if(NOT USE_SDL1) +if(USE_SDL1) + # No need for SDL_image. +elseif(USE_SDL3) + if(NOT DEFINED DEVILUTIONX_SYSTEM_SDL_IMAGE) + find_package(SDL3_image QUIET CONFIG) + if(SDL3_image_FOUND) + message("-- Found SDL3_image") + else() + message("-- Suitable system SDL3_image package not found, will use SDL3_image from source") + set(DEVILUTIONX_SYSTEM_SDL_IMAGE OFF) + endif() + endif() + dependency_options("SDL3_image" DEVILUTIONX_SYSTEM_SDL_IMAGE ON DEVILUTIONX_STATIC_SDL_IMAGE) + if(DEVILUTIONX_SYSTEM_SDL_IMAGE) + find_package(SDL3_image REQUIRED CONFIG) + else() + # Must be the same, see: + # https://github.com/libsdl-org/SDL_image/blob/11154afb7855293159588b245b446a4ef09e574f/CMakeLists.txt#L225-L233 + set(DEVILUTIONX_STATIC_SDL_IMAGE ${DEVILUTIONX_STATIC_SDL3}) + add_subdirectory(3rdParty/SDL3_image) + endif() +else() if(EMSCRIPTEN) emscripten_system_library("SDL_image" SDL2::SDL2_image USE_SDL_IMAGE=2 "SDL2_IMAGE_FORMATS='[\"png\"]'") else() diff --git a/CMake/VcPkgManifestFeatures.cmake b/CMake/VcPkgManifestFeatures.cmake index de7359fa8..e22e866d6 100644 --- a/CMake/VcPkgManifestFeatures.cmake +++ b/CMake/VcPkgManifestFeatures.cmake @@ -1,6 +1,8 @@ # See https://vcpkg.readthedocs.io/en/latest/users/manifests/ if(USE_SDL1) list(APPEND VCPKG_MANIFEST_FEATURES "sdl1") +elseif(USE_SDL3) + list(APPEND VCPKG_MANIFEST_FEATURES "sdl3") else() list(APPEND VCPKG_MANIFEST_FEATURES "sdl2") endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f34809f1..21a014c29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ include(functions/genex) # Options required by `VcPkgManifestFeatures`, which must be included before the `project` call. option(USE_SDL1 "Use SDL1.2 instead of SDL2" OFF) +option(USE_SDL3 "Use SDL3 instead of SDL2" OFF) option(NONET "Disable network support" OFF) cmake_dependent_option(PACKET_ENCRYPTION "Encrypt network packets" ON "NOT NONET" OFF) # The gettext[tools] package takes a very long time to install @@ -105,6 +106,10 @@ option(WIN_NSIS "Generate an NSIS installer" OFF) cmake_dependent_option(DISABLE_TCP "Disable TCP multiplayer option" OFF "NOT NONET" ON) cmake_dependent_option(DISABLE_ZERO_TIER "Disable ZeroTier multiplayer option" OFF "NOT NONET" ON) +if(USE_SDL1 AND USE_SDL3) + message(FATAL_ERROR "USE_SDL1 and USE_SDL3 cannot be set at the same time") +endif() + # Graphics options if(NOT USE_SDL1) set(DEVILUTIONX_DISPLAY_TEXTURE_FORMAT "SDL_PIXELFORMAT_RGB888" CACHE STRING "Texture format for DevilutionX textures when using the GPU renderer") diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 85d5746b9..db37bd396 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -869,10 +869,15 @@ if(DEVILUTIONX_SCREENSHOT_FORMAT STREQUAL DEVILUTIONX_SCREENSHOT_FORMAT_PNG) target_link_dependencies(libdevilutionx_surface_to_png PUBLIC DevilutionX::SDL - SDL2::SDL2_image tl libdevilutionx_surface ) + if(USE_SDL3) + target_link_dependencies(libdevilutionx_surface_to_png PUBLIC SDL3_image::SDL3_image) + target_compile_definitions(libdevilutionx_surface_to_png INTERFACE USE_SDL3) + else() + target_link_dependencies(libdevilutionx_surface_to_png PUBLIC SDL2::SDL2_image) + endif() endif() add_devilutionx_object_library(libdevilutionx ${libdevilutionx_SRCS}) @@ -973,7 +978,11 @@ if(SCREEN_READER_INTEGRATION) endif() endif() -if(NOT USE_SDL1) +if(USE_SDL1) + # No need for SDL_image +elseif(USE_SDL3) + target_link_libraries(libdevilutionx PUBLIC SDL3_image::SDL3_image) +else() target_link_libraries(libdevilutionx PUBLIC SDL2::SDL2_image) endif()