Fix error in handling 'z' for svg:d string parsing

Previously 'z' did not update the current point to the start
point of the subpath, as required by
http://www.w3.org/TR/SVG/paths.html#PathDataClosePathCommand. Fixed
now, and adapted all the unit tests.
This commit is contained in:
Thorsten Behrens
2012-01-17 16:32:43 +01:00
parent b13852edb7
commit 13e1fe0561
5 changed files with 71 additions and 26 deletions

View File

@@ -123,8 +123,7 @@ namespace basegfx
/** Read poly-polygon from SVG.
This function imports a poly-polygon from an SVG-D
attribute. Currently, elliptical arc elements are not yet
supported (and ignored during parsing).
attribute.
@param o_rPolyPoly
The output poly-polygon

View File

@@ -239,6 +239,14 @@ namespace basegfx
// remember closed state of current polygon
bIsClosed = true;
// update current point - we're back at the start
if( aCurrPoly.count() )
{
const B2DPoint aFirst( aCurrPoly.getB2DPoint(0) );
nLastX = aFirst.getX();
nLastY = aFirst.getY();
}
break;
}
@@ -1033,6 +1041,8 @@ namespace basegfx
if(aPolygon.isClosed())
{
aResult.append(lcl_getCommand('Z', 'z', bUseRelativeCoordinates));
// return to first point
aCurrentSVGPosition = aPolygon.getB2DPoint(0);
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -136,8 +136,9 @@ public:
void verifySimpleRange()
{
const char* unionSvg="m100 10v90h-90v10h-20v-10h-90v-90h-10v-20h10v-90h90v-10h20v10h90v90h10v20z";
const char* intersectSvg="m-100 10v-20h10v20zm80 90v-10h20v10zm-20-190v-10h20v10zm80 100v-20h10v20z";
const char* xorSvg="m-100 10h10v-20h-10zm90 110h20v-10h-20zm0-180h20v-10h-20zm100 110h10v-20h-10zm10 20v90h-90v10h-20v-10h-90v-90h-10v-20h10v-90h90v-10h20v10h90v90h10v20z";
const char* intersectSvg="m-100 10v-20h10v20zm90 90v-10h20v10zm0-190v-10h20v10zm100 100v-20h10v20z";
const char* xorSvg="m-100 10h10v-20h-10zm90 90h20v-10h-20zm0-190h20v-10h-20zm100 100h10v-20h-10z"
"m10 0v90h-90v10h-20v-10h-90v-90h-10v-20h10v-90h90v-10h20v10h90v90h10v20z";
const char* subtractSvg="m-90 10v-20h-10v-90h90v10h20v-10h90v90h-10v20h10v90h-90v-10h-20v10h-90v-90z";
CPPUNIT_ASSERT_MESSAGE("cleared clip stays empty under union operation",
@@ -164,7 +165,7 @@ public:
aMixedClip.subtractRange(B2DRange(-150,-20,0,20));
aMixedClip.xorRange(B2DRange(-150,-150,150,150));
const char* mixedClipSvg="m0 0v20h-100v80h90v10h20v-10h90v-90h10v-20h-10v-90h-80v100zm-40-20v-80h-80v80zm-50 170v-300h300v300z";
const char* mixedClipSvg="m0 0v20h-100v80h90v10h20v-10h90v-90h10v-20h-10v-90h-80v100zm-20-20v-80h-80v80zm-130 170v-300h300v300z";
verifyPoly("mixed clip", mixedClipSvg, aMixedClip);
}

View File

@@ -121,13 +121,13 @@ public:
void validateOr()
{
const char* pValid="m0 0h100v150h-75v-50h-5v50h-20v-50-10zm75 10v-50h-50v50z";
const char* pValid="m0 0h100v150h-75v-50h-5v50h-20v-50-10zm75 100v-50h-50v50z";
validate("validateOr", pValid, &tools::solvePolygonOperationOr);
}
void validateXor()
{
const char* pValid="m0 0h100v150h-75v-50h-5v50h-20v-50-10zm0 10h20v-10h-20zm75 10v-50h-50v50z";
const char* pValid="m0 0h100v150h-75v-50h-5v50h-20v-50-10zm0 100h20v-10h-20zm75 0v-50h-50v50z";
validate("validateXor", pValid, &tools::solvePolygonOperationXor);
}
@@ -139,10 +139,23 @@ public:
void validateDiff()
{
const char* pValid="m0 90v-90h100v150h-75v-50h-5v-10zm55 10v-50h-50v50z";
const char* pValid="m0 90v-90h100v150h-75v-50h-5v-10zm75 10v-50h-50v50z";
validate("validateDiff", pValid, &tools::solvePolygonOperationDiff);
}
void checkCrossoverSolver()
{
B2DPolyPolygon aPoly;
tools::importFromSvgD(
aPoly,
::rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"m0 0 v 5 h 3 h 1 h 1 h 1 v -2 v -3 z"
"m3 7 v -2 h 1 h 1 h 1 v -2 h 1 v 3 z")));
tools::solveCrossovers(aPoly);
}
// Change the following lines only, if you add, remove or rename
// member functions of the current class,
// because these macros are need by auto register mechanism.
@@ -152,6 +165,7 @@ public:
CPPUNIT_TEST(validateXor);
CPPUNIT_TEST(validateAnd);
CPPUNIT_TEST(validateDiff);
CPPUNIT_TEST(checkCrossoverSolver);
CPPUNIT_TEST_SUITE_END();
};