Sat, 12 Apr 2008 06:37:13 -0300 "bulia byak" <buliabyak@...400...> kirjoitti:
Spiro splines are a novel way of defining curvilinear paths developed by Raph Levien. Recently, Spiro support was added to the FontForge font editor, and now it is available in Inkscape too. It takes some getting used to, but for certain tasks Spiros have a clear advantage over Bezier curves.
I bumped into a problem playing around with this. Inkscape just freezed when moving the control points. Here's some debug info I managed to catch, I'll file a bug report later when I'm not on Polish WLAN ;)
I attached into the inkscape process with gdb, so this is just a random point, where I stopped it.
(gdb) bt #0 std::vector<Shape::dg_point, std::allocatorShape::dg_point
::operator[] (this=0x46e0c38, __n=35191)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4/bits/stl_vector.h:494 #1 0x0000000000723aa1 in Shape::SwapPoints (this=0x46e0b60, a=35191, b=61747) at livarot/Shape.cpp:482 #2 0x0000000000723fc4 in Shape::SortPointsRounded (this=0x46e0b60, s=0, e=61747) at livarot/Shape.cpp:1088 #3 0x000000000072400a in Shape::SortPointsRounded (this=0x46e0b60, s=0, e=61748) at livarot/Shape.cpp:1104 #4 0x000000000072400a in Shape::SortPointsRounded (this=0x46e0b60, s=0, e=61749) at livarot/Shape.cpp:1104 [snip...] #3786 0x000000000072400a in Shape::SortPointsRounded (this=0x46e0b60, s=0, e=65531) at livarot/Shape.cpp:1104 #3787 0x000000000072400a in Shape::SortPointsRounded (this=0x46e0b60, s=0, e=65532) at livarot/Shape.cpp:1104 #3788 0x000000000072400a in Shape::SortPointsRounded (this=0x46e0b60, s=0, e=65533) at livarot/Shape.cpp:1104 #3789 0x000000000072400a in Shape::SortPointsRounded (this=0x46e0b60, s=0, e=65537) at livarot/Shape.cpp:1104 #3790 0x000000000072400a in Shape::SortPointsRounded (this=0x46e0b60, s=0, e=65538) at livarot/Shape.cpp:1104 #3791 0x000000000073b376 in Shape::ConvertToShape (this=0x4075200, a=0x46e0b60, directed=fill_oddEven, invert=false) at livarot/ShapeSweep.cpp:199 #3792 0x00000000006816d6 in nr_arena_shape_update_fill (shape=0x355d000, gc=0x7fff63b89a70, area=0x7fff63b8a1f8, force_shape=<value optimized out>) at display/nr-arena-shape.cpp:474 #3793 0x00000000006829f7 in nr_arena_shape_render (ct=0x4defc00, item=0x355d000, area=0x7fff63b89ce0, pb=0x7fff63b8a1e0, flags=0) at display/nr-arena-shape.cpp:871 ...
(gdb) print {Shape}0x46e0b60 $1 = {_vptr.Shape = 0x964cd0, ebData = {<std::_Vector_base<Shape::back_data,std::allocatorShape::back_data
= { _M_impl = {<std::allocatorShape::back_data> = {<__gnu_cxx::new_allocatorShape::back_data> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>},
vorpData = {<std::_Vector_base<Shape::voronoi_point,std::allocatorShape::voronoi_point
= { _M_impl = {<std::allocatorShape::voronoi_point> = {<__gnu_cxx::new_allocatorShape::voronoi_point> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0,
_M_end_of_storage = 0x0}}, <No data fields>}, voreData = {<std::_Vector_base<Shape::voronoi_edge,std::allocatorShape::voronoi_edge
= { _M_impl = {<std::allocatorShape::voronoi_edge> = {<__gnu_cxx::new_allocatorShape::voronoi_edge> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0,
_M_end_of_storage = 0x0}}, <No data fields>}, nbQRas = 96, firstQRas = 0, lastQRas = 96, qrsData = 0x0, chgts = {<std::_Vector_base<Shape::sTreeChange,std::allocatorShape::sTreeChange
= { _M_impl = {<std::allocatorShape::sTreeChange> = {<__gnu_cxx::new_allocatorShape::sTreeChange> = {<No data fields>}, <No data fields>}, ---Type <return> to continue, or q fields><return> to quit---
_M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>}, nbInc = 0, maxInc = -524288, iData = 0x0, sTree = 0x0, sEvts = 0x0, leftX = 0, topY = 0, rightX = 0, bottomY = 0, maxPt = 65539, maxAr = 65539, type = 0, _need_points_sorting = true, _need_edges_sorting = true, _has_points_data = true, _point_data_initialised = true, _has_edges_data = true, _has_sweep_src_data = true, _has_sweep_dest_data = false, _has_raster_data = false, _has_quick_raster_data = false, _has_back_data = false, _has_voronoi_data = false, _bbox_up_to_date = false, _pts = {<std::_Vector_base<Shape::dg_point,std::allocatorShape::dg_point >> = { _M_impl = {<std::allocatorShape::dg_point> = {<__gnu_cxx::new_allocatorShape::dg_point> = {<No data fields>}, <No data fields>}, _M_start = 0x619e040, _M_finish = 0x641e0b8, _M_end_of_storage = 0x669e040}}, <No data fields>}, _aretes = {<std::_Vector_base<Shape::dg_arete,std::allocatorShape::dg_arete >> = { _M_impl = {<std::allocatorShape::dg_arete> = {<__gnu_cxx::new_allocatorShape::dg_arete> = {<No data fields>}, <No data fields>}, _M_start = 0x549cda0, _M_finish = 0x549ce90, _M_end_of_storage = 0x549cee0}}, <No data fields>}, eData = {<std::_Vector_base<Shape::edge_data,std::allocatorShape::edge_data
= {
_M_impl = {<std::allocatorShape::edge_data> = {<__gnu_cxx::new_allocatorShape::edge_data> = {<No data fields>}, <No data fields>}, _M_start = 0x669e050, _M_finish = 0x6b1e128, _M_end_of_storage = 0x6b1e128}}, <No data fields>}, swsData = {<std::_Vector_base<Shape::sweep_src_data,std::allocatorShape::sweep_src_data
= { _M_impl = {<std::allocatorShape::sweep_src_data> = {<__gnu_cxx::new_allocatorShape::sweep_src_data> = {<No data fields>}, <No data fields>}, _M_start = 0x6b1e130, _M_finish = fields>0x6f1e1f0,
_M_end_of_storage = 0x6f1e1f0}}, <No data fields>}, swdData = {<std::_Vector_base<Shape::sweep_dest_data,std::allocatorShape::sweep_dest_data
= { _M_impl = {<std::allocatorShape::sweep_dest_data> = {<__gnu_cxx::new_allocatorShape::sweep_dest_data> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0,
_M_end_of_storage = 0x0}}, <No data fields>}, swrData = {<std::_Vector_base<Shape::raster_data,std::allocatorShape::raster_data
= { _M_impl = {<std::allocatorShape::raster_data> = {<__gnu_cxx::new_allocatorShape::raster_data> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0,
_M_end_of_storage = 0x0}}, <No data fields>}, pData = {<std::_Vector_base<Shape::point_data,std::allocatorShape::point_data
= { _M_impl = {<std::allocatorShape::point_data> = {<__gnu_cxx::new_allocatorShape::point_data> = {<No data fields>}, <No data fields>}, _M_start = 0x58de010, _M_finish = 0x5c5e0b8,
_M_end_of_storage = 0x5c5e0b8}}, <No data fields>}}