]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/matrix.cpp
Fix another off-by-1 bug in wxMBConv::ToWChar().
[wxWidgets.git] / src / common / matrix.cpp
index d324a852dd0dc696d1fc2f836616743894b0d884..f1f8c319f97ae0754d205e8ead4685268ff6f518 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        matrix.cpp
+// Name:        src/common/matrix.cpp
 // Purpose:     wxTransformMatrix class
 // Author:      Chris Breeze, Julian Smart
 // Modified by: Klaas Holwerda
@@ -9,10 +9,6 @@
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "matrix.h"
-#endif
-
 // Note: this is intended to be used in wxDC at some point to replace
 // the current system of scaling/translation. It is not yet used.
 
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
+#include "wx/matrix.h"
+
 #ifndef WX_PRECOMP
-#include "wx/defs.h"
-#include "wx/math.h"
+    #include "wx/math.h"
 #endif
 
-#include "wx/matrix.h"
-
 static const double pi = M_PI;
 
 wxTransformMatrix::wxTransformMatrix(void)
@@ -75,9 +70,9 @@ void wxTransformMatrix::operator = (const wxTransformMatrix& mat)
     m_isIdentity = mat.m_isIdentity;
 }
 
-bool wxTransformMatrix::operator == (const wxTransformMatrix& mat)
+bool wxTransformMatrix::operator == (const wxTransformMatrix& mat) const
 {
-    if (m_isIdentity==true && mat.m_isIdentity==true)
+    if (m_isIdentity && mat.m_isIdentity)
         return true;
 
     int i, j;
@@ -85,14 +80,14 @@ bool wxTransformMatrix::operator == (const wxTransformMatrix& mat)
     {
         for (j = 0; j < 3; j++)
         {
-            if (m_matrix[i][j] != mat.m_matrix[i][j])
+            if ( !wxIsSameDouble(m_matrix[i][j], mat.m_matrix[i][j]) )
                 return false;
         }
     }
     return true;
 }
 
-bool wxTransformMatrix::operator != (const wxTransformMatrix& mat)
+bool wxTransformMatrix::operator != (const wxTransformMatrix& mat) const
 {
     return (! ((*this) == mat));
 }
@@ -133,27 +128,22 @@ bool wxTransformMatrix::Invert(void)
 
     // now divide by the determinant
     double det = m_matrix[0][0] * inverseMatrix[0][0] + m_matrix[0][1] * inverseMatrix[1][0] + m_matrix[0][2] * inverseMatrix[2][0];
-    if (det != 0.0)
-    {
-        inverseMatrix[0][0] /= det; inverseMatrix[1][0] /= det; inverseMatrix[2][0] /= det;
-        inverseMatrix[0][1] /= det; inverseMatrix[1][1] /= det; inverseMatrix[2][1] /= det;
-        inverseMatrix[0][2] /= det; inverseMatrix[1][2] /= det; inverseMatrix[2][2] /= det;
+    if ( wxIsNullDouble(det) )
+        return false;
+
+    inverseMatrix[0][0] /= det; inverseMatrix[1][0] /= det; inverseMatrix[2][0] /= det;
+    inverseMatrix[0][1] /= det; inverseMatrix[1][1] /= det; inverseMatrix[2][1] /= det;
+    inverseMatrix[0][2] /= det; inverseMatrix[1][2] /= det; inverseMatrix[2][2] /= det;
 
-        int i, j;
-        for (i = 0; i < 3; i++)
+    for (int i = 0; i < 3; i++)
+    {
+        for (int j = 0; j < 3; j++)
         {
-            for (j = 0; j < 3; j++)
-            {
-                m_matrix[i][j] = inverseMatrix[i][j];
-            }
+            m_matrix[i][j] = inverseMatrix[i][j];
         }
-        m_isIdentity = IsIdentity1();
-        return true;
-    }
-    else
-    {
-        return false;
     }
+    m_isIdentity = IsIdentity1();
+    return true;
 }
 
 // Make into identity matrix
@@ -199,8 +189,8 @@ wxTransformMatrix&  wxTransformMatrix::Scale(const double &xs, const double &ys,
 
     if (m_isIdentity)
     {
-        double tx  =xc*(1-xs);
-        double ty  =yc*(1-ys);
+        double tx xc*(1-xs);
+        double ty yc*(1-ys);
         r00 = xs;
         r10 = 0;
         r20 = tx;
@@ -208,10 +198,10 @@ wxTransformMatrix&  wxTransformMatrix::Scale(const double &xs, const double &ys,
         r11 = ys;
         r21 = ty;
     }
-    else if (xc!=0 || yc!=0)
+    else if ( !wxIsNullDouble(xc) || !wxIsNullDouble(yc) )
     {
-        double tx  =xc*(1-xs);
-        double ty  =yc*(1-ys);
+        double tx xc*(1-xs);
+        double ty yc*(1-ys);
         r00 = xs * m_matrix[0][0];
         r10 = xs * m_matrix[1][0];
         r20 = xs * m_matrix[2][0] + tx;
@@ -324,8 +314,8 @@ wxTransformMatrix&  wxTransformMatrix::Rotate(const double &degrees, const doubl
 
     if (m_isIdentity)
     {
-        double tx  = x*(1-c)+y*s;
-        double ty  = y*(1-c)-x*s;
+        double tx = x*(1-c)+y*s;
+        double ty = y*(1-c)-x*s;
         r00 = c ;
         r10 = -s;
         r20 = tx;
@@ -333,10 +323,10 @@ wxTransformMatrix&  wxTransformMatrix::Rotate(const double &degrees, const doubl
         r11 = c;
         r21 = ty;
     }
-    else if (x!=0 || y!=0)
+    else if ( !wxIsNullDouble(x) || !wxIsNullDouble(y) )
     {
-        double tx  = x*(1-c)+y*s;
-        double ty  = y*(1-c)-x*s;
+        double tx = x*(1-c)+y*s;
+        double ty = y*(1-c)-x*s;
         r00 = c * m_matrix[0][0] - s * m_matrix[0][1] + tx * m_matrix[0][2];
         r10 = c * m_matrix[1][0] - s * m_matrix[1][1] + tx * m_matrix[1][2];
         r20 = c * m_matrix[2][0] - s * m_matrix[2][1] + tx;// * m_matrix[2][2];
@@ -408,15 +398,15 @@ bool wxTransformMatrix::InverseTransformPoint(double x, double y, double& tx, do
 {
     if (IsIdentity())
     {
-        tx = x; ty = y; return true;
+        tx = x;
+        ty = y;
+        return true;
     }
 
-    double z = (1.0 - m_matrix[0][2] * x - m_matrix[1][2] * y) / m_matrix[2][2];
-    if (z == 0.0)
-    {
-//      z = 0.0000001;
+    const double z = (1.0 - m_matrix[0][2] * x - m_matrix[1][2] * y) / m_matrix[2][2];
+    if ( wxIsNullDouble(z) )
         return false;
-    }
+
     tx = x * m_matrix[0][0] + y * m_matrix[1][0] + z * m_matrix[2][0];
     ty = x * m_matrix[0][1] + y * m_matrix[1][1] + z * m_matrix[2][1];
     return true;
@@ -560,7 +550,7 @@ double wxTransformMatrix::Get_scaleX()
 {
     double scale_factor;
     double rot_angle = CheckInt(atan2(m_matrix[1][0],m_matrix[0][0])*180/pi);
-    if (rot_angle != 90 && rot_angle != -90)
+    if ( !wxIsSameDouble(rot_angle, 90) && !wxIsSameDouble(rot_angle, -90) )
         scale_factor = m_matrix[0][0]/cos((rot_angle/180)*pi);
     else
         scale_factor = m_matrix[0][0]/sin((rot_angle/180)*pi);  // er kan nl. niet door 0 gedeeld worden !
@@ -576,7 +566,7 @@ double wxTransformMatrix::Get_scaleY()
 {
     double scale_factor;
     double rot_angle = CheckInt(atan2(m_matrix[1][0],m_matrix[0][0])*180/pi);
-    if (rot_angle != 90 && rot_angle != -90)
+    if ( !wxIsSameDouble(rot_angle, 90) && !wxIsSameDouble(rot_angle, -90) )
        scale_factor = m_matrix[1][1]/cos((rot_angle/180)*pi);
     else
        scale_factor = m_matrix[1][1]/sin((rot_angle/180)*pi);   // er kan nl. niet door 0 gedeeld worden !
@@ -609,4 +599,3 @@ void wxTransformMatrix::SetRotation(double rotation)
     Rotate(-GetRotation(), x, y);
     Rotate(rotation, x, y);
 }
-