forked from mirrors/gecko-dev
		
	 126bd9e1a4
			
		
	
	
		126bd9e1a4
		
	
	
	
	
		
			
			This patch was generated automatically by the "modeline.py" script, available here: https://github.com/amccreight/moz-source-tools/blob/master/modeline.py For every file that is modified in this patch, the changes are as follows: (1) The patch changes the file to use the exact C++ mode lines from the Mozilla coding style guide, available here: https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style#Mode_Line (2) The patch deletes any blank lines between the mode line & the MPL boilerplate comment. (3) If the file previously had the mode lines and MPL boilerplate in a single contiguous C++ comment, then the patch splits them into separate C++ comments, to match the boilerplate in the coding style. MozReview-Commit-ID: 77D61xpSmIl --HG-- extra : rebase_source : c6162fa3cf539a07177a19838324bf368faa162b
		
			
				
	
	
		
			124 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #include "Matrix.h"
 | |
| #include "Quaternion.h"
 | |
| #include "Tools.h"
 | |
| #include <algorithm>
 | |
| #include <ostream>
 | |
| #include <math.h>
 | |
| #include <float.h>  // for FLT_EPSILON
 | |
| 
 | |
| #include "mozilla/FloatingPoint.h" // for UnspecifiedNaN
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace gfx {
 | |
| 
 | |
| /* Force small values to zero.  We do this to avoid having sin(360deg)
 | |
|  * evaluate to a tiny but nonzero value.
 | |
|  */
 | |
| double
 | |
| FlushToZero(double aVal)
 | |
| {
 | |
|   // XXX Is double precision really necessary here
 | |
|   if (-FLT_EPSILON < aVal && aVal < FLT_EPSILON) {
 | |
|     return 0.0f;
 | |
|   } else {
 | |
|     return aVal;
 | |
|   }
 | |
| }
 | |
| 
 | |
| /* Computes tan(aTheta).  For values of aTheta such that tan(aTheta) is
 | |
|  * undefined or very large, SafeTangent returns a manageably large value
 | |
|  * of the correct sign.
 | |
|  */
 | |
| double
 | |
| SafeTangent(double aTheta)
 | |
| {
 | |
|   // XXX Is double precision really necessary here
 | |
|   const double kEpsilon = 0.0001;
 | |
| 
 | |
|   /* tan(theta) = sin(theta)/cos(theta); problems arise when
 | |
|    * cos(theta) is too close to zero.  Limit cos(theta) to the
 | |
|    * range [-1, -epsilon] U [epsilon, 1].
 | |
|    */
 | |
| 
 | |
|   double sinTheta = sin(aTheta);
 | |
|   double cosTheta = cos(aTheta);
 | |
| 
 | |
|   if (cosTheta >= 0 && cosTheta < kEpsilon) {
 | |
|     cosTheta = kEpsilon;
 | |
|   } else if (cosTheta < 0 && cosTheta >= -kEpsilon) {
 | |
|     cosTheta = -kEpsilon;
 | |
|   }
 | |
|   return FlushToZero(sinTheta / cosTheta);
 | |
| }
 | |
| 
 | |
| template<> Matrix
 | |
| Matrix::Rotation(Float aAngle)
 | |
| {
 | |
|   Matrix newMatrix;
 | |
| 
 | |
|   Float s = sinf(aAngle);
 | |
|   Float c = cosf(aAngle);
 | |
| 
 | |
|   newMatrix._11 = c;
 | |
|   newMatrix._12 = s;
 | |
|   newMatrix._21 = -s;
 | |
|   newMatrix._22 = c;
 | |
| 
 | |
|   return newMatrix;
 | |
| }
 | |
| 
 | |
| template<> MatrixDouble
 | |
| MatrixDouble::Rotation(Double aAngle)
 | |
| {
 | |
|   MatrixDouble newMatrix;
 | |
| 
 | |
|   Double s = sin(aAngle);
 | |
|   Double c = cos(aAngle);
 | |
| 
 | |
|   newMatrix._11 = c;
 | |
|   newMatrix._12 = s;
 | |
|   newMatrix._21 = -s;
 | |
|   newMatrix._22 = c;
 | |
| 
 | |
|   return newMatrix;
 | |
| }
 | |
| 
 | |
| template<> Matrix4x4
 | |
| MatrixDouble::operator*(const Matrix4x4& aMatrix) const
 | |
| {
 | |
|   Matrix4x4 resultMatrix;
 | |
| 
 | |
|   resultMatrix._11 = this->_11 * aMatrix._11 + this->_12 * aMatrix._21;
 | |
|   resultMatrix._12 = this->_11 * aMatrix._12 + this->_12 * aMatrix._22;
 | |
|   resultMatrix._13 = this->_11 * aMatrix._13 + this->_12 * aMatrix._23;
 | |
|   resultMatrix._14 = this->_11 * aMatrix._14 + this->_12 * aMatrix._24;
 | |
| 
 | |
|   resultMatrix._21 = this->_21 * aMatrix._11 + this->_22 * aMatrix._21;
 | |
|   resultMatrix._22 = this->_21 * aMatrix._12 + this->_22 * aMatrix._22;
 | |
|   resultMatrix._23 = this->_21 * aMatrix._13 + this->_22 * aMatrix._23;
 | |
|   resultMatrix._24 = this->_21 * aMatrix._14 + this->_22 * aMatrix._24;
 | |
| 
 | |
|   resultMatrix._31 = aMatrix._31;
 | |
|   resultMatrix._32 = aMatrix._32;
 | |
|   resultMatrix._33 = aMatrix._33;
 | |
|   resultMatrix._34 = aMatrix._34;
 | |
| 
 | |
|   resultMatrix._41 = this->_31 * aMatrix._11 + this->_32 * aMatrix._21 + aMatrix._41;
 | |
|   resultMatrix._42 = this->_31 * aMatrix._12 + this->_32 * aMatrix._22 + aMatrix._42;
 | |
|   resultMatrix._43 = this->_31 * aMatrix._13 + this->_32 * aMatrix._23 + aMatrix._43;
 | |
|   resultMatrix._44 = this->_31 * aMatrix._14 + this->_32 * aMatrix._24 + aMatrix._44;
 | |
| 
 | |
|   return resultMatrix;
 | |
| }
 | |
| 
 | |
| } // namespace gfx
 | |
| } // namespace mozilla
 |