]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/geometry.cpp
fixing overrelease and out-of-bounds write, fixes #13725
[wxWidgets.git] / src / common / geometry.cpp
index d53b1f9a57ee409aa3bd33a1fd77732e9c403403..d979e79b3fc873beaf1b8d796af6038ba4c14b6c 100644 (file)
@@ -1,33 +1,31 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        common/geometry.cpp
+// Name:        src/common/geometry.cpp
 // Purpose:     Common Geometry Classes
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     08/05/99
-// RCS-ID:
+// RCS-ID:      $Id$
 // Copyright:   (c) 1999 Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-    #pragma implementation "geometry.cpp"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
-
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #if wxUSE_GEOMETRY
 
-#include "wx/log.h"
-#include <string.h>
+#include "wx/geometry.h"
 
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+#endif
+
+#include <string.h>
 
-#include "wx/geometry.h"
 #include "wx/datstrm.h"
 
 //
@@ -53,9 +51,9 @@ bool wxRect2DDouble::Intersects( const wxRect2DDouble &rect ) const
 
     if ( left < right && top < bottom )
     {
-        return TRUE;
+        return true;
     }
-    return FALSE;
+    return false;
 }
 
 void wxRect2DDouble::Intersect( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest )
@@ -141,6 +139,15 @@ void wxRect2DDouble::ConstrainTo( const wxRect2DDouble &rect )
         SetTop( rect.GetTop() );
 }
 
+wxRect2DDouble& wxRect2DDouble::operator=( const wxRect2DDouble &r )
+{
+    m_x = r.m_x;
+    m_y = r.m_y;
+    m_width = r.m_width;
+    m_height = r.m_height;
+    return *this;
+}
+
 // integer version
 
 // for the following calculations always remember
@@ -148,6 +155,7 @@ void wxRect2DDouble::ConstrainTo( const wxRect2DDouble &rect )
 
 // wxPoint2D
 
+#if wxUSE_STREAMS
 void wxPoint2DInt::WriteTo( wxDataOutputStream &stream ) const
 {
     stream.Write32( m_x );
@@ -159,8 +167,9 @@ void wxPoint2DInt::ReadFrom( wxDataInputStream &stream )
     m_x = stream.Read32();
     m_y = stream.Read32();
 }
+#endif // wxUSE_STREAMS
 
-wxDouble wxPoint2DInt::GetVectorAngle()
+wxDouble wxPoint2DInt::GetVectorAngle() const
 {
     if ( m_x == 0 )
     {
@@ -177,8 +186,8 @@ wxDouble wxPoint2DInt::GetVectorAngle()
             return 180;
     }
 
-    // casts needed MIPSpro compiler under SGI
-    wxDouble deg = atan2( (double)m_y , (double)m_x ) * 180 / 3.14159265359;
+    // casts needed for MIPSpro compiler under SGI
+    wxDouble deg = atan2( (double)m_y , (double)m_x ) * 180 / M_PI;
     if ( deg < 0 )
     {
         deg += 360;
@@ -187,6 +196,44 @@ wxDouble wxPoint2DInt::GetVectorAngle()
 }
 
 
+void wxPoint2DInt::SetVectorAngle( wxDouble degrees )
+{
+    wxDouble length = GetVectorLength();
+    m_x = (int)(length * cos( degrees / 180 * M_PI ));
+    m_y = (int)(length * sin( degrees / 180 * M_PI ));
+}
+
+wxDouble wxPoint2DDouble::GetVectorAngle() const
+{
+    if ( wxIsNullDouble(m_x) )
+    {
+        if ( m_y >= 0 )
+            return 90;
+        else
+            return 270;
+    }
+    if ( wxIsNullDouble(m_y) )
+    {
+        if ( m_x >= 0 )
+            return 0;
+        else
+            return 180;
+    }
+    wxDouble deg = atan2( m_y , m_x ) * 180 / M_PI;
+    if ( deg < 0 )
+    {
+        deg += 360;
+    }
+    return deg;
+}
+
+void wxPoint2DDouble::SetVectorAngle( wxDouble degrees )
+{
+    wxDouble length = GetVectorLength();
+    m_x = length * cos( degrees / 180 * M_PI );
+    m_y = length * sin( degrees / 180 * M_PI );
+}
+
 // wxRect2D
 
 bool wxRect2DInt::Intersects( const wxRect2DInt &rect ) const
@@ -199,9 +246,9 @@ bool wxRect2DInt::Intersects( const wxRect2DInt &rect ) const
 
     if ( left < right && top < bottom )
     {
-        return TRUE;
+        return true;
     }
-    return FALSE;
+    return false;
 }
 
 void wxRect2DInt::Intersect( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest )
@@ -296,6 +343,7 @@ wxRect2DInt& wxRect2DInt::operator=( const wxRect2DInt &r )
     return *this;
 }
 
+#if wxUSE_STREAMS
 void wxRect2DInt::WriteTo( wxDataOutputStream &stream ) const
 {
     stream.Write32( m_x );
@@ -311,5 +359,6 @@ void wxRect2DInt::ReadFrom( wxDataInputStream &stream )
     m_width = stream.Read32();
     m_height = stream.Read32();
 }
+#endif // wxUSE_STREAMS
 
 #endif // wxUSE_GEOMETRY