| Index: Source/core/rendering/svg/SVGTextQuery.cpp
|
| diff --git a/Source/core/rendering/svg/SVGTextQuery.cpp b/Source/core/rendering/svg/SVGTextQuery.cpp
|
| index f5ead0d43661f2ec0f636f48021b511100a0b748..93d8ea4b7c02b30b31a971abe4ecca7a8b6211f5 100644
|
| --- a/Source/core/rendering/svg/SVGTextQuery.cpp
|
| +++ b/Source/core/rendering/svg/SVGTextQuery.cpp
|
| @@ -38,13 +38,28 @@ struct SVGTextQuery::Data {
|
| , processedCharacters(0)
|
| , textRenderer(0)
|
| , textBox(0)
|
| + , ligatureAdjustmentLastStartPositionQuery(-1)
|
| + , ligatureAdjustmentLastEndPositionQuery(-1)
|
| + , ligatureAdjustmentLastStartPositionResult(-1)
|
| + , ligatureAdjustmentLastEndPositionResult(-1)
|
| {
|
| }
|
|
|
| + void invalidateLigatureAdjustmentCache()
|
| + {
|
| + ligatureAdjustmentLastStartPositionQuery = ligatureAdjustmentLastEndPositionQuery = -1;
|
| + ligatureAdjustmentLastStartPositionResult = ligatureAdjustmentLastEndPositionResult = -1;
|
| + }
|
| +
|
| bool isVerticalText;
|
| unsigned processedCharacters;
|
| RenderSVGInlineText* textRenderer;
|
| const SVGInlineTextBox* textBox;
|
| + // Ligature adjustment cache.
|
| + int ligatureAdjustmentLastStartPositionQuery;
|
| + int ligatureAdjustmentLastEndPositionQuery;
|
| + int ligatureAdjustmentLastStartPositionResult;
|
| + int ligatureAdjustmentLastEndPositionResult;
|
| };
|
|
|
| static inline InlineFlowBox* flowBoxForRenderer(RenderObject* renderer)
|
| @@ -130,6 +145,7 @@ bool SVGTextQuery::executeQuery(Data* queryData, ProcessTextFragmentCallback fra
|
| }
|
|
|
| queryData->processedCharacters = processedCharacters;
|
| + queryData->invalidateLigatureAdjustmentCache();
|
| }
|
|
|
| return false;
|
| @@ -156,6 +172,15 @@ bool SVGTextQuery::mapStartEndPositionsIntoFragmentCoordinates(Data* queryData,
|
|
|
| void SVGTextQuery::modifyStartEndPositionsRespectingLigatures(Data* queryData, int& startPosition, int& endPosition) const
|
| {
|
| + if (queryData->ligatureAdjustmentLastStartPositionQuery == startPosition && queryData->ligatureAdjustmentLastEndPositionQuery == endPosition) {
|
| + startPosition = queryData->ligatureAdjustmentLastStartPositionResult;
|
| + endPosition = queryData->ligatureAdjustmentLastEndPositionResult;
|
| + return;
|
| + }
|
| +
|
| + queryData->ligatureAdjustmentLastStartPositionQuery = startPosition;
|
| + queryData->ligatureAdjustmentLastEndPositionQuery = endPosition;
|
| +
|
| SVGTextLayoutAttributes* layoutAttributes = queryData->textRenderer->layoutAttributes();
|
| Vector<SVGTextMetrics>& textMetricsValues = layoutAttributes->textMetricsValues();
|
| unsigned boxStart = queryData->textBox->start();
|
| @@ -212,16 +237,18 @@ void SVGTextQuery::modifyStartEndPositionsRespectingLigatures(Data* queryData, i
|
| positionOffset += metrics.length();
|
| }
|
|
|
| - if (!alterStartPosition && !alterEndPosition)
|
| - return;
|
| -
|
| - if (lastPositionOffset != -1 && lastPositionOffset - positionOffset > 1) {
|
| - if (alterStartPosition && startPosition > lastPositionOffset && startPosition < static_cast<int>(positionOffset))
|
| - startPosition = lastPositionOffset;
|
| + if (alterStartPosition || alterEndPosition) {
|
| + if (lastPositionOffset != -1 && lastPositionOffset - positionOffset > 1) {
|
| + if (alterStartPosition && startPosition > lastPositionOffset && startPosition < static_cast<int>(positionOffset))
|
| + startPosition = lastPositionOffset;
|
|
|
| - if (alterEndPosition && endPosition > lastPositionOffset && endPosition < static_cast<int>(positionOffset))
|
| - endPosition = positionOffset;
|
| + if (alterEndPosition && endPosition > lastPositionOffset && endPosition < static_cast<int>(positionOffset))
|
| + endPosition = positionOffset;
|
| + }
|
| }
|
| +
|
| + queryData->ligatureAdjustmentLastStartPositionResult = startPosition;
|
| + queryData->ligatureAdjustmentLastEndPositionResult = endPosition;
|
| }
|
|
|
| // numberOfCharacters() implementation
|
|
|