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

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

Issue 349223003: Optimize SVGTextQuery's character offset ligature adjustment query (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 | « Source/core/rendering/svg/SVGTextQuery.h ('k') | 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 f5ead0d43661f2ec0f636f48021b511100a0b748..7b9fcb95171fa59a0034ff11510e4f1cbacf750b 100644
--- a/Source/core/rendering/svg/SVGTextQuery.cpp
+++ b/Source/core/rendering/svg/SVGTextQuery.cpp
@@ -38,13 +38,36 @@ struct SVGTextQuery::Data {
, processedCharacters(0)
, textRenderer(0)
, textBox(0)
+ , ligatureAdjustmentLastStartPositionQuery(-1)
+ , ligatureAdjustmentLastEndPositionQuery(-1)
+ , ligatureAdjustmentLastStartPositionResult(-1)
+ , ligatureAdjustmentLastEndPositionResult(-1)
{
}
+ void setupForTextBox(const SVGInlineTextBox* newTextBox)
+ {
+ textBox = newTextBox;
+ textRenderer = &toRenderSVGInlineText(textBox->textRenderer());
+ ASSERT(textRenderer->style());
+ ASSERT(textRenderer->style()->svgStyle());
+
+ isVerticalText = textRenderer->style()->svgStyle()->isVerticalWritingMode();
+
+ // Invalidate the ligature-adjustment cache.
pdr. 2014/06/24 21:18:48 Is it possible to invalidate the cache when it rea
fs 2014/06/25 10:29:49 That pretty much what it does ATM - in the loop in
+ ligatureAdjustmentLastStartPositionQuery = ligatureAdjustmentLastEndPositionQuery = -1;
+ ligatureAdjustmentLastStartPositionResult = ligatureAdjustmentLastEndPositionResult = -1;
+ }
+
bool isVerticalText;
unsigned processedCharacters;
RenderSVGInlineText* textRenderer;
const SVGInlineTextBox* textBox;
+ // Ligature adjustment cache.
pdr. 2014/06/24 21:18:48 The cache key is pretty much {startPosition, proce
fs 2014/06/25 10:29:49 I suppose there could be some merit to that... To
+ int ligatureAdjustmentLastStartPositionQuery;
+ int ligatureAdjustmentLastEndPositionQuery;
+ int ligatureAdjustmentLastStartPositionResult;
+ int ligatureAdjustmentLastEndPositionResult;
};
static inline InlineFlowBox* flowBoxForRenderer(RenderObject* renderer)
@@ -111,12 +134,8 @@ bool SVGTextQuery::executeQuery(Data* queryData, ProcessTextFragmentCallback fra
// Loop over all text boxes
for (unsigned textBoxPosition = 0; textBoxPosition < textBoxCount; ++textBoxPosition) {
- queryData->textBox = m_textBoxes.at(textBoxPosition);
- queryData->textRenderer = &toRenderSVGInlineText(queryData->textBox->textRenderer());
- ASSERT(queryData->textRenderer->style());
- ASSERT(queryData->textRenderer->style()->svgStyle());
+ queryData->setupForTextBox(m_textBoxes.at(textBoxPosition));
- queryData->isVerticalText = queryData->textRenderer->style()->svgStyle()->isVerticalWritingMode();
const Vector<SVGTextFragment>& fragments = queryData->textBox->textFragments();
// Loop over all text fragments in this text box, firing a callback for each.
@@ -146,7 +165,7 @@ bool SVGTextQuery::mapStartEndPositionsIntoFragmentCoordinates(Data* queryData,
if (startPosition >= endPosition)
return false;
- modifyStartEndPositionsRespectingLigatures(queryData, startPosition, endPosition);
+ modifyStartEndPositionsRespectingLigaturesCached(queryData, startPosition, endPosition);
pdr. 2014/06/24 21:18:48 This name was confusing until I read the implement
fs 2014/06/25 10:29:49 Although it didn't like having the additional indi
if (!queryData->textBox->mapStartEndPositionsIntoFragmentCoordinates(fragment, startPosition, endPosition))
return false;
@@ -154,6 +173,23 @@ bool SVGTextQuery::mapStartEndPositionsIntoFragmentCoordinates(Data* queryData,
return true;
}
+void SVGTextQuery::modifyStartEndPositionsRespectingLigaturesCached(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;
+
+ modifyStartEndPositionsRespectingLigatures(queryData, startPosition, endPosition);
+
+ queryData->ligatureAdjustmentLastStartPositionResult = startPosition;
+ queryData->ligatureAdjustmentLastEndPositionResult = endPosition;
+}
+
void SVGTextQuery::modifyStartEndPositionsRespectingLigatures(Data* queryData, int& startPosition, int& endPosition) const
{
SVGTextLayoutAttributes* layoutAttributes = queryData->textRenderer->layoutAttributes();
« no previous file with comments | « Source/core/rendering/svg/SVGTextQuery.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698