Commit 4f7ead10 authored by Fredrik Söderquist's avatar Fredrik Söderquist Committed by Commit Bot

Split out HitTestFragments from SVGInlineTextBox::NodeAtPoint

We can only ever hit the same Node in this loop, so even if the query
is penetrating/list-based we won't add more to the result if we would
happen to hit multiple fragments.

It's also easier to read and maybe slightly faster in some cases.

Change-Id: I3ce41ce58ef4a188d948690b1840d66e20ac0631
Reviewed-on: https://chromium-review.googlesource.com/c/1277792Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Cr-Commit-Position: refs/heads/master@{#600479}
parent be45ae14
...@@ -276,6 +276,25 @@ FloatRect SVGInlineTextBox::CalculateBoundaries() const { ...@@ -276,6 +276,25 @@ FloatRect SVGInlineTextBox::CalculateBoundaries() const {
return text_bounding_rect; return text_bounding_rect;
} }
bool SVGInlineTextBox::HitTestFragments(
const HitTestLocation& location_in_container) const {
auto line_layout_item = LineLayoutSVGInlineText(GetLineLayoutItem());
const SimpleFontData* font_data = line_layout_item.ScaledFont().PrimaryFont();
DCHECK(font_data);
if (!font_data)
return false;
DCHECK(line_layout_item.ScalingFactor());
float baseline = font_data->GetFontMetrics().FloatAscent() /
line_layout_item.ScalingFactor();
for (const SVGTextFragment& fragment : text_fragments_) {
FloatQuad fragment_quad = fragment.BoundingQuad(baseline);
if (location_in_container.Intersects(fragment_quad))
return true;
}
return false;
}
bool SVGInlineTextBox::NodeAtPoint(HitTestResult& result, bool SVGInlineTextBox::NodeAtPoint(HitTestResult& result,
const HitTestLocation& location_in_container, const HitTestLocation& location_in_container,
const LayoutPoint& accumulated_offset, const LayoutPoint& accumulated_offset,
...@@ -299,26 +318,14 @@ bool SVGInlineTextBox::NodeAtPoint(HitTestResult& result, ...@@ -299,26 +318,14 @@ bool SVGInlineTextBox::NodeAtPoint(HitTestResult& result,
LayoutRect rect(Location(), Size()); LayoutRect rect(Location(), Size());
rect.MoveBy(accumulated_offset); rect.MoveBy(accumulated_offset);
if (location_in_container.Intersects(rect)) { if (location_in_container.Intersects(rect)) {
const SimpleFontData* font_data = if (HitTestFragments(location_in_container)) {
line_layout_item.ScaledFont().PrimaryFont(); line_layout_item.UpdateHitTestResult(
DCHECK(font_data); result,
if (!font_data) location_in_container.Point() - ToLayoutSize(accumulated_offset));
return false; if (result.AddNodeToListBasedTestResult(line_layout_item.GetNode(),
location_in_container,
DCHECK(line_layout_item.ScalingFactor()); rect) == kStopHitTesting)
float baseline = font_data->GetFontMetrics().FloatAscent() / return true;
line_layout_item.ScalingFactor();
for (const SVGTextFragment& fragment : text_fragments_) {
FloatQuad fragment_quad = fragment.BoundingQuad(baseline);
if (location_in_container.Intersects(fragment_quad)) {
line_layout_item.UpdateHitTestResult(
result,
location_in_container.Point() - ToLayoutSize(accumulated_offset));
if (result.AddNodeToListBasedTestResult(line_layout_item.GetNode(),
location_in_container,
rect) == kStopHitTesting)
return true;
}
} }
} }
} }
......
...@@ -97,6 +97,7 @@ class SVGInlineTextBox final : public InlineTextBox { ...@@ -97,6 +97,7 @@ class SVGInlineTextBox final : public InlineTextBox {
const ComputedStyle&, const ComputedStyle&,
const Font&) const final; const Font&) const final;
bool HitTestFragments(const HitTestLocation& location_in_container) const;
bool NodeAtPoint(HitTestResult&, bool NodeAtPoint(HitTestResult&,
const HitTestLocation& location_in_container, const HitTestLocation& location_in_container,
const LayoutPoint& accumulated_offset, const LayoutPoint& accumulated_offset,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment