decompose() should return the original rotation angle and scales.

decompose() would return incorrect rotation angle and scales when the
angle was exactly 180 degrees, due to FPU rounding error.  This commit
fixes it.

This problem would manifest itself when inserting an image into
Calc/Draw, cropping it, and flipping it vertically or rotating it
at exactly 180 degrees.  Before the fix the image would simply disappear.
This commit is contained in:
Thorsten Behrens
2012-01-18 14:52:20 -05:00
committed by Kohei Yoshida
parent 105546f7f1
commit 800806ba85
2 changed files with 25 additions and 0 deletions

View File

@@ -289,6 +289,14 @@ namespace basegfx
// no rotation and shear, copy scale values // no rotation and shear, copy scale values
rScale.setX(get(0, 0)); rScale.setX(get(0, 0));
rScale.setY(get(1, 1)); rScale.setY(get(1, 1));
// or is there?
if( rScale.getX() < 0 && rScale.getY() < 0 )
{
// there is - 180 degree rotated
rScale *= -1;
rRotate = 180*F_PI180;
}
} }
else else
{ {

View File

@@ -36,6 +36,7 @@
#include "cppunit/extensions/HelperMacros.h" #include "cppunit/extensions/HelperMacros.h"
#include <basegfx/matrix/b2dhommatrix.hxx> #include <basegfx/matrix/b2dhommatrix.hxx>
#include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <basegfx/polygon/b2dpolygon.hxx> #include <basegfx/polygon/b2dpolygon.hxx>
#include <basegfx/polygon/b2dpolygontools.hxx> #include <basegfx/polygon/b2dpolygontools.hxx>
#include <basegfx/curve/b2dcubicbezier.hxx> #include <basegfx/curve/b2dcubicbezier.hxx>
@@ -666,6 +667,22 @@ public:
CPPUNIT_ASSERT_MESSAGE("decompose: error test I2", impDecomposeComposeTest(-fSX, fSY, tan(-fS), -fR)); CPPUNIT_ASSERT_MESSAGE("decompose: error test I2", impDecomposeComposeTest(-fSX, fSY, tan(-fS), -fR));
CPPUNIT_ASSERT_MESSAGE("decompose: error test I3", impDecomposeComposeTest(fSX, -fSY, tan(-fS), -fR)); CPPUNIT_ASSERT_MESSAGE("decompose: error test I3", impDecomposeComposeTest(fSX, -fSY, tan(-fS), -fR));
CPPUNIT_ASSERT_MESSAGE("decompose: error test I4", impDecomposeComposeTest(-fSX, -fSY, tan(-fS), -fR)); CPPUNIT_ASSERT_MESSAGE("decompose: error test I4", impDecomposeComposeTest(-fSX, -fSY, tan(-fS), -fR));
// cover special case of 180 degree rotation
B2DHomMatrix aTest=tools::createScaleShearXRotateTranslateB2DHomMatrix(
6425,3938,
0,
180*F_PI180,
10482,4921);
// decompose that matrix
B2DTuple aDScale;
B2DTuple aDTrans;
double fDRot;
double fDShX;
aTest.decompose(aDScale, aDTrans, fDRot, fDShX);
CPPUNIT_ASSERT_MESSAGE("decompose: error test J1", aDScale.getX() == 6425 && aDScale.getY() == 3938);
CPPUNIT_ASSERT_MESSAGE("decompose: error test J1", aDTrans.getX() == 10482 && aDTrans.getY() == 4921);
CPPUNIT_ASSERT_MESSAGE("decompose: error test J1", fDRot == 180*F_PI180);
} }
// Change the following lines only, if you add, remove or rename // Change the following lines only, if you add, remove or rename