Code

Patch from codedread. Prevents rendering of title/desc/metadata elements in text...
[inkscape.git] / src / display / nr-arena-shape.cpp
index 40e55255f5f39e98afc8d6485f839d1d604c6907..23bf70be5eb597e34a8cd58d67f61d4e71b5568e 100644 (file)
@@ -252,8 +252,7 @@ nr_arena_shape_update(NRArenaItem *item, NRRectL *area, NRGC *gc, guint state, g
         shape->ctm = gc->transform;
         if (state & NR_ARENA_ITEM_STATE_BBOX) {
             if (shape->curve) {
-                // note: the original code before 2geom used to calculate the exact bounding box, for speed we take the approx bbox here
-                boundingbox = bounds_fast_transformed(shape->curve->get_pathvector(), to_2geom(gc->transform));
+                boundingbox = bounds_exact_transformed(shape->curve->get_pathvector(), to_2geom(gc->transform));
                 item->bbox.x0 = (gint32)(boundingbox[0][0] - 1.0F);
                 item->bbox.y0 = (gint32)(boundingbox[1][0] - 1.0F);
                 item->bbox.x1 = (gint32)(boundingbox[0][1] + 1.9999F);
@@ -276,8 +275,7 @@ nr_arena_shape_update(NRArenaItem *item, NRRectL *area, NRGC *gc, guint state, g
     bool outline = (NR_ARENA_ITEM(shape)->arena->rendermode == Inkscape::RENDERMODE_OUTLINE);
 
     if (shape->curve) {
-        // note: the original code before 2geom used to calculate the exact bounding box, for speed we take the approx bbox here
-        boundingbox = bounds_fast_transformed(shape->curve->get_pathvector(), to_2geom(gc->transform));
+        boundingbox = bounds_exact_transformed(shape->curve->get_pathvector(), to_2geom(gc->transform));
 
         if (shape->_stroke.paint.type() != NRArenaShape::Paint::NONE || outline) {
             float width, scale;
@@ -420,7 +418,7 @@ static bool is_inner_area(NRRectL const &outer, NRRectL const &inner) {
 
 /* returns true if the pathvector has a region that needs fill.
  * is for optimizing purposes, so should be fast and can falsely return true. 
- * CANNOT falsely return false.
+ * CANNOT falsely return false. */
 static bool has_inner_area(Geom::PathVector const & pv) {
     // return false for the cases where there is surely no region to be filled
     if (pv.empty())
@@ -428,13 +426,13 @@ static bool has_inner_area(Geom::PathVector const & pv) {
 
     if ( (pv.size() == 1) && (pv.front().size() <= 1) ) {
         // vector has only one path with only one segment, see if that's a non-curve segment: that would mean no internal region
-        Geom::Curve const & c = pv.front().front();
-        if ( typeid(c) == typeid(Geom::LineSegment) )
-            return false;
-        if ( typeid(c) == typeid(Geom::HLineSegment) )
-            return false;
-        if ( typeid(c) == typeid(Geom::VLineSegment) )
+        Geom::Curve const * c = & pv.front().front();
+        if ( dynamic_cast<Geom::LineSegment const*>(c) ||
+             dynamic_cast<Geom::HLineSegment const*>(c) ||
+             dynamic_cast<Geom::VLineSegment const*>(c) )
+        {
             return false;
+        }
     }
 
     return true; //too costly to see if it has region to be filled, so return true.
@@ -1070,14 +1068,16 @@ nr_arena_shape_pick(NRArenaItem *item, NR::Point p, double delta, unsigned int /
 
     if (!shape->curve) return NULL;
     if (!shape->style) return NULL;
-    if (SP_SCALE24_TO_FLOAT(shape->style->opacity.value) == 0) // fully transparent, no pick
+
+    bool outline = (NR_ARENA_ITEM(shape)->arena->rendermode == Inkscape::RENDERMODE_OUTLINE);
+
+    if (SP_SCALE24_TO_FLOAT(shape->style->opacity.value) == 0 && !outline) 
+        // fully transparent, no pick unless outline mode
         return NULL;
 
     GTimeVal tstart, tfinish;
     g_get_current_time (&tstart);
 
-    bool outline = (NR_ARENA_ITEM(shape)->arena->rendermode == Inkscape::RENDERMODE_OUTLINE);
-
     double width;
     if (outline) {
         width = 0.5;
@@ -1088,19 +1088,17 @@ nr_arena_shape_pick(NRArenaItem *item, NR::Point p, double delta, unsigned int /
         width = 0;
     }
 
-    const_NRBPath bp;
-    bp.path = SP_CURVE_BPATH(shape->curve);
     double dist = NR_HUGE;
     int wind = 0;
     bool needfill = (shape->_fill.paint.type() != NRArenaShape::Paint::NONE 
              && shape->_fill.opacity > 1e-3 && !outline);
 
     if (item->arena->canvasarena) {
-        NR::Rect viewbox = item->arena->canvasarena->item.canvas->getViewbox();
-        viewbox.growBy (width);
-        nr_path_matrix_point_bbox_wind_distance(&bp, shape->ctm, p, NULL, needfill? &wind : NULL, &dist, 0.5, &viewbox);
+        Geom::Rect viewbox = to_2geom(item->arena->canvasarena->item.canvas->getViewbox());
+        viewbox.expandBy (width);
+        pathv_matrix_point_bbox_wind_distance(shape->curve->get_pathvector(), to_2geom(shape->ctm), to_2geom(p), NULL, needfill? &wind : NULL, &dist, 0.5, &viewbox);
     } else {
-        nr_path_matrix_point_bbox_wind_distance(&bp, shape->ctm, p, NULL, needfill? &wind : NULL, &dist, 0.5, NULL);
+        pathv_matrix_point_bbox_wind_distance(shape->curve->get_pathvector(), to_2geom(shape->ctm), to_2geom(p), NULL, needfill? &wind : NULL, &dist, 0.5, NULL);
     }
 
     g_get_current_time (&tfinish);