summaryrefslogtreecommitdiffstats
path: root/src/svg
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-07-24 23:26:11 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-07-24 23:26:11 +0000
commit7b6ffd82650ee1e20a53b0631d5c2dddef58e8d5 (patch)
tree48cae26bf789b11d79f72efc16a6676f960eaaa6 /src/svg
parentupdate to trunk (diff)
parent3D box tool: the shift key must not prevent snapping of the vanishing point. ... (diff)
downloadinkscape-7b6ffd82650ee1e20a53b0631d5c2dddef58e8d5.tar.gz
inkscape-7b6ffd82650ee1e20a53b0631d5c2dddef58e8d5.zip
update to trunk
(bzr r12588.1.45)
Diffstat (limited to 'src/svg')
-rw-r--r--src/svg/svg-path-geom-test.h121
-rw-r--r--src/svg/svg-path.cpp36
2 files changed, 22 insertions, 135 deletions
diff --git a/src/svg/svg-path-geom-test.h b/src/svg/svg-path-geom-test.h
index 3558b4e55..c3972133d 100644
--- a/src/svg/svg-path-geom-test.h
+++ b/src/svg/svg-path-geom-test.h
@@ -453,38 +453,6 @@ private:
return false;
}
}
- else if(Geom::HLineSegment const *la = dynamic_cast<Geom::HLineSegment const*>(ca))
- {
- Geom::HLineSegment const *lb = dynamic_cast<Geom::HLineSegment const*>(cb);
- if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- }
- else if(Geom::VLineSegment const *la = dynamic_cast<Geom::VLineSegment const*>(ca))
- {
- Geom::VLineSegment const *lb = dynamic_cast<Geom::VLineSegment const*>(cb);
- if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- }
else if(Geom::CubicBezier const *la = dynamic_cast<Geom::CubicBezier const*>(ca))
{
Geom::CubicBezier const *lb = dynamic_cast<Geom::CubicBezier const*>(cb);
@@ -522,91 +490,10 @@ private:
}
else // not same type
{
- if(Geom::LineSegment const *la = dynamic_cast<Geom::LineSegment const*>(ca))
- {
- if (Geom::HLineSegment const *lb = dynamic_cast<Geom::HLineSegment const*>(cb)) {
- if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- char temp[200];
- sprintf(temp, "A LineSegment and an HLineSegment have been considered equal. Subpath: %u, segment: %u", static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_TRACE(temp);
- } else if (Geom::VLineSegment const *lb = dynamic_cast<Geom::VLineSegment const*>(cb)) {
- if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- char temp[200];
- sprintf(temp, "A LineSegment and a VLineSegment have been considered equal. Subpath: %u, segment: %u", static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_TRACE(temp);
- } else {
- char temp[200];
- sprintf(temp, "Different curve types: %s != %s, subpath: %u, segment: %u", typeid(*ca).name(), typeid(*cb).name(), static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- }
- }
- else if(Geom::LineSegment const *lb = dynamic_cast<Geom::LineSegment const*>(cb))
- {
- if (Geom::HLineSegment const *la = dynamic_cast<Geom::HLineSegment const*>(ca)) {
- if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- char temp[200];
- sprintf(temp, "An HLineSegment and a LineSegment have been considered equal. Subpath: %u, segment: %u", static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_TRACE(temp);
- } else if (Geom::VLineSegment const *la = dynamic_cast<Geom::VLineSegment const*>(ca)) {
- if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
- char temp[200];
- sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- char temp[200];
- sprintf(temp, "A VLineSegment and a LineSegment have been considered equal. Subpath: %u, segment: %u", static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_TRACE(temp);
- } else {
- char temp[200];
- sprintf(temp, "Different curve types: %s != %s, subpath: %u, segment: %u", typeid(*ca).name(), typeid(*cb).name(), static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- return false;
- }
- } else {
- char temp[200];
- sprintf(temp, "Different curve types: %s != %s, subpath: %u, segment: %u", typeid(*ca).name(), typeid(*cb).name(), static_cast<unsigned int>(i), static_cast<unsigned int>(j));
- TS_FAIL(temp);
- }
+ char temp[200];
+ sprintf(temp, "Different curve types: %s != %s, subpath: %u, segment: %u", typeid(*ca).name(), typeid(*cb).name(), static_cast<unsigned int>(i), static_cast<unsigned int>(j));
+ TS_FAIL(temp);
+ return false;
}
}
}
diff --git a/src/svg/svg-path.cpp b/src/svg/svg-path.cpp
index 9ba3c0ebd..ba9e11452 100644
--- a/src/svg/svg-path.cpp
+++ b/src/svg/svg-path.cpp
@@ -43,16 +43,15 @@ Geom::PathVector sp_svg_read_pathv(char const * str)
if (!str)
return pathv; // return empty pathvector when str == NULL
-
- typedef std::back_insert_iterator<Geom::PathVector> Inserter;
- Inserter iter(pathv);
- Geom::PathIteratorSink<Inserter> generator(iter);
+ Geom::PathBuilder builder(pathv);
+ Geom::SVGPathParser parser(builder);
+ parser.setZSnapThreshold(Geom::EPSILON);
try {
- Geom::parse_svg_path(str, generator);
+ parser.parse(str);
}
catch (Geom::SVGPathParseError &e) {
- generator.flush();
+ builder.flush();
// This warning is extremely annoying when testing
//g_warning("Malformed SVG path, truncated path up to where error was found.\n Input path=\"%s\"\n Parsed path=\"%s\"", str, sp_svg_write_path(pathv));
}
@@ -61,10 +60,17 @@ Geom::PathVector sp_svg_read_pathv(char const * str)
}
static void sp_svg_write_curve(Inkscape::SVG::PathString & str, Geom::Curve const * c) {
+ // TODO: this code needs to removed and replaced by appropriate path sink
if(Geom::LineSegment const *line_segment = dynamic_cast<Geom::LineSegment const *>(c)) {
// don't serialize stitch segments
if (!dynamic_cast<Geom::Path::StitchSegment const *>(c)) {
- str.lineTo( (*line_segment)[1][0], (*line_segment)[1][1] );
+ if (line_segment->initialPoint()[Geom::X] == line_segment->finalPoint()[Geom::X]) {
+ str.verticalLineTo( line_segment->finalPoint()[Geom::Y] );
+ } else if (line_segment->initialPoint()[Geom::Y] == line_segment->finalPoint()[Geom::Y]) {
+ str.horizontalLineTo( line_segment->finalPoint()[Geom::X] );
+ } else {
+ str.lineTo( (*line_segment)[1][0], (*line_segment)[1][1] );
+ }
}
}
else if(Geom::QuadraticBezier const *quadratic_bezier = dynamic_cast<Geom::QuadraticBezier const *>(c)) {
@@ -76,17 +82,11 @@ static void sp_svg_write_curve(Inkscape::SVG::PathString & str, Geom::Curve cons
(*cubic_bezier)[2][0], (*cubic_bezier)[2][1],
(*cubic_bezier)[3][0], (*cubic_bezier)[3][1] );
}
- else if(Geom::SVGEllipticalArc const *svg_elliptical_arc = dynamic_cast<Geom::SVGEllipticalArc const *>(c)) {
- str.arcTo( svg_elliptical_arc->ray(Geom::X), svg_elliptical_arc->ray(Geom::Y),
- Geom::rad_to_deg(svg_elliptical_arc->rotationAngle()),
- svg_elliptical_arc->largeArc(), svg_elliptical_arc->sweep(),
- svg_elliptical_arc->finalPoint() );
- }
- else if(Geom::HLineSegment const *hline_segment = dynamic_cast<Geom::HLineSegment const *>(c)) {
- str.horizontalLineTo( hline_segment->finalPoint()[0] );
- }
- else if(Geom::VLineSegment const *vline_segment = dynamic_cast<Geom::VLineSegment const *>(c)) {
- str.verticalLineTo( vline_segment->finalPoint()[1] );
+ else if(Geom::EllipticalArc const *elliptical_arc = dynamic_cast<Geom::EllipticalArc const *>(c)) {
+ str.arcTo( elliptical_arc->ray(Geom::X), elliptical_arc->ray(Geom::Y),
+ Geom::rad_to_deg(elliptical_arc->rotationAngle()),
+ elliptical_arc->largeArc(), elliptical_arc->sweep(),
+ elliptical_arc->finalPoint() );
} else {
//this case handles sbasis as well as all other curve types
Geom::Path sbasis_path = Geom::cubicbezierpath_from_sbasis(c->toSBasis(), 0.1);