| Index: third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp
|
| index ff547aea673ac3a47a6233700286ca279c097798..a7e1d655f7af72369179b0db83feed79eb4fa4d2 100644
|
| --- a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp
|
| @@ -89,8 +89,7 @@ int SVGInlineTextBox::offsetForPositionInFragment(const SVGTextFragment& fragmen
|
| // Eventually handle lengthAdjust="spacingAndGlyphs".
|
| // FIXME: Handle vertical text.
|
| if (fragment.isTransformed()) {
|
| - AffineTransform fragmentTransform;
|
| - fragment.buildFragmentTransform(fragmentTransform);
|
| + AffineTransform fragmentTransform = fragment.buildFragmentTransform();
|
| textRun.setHorizontalGlyphStretch(narrowPrecisionToFloat(fragmentTransform.xScale()));
|
| }
|
|
|
| @@ -139,7 +138,6 @@ LayoutRect SVGInlineTextBox::localSelectionRect(int startPosition, int endPositi
|
|
|
| const ComputedStyle& style = lineLayoutItem().styleRef();
|
|
|
| - AffineTransform fragmentTransform;
|
| FloatRect selectionRect;
|
| int fragmentStartPosition = 0;
|
| int fragmentEndPosition = 0;
|
| @@ -154,10 +152,8 @@ LayoutRect SVGInlineTextBox::localSelectionRect(int startPosition, int endPositi
|
| continue;
|
|
|
| FloatRect fragmentRect = selectionRectForTextFragment(fragment, fragmentStartPosition, fragmentEndPosition, style);
|
| - if (fragment.isTransformed()) {
|
| - fragment.buildFragmentTransform(fragmentTransform);
|
| - fragmentRect = fragmentTransform.mapRect(fragmentRect);
|
| - }
|
| + if (fragment.isTransformed())
|
| + fragmentRect = fragment.buildFragmentTransform().mapRect(fragmentRect);
|
|
|
| selectionRect.unite(fragmentRect);
|
| }
|
| @@ -234,32 +230,16 @@ void SVGInlineTextBox::paintTextMatchMarkerBackground(const PaintInfo& paintInfo
|
|
|
| LayoutRect SVGInlineTextBox::calculateBoundaries() const
|
| {
|
| - LayoutRect textRect;
|
| -
|
| LineLayoutSVGInlineText lineLayoutItem = LineLayoutSVGInlineText(this->lineLayoutItem());
|
| -
|
| float scalingFactor = lineLayoutItem.scalingFactor();
|
| ASSERT(scalingFactor);
|
| -
|
| LayoutUnit baseline = lineLayoutItem.scaledFont().fontMetrics().floatAscent() / scalingFactor;
|
|
|
| - AffineTransform fragmentTransform;
|
| - unsigned textFragmentsSize = m_textFragments.size();
|
| - for (unsigned i = 0; i < textFragmentsSize; ++i) {
|
| - const SVGTextFragment& fragment = m_textFragments.at(i);
|
| -
|
| - FloatRect fragmentRect(
|
| - fragment.x - fragment.glyphOverflowLeft,
|
| - fragment.y - baseline - fragment.glyphOverflowTop,
|
| - fragment.width + fragment.glyphOverflowLeft + fragment.glyphOverflowRight,
|
| - fragment.height + fragment.glyphOverflowTop + fragment.glyphOverflowBottom);
|
| - fragment.buildFragmentTransform(fragmentTransform);
|
| - fragmentRect = fragmentTransform.mapRect(fragmentRect);
|
| -
|
| - textRect.unite(LayoutRect(fragmentRect));
|
| - }
|
| + LayoutRect textBoundingRect;
|
| + for (const SVGTextFragment& fragment : m_textFragments)
|
| + textBoundingRect.unite(LayoutRect(fragment.overflowBoundingBox(baseline)));
|
|
|
| - return textRect;
|
| + return textBoundingRect;
|
| }
|
|
|
| bool SVGInlineTextBox::nodeAtPoint(HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit, LayoutUnit)
|
| @@ -281,15 +261,10 @@ bool SVGInlineTextBox::nodeAtPoint(HitTestResult& result, const HitTestLocation&
|
| ASSERT(lineLayoutItem.scalingFactor());
|
| float baseline = lineLayoutItem.scaledFont().fontMetrics().floatAscent() / lineLayoutItem.scalingFactor();
|
|
|
| - AffineTransform fragmentTransform;
|
| - for (const auto& fragment : m_textFragments) {
|
| - FloatQuad fragmentQuad(FloatRect(fragment.x, fragment.y - baseline, fragment.width, fragment.height));
|
| - if (fragment.isTransformed()) {
|
| - fragment.buildFragmentTransform(fragmentTransform);
|
| - fragmentQuad = fragmentTransform.mapQuad(fragmentQuad);
|
| - }
|
| -
|
| - if (fragmentQuad.containsPoint(FloatPoint(locationInContainer.point()))) {
|
| + FloatPoint floatLocation = FloatPoint(locationInContainer.point());
|
| + for (const SVGTextFragment& fragment : m_textFragments) {
|
| + FloatQuad fragmentQuad = fragment.boundingQuad(baseline);
|
| + if (fragmentQuad.containsPoint(floatLocation)) {
|
| lineLayoutItem.updateHitTestResult(result, locationInContainer.point() - toLayoutSize(accumulatedOffset));
|
| if (!result.addNodeToListBasedTestResult(lineLayoutItem.node(), locationInContainer, rect))
|
| return true;
|
|
|