diff --git a/CMakeLists.txt b/CMakeLists.txt index 50d6e31..1a237b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ file(GLOB HEADERS poly2tri/*.h poly2tri/common/*.h poly2tri/sweep/*.h) add_library(poly2tri ${SOURCES} ${HEADERS}) target_include_directories(poly2tri INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) +get_target_property(poly2tri_target_type poly2tri TYPE) +if(poly2tri_target_type STREQUAL SHARED_LIBRARY) + target_compile_definitions(poly2tri PRIVATE P2T_SHARED_EXPORTS) +else() + target_compile_definitions(poly2tri PUBLIC P2T_STATIC_EXPORTS) +endif() + if(P2T_BUILD_TESTS) enable_testing() add_subdirectory(unittest) diff --git a/poly2tri/common/dll_symbol.h b/poly2tri/common/dll_symbol.h new file mode 100644 index 0000000..92c50cb --- /dev/null +++ b/poly2tri/common/dll_symbol.h @@ -0,0 +1,56 @@ +/* + * Poly2Tri Copyright (c) 2009-2022, Poly2Tri Contributors + * https://github.com/jhasse/poly2tri + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DLL_SYMBOL_H +#define DLL_SYMBOL_H + +#if defined(_WIN32) +# define P2T_COMPILER_DLLEXPORT __declspec(dllexport) +# define P2T_COMPILER_DLLIMPORT __declspec(dllimport) +#elif defined(__GNUC__) +# define P2T_COMPILER_DLLEXPORT __attribute__ ((visibility ("default"))) +# define P2T_COMPILER_DLLIMPORT __attribute__ ((visibility ("default"))) +#else +# define P2T_COMPILER_DLLEXPORT +# define P2T_COMPILER_DLLIMPORT +#endif + +#ifndef P2T_DLL_SYMBOL +# if defined(P2T_STATIC_EXPORTS) +# define P2T_DLL_SYMBOL +# elif defined(P2T_SHARED_EXPORTS) +# define P2T_DLL_SYMBOL P2T_COMPILER_DLLEXPORT +# else +# define P2T_DLL_SYMBOL P2T_COMPILER_DLLIMPORT +# endif +#endif + +#endif diff --git a/poly2tri/common/shapes.h b/poly2tri/common/shapes.h index 5bf8c8f..489558d 100644 --- a/poly2tri/common/shapes.h +++ b/poly2tri/common/shapes.h @@ -33,6 +33,8 @@ #ifndef SHAPES_H #define SHAPES_H +#include "dll_symbol.h" + #include #include #include @@ -42,7 +44,7 @@ namespace p2t { struct Edge; -struct Point { +struct P2T_DLL_SYMBOL Point { double x, y; @@ -119,10 +121,10 @@ struct Point { }; -std::ostream& operator<<(std::ostream&, const Point&); +P2T_DLL_SYMBOL std::ostream& operator<<(std::ostream&, const Point&); // Represents a simple polygon's edge -struct Edge { +struct P2T_DLL_SYMBOL Edge { Point* p, *q; @@ -149,7 +151,7 @@ struct Edge { // Triangle-based data structures are know to have better performance than quad-edge structures // See: J. Shewchuk, "Triangle: Engineering a 2D Quality Mesh Generator and Delaunay Triangulator" // "Triangulations in CGAL" -class Triangle { +class P2T_DLL_SYMBOL Triangle { public: /// Constructor @@ -324,7 +326,7 @@ inline void Triangle::IsInterior(bool b) } /// Is this set a valid delaunay triangulation? -bool IsDelaunay(const std::vector&); +P2T_DLL_SYMBOL bool IsDelaunay(const std::vector&); } diff --git a/poly2tri/sweep/cdt.h b/poly2tri/sweep/cdt.h index efeeda3..7e3a45a 100644 --- a/poly2tri/sweep/cdt.h +++ b/poly2tri/sweep/cdt.h @@ -36,6 +36,8 @@ #include "sweep_context.h" #include "sweep.h" +#include "../common/dll_symbol.h" + /** * * @author Mason Green @@ -44,7 +46,7 @@ namespace p2t { -class CDT +class P2T_DLL_SYMBOL CDT { public: