From 2c16a78282ae7ea0dd62a90124ba162fb51c0d7a Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Mon, 8 May 2023 19:53:29 +0200 Subject: [PATCH] Squashed 'external/lunasvg/' changes from 585d61eef..f924651b8 f924651b8 Merge pull request #129 from lemirep/master db27b7c0e Add missing cstdint include b66e22402 Merge pull request #126 from m-carrasco/fix-null-ptr-arithmetic a1edbff60 Merge pull request #125 from m-carrasco/fix-ub-memcpy f595f7be3 Fix UB caused by null pointer arithmetic. a854444e5 Fix UB caused by wrong call to memcpy. b7e72fb37 Merge pull request #84 from seanharmer/master 4c16abf41 Merge pull request #123 from m-carrasco/fix-gradient-ub 4d51541c2 Fix undefined behavior caused by a domain error on an sqrt call. d4a7080cf Merge pull request #1 from seanharmer/cmake_modernization b08d7d03a Relax the cmake version and other improvements 33a458302 Modernize the cmake usage 4b2609c14 Add initial .gitignore git-subtree-dir: external/lunasvg git-subtree-split: f924651b85cac47dbe15f51a4aa320461fc1d07b --- .gitignore | 2 + 3rdparty/plutovg/plutovg-blend.c | 8 +++- 3rdparty/plutovg/plutovg-ft-stroker.c | 7 ++- 3rdparty/plutovg/plutovg-rle.c | 10 ++-- CMakeLists.txt | 67 +++++++++++++++++++++------ cmake/lunasvgConfig.cmake.in | 3 ++ example/CMakeLists.txt | 2 +- include/CMakeLists.txt | 16 ++++++- include/lunasvg.h | 12 ++--- source/property.h | 1 + 10 files changed, 97 insertions(+), 31 deletions(-) create mode 100644 .gitignore create mode 100644 cmake/lunasvgConfig.cmake.in diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..6cb22275e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +build/* diff --git a/3rdparty/plutovg/plutovg-blend.c b/3rdparty/plutovg/plutovg-blend.c index 6cbe76e7f..64cb79da2 100644 --- a/3rdparty/plutovg/plutovg-blend.c +++ b/3rdparty/plutovg/plutovg-blend.c @@ -2,6 +2,7 @@ #include #include +#include #define COLOR_TABLE_SIZE 1024 typedef struct { @@ -243,6 +244,7 @@ static void fetch_radial_gradient(uint32_t* buffer, const radial_gradient_values while(buffer < end) { uint32_t result = 0; + det = fabs(det) < DBL_EPSILON ? 0.0 : det; if(det >= 0) { double w = sqrt(det) - b; @@ -261,7 +263,11 @@ static void fetch_radial_gradient(uint32_t* buffer, const radial_gradient_values { while(buffer < end) { - *buffer++ = gradient_pixel(gradient, sqrt(det) - b); + det = fabs(det) < DBL_EPSILON ? 0.0 : det; + uint32_t result = 0; + if (det >= 0) + result = gradient_pixel(gradient, sqrt(det) - b); + *buffer++ = result; det += delta_det; delta_det += delta_delta_det; b += delta_b; diff --git a/3rdparty/plutovg/plutovg-ft-stroker.c b/3rdparty/plutovg/plutovg-ft-stroker.c index 207c15d39..2d2f44606 100644 --- a/3rdparty/plutovg/plutovg-ft-stroker.c +++ b/3rdparty/plutovg/plutovg-ft-stroker.c @@ -629,10 +629,12 @@ static void ft_stroke_border_export(PVG_FT_StrokeBorder border, PVG_FT_Outline* outline) { /* copy point locations */ - memcpy(outline->points + outline->n_points, border->points, - border->num_points * sizeof(PVG_FT_Vector)); + if (outline->points != NULL && border->points != NULL) + memcpy(outline->points + outline->n_points, border->points, + border->num_points * sizeof(PVG_FT_Vector)); /* copy tags */ + if (outline->tags) { PVG_FT_UInt count = border->num_points; PVG_FT_Byte* read = border->tags; @@ -649,6 +651,7 @@ static void ft_stroke_border_export(PVG_FT_StrokeBorder border, } /* copy contours */ + if (outline->contours) { PVG_FT_UInt count = border->num_points; PVG_FT_Byte* tags = border->tags; diff --git a/3rdparty/plutovg/plutovg-rle.c b/3rdparty/plutovg/plutovg-rle.c index 857628ad0..31eb86501 100644 --- a/3rdparty/plutovg/plutovg-rle.c +++ b/3rdparty/plutovg/plutovg-rle.c @@ -21,9 +21,13 @@ static void ft_outline_init(PVG_FT_Outline* outline, plutovg_t* pluto, int point PVG_FT_Byte* data = pluto->outline_data; outline->points = (PVG_FT_Vector*)(data); - outline->tags = (char*)(data + size_a); - outline->contours = (int*)(data + size_a + size_b); - outline->contours_flag = (char*)(data + size_a + size_b + size_c); + outline->tags = outline->contours_flag = NULL; + outline->contours = NULL; + if(data){ + outline->tags = (char*)(data + size_a); + outline->contours = (int*)(data + size_a + size_b); + outline->contours_flag = (char*)(data + size_a + size_b + size_c); + } outline->n_points = 0; outline->n_contours = 0; outline->flags = 0x0; diff --git a/CMakeLists.txt b/CMakeLists.txt index b2f07dc90..0903cc528 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,15 @@ -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.13) project(lunasvg VERSION 2.3.5 LANGUAGES CXX C) set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 11) +# Default to hidden visibility for symbols +set(CMAKE_C_VISIBILITY_PRESET hidden) +set(CMAKE_CXX_VISIBILITY_PRESET hidden) +set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) + option(BUILD_SHARED_LIBS "Builds as shared library" OFF) option(LUNASVG_BUILD_EXAMPLES "Builds examples" OFF) @@ -14,25 +19,61 @@ add_subdirectory(include) add_subdirectory(source) add_subdirectory(3rdparty/plutovg) -if(BUILD_SHARED_LIBS) - target_compile_definitions(lunasvg PUBLIC LUNASVG_SHARED) - target_compile_definitions(lunasvg PRIVATE LUNASVG_EXPORT) +set_target_properties(lunasvg + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" +) + +add_library(lunasvg::lunasvg ALIAS lunasvg) + +if(NOT BUILD_SHARED_LIBS) + target_compile_definitions(lunasvg PUBLIC LUNASVG_STATIC_DEFINE) endif() if(LUNASVG_BUILD_EXAMPLES) add_subdirectory(example) endif() -set(LUNASVG_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib) -set(LUNASVG_INCDIR ${CMAKE_INSTALL_PREFIX}/include) +# +# Installation +# +include(GNUInstallDirs) +install( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/include/lunasvg.h + ${CMAKE_CURRENT_BINARY_DIR}/include/lunasvg_export.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/lunasvg +) +install( + TARGETS lunasvg + EXPORT lunasvg-targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) +install( + EXPORT lunasvg-targets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/lunasvg NAMESPACE lunasvg:: FILE lunasvgTargets.cmake +) + +include(CMakePackageConfigHelpers) +configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/lunasvgConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/lunasvgConfig.cmake + INSTALL_DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/lunasvg +) + +write_basic_package_version_file(lunasvgConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) install(FILES - include/lunasvg.h - DESTINATION ${LUNASVG_INCDIR} + ${CMAKE_CURRENT_BINARY_DIR}/lunasvgConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/lunasvgConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/lunasvg ) -install(TARGETS lunasvg - LIBRARY DESTINATION ${LUNASVG_LIBDIR} - ARCHIVE DESTINATION ${LUNASVG_LIBDIR} - INCLUDES DESTINATION ${LUNASVG_INCDIR} -) +export(EXPORT lunasvg-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/lunasvgTargets.cmake NAMESPACE lunasvg::) diff --git a/cmake/lunasvgConfig.cmake.in b/cmake/lunasvgConfig.cmake.in new file mode 100644 index 000000000..850098f24 --- /dev/null +++ b/cmake/lunasvgConfig.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/lunasvgTargets.cmake") diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 53ec5ef46..de18b31d1 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.13) set(CMAKE_CXX_STANDARD 14) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index de589546c..70d896f55 100755 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -1,4 +1,16 @@ +# Generate a standard header with export macros +include(GenerateExportHeader) +generate_export_header(lunasvg) + target_include_directories(lunasvg -PUBLIC - "${CMAKE_CURRENT_LIST_DIR}" + # When building a project that uses the lunasvg library, + # we need to look in the installed include directory + PUBLIC + $ + + # When building the lunasvg library we need to look in the + # build dir for the lunasvg_export.h header and in the source + # dir for other headers + $ + $ ) diff --git a/include/lunasvg.h b/include/lunasvg.h index ae44b75d1..687b5723a 100644 --- a/include/lunasvg.h +++ b/include/lunasvg.h @@ -25,16 +25,10 @@ #include #include +#include -#if defined(_MSC_VER) && defined(LUNASVG_SHARED) -#ifdef LUNASVG_EXPORT -#define LUNASVG_API __declspec(dllexport) -#else -#define LUNASVG_API __declspec(dllimport) -#endif -#else -#define LUNASVG_API -#endif +#include +#define LUNASVG_API LUNASVG_EXPORT namespace lunasvg { diff --git a/source/property.h b/source/property.h index cdbff73e6..b08724704 100644 --- a/source/property.h +++ b/source/property.h @@ -4,6 +4,7 @@ #include #include #include +#include namespace lunasvg {