bool SVGSVGElement::checkIntersectionOrEnclosure( const SVGElement& element, const FloatRect& rect, CheckIntersectionOrEnclosure mode) const { LayoutObject* layoutObject = element.layoutObject(); ASSERT(!layoutObject || layoutObject->style()); if (!layoutObject || layoutObject->style()->pointerEvents() == EPointerEvents::None) return false; if (!isIntersectionOrEnclosureTarget(layoutObject)) return false; AffineTransform ctm = toSVGGraphicsElement(element).computeCTM( AncestorScope, DisallowStyleUpdate, this); FloatRect mappedRepaintRect = ctm.mapRect(layoutObject->visualRectInLocalSVGCoordinates()); bool result = false; switch (mode) { case CheckIntersection: result = intersectsAllowingEmpty(rect, mappedRepaintRect); break; case CheckEnclosure: result = rect.contains(mappedRepaintRect); break; default: ASSERT_NOT_REACHED(); break; } return result; }
bool RenderSVGModelObject::checkIntersection(RenderObject* renderer, const FloatRect& rect) { if (!renderer || renderer->style()->pointerEvents() == PE_NONE) return false; if (!isGraphicsElement(renderer)) return false; AffineTransform ctm; getElementCTM(static_cast<SVGElement*>(renderer->node()), ctm); return intersectsAllowingEmpty(rect, ctm.mapRect(renderer->repaintRectInLocalCoordinates())); }
// FloatRect::intersects does not consider horizontal or vertical lines (because of isEmpty()). // So special-case handling of such lines. static bool intersectsAllowingEmpty(const FloatRect& r, const FloatRect& other) { if (r.isEmpty() && other.isEmpty()) return false; if (r.isEmpty() && !other.isEmpty()) { return (other.contains(r.x(), r.y()) && !other.contains(r.maxX(), r.maxY())) || (!other.contains(r.x(), r.y()) && other.contains(r.maxX(), r.maxY())); } if (other.isEmpty() && !r.isEmpty()) return intersectsAllowingEmpty(other, r); return r.intersects(other); }
bool RenderSVGModelObject::checkIntersection(RenderElement* renderer, const FloatRect& rect) { if (!renderer || renderer->style().pointerEvents() == PE_NONE) return false; if (!isGraphicsElement(*renderer)) return false; AffineTransform ctm; SVGElement* svgElement = downcast<SVGElement>(renderer->element()); getElementCTM(svgElement, ctm); ASSERT(svgElement->renderer()); return intersectsAllowingEmpty(rect, ctm.mapRect(svgElement->renderer()->repaintRectInLocalCoordinates())); }