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

Unified Diff: third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp

Issue 1931303002: Simplify SVG layout attribute reordering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove userData argument/closure. Created 4 years, 8 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 | « third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
diff --git a/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp b/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
index 23ee1f956756ce4d0255fd461627a7700fdf499a..18675ed3b5e754dfa7b812b34e50cd55a145509e 100644
--- a/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
@@ -27,10 +27,10 @@
#include "core/layout/api/LineLayoutBlockFlow.h"
#include "core/layout/api/LineLayoutSVGInlineText.h"
#include "core/layout/svg/LayoutSVGText.h"
+#include "core/layout/svg/SVGTextLayoutEngine.h"
#include "core/layout/svg/line/SVGInlineFlowBox.h"
#include "core/layout/svg/line/SVGInlineTextBox.h"
#include "core/paint/SVGRootInlineBoxPainter.h"
-#include "core/svg/SVGTextPathElement.h"
namespace blink {
@@ -55,7 +55,7 @@ void SVGRootInlineBox::computePerCharacterLayoutInformation()
return;
if (textRoot.needsReordering())
- reorderValueLists(layoutAttributes);
+ reorderValueLists();
// Perform SVG text layout phase two (see SVGTextLayoutEngine for details).
SVGTextLayoutEngine characterLayout(layoutAttributes);
@@ -153,83 +153,52 @@ InlineBox* SVGRootInlineBox::closestLeafChildForPosition(const LayoutPoint& poin
return closestLeaf ? closestLeaf : lastLeaf;
}
-static inline void swapItemsInLayoutAttributes(SVGTextLayoutAttributes* firstAttributes, SVGTextLayoutAttributes* lastAttributes, unsigned firstPosition, unsigned lastPosition)
+static inline void swapPositioningValuesInTextBoxes(SVGInlineTextBox* firstTextBox, SVGInlineTextBox* lastTextBox)
{
- SVGCharacterDataMap::iterator itFirst = firstAttributes->characterDataMap().find(firstPosition + 1);
- SVGCharacterDataMap::iterator itLast = lastAttributes->characterDataMap().find(lastPosition + 1);
- bool firstPresent = itFirst != firstAttributes->characterDataMap().end();
- bool lastPresent = itLast != lastAttributes->characterDataMap().end();
+ LineLayoutSVGInlineText firstTextNode = LineLayoutSVGInlineText(firstTextBox->getLineLayoutItem());
+ SVGCharacterDataMap& firstCharacterDataMap = firstTextNode.layoutAttributes().characterDataMap();
+ SVGCharacterDataMap::iterator itFirst = firstCharacterDataMap.find(firstTextBox->start() + 1);
+ if (itFirst == firstCharacterDataMap.end())
+ return;
+ LineLayoutSVGInlineText lastTextNode = LineLayoutSVGInlineText(lastTextBox->getLineLayoutItem());
+ SVGCharacterDataMap& lastCharacterDataMap = lastTextNode.layoutAttributes().characterDataMap();
+ SVGCharacterDataMap::iterator itLast = lastCharacterDataMap.find(lastTextBox->start() + 1);
+ if (itLast == lastCharacterDataMap.end())
+ return;
// We only want to perform the swap if both inline boxes are absolutely
// positioned.
- if (!firstPresent || !lastPresent)
- return;
std::swap(itFirst->value, itLast->value);
}
-static inline void findFirstAndLastAttributesInVector(Vector<SVGTextLayoutAttributes*>& attributes, LineLayoutSVGInlineText firstContext, LineLayoutSVGInlineText lastContext, SVGTextLayoutAttributes*& first, SVGTextLayoutAttributes*& last)
-{
- first = 0;
- last = 0;
-
- unsigned attributesSize = attributes.size();
- for (unsigned i = 0; i < attributesSize; ++i) {
- SVGTextLayoutAttributes* current = attributes[i];
- if (!first && firstContext.isEqual(current->context()))
- first = current;
- if (!last && lastContext.isEqual(current->context()))
- last = current;
- if (first && last)
- break;
- }
-
- ASSERT(first);
- ASSERT(last);
-}
-
-static inline void reverseInlineBoxRangeAndValueListsIfNeeded(void* userData, Vector<InlineBox*>::iterator first, Vector<InlineBox*>::iterator last)
+static inline void reverseInlineBoxRangeAndValueListsIfNeeded(Vector<InlineBox*>::iterator first, Vector<InlineBox*>::iterator last)
{
- ASSERT(userData);
- Vector<SVGTextLayoutAttributes*>& attributes = *reinterpret_cast<Vector<SVGTextLayoutAttributes*>*>(userData);
-
- // This is a copy of std::reverse(first, last). It additionally assures that the metrics map within the layoutObjects belonging to the InlineBoxes are reordered as well.
+ // This is a copy of std::reverse(first, last). It additionally assures
+ // that the metrics map within the layoutObjects belonging to the
+ // InlineBoxes are reordered as well.
while (true) {
if (first == last || first == --last)
return;
- if (!(*last)->isSVGInlineTextBox() || !(*first)->isSVGInlineTextBox()) {
- InlineBox* temp = *first;
- *first = *last;
- *last = temp;
- ++first;
- continue;
- }
+ if ((*last)->isSVGInlineTextBox() && (*first)->isSVGInlineTextBox()) {
+ SVGInlineTextBox* firstTextBox = toSVGInlineTextBox(*first);
+ SVGInlineTextBox* lastTextBox = toSVGInlineTextBox(*last);
- SVGInlineTextBox* firstTextBox = toSVGInlineTextBox(*first);
- SVGInlineTextBox* lastTextBox = toSVGInlineTextBox(*last);
-
- // Reordering is only necessary for BiDi text that is _absolutely_ positioned.
- if (firstTextBox->len() == 1 && firstTextBox->len() == lastTextBox->len()) {
- LineLayoutSVGInlineText firstContext = LineLayoutSVGInlineText(firstTextBox->getLineLayoutItem());
- LineLayoutSVGInlineText lastContext = LineLayoutSVGInlineText(lastTextBox->getLineLayoutItem());
-
- SVGTextLayoutAttributes* firstAttributes = nullptr;
- SVGTextLayoutAttributes* lastAttributes = nullptr;
- findFirstAndLastAttributesInVector(attributes, firstContext, lastContext, firstAttributes, lastAttributes);
- swapItemsInLayoutAttributes(firstAttributes, lastAttributes, firstTextBox->start(), lastTextBox->start());
+ // Reordering is only necessary for BiDi text that is _absolutely_ positioned.
+ if (firstTextBox->len() == 1 && firstTextBox->len() == lastTextBox->len())
+ swapPositioningValuesInTextBoxes(firstTextBox, lastTextBox);
}
InlineBox* temp = *first;
*first = *last;
*last = temp;
-
++first;
}
}
-void SVGRootInlineBox::reorderValueLists(Vector<SVGTextLayoutAttributes*>& attributes)
+void SVGRootInlineBox::reorderValueLists()
{
Vector<InlineBox*> leafBoxesInLogicalOrder;
- collectLeafBoxesInLogicalOrder(leafBoxesInLogicalOrder, reverseInlineBoxRangeAndValueListsIfNeeded, &attributes);
+ collectLeafBoxesInLogicalOrder(leafBoxesInLogicalOrder, reverseInlineBoxRangeAndValueListsIfNeeded);
}
bool SVGRootInlineBox::nodeAtPoint(HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit lineTop, LayoutUnit lineBottom)
« no previous file with comments | « third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698