| Index: third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp
|
| index 8b2556c2f3287d9022b3b746b46d523faeb8c16f..201ed833b31da0b7e9074053b17130d17d816f8d 100644
|
| --- a/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp
|
| @@ -459,14 +459,13 @@ struct ExtentOfCharacterData : QueryData {
|
| FloatRect extent;
|
| };
|
|
|
| -static inline void calculateGlyphBoundaries(const QueryData* queryData, const SVGTextFragment& fragment, int startPosition, FloatRect& extent)
|
| +static inline FloatRect calculateGlyphBoundaries(const QueryData* queryData, const SVGTextFragment& fragment, int startPosition)
|
| {
|
| float scalingFactor = queryData->textLineLayout.scalingFactor();
|
| ASSERT(scalingFactor);
|
|
|
| FloatPoint glyphPosition = calculateGlyphPositionWithoutTransform(queryData, fragment, startPosition);
|
| glyphPosition.move(0, -queryData->textLineLayout.scaledFont().getFontMetrics().floatAscent() / scalingFactor);
|
| - extent.setLocation(glyphPosition);
|
|
|
| // Use the SVGTextMetrics computed by SVGTextMetricsBuilder (which spends
|
| // time attempting to compute more correct glyph bounds already, handling
|
| @@ -477,20 +476,21 @@ static inline void calculateGlyphBoundaries(const QueryData* queryData, const SV
|
| // TODO(fs): Negative glyph extents seems kind of weird to have, but
|
| // presently it can occur in some cases (like Arabic.)
|
| FloatSize glyphSize(std::max<float>(metrics.width(), 0), std::max<float>(metrics.height(), 0));
|
| - extent.setSize(glyphSize);
|
|
|
| // If RTL, adjust the starting point to align with the LHS of the glyph bounding box.
|
| if (!queryData->textBox->isLeftToRightDirection()) {
|
| if (queryData->isVerticalText)
|
| - extent.move(0, -glyphSize.height());
|
| + glyphPosition.move(0, -glyphSize.height());
|
| else
|
| - extent.move(-glyphSize.width(), 0);
|
| + glyphPosition.move(-glyphSize.width(), 0);
|
| }
|
|
|
| + FloatRect extent(glyphPosition, glyphSize);
|
| if (fragment.isTransformed()) {
|
| AffineTransform fragmentTransform = fragment.buildFragmentTransform(SVGTextFragment::TransformIgnoringTextLength);
|
| extent = fragmentTransform.mapRect(extent);
|
| }
|
| + return extent;
|
| }
|
|
|
| static inline FloatRect calculateFragmentBoundaries(LineLayoutSVGInlineText textLineLayout, const SVGTextFragment& fragment)
|
| @@ -510,7 +510,7 @@ static bool extentOfCharacterCallback(QueryData* queryData, const SVGTextFragmen
|
| if (!mapStartEndPositionsIntoFragmentCoordinates(queryData, fragment, startPosition, endPosition))
|
| return false;
|
|
|
| - calculateGlyphBoundaries(queryData, fragment, startPosition, data->extent);
|
| + data->extent = calculateGlyphBoundaries(queryData, fragment, startPosition);
|
| return true;
|
| }
|
|
|
| @@ -585,12 +585,11 @@ static bool characterNumberAtPositionCallback(QueryData* queryData, const SVGTex
|
|
|
| // Iterate through the glyphs in this fragment, and check if their extents
|
| // contain the query point.
|
| - FloatRect extent;
|
| const Vector<SVGTextMetrics>& textMetrics = queryData->textLineLayout.layoutAttributes()->textMetricsValues();
|
| unsigned textMetricsOffset = fragment.metricsListOffset;
|
| unsigned fragmentOffset = 0;
|
| while (fragmentOffset < fragment.length) {
|
| - calculateGlyphBoundaries(queryData, fragment, fragmentOffset, extent);
|
| + FloatRect extent = calculateGlyphBoundaries(queryData, fragment, fragmentOffset);
|
| if (extent.contains(data->position)) {
|
| // Compute the character offset of the glyph within the text node.
|
| unsigned offsetInBox = fragment.characterOffset - queryData->textBox->start() + fragmentOffset;
|
|
|