Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(738)

Unified Diff: Source/core/rendering/svg/SVGTextQuery.cpp

Issue 359783002: Improve rejection test for character-based SVG text queries (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/svg/SVGTextQuery.cpp
diff --git a/Source/core/rendering/svg/SVGTextQuery.cpp b/Source/core/rendering/svg/SVGTextQuery.cpp
index fe7f7c08c3b9c361b9321c7fc1b1a00aac61f0bf..2c80032a1d50efa34e323a4cdab0628f7ef8fbf6 100644
--- a/Source/core/rendering/svg/SVGTextQuery.cpp
+++ b/Source/core/rendering/svg/SVGTextQuery.cpp
@@ -38,28 +38,13 @@ 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)
@@ -145,7 +130,6 @@ bool SVGTextQuery::executeQuery(Data* queryData, ProcessTextFragmentCallback fra
}
queryData->processedCharacters = processedCharacters;
- queryData->invalidateLigatureAdjustmentCache();
}
return false;
@@ -157,7 +141,14 @@ bool SVGTextQuery::mapStartEndPositionsIntoFragmentCoordinates(Data* queryData,
startPosition -= queryData->processedCharacters;
endPosition -= queryData->processedCharacters;
- startPosition = max(0, startPosition);
+ // <startPosition, endPosition> is now a tuple of offsets relative to the current text box.
+ // Compute the offsets of the fragment in the same offset space.
+ int fragmentStartInBox = fragment.characterOffset - queryData->textBox->start();
+ int fragmentEndInBox = fragmentStartInBox + fragment.length;
+
+ // Check if the ranges intersect.
+ startPosition = std::max(startPosition, fragmentStartInBox);
+ endPosition = std::min(endPosition, fragmentEndInBox);
if (startPosition >= endPosition)
return false;
@@ -172,15 +163,6 @@ 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();
@@ -237,18 +219,16 @@ void SVGTextQuery::modifyStartEndPositionsRespectingLigatures(Data* queryData, i
positionOffset += metrics.length();
}
- if (alterStartPosition || alterEndPosition) {
- if (lastPositionOffset != -1 && lastPositionOffset - positionOffset > 1) {
- if (alterStartPosition && startPosition > lastPositionOffset && startPosition < static_cast<int>(positionOffset))
- startPosition = lastPositionOffset;
+ if (!alterStartPosition && !alterEndPosition)
+ return;
- if (alterEndPosition && endPosition > lastPositionOffset && endPosition < static_cast<int>(positionOffset))
- endPosition = positionOffset;
- }
- }
+ if (lastPositionOffset != -1 && lastPositionOffset - positionOffset > 1) {
+ if (alterStartPosition && startPosition > lastPositionOffset && startPosition < static_cast<int>(positionOffset))
+ startPosition = lastPositionOffset;
- queryData->ligatureAdjustmentLastStartPositionResult = startPosition;
- queryData->ligatureAdjustmentLastEndPositionResult = endPosition;
+ if (alterEndPosition && endPosition > lastPositionOffset && endPosition < static_cast<int>(positionOffset))
+ endPosition = positionOffset;
+ }
}
// numberOfCharacters() implementation
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698