diff --git a/Libraries/CMakeLists.txt b/Libraries/CMakeLists.txt index 11efc1f231..615d77cea4 100644 --- a/Libraries/CMakeLists.txt +++ b/Libraries/CMakeLists.txt @@ -28,6 +28,7 @@ add_subdirectory(LibXML) if (ENABLE_GUI_TARGETS) add_subdirectory(LibDevTools) add_subdirectory(LibGfx) + add_subdirectory(LibImageDecoders) add_subdirectory(LibImageDecoderClient) add_subdirectory(LibMedia) add_subdirectory(LibWeb) diff --git a/Libraries/LibGfx/CMakeLists.txt b/Libraries/LibGfx/CMakeLists.txt index ef173cbde2..35aa60c547 100644 --- a/Libraries/LibGfx/CMakeLists.txt +++ b/Libraries/LibGfx/CMakeLists.txt @@ -22,20 +22,9 @@ set(SOURCES FontCascadeList.cpp GradientPainting.cpp Matrix4x4.cpp - ImageFormats/AVIFLoader.cpp - ImageFormats/BMPLoader.cpp ImageFormats/BMPWriter.cpp - ImageFormats/CCITTDecoder.cpp - ImageFormats/GIFLoader.cpp - ImageFormats/ICOLoader.cpp - ImageFormats/ImageDecoder.cpp - ImageFormats/JPEGLoader.cpp ImageFormats/JPEGWriter.cpp - ImageFormats/JPEGXLLoader.cpp - ImageFormats/PNGLoader.cpp ImageFormats/PNGWriter.cpp - ImageFormats/TIFFLoader.cpp - ImageFormats/WebPLoader.cpp ImageFormats/WebPSharedLossless.cpp ImageFormats/WebPWriter.cpp ImageFormats/WebPWriterLossless.cpp @@ -79,31 +68,7 @@ ladybird_lib(LibGfx gfx) target_link_libraries(LibGfx PRIVATE LibCompress LibCore LibCrypto LibFileSystem LibTextCodec LibIPC LibSync LibUnicode) -set(generated_sources TIFFMetadata.h TIFFTagHandler.cpp) -list(TRANSFORM generated_sources PREPEND "ImageFormats/") - -add_custom_command( - OUTPUT ${generated_sources} - COMMAND ${Python3_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/TIFFGenerator.py" -o "${CMAKE_CURRENT_BINARY_DIR}/ImageFormats" - DEPENDS "TIFFGenerator.py" - VERBATIM -) -target_sources(LibGfx PRIVATE ${generated_sources}) -add_custom_target(generate_tiff_files_handler DEPENDS ${generated_sources}) -add_dependencies(ladybird_codegen_accumulator generate_tiff_files_handler) -add_dependencies(LibGfx generate_tiff_files_handler) - -set(generated_headers ${generated_sources}) -list(FILTER generated_headers INCLUDE REGEX "\\.h$") -list(TRANSFORM generated_headers PREPEND "${CMAKE_CURRENT_BINARY_DIR}/") - -if (ENABLE_INSTALL_HEADERS) - list(TRANSFORM generated_sources PREPEND "${CMAKE_CURRENT_BINARY_DIR}/") - install(FILES ${generated_sources} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibGfx/ImageFormats") -endif() - -target_link_libraries(LibGfx PRIVATE PkgConfig::WOFF2 JPEG::JPEG PNG::PNG avif WebP::webp WebP::webpdecoder - WebP::webpdemux WebP::libwebpmux skia harfbuzz) +target_link_libraries(LibGfx PRIVATE PkgConfig::WOFF2 JPEG::JPEG PNG::PNG skia harfbuzz) import_rust_crate(MANIFEST_PATH Rust/Cargo.toml CRATE_NAME libgfx_rust FFI_HEADER RustFFI.h) target_link_libraries(LibGfx PRIVATE libgfx_rust) @@ -112,20 +77,6 @@ if (HAS_FONTCONFIG) target_link_libraries(LibGfx PRIVATE Fontconfig::Fontconfig) endif() -set(CMAKE_REQUIRED_LIBRARIES PNG::PNG) -check_c_source_compiles([=[ - #include - #if !defined(PNG_APNG_SUPPORTED) || !defined(PNG_READ_APNG_SUPPORTED) || !defined(PNG_READ_APNG_SUPPORTED) - #error "APNG support is required" - #endif - int main() {} -]=] LIBPNG_HAS_APNG) -unset(CMAKE_REQUIRED_LIBRARIES) - -if (NOT LIBPNG_HAS_APNG) - message(FATAL_ERROR "libpng does not support APNG, which is required by LibGfx.") -endif() - if (NOT ANDROID) # FIXME: Build vcpkg libraries with clang-cl so they can also build in sanitize. # https://github.com/LadybirdBrowser/ladybird/issues/5224 @@ -134,9 +85,6 @@ if (NOT ANDROID) # alone causes transitive issues in other TUs that depend on it target_compile_options(LibGfx PRIVATE -fno-sanitize=address) endif() - target_link_libraries(LibGfx PRIVATE PkgConfig::Jxl) -else() - target_link_libraries(LibGfx PRIVATE libjxl::libjxl hwy::hwy) endif() if (APPLE) diff --git a/Libraries/LibImageDecoders/CMakeLists.txt b/Libraries/LibImageDecoders/CMakeLists.txt new file mode 100644 index 0000000000..f642eabbed --- /dev/null +++ b/Libraries/LibImageDecoders/CMakeLists.txt @@ -0,0 +1,74 @@ +set(LIBGFX_IMAGE_FORMATS_DIR "${LADYBIRD_SOURCE_DIR}/Libraries/LibGfx/ImageFormats") + +set(SOURCES + ${LIBGFX_IMAGE_FORMATS_DIR}/AVIFLoader.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/BMPLoader.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/CCITTDecoder.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/GIFLoader.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/ICOLoader.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/ImageDecoder.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/JPEGLoader.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/JPEGXLLoader.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/PNGLoader.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/TIFFLoader.cpp + ${LIBGFX_IMAGE_FORMATS_DIR}/WebPLoader.cpp +) + +ladybird_lib(LibImageDecoders imagedecoders) + +target_link_libraries(LibImageDecoders PRIVATE + LibCompress + LibCore + LibCrypto + LibFileSystem + LibGfx + LibIPC + LibSync + LibTextCodec + LibUnicode + JPEG::JPEG + PNG::PNG + WebP::webp + WebP::webpdecoder + WebP::webpdemux + WebP::libwebpmux + avif +) + +set(generated_sources TIFFMetadata.h TIFFTagHandler.cpp) +list(TRANSFORM generated_sources PREPEND "${CMAKE_BINARY_DIR}/Libraries/LibGfx/ImageFormats/") + +add_custom_command( + OUTPUT ${generated_sources} + COMMAND ${Python3_EXECUTABLE} "${LADYBIRD_SOURCE_DIR}/Libraries/LibGfx/TIFFGenerator.py" -o "${CMAKE_BINARY_DIR}/Libraries/LibGfx/ImageFormats" + DEPENDS "${LADYBIRD_SOURCE_DIR}/Libraries/LibGfx/TIFFGenerator.py" + VERBATIM +) +target_sources(LibImageDecoders PRIVATE ${generated_sources}) +add_custom_target(generate_tiff_files_handler DEPENDS ${generated_sources}) +add_dependencies(ladybird_codegen_accumulator generate_tiff_files_handler) +add_dependencies(LibImageDecoders generate_tiff_files_handler) + +if (ENABLE_INSTALL_HEADERS) + install(FILES ${generated_sources} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/LibGfx/ImageFormats") +endif() + +set(CMAKE_REQUIRED_LIBRARIES PNG::PNG) +check_c_source_compiles([=[ + #include + #if !defined(PNG_APNG_SUPPORTED) || !defined(PNG_READ_APNG_SUPPORTED) || !defined(PNG_READ_APNG_SUPPORTED) + #error "APNG support is required" + #endif + int main() {} +]=] LIBPNG_HAS_APNG) +unset(CMAKE_REQUIRED_LIBRARIES) + +if (NOT LIBPNG_HAS_APNG) + message(FATAL_ERROR "libpng does not support APNG, which is required by LibImageDecoders.") +endif() + +if (NOT ANDROID) + target_link_libraries(LibImageDecoders PRIVATE PkgConfig::Jxl) +else() + target_link_libraries(LibImageDecoders PRIVATE libjxl::libjxl hwy::hwy) +endif() diff --git a/Libraries/LibWeb/DOM/DocumentLoading.cpp b/Libraries/LibWeb/DOM/DocumentLoading.cpp index 501241a351..fd15dedaed 100644 --- a/Libraries/LibWeb/DOM/DocumentLoading.cpp +++ b/Libraries/LibWeb/DOM/DocumentLoading.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include diff --git a/Libraries/LibWebView/Plugins/ImageCodecPlugin.cpp b/Libraries/LibWebView/Plugins/ImageCodecPlugin.cpp index aea702ce8f..c834a621c9 100644 --- a/Libraries/LibWebView/Plugins/ImageCodecPlugin.cpp +++ b/Libraries/LibWebView/Plugins/ImageCodecPlugin.cpp @@ -6,7 +6,6 @@ */ #include -#include #include #include #include diff --git a/Meta/Lagom/Fuzzers/fuzzers.cmake b/Meta/Lagom/Fuzzers/fuzzers.cmake index f469d80804..a79085c121 100644 --- a/Meta/Lagom/Fuzzers/fuzzers.cmake +++ b/Meta/Lagom/Fuzzers/fuzzers.cmake @@ -24,20 +24,20 @@ if (TARGET LibWeb) endif() set(FUZZER_DEPENDENCIES_ASN1 LibCrypto LibTLS) -set(FUZZER_DEPENDENCIES_BMPLoader LibGfx) +set(FUZZER_DEPENDENCIES_BMPLoader LibGfx LibImageDecoders) set(FUZZER_DEPENDENCIES_CSSParser LibWeb) set(FUZZER_DEPENDENCIES_ELF LibELF) -set(FUZZER_DEPENDENCIES_GIFLoader LibGfx) -set(FUZZER_DEPENDENCIES_ICOLoader LibGfx) +set(FUZZER_DEPENDENCIES_GIFLoader LibGfx LibImageDecoders) +set(FUZZER_DEPENDENCIES_ICOLoader LibGfx LibImageDecoders) set(FUZZER_DEPENDENCIES_Js LibJS LibGC) set(FUZZER_DEPENDENCIES_MatroskaReader LibMedia) set(FUZZER_DEPENDENCIES_PEM LibCrypto) -set(FUZZER_DEPENDENCIES_PNGLoader LibGfx) +set(FUZZER_DEPENDENCIES_PNGLoader LibGfx LibImageDecoders) set(FUZZER_DEPENDENCIES_Poly1305 LibCrypto) set(FUZZER_DEPENDENCIES_RegexECMA262 LibRegex) set(FUZZER_DEPENDENCIES_RSAKeyParsing LibCrypto) set(FUZZER_DEPENDENCIES_TextDecoder LibTextCodec) -set(FUZZER_DEPENDENCIES_TIFFLoader LibGfx) +set(FUZZER_DEPENDENCIES_TIFFLoader LibGfx LibImageDecoders) set(FUZZER_DEPENDENCIES_TTF LibGfx) set(FUZZER_DEPENDENCIES_URL LibURL) set(FUZZER_DEPENDENCIES_WasmParser LibWasm) diff --git a/Services/ImageDecoder/CMakeLists.txt b/Services/ImageDecoder/CMakeLists.txt index c8f1f040c0..be8343e469 100644 --- a/Services/ImageDecoder/CMakeLists.txt +++ b/Services/ImageDecoder/CMakeLists.txt @@ -32,7 +32,7 @@ target_include_directories(imagedecoderservice PRIVATE ${CMAKE_CURRENT_BINARY_DI target_include_directories(imagedecoderservice PRIVATE ${LADYBIRD_SOURCE_DIR}/Services/) target_link_libraries(ImageDecoder PRIVATE imagedecoderservice LibCore LibMain LibSandbox LibThreading) -target_link_libraries(imagedecoderservice PRIVATE LibCore LibGfx LibIPC LibImageDecoderClient LibMain LibSync LibThreading) +target_link_libraries(imagedecoderservice PRIVATE LibCore LibGfx LibImageDecoders LibIPC LibImageDecoderClient LibMain LibSync LibThreading) if (WIN32) ladybird_windows_bin(ImageDecoder CONSOLE) diff --git a/Tests/LibGfx/CMakeLists.txt b/Tests/LibGfx/CMakeLists.txt index 87e1d41042..7a2bf71bcd 100644 --- a/Tests/LibGfx/CMakeLists.txt +++ b/Tests/LibGfx/CMakeLists.txt @@ -14,4 +14,8 @@ foreach(source IN LISTS TEST_SOURCES) ladybird_test("${source}" LibGfx LIBS LibGfx) endforeach() +target_link_libraries(BenchmarkJPEGLoader PRIVATE LibImageDecoders) +target_link_libraries(TestImageDecoder PRIVATE LibImageDecoders) +target_link_libraries(TestImageWriter PRIVATE LibImageDecoders) + ladybird_test(TestYUVData.cpp LibGfx LIBS LibGfx skia) diff --git a/Tests/LibWeb/test-web/CMakeLists.txt b/Tests/LibWeb/test-web/CMakeLists.txt index e0eb0aa525..b39015bbfc 100644 --- a/Tests/LibWeb/test-web/CMakeLists.txt +++ b/Tests/LibWeb/test-web/CMakeLists.txt @@ -12,7 +12,7 @@ set(SOURCES add_executable(test-web ${SOURCES}) add_dependencies(test-web ladybird_build_resource_files ${ladybird_helper_processes}) -target_link_libraries(test-web PRIVATE AK LibCore LibDiff LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibRequests LibURL LibWeb LibWebView) +target_link_libraries(test-web PRIVATE AK LibCore LibDiff LibFileSystem LibGfx LibImageDecoders LibImageDecoderClient LibIPC LibJS LibMain LibRequests LibURL LibWeb LibWebView) if (APPLE) target_compile_definitions(test-web PRIVATE LADYBIRD_BINARY_PATH="$") diff --git a/Utilities/CMakeLists.txt b/Utilities/CMakeLists.txt index ed138df558..caa5dadebd 100644 --- a/Utilities/CMakeLists.txt +++ b/Utilities/CMakeLists.txt @@ -9,7 +9,7 @@ ladybird_utility(xml SOURCES xml.cpp LIBS LibFileSystem LibMain LibXML LibURL) ladybird_utility(dns SOURCES dns.cpp LIBS LibDNS LibMain LibTLS LibCrypto) if (ENABLE_GUI_TARGETS) - ladybird_utility(image SOURCES image.cpp LIBS LibGfx LibMain) + ladybird_utility(image SOURCES image.cpp LIBS LibGfx LibImageDecoders LibMain) endif() # FIXME: Increase support for building targets on Windows