index 39bfe1e261480320b6bb74158c08bbb4f63ff01d..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;
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);