mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-04 07:31:16 +00:00 
			
		
		
		
	
		
			
	
	
		
			155 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
		
		
			
		
	
	
			155 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 
								 | 
							
								diff --git a/thirdparty/misc/clipper.cpp b/thirdparty/misc/clipper.cpp
							 | 
						||
| 
								 | 
							
								index 8c3a59c4ca..c67045d113 100644
							 | 
						||
| 
								 | 
							
								--- a/thirdparty/misc/clipper.cpp
							 | 
						||
| 
								 | 
							
								+++ b/thirdparty/misc/clipper.cpp
							 | 
						||
| 
								 | 
							
								@@ -48,6 +48,38 @@
							 | 
						||
| 
								 | 
							
								 #include <ostream>
							 | 
						||
| 
								 | 
							
								 #include <functional>
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								+//Explicitly disables exceptions handling for target platform
							 | 
						||
| 
								 | 
							
								+//#define CLIPPER_NOEXCEPTION
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+#define CLIPPER_THROW(exception) std::abort()
							 | 
						||
| 
								 | 
							
								+#define CLIPPER_TRY if(true)
							 | 
						||
| 
								 | 
							
								+#define CLIPPER_CATCH(exception) if(false)
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+#if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)
							 | 
						||
| 
								 | 
							
								+  #ifndef CLIPPER_NOEXCEPTION
							 | 
						||
| 
								 | 
							
								+    #undef CLIPPER_THROW
							 | 
						||
| 
								 | 
							
								+    #define CLIPPER_THROW(exception) throw exception
							 | 
						||
| 
								 | 
							
								+    #undef CLIPPER_TRY
							 | 
						||
| 
								 | 
							
								+    #define CLIPPER_TRY try
							 | 
						||
| 
								 | 
							
								+    #undef CLIPPER_CATCH
							 | 
						||
| 
								 | 
							
								+    #define CLIPPER_CATCH(exception) catch(exception)
							 | 
						||
| 
								 | 
							
								+  #endif
							 | 
						||
| 
								 | 
							
								+#endif
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+//Optionally allows to override exception macros
							 | 
						||
| 
								 | 
							
								+#if defined(CLIPPER_THROW_USER)
							 | 
						||
| 
								 | 
							
								+	#undef CLIPPER_THROW
							 | 
						||
| 
								 | 
							
								+	#define CLIPPER_THROW CLIPPER_THROW_USER
							 | 
						||
| 
								 | 
							
								+#endif
							 | 
						||
| 
								 | 
							
								+#if defined(CLIPPER_TRY_USER)
							 | 
						||
| 
								 | 
							
								+	#undef CLIPPER_TRY
							 | 
						||
| 
								 | 
							
								+	#define CLIPPER_TRY CLIPPER_TRY_USER
							 | 
						||
| 
								 | 
							
								+#endif
							 | 
						||
| 
								 | 
							
								+#if defined(CLIPPER_CATCH_USER)
							 | 
						||
| 
								 | 
							
								+	#undef CLIPPER_CATCH
							 | 
						||
| 
								 | 
							
								+	#define CLIPPER_CATCH CLIPPER_CATCH_USER
							 | 
						||
| 
								 | 
							
								+#endif
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								 namespace ClipperLib {
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 static double const pi = 3.141592653589793238;
							 | 
						||
| 
								 | 
							
								@@ -898,7 +930,7 @@ void RangeTest(const IntPoint& Pt, bool& useFullRange)
							 | 
						||
| 
								 | 
							
								   if (useFullRange)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								     if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) 
							 | 
						||
| 
								 | 
							
								-      throw clipperException("Coordinate outside allowed range");
							 | 
						||
| 
								 | 
							
								+      CLIPPER_THROW(clipperException("Coordinate outside allowed range"));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								   else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) 
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								@@ -1046,10 +1078,10 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
							 | 
						||
| 
								 | 
							
								 {
							 | 
						||
| 
								 | 
							
								 #ifdef use_lines
							 | 
						||
| 
								 | 
							
								   if (!Closed && PolyTyp == ptClip)
							 | 
						||
| 
								 | 
							
								-    throw clipperException("AddPath: Open paths must be subject.");
							 | 
						||
| 
								 | 
							
								+    CLIPPER_THROW(clipperException("AddPath: Open paths must be subject."));
							 | 
						||
| 
								 | 
							
								 #else
							 | 
						||
| 
								 | 
							
								   if (!Closed)
							 | 
						||
| 
								 | 
							
								-    throw clipperException("AddPath: Open paths have been disabled.");
							 | 
						||
| 
								 | 
							
								+    CLIPPER_THROW(clipperException("AddPath: Open paths have been disabled."));
							 | 
						||
| 
								 | 
							
								 #endif
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								   int highI = (int)pg.size() -1;
							 | 
						||
| 
								 | 
							
								@@ -1062,7 +1094,7 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								   bool IsFlat = true;
							 | 
						||
| 
								 | 
							
								   //1. Basic (first) edge initialization ...
							 | 
						||
| 
								 | 
							
								-  try
							 | 
						||
| 
								 | 
							
								+  CLIPPER_TRY
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								     edges[1].Curr = pg[1];
							 | 
						||
| 
								 | 
							
								     RangeTest(pg[0], m_UseFullRange);
							 | 
						||
| 
								 | 
							
								@@ -1075,10 +1107,10 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
							 | 
						||
| 
								 | 
							
								       InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]);
							 | 
						||
| 
								 | 
							
								     }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								-  catch(...)
							 | 
						||
| 
								 | 
							
								+  CLIPPER_CATCH(...)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								     delete [] edges;
							 | 
						||
| 
								 | 
							
								-    throw; //range test fails
							 | 
						||
| 
								 | 
							
								+    CLIPPER_THROW(); //range test fails
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								   TEdge *eStart = &edges[0];
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								@@ -1442,7 +1474,7 @@ void ClipperBase::SwapPositionsInAEL(TEdge *Edge1, TEdge *Edge2)
							 | 
						||
| 
								 | 
							
								 void ClipperBase::UpdateEdgeIntoAEL(TEdge *&e)
							 | 
						||
| 
								 | 
							
								 {
							 | 
						||
| 
								 | 
							
								   if (!e->NextInLML) 
							 | 
						||
| 
								 | 
							
								-    throw clipperException("UpdateEdgeIntoAEL: invalid call");
							 | 
						||
| 
								 | 
							
								+    CLIPPER_THROW(clipperException("UpdateEdgeIntoAEL: invalid call"));
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								   e->NextInLML->OutIdx = e->OutIdx;
							 | 
						||
| 
								 | 
							
								   TEdge* AelPrev = e->PrevInAEL;
							 | 
						||
| 
								 | 
							
								@@ -1510,7 +1542,7 @@ bool Clipper::Execute(ClipType clipType, Paths &solution,
							 | 
						||
| 
								 | 
							
								 {
							 | 
						||
| 
								 | 
							
								   if( m_ExecuteLocked ) return false;
							 | 
						||
| 
								 | 
							
								   if (m_HasOpenPaths)
							 | 
						||
| 
								 | 
							
								-    throw clipperException("Error: PolyTree struct is needed for open path clipping.");
							 | 
						||
| 
								 | 
							
								+    CLIPPER_THROW(clipperException("Error: PolyTree struct is needed for open path clipping."));
							 | 
						||
| 
								 | 
							
								   m_ExecuteLocked = true;
							 | 
						||
| 
								 | 
							
								   solution.resize(0);
							 | 
						||
| 
								 | 
							
								   m_SubjFillType = subjFillType;
							 | 
						||
| 
								 | 
							
								@@ -1560,7 +1592,7 @@ void Clipper::FixHoleLinkage(OutRec &outrec)
							 | 
						||
| 
								 | 
							
								 bool Clipper::ExecuteInternal()
							 | 
						||
| 
								 | 
							
								 {
							 | 
						||
| 
								 | 
							
								   bool succeeded = true;
							 | 
						||
| 
								 | 
							
								-  try {
							 | 
						||
| 
								 | 
							
								+  CLIPPER_TRY {
							 | 
						||
| 
								 | 
							
								     Reset();
							 | 
						||
| 
								 | 
							
								     m_Maxima = MaximaList();
							 | 
						||
| 
								 | 
							
								     m_SortedEdges = 0;
							 | 
						||
| 
								 | 
							
								@@ -1583,7 +1615,7 @@ bool Clipper::ExecuteInternal()
							 | 
						||
| 
								 | 
							
								       InsertLocalMinimaIntoAEL(botY);
							 | 
						||
| 
								 | 
							
								     }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								-  catch(...) 
							 | 
						||
| 
								 | 
							
								+  CLIPPER_CATCH(...) 
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								     succeeded = false;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								@@ -2827,18 +2859,18 @@ void Clipper::ProcessHorizontal(TEdge *horzEdge)
							 | 
						||
| 
								 | 
							
								 bool Clipper::ProcessIntersections(const cInt topY)
							 | 
						||
| 
								 | 
							
								 {
							 | 
						||
| 
								 | 
							
								   if( !m_ActiveEdges ) return true;
							 | 
						||
| 
								 | 
							
								-  try {
							 | 
						||
| 
								 | 
							
								+  CLIPPER_TRY {
							 | 
						||
| 
								 | 
							
								     BuildIntersectList(topY);
							 | 
						||
| 
								 | 
							
								     size_t IlSize = m_IntersectList.size();
							 | 
						||
| 
								 | 
							
								     if (IlSize == 0) return true;
							 | 
						||
| 
								 | 
							
								     if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList();
							 | 
						||
| 
								 | 
							
								     else return false;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								-  catch(...) 
							 | 
						||
| 
								 | 
							
								+  CLIPPER_CATCH(...) 
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								     m_SortedEdges = 0;
							 | 
						||
| 
								 | 
							
								     DisposeIntersectNodes();
							 | 
						||
| 
								 | 
							
								-    throw clipperException("ProcessIntersections error");
							 | 
						||
| 
								 | 
							
								+    CLIPPER_THROW(clipperException("ProcessIntersections error"));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								   m_SortedEdges = 0;
							 | 
						||
| 
								 | 
							
								   return true;
							 | 
						||
| 
								 | 
							
								@@ -3002,7 +3034,7 @@ void Clipper::DoMaxima(TEdge *e)
							 | 
						||
| 
								 | 
							
								     DeleteFromAEL(eMaxPair);
							 | 
						||
| 
								 | 
							
								   } 
							 | 
						||
| 
								 | 
							
								 #endif
							 | 
						||
| 
								 | 
							
								-  else throw clipperException("DoMaxima error");
							 | 
						||
| 
								 | 
							
								+  else CLIPPER_THROW(clipperException("DoMaxima error"));
							 | 
						||
| 
								 | 
							
								 }
							 | 
						||
| 
								 | 
							
								 //------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								 
							 |