Code

Fix bug #612756 where connectors with zero length (due to being clipped
authorMichael Wybrow <mjwybrow@users.sf.net>
Fri, 13 Aug 2010 05:22:17 +0000 (15:22 +1000)
committerMichael Wybrow <mjwybrow@users.sf.net>
Fri, 13 Aug 2010 05:22:17 +0000 (15:22 +1000)
to the perimeter of two overlapping objects) could crash the connector
context.

src/connector-context.cpp

index 3791034d69687723af5243335d93802e29710f0b..1263a9215086a068821fcbcf8179cca754d78f2b 100644 (file)
@@ -1760,12 +1760,22 @@ cc_set_active_conn(SPConnectorContext *cc, SPItem *item)
 
     if (cc->active_conn == item)
     {
-        // Just adjust handle positions.
-        Geom::Point startpt = *(curve->first_point()) * i2d;
-        sp_knot_set_position(cc->endpt_handle[0], startpt, 0);
+        if (curve->is_empty())
+        {
+            // Connector is invisible because it is clipped to the boundary of
+            // two overlpapping shapes.
+            sp_knot_hide(cc->endpt_handle[0]);
+            sp_knot_hide(cc->endpt_handle[1]);
+        }
+        else
+        {
+            // Just adjust handle positions.
+            Geom::Point startpt = *(curve->first_point()) * i2d;
+            sp_knot_set_position(cc->endpt_handle[0], startpt, 0);
 
-        Geom::Point endpt = *(curve->last_point()) * i2d;
-        sp_knot_set_position(cc->endpt_handle[1], endpt, 0);
+            Geom::Point endpt = *(curve->last_point()) * i2d;
+            sp_knot_set_position(cc->endpt_handle[1], endpt, 0);
+        }
 
         return;
     }
@@ -1828,6 +1838,13 @@ cc_set_active_conn(SPConnectorContext *cc, SPItem *item)
                 G_CALLBACK(endpt_handler), cc);
     }
 
+    if (curve->is_empty())
+    {
+        // Connector is invisible because it is clipped to the boundary 
+        // of two overlpapping shapes.  So, it doesn't need endpoints.
+        return;
+    }
+
     Geom::Point startpt = *(curve->first_point()) * i2d;
     sp_knot_set_position(cc->endpt_handle[0], startpt, 0);