Crash on rotation/snapping to Line
Migrated from: https://bugs.launchpad.net/inkscape/+bug/1777327
Related issues (all center around Ellipse::intersect): inkscape#197 (closed), inkscape#194 (closed), inkscape#213 (closed)
Steps to reproduce:
- Open bug.svg in Inkscape
- Rotate the top-most object counter-clockwise (path8612/last in xml editor)
- Crash
Backtrace
inkscape: ../src/2geom/elliptical-arc.cpp:573: void Geom::EllipticalArc::_filterIntersections(std::vector<Geom::Intersection<> >&, bool) const: Assertion `are_near(_ellipse.pointAt(t), i->point(), 1e-5)' failed.
Thread 1 "inkscape" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
Backtrace in 0.92.x build
inkscape: ../src/2geom/elliptical-arc.cpp:573: void Geom::EllipticalArc::_filterIntersections(std::vector >&, bool) const: Assertion `are_near(_ellipse.pointAt(t), i->point(), 1e-5)' failed.Thread 1 "inkscape" received signal SIGABRT, Aborted. __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51 51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
#0 0x00007ffff2b84e97 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51 #1 0x00007ffff2b86801 in __GI_abort () at abort.c:79 #2 0x00007ffff2b7639a in __assert_fail_base (fmt=0x7ffff2cfd7d8 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x7ffff7501a20 "are_near(_ellipse.pointAt(t), i->point(), 1e-5)", file=file@entry=0x7ffff7501a00 "../src/2geom/elliptical-arc.cpp", line=line@entry=573, function=function@entry=0x7ffff7501ee0 <Geom::EllipticalArc::_filterIntersections(std::vector<Geom::Intersection<double, double>, std::allocator<Geom::Intersection<double, double> > >&, bool) const::__PRETTY_FUNCTION__> "void Geom::EllipticalArc::_filterIntersections(std::vector<Geom::Intersection<> >&, bool) const") at assert.c:92 #3 0x00007ffff2b76412 in __GI___assert_fail (assertion=0x7ffff7501a20 "are_near(_ellipse.pointAt(t), i->point(), 1e-5)", file=0x7ffff7501a00 "../src/2geom/elliptical-arc.cpp", line=573, function=0x7ffff7501ee0 <Geom::EllipticalArc::_filterIntersections(std::vector<Geom::Intersection<double, double>, std::allocator<Geom::Intersection<double, double> > >&, bool) const::__PRETTY_FUNCTION__> "void Geom::EllipticalArc::_filterIntersections(std::vector<Geom::Intersection<> >&, bool) const") at assert.c:101 #4 0x00007ffff729cf48 in Geom::EllipticalArc::_filterIntersections(std::vector<Geom::Intersection<double, double>, std::allocator<Geom::Intersection<double, double> > >&, bool) const (this=0x55555ca833a0, xs=std::vector of length 1, capacity 2 = {...}, is_first=true) at ../src/2geom/elliptical-arc.cpp:573 #5 0x00007ffff729d32d in Geom::EllipticalArc::intersect(Geom::Curve const&, double) const (this=0x55555ca833a0, other=warning: RTTI symbol not found for class 'Geom::BezierCurveN<1u>' ..., eps=9.9999999999999995e-07) at ../src/2geom/elliptical-arc.cpp:597 #6 0x00007ffff7270e12 in Geom::BezierCurveN<1u>::intersect(Geom::Curve const&, double) const (this=0x55555d3a8ca0, other=..., eps=9.9999999999999995e-07) at ../src/2geom/bezier-curve.cpp:312 #7 0x00007ffff72b852c in Geom::CurveIntersectionSweepSet::addActiveItem(__gnu_cxx::normal_iterator<Geom::CurveIntersectionSweepSet::CurveRecord const*, std::vector<Geom::CurveIntersectionSweepSet::CurveRecord, std::allocatorGeom::CurveIntersectionSweepSet::CurveRecord > >) (this=0x7fffffffc8c0, ii={hook = {<boost::intrusive::generic_hook<(boost::intrusive::algo_types)0, boost::intrusive::list_node_traits<void>, boost::intrusive::member_tag, (boost::intrusive::link_mode_type)1, (boost::intrusive::base_hook_type)0>> = {<boost::intrusive::list_node<void>> = {next = 0x7fffffffc8e8, prev = 0x7fffffffc8e8}, <boost::intrusive::hook_tags_definer<boost::intrusive::generic_hook<(boost::intrusive::algo_types)0, boost::intrusive::list_node_traits<void>, boost::intrusive::member_tag, (boost::intrusive::link_mode_type)1, (boost::intrusive::base_hook_type)0>, 0>> = {}, }, }, curve = 0x55555d3a8ca0, bounds = {<Geom::GenericRect> = {<boost::operators_impl::equality_comparable<Geom::Rect, boost::operators_impl::equality_comparable<Geom::Rect, Geom::GenericRect, boost::operators_impl::orable<Geom::Rect, boost::operators_impl::orable<Geom::Rect, Geom::OptRect, boost::operators_impl::additive<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::equality_comparable1<Geom::Rect, boost::operators_impl::equality_comparable<Geom::Rect, Geom::GenericRect, boost::operators_impl::orable<Geom::Rect, boost::operators_impl::orable<Geom::Rect, Geom::OptRect, boost::operators_impl::additive<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::equality_comparable<Geom::Rect, Geom::GenericRect, boost::operators_impl::orable<Geom::Rect, boost::operators_impl::orable<Geom::Rect, Geom::OptRect, boost::operators_impl::additive<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::equality_comparable2<Geom::Rect, Geom::GenericRect, boost::operators_impl::orable<Geom::Rect, boost::operators_impl::orable<Geom::Rect, Geom::OptRect, boost::operators_impl::additive<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::true_t> >> = {<boost::operators_impl::orable<Geom::Rect, boost::operators_impl::orable<Geom::Rect, Geom::OptRect, boost::operators_impl::additive<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::orable1<Geom::Rect, boost::operators_impl::orable<Geom::Rect, Geom::OptRect, boost::operators_impl::additive<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::orable<Geom::Rect, Geom::OptRect, boost::operators_impl::additive<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::orable2<Geom::Rect, Geom::OptRect, boost::operators_impl::additive<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::additive<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::additive2<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::addable2<Geom::Rect, Geom::Point, boost::operators_impl::subtractable2<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t> > >> = {<boost::operators_impl::subtractable2<Geom::Rect, Geom::Point, boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::multipliable<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::multipliable2<Geom::Rect, Geom::Affine, boost::operators_impl::operators_detail::empty_baseGeom::Rect >> = {<boost::operators_impl::operators_detail::empty_baseGeom::Rect> = {}, }, }, }, }, }, }, }, }, }, }, }, }, }, }, f = {{<Geom::GenericInterval> = {<boost::operators_impl::equality_comparable<Geom::Interval, boost::operators_impl::equality_comparable<Geom::Interval, Geom::GenericInterval, boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::equality_comparable1<Geom::Interval, boost::operators_impl::equality_comparable<Geom::Interval, Geom::GenericInterval, boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::equality_comparable<Geom::Interval, Geom::GenericInterval, boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::equality_comparable2<Geom::Interval, Geom::GenericInterval, boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> >> = {<boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::additive1<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> >> = {<boost::operators_impl::addable1<Geom::Interval, boost::operators_impl::subtractable1<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> > >> = {<boost::operators_impl::subtractable1<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> >> = {<boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::multipliable1<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> >> = {<boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::orable1<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::arithmetic2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval >> = {<boost::operators_impl::additive2<Geom::Interval, double, boost::operators_impl::multiplicative2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval > >> = {<boost::operators_impl::addable2<Geom::Interval, double, boost::operators_impl::subtractable2<Geom::Interval, double, boost::operators_impl::multiplicative2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval > > >> = {<boost::operators_impl::subtractable2<Geom::Interval, double, boost::operators_impl::multiplicative2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval > >> = {<boost::operators_impl::multiplicative2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval >> = {<boost::operators_impl::multipliable2<Geom::Interval, double, boost::operators_impl::dividable2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval > >> = {<boost::operators_impl::dividable2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval >> = {<boost::operators_impl::operators_detail::empty_baseGeom::Interval> = {}, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, _b = {-1746.0485669291343, -1689.4799622047249}}, }, {<Geom::GenericInterval> = {<boost::operators_impl::equality_comparable<Geom::Interval, boost::operators_impl::equality_comparable<Geom::Interval, Geom::GenericInterval, boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::equality_comparable1<Geom::Interval, boost::operators_impl::equality_comparable<Geom::Interval, Geom::GenericInterval, boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::equality_comparable<Geom::Interval, Geom::GenericInterval, boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::equality_comparable2<Geom::Interval, Geom::GenericInterval, boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> >> = {<boost::operators_impl::additive<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::additive1<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> >> = {<boost::operators_impl::addable1<Geom::Interval, boost::operators_impl::subtractable1<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> > >> = {<boost::operators_impl::subtractable1<Geom::Interval, boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> >> = {<boost::operators_impl::multipliable<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::multipliable1<Geom::Interval, boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t> >> = {<boost::operators_impl::orable<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::true_t>> = {<boost::operators_impl::orable1<Geom::Interval, boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t> >> = {<boost::operators_impl::arithmetic<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::arithmetic2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval >> = {<boost::operators_impl::additive2<Geom::Interval, double, boost::operators_impl::multiplicative2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval > >> = {<boost::operators_impl::addable2<Geom::Interval, double, boost::operators_impl::subtractable2<Geom::Interval, double, boost::operators_impl::multiplicative2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval > > >> = {<boost::operators_impl::subtractable2<Geom::Interval, double, boost::operators_impl::multiplicative2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval > >> = {<boost::operators_impl::multiplicative2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval >> = {<boost::operators_impl::multipliable2<Geom::Interval, double, boost::operators_impl::dividable2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval > >> = {<boost::operators_impl::dividable2<Geom::Interval, double, boost::operators_impl::operators_detail::empty_baseGeom::Interval >> = {<boost::operators_impl::operators_detail::empty_baseGeom::Interval> = {}, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, }, _b = {53.580325039370088, 77.01176692913387}}, }}}, }, index = 0, which = 0}) at ../src/2geom/path.cpp:526 #8 0x00007ffff72b9887 in Geom::SweeperGeom::CurveIntersectionSweepSet::process() (this=0x7fffffffc880) at ../src/2geom/sweeper.h:137 #9 0x00007ffff72b326b in Geom::Path::intersect(Geom::Path const&, double) const (this=0x55555cf622a0, other=..., precision=9.9999999999999995e-07) at ../src/2geom/path.cpp:564 #10 0x00007ffff72c3be3 in Geom::PathIntersectionSweepSet::addActiveItem(__gnu_cxx::__normal_iterator<Geom::PathIntersectionSweepSet::PathRecord, std::vector<Geom::PathIntersectionSweepSet::PathRecord, std::allocatorGeom::PathIntersectionSweepSet::PathRecord > >) (this=0x7fffffffcb80, ii={hook = {<boost::intrusive::generic_hook<(boost::intrusive::algo_types)0, boost::intrusive::list_node_traits<void>, boost::intrusive::member_tag, (boost::intrusive::link_mode_type)1, (boost::intrusive::base_hook_type)0>> = {<boost::intrusive::list_node<void>> = {next = 0x0, prev = 0x0}, <boost::intrusive::hook_tags_definer<boost::intrusive::generic_hook<(boost::intrusive::algo_types)0, boost::intrusive::list_node_traits<void>, boost::intrusive::member_tag, (boost::intrusive::link_mode_type)1, (boost::intrusive::base_hook_type)0>, 0>> = {}, }, }, path = 0x55555cf622a0, index = 0, which = 1}) at ../src/2geom/pathvector.cpp:184 #11 0x00007ffff72c4c9f in Geom::SweeperGeom::PathIntersectionSweepSet::process() (this=0x7fffffffcb40) at ../src/2geom/sweeper.h:137 #12 0x00007ffff72c2b7b in Geom::PathVector::intersect(Geom::PathVector const&, double) const (this=0x7fffffffcc70, other=..., precision=9.9999999999999995e-07) at ../src/2geom/pathvector.cpp:223 #13 0x00007ffff6f1f823 in Inkscape::ObjectSnapper::_snapPathsConstrained(IntermSnapResults&, Inkscape::SnapCandidatePoint const&, Inkscape::Snapper::SnapConstraint const&, Geom::Point const&) const (this=0x555557130680, isr=..., p=..., c=..., p_proj_on_constraint=...) at ../src/object-snapper.cpp:647 #14 0x00007ffff6f20210 in Inkscape::ObjectSnapper::constrainedSnap(IntermSnapResults&, Inkscape::SnapCandidatePoint const&, Geom::OptRect const&, Inkscape::Snapper::SnapConstraint const&, std::vector<SPItem const, std::allocator<SPItem const> > const, std::vector<Inkscape::SnapCandidatePoint, std::allocatorInkscape::SnapCandidatePoint >*) const (this=0x555557130680, isr=..., p=..., bbox_to_snap=..., c=..., it=0x5555571308f8, unselected_nodes=0x0) at ../src/object-snapper.cpp:734 #15 0x00007ffff6f88cdd in SnapManager::constrainedSnap(Inkscape::SnapCandidatePoint const&, Inkscape::Snapper::SnapConstraint const&, Geom::OptRect const&) const (this=0x555557130668, p=..., constraint=..., bbox_to_snap=...) at ../src/snap.cpp:260 #16 0x00007ffff6f3b9b3 in Inkscape::PureRotateConstrained::snap(SnapManager*, Inkscape::SnapCandidatePoint const&, Geom::Point, Geom::OptRect const&) const (this=0x7fffffffd6e0, sm=0x555557130668, p=..., pt_orig=..., bbox_to_snap=...) at ../src/pure-transform.cpp:349 #17 0x00007ffff6f39cca in Inkscape::PureTransform::snap(SnapManager*, std::vector<Inkscape::SnapCandidatePoint, std::allocatorInkscape::SnapCandidatePoint > const&, Geom::Point const&) (this=0x7fffffffd6e0, sm=0x555557130668, points=std::vector of length 4, capacity 4 = {...}, pointer=...) at ../src/pure-transform.cpp:67 #18 0x00007ffff6f8a668 in SnapManager::snapTransformed(std::vector<Inkscape::SnapCandidatePoint, std::allocatorInkscape::SnapCandidatePoint > const&, Geom::Point const&, Inkscape::PureTransform&) (this=0x555557130668, points=std::vector of length 4, capacity 4 = {...}, pointer=..., transform=...) at ../src/snap.cpp:467 #19 0x00007ffff6f7916d in Inkscape::SelTrans::rotateRequest(Geom::Point&, unsigned int) (this=0x555557829970, pt=..., state=272) at ../src/seltrans.cpp:1253 #20 0x00007ffff6f7801d in Inkscape::SelTrans::request(SPSelTransHandle const&, Geom::Point&, unsigned int) (this=0x555557829970, handle=..., pt=..., state=272) at ../src/seltrans.cpp:1084 #21 0x00007ffff6f76665 in Inkscape::SelTrans::handleRequest(SPKnot*, Geom::Point*, unsigned int, SPSelTransHandle const&) (this=0x555557829970, knot=0x555557832ba0, position=0x7fffffffdac0, state=272, handle=...) at ../src/seltrans.cpp:810 #22 0x00007ffff6f75fd0 in sp_sel_trans_handle_request(SPKnot*, Geom::Point*, guint, SPSelTransHandle const*) (knot=0x555557832ba0, position=0x7fffffffdac0, state=272, data=0x7ffff74a5600 <hands+480>) at ../src/seltrans.cpp:700 #23 0x00007ffff6f7ffb4 in sigc::pointer_functor4<SPKnot*, Geom::Point*, unsigned int, SPSelTransHandle const*, int>::operator()(SPKnot* const&, Geom::Point* const&, unsigned int const&, SPSelTransHandle const* const&) const (this=0x555557832ec0, _A_a1=@0x7fffffffda58: 0x555557832ba0, _A_a2=@0x7fffffffda60: 0x7fffffffdac0, _A_a3=@0x7fffffffda3c: 272, _A_a4=@0x555557832ec8: 0x7ffff74a5600 <hands+480>) at /usr/include/sigc++-2.0/sigc++/functors/ptr_fun.h:225 #24 0x00007ffff6f7fa8d in sigc::adaptor_functor<sigc::pointer_functor4<SPKnot*, Geom::Point*, unsigned int, SPSelTransHandle const*, int> >::operator()<SPKnot* const&, Geom::Point* const&, unsigned int const&, SPSelTransHandle const*&>(SPKnot* const&, Geom::Point* const&, unsigned int const&, SPSelTransHandle const*&) const (this=0x555557832eb8, _A_arg1=@0x7fffffffda58: 0x555557832ba0, _A_arg2=@0x7fffffffda60: 0x7fffffffdac0, _A_arg3=@0x7fffffffda3c: 272, _A_arg4=@0x555557832ec8: 0x7ffff74a5600 <hands+480>) at /usr/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h:149 #25 0x00007ffff6f7efc2 in sigc::bind_functor<-1, sigc::pointer_functor4<SPKnot*, Geom::Point*, unsigned int, SPSelTransHandle const*, int>, SPSelTransHandle const*, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>::operator()<SPKnot* const&, Geom::Point* const&, unsigned int const&>(SPKnot* const&, Geom::Point* const&, unsigned int const&) (this=0x555557832eb0, A_arg1=@0x7fffffffda58: 0x555557832ba0, A_arg2=@0x7fffffffda60: 0x7fffffffdac0, A_arg3=@0x7fffffffda3c: 272) at /usr/include/sigc++-2.0/sigc++/adaptors/bind.h:1181 #26 0x00007ffff6f7e1ab in sigc::internal::slot_call<sigc::bind_functor<-1, sigc::pointer_functor4<SPKnot*, Geom::Point*, unsigned int, SPSelTransHandle const*, int>, SPSelTransHandle const*, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>, bool, SPKnot*, Geom::Point*, unsigned int>::call_it(sigc::internal::slot_rep*, SPKnot* const&, Geom::Point* const&, unsigned int const&) (rep=0x555557832e80, a#0=@0x7fffffffda58: 0x555557832ba0, a#1=@0x7fffffffda60: 0x7fffffffdac0, a#2=@0x7fffffffda3c: 272) at /usr/include/sigc++-2.0/sigc++/functors/slot.h:429 #27 0x00007ffff6f09489 in sigc::internal::signal_emit3<bool, SPKnot*, Geom::Point*, unsigned int, sigc::nil>::emit(sigc::internal::signal_impl*, SPKnot* const&, Geom::Point* const&, unsigned int const&) (impl=0x555557832e30, _A_a1=@0x7fffffffda58: 0x555557832ba0, _A_a2=@0x7fffffffda60: 0x7fffffffdac0, _A_a3=@0x7fffffffda3c: 272) at /usr/include/sigc++-2.0/sigc++/signal.h:1465 #28 0x00007ffff6f08e4c in sigc::signal3<bool, SPKnot*, Geom::Point*, unsigned int, sigc::nil>::emit(SPKnot* const&, Geom::Point* const&, unsigned int const&) const (this=0x555557832cf8, _A_a1=@0x7fffffffda58: 0x555557832ba0, _A_a2=@0x7fffffffda60: 0x7fffffffdac0, _A_a3=@0x7fffffffda3c: 272) at /usr/include/sigc++-2.0/sigc++/signal.h:3263 #29 0x00007ffff6f08469 in SPKnot::requestPosition(Geom::Point const&, unsigned int) (this=0x555557832ba0, p=..., state=272) at ../src/knot.cpp:400 #30 0x00007ffff6f0835a in sp_knot_handler_request_position(_GdkEvent*, SPKnot*) (event=0x55555caeb990, knot=0x555557832ba0) at ../src/knot.cpp:382 #31 0x00007ffff69faef1 in Inkscape::UI::Tools::sp_event_context_snap_watchdog_callback(void*) (data=0x55555d3a9880) at ../src/ui/tools/tool-base.cpp:1396 #32 0x00007ffff5006c73 in () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #33 0x00007ffff50061f5 in g_main_context_dispatch () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #34 0x00007ffff50065c0 in () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #35 0x00007ffff50068d2 in g_main_loop_run () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #36 0x00007ffff3eeba37 in gtk_main () at /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #37 0x000055555556652a in sp_main_gui(int, char const**) (argc=2, argv=0x7fffffffdfb8) at ../src/main.cpp:1173 #38 0x00005555555659b8 in main(int, char**) (argc=2, argv=0x7fffffffdfb8) at ../src/main.cpp:817
What should have happened?
No crash.
Replicated/Tested on
- 0.92.x build (custom build, up to date with gitlab), Linux Mint 19.1
- 0.92.2 5c3e80d, 2017-08-06, OS X 10.11.6 (15G20015) "El Capitan"
- 0.92.3 (2405546, 2018-03-11) ppa, Linux Mint 19.1
- 0.92.4 latest flatpak, Linux Mint 19.1
Caveat: failed replication
- Not replicated in latest brew (compiled) (0.92.3 2405546, 2018-03-11) not viable alternative as too buggy
- Not replicated in 1.0alpha up to date with master, Linux Mint 19.1
- Not replicated in 1.0alpha (9dee831, 2019-01-15), AppImage, Linux Mint 19.1
Edit: note I ended up replicating in 1.0alpha by flipping the y axis