From ee68ae9c23409cac64663c877fc5befdd6ca75ca Mon Sep 17 00:00:00 2001 From: "masayuki%d-toybox.com" Date: Sun, 26 Nov 2006 13:49:26 +0000 Subject: [PATCH] Bug 360050 Implement SVGMatrix::RotateFromVector, FlipX, FlipY. patch by KUROSAWA, Takeshi(taken) r=tor, sr=roc --- content/svg/content/src/nsSVGMatrix.cpp | 46 ++++++++++++++++++------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/content/svg/content/src/nsSVGMatrix.cpp b/content/svg/content/src/nsSVGMatrix.cpp index 125cdfe8566d..f1f35bf2150a 100644 --- a/content/svg/content/src/nsSVGMatrix.cpp +++ b/content/svg/content/src/nsSVGMatrix.cpp @@ -62,6 +62,9 @@ public: protected: float mA, mB, mC, mD, mE, mF; + + // implementation helpers: + nsresult RotateRadians(float rad, nsIDOMSVGMatrix **_retval); }; //---------------------------------------------------------------------- @@ -252,34 +255,36 @@ NS_IMETHODIMP nsSVGMatrix::ScaleNonUniform(float scaleFactorX, float scaleFactor /* nsIDOMSVGMatrix rotate (in float angle); */ NS_IMETHODIMP nsSVGMatrix::Rotate(float angle, nsIDOMSVGMatrix **_retval) { - double ca = cos( angle*radPerDegree ); - double sa = sin( angle*radPerDegree ); - - return NS_NewSVGMatrix(_retval, - (float) (mA*ca + mC*sa), (float) (mB*ca + mD*sa), - (float) (mC*ca - mA*sa), (float) (mD*ca - mB*sa), - mE, mF); + RotateRadians(angle*radPerDegree, _retval); } /* nsIDOMSVGMatrix rotateFromVector (in float x, in float y); */ NS_IMETHODIMP nsSVGMatrix::RotateFromVector(float x, float y, nsIDOMSVGMatrix **_retval) { - NS_NOTYETIMPLEMENTED("nsSVGMatrix::RotateFromVector"); - return NS_ERROR_NOT_IMPLEMENTED; + if (x == 0.0 || y == 0.0) + return NS_ERROR_DOM_SVG_INVALID_VALUE_ERR; + + double rad = atan2(y, x); + + RotateRadians(rad, _retval); } /* nsIDOMSVGMatrix flipX (); */ NS_IMETHODIMP nsSVGMatrix::FlipX(nsIDOMSVGMatrix **_retval) { - NS_NOTYETIMPLEMENTED("nsSVGMatrix::FlipX"); - return NS_ERROR_NOT_IMPLEMENTED; + return NS_NewSVGMatrix(_retval, + -mA, -mB, + mC, mD, + mE, mF); } /* nsIDOMSVGMatrix flipY (); */ NS_IMETHODIMP nsSVGMatrix::FlipY(nsIDOMSVGMatrix **_retval) { - NS_NOTYETIMPLEMENTED("nsSVGMatrix::FlipY"); - return NS_ERROR_NOT_IMPLEMENTED; + return NS_NewSVGMatrix(_retval, + mA, mB, + -mC, -mD, + mE, mF); } /* nsIDOMSVGMatrix skewX (in float angle); */ @@ -320,3 +325,18 @@ nsSVGMatrix::GetValueString(nsAString& aValue) NS_NOTYETIMPLEMENTED("nsSVGMatrix::GetValueString"); return NS_ERROR_NOT_IMPLEMENTED; } + + +//---------------------------------------------------------------------- +// Implementation helpers: +nsresult +nsSVGMatrix::RotateRadians(float rad, nsIDOMSVGMatrix **_retval) +{ + double ca = cos(rad); + double sa = sin(rad); + + return NS_NewSVGMatrix(_retval, + (float) (mA*ca + mC*sa), (float) (mB*ca + mD*sa), + (float) (mC*ca - mA*sa), (float) (mD*ca - mB*sa), + mE, mF); +}