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

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

Issue 1854853002: Iteration helper for SVGTextLayoutAttributesBuilder::fillCharacterDataMap (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: ! 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 | « no previous file | 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/SVGTextLayoutAttributesBuilder.cpp
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.cpp
index 326ddda335f5e773e7d90302a1fd0b72488fbfa0..6f2888a4e1bef1841f0a076439862f00a1a75ef5 100644
--- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.cpp
@@ -162,60 +162,98 @@ void SVGTextLayoutAttributesBuilder::buildCharacterDataMap(LayoutSVGText& textRo
data.y = 0;
}
-static inline void updateCharacterData(unsigned i, float& lastRotation, SVGCharacterData& data, const SVGLengthContext& lengthContext, const SVGLengthList* xList, const SVGLengthList* yList, const SVGLengthList* dxList, const SVGLengthList* dyList, const SVGNumberList* rotateList)
-{
- if (xList)
- data.x = xList->at(i)->value(lengthContext);
- if (yList)
- data.y = yList->at(i)->value(lengthContext);
- if (dxList)
- data.dx = dxList->at(i)->value(lengthContext);
- if (dyList)
- data.dy = dyList->at(i)->value(lengthContext);
- if (rotateList) {
- data.rotate = rotateList->at(i)->value();
- lastRotation = data.rotate;
+namespace {
+
+class AttributeListsIterator {
+ STACK_ALLOCATED();
+public:
+ AttributeListsIterator(SVGTextPositioningElement*);
+
+ bool hasAttributes() const
+ {
+ return m_xListRemaining || m_yListRemaining
+ || m_dxListRemaining || m_dyListRemaining
+ || m_rotateListRemaining;
}
+ void updateCharacterData(unsigned index, SVGCharacterData&);
+
+ bool hasRotation() const { return !SVGTextLayoutAttributes::isEmptyValue(m_lastRotation); }
+ float lastRotation() const { return m_lastRotation; }
+ unsigned rotateEnd() const { return m_rotateList->length(); }
+
+private:
+ SVGLengthContext m_lengthContext;
+ Member<SVGLengthList> m_xList;
+ unsigned m_xListRemaining;
+ Member<SVGLengthList> m_yList;
+ unsigned m_yListRemaining;
+ Member<SVGLengthList> m_dxList;
+ unsigned m_dxListRemaining;
+ Member<SVGLengthList> m_dyList;
+ unsigned m_dyListRemaining;
+ Member<SVGNumberList> m_rotateList;
+ unsigned m_rotateListRemaining;
+ float m_lastRotation;
+};
+
+AttributeListsIterator::AttributeListsIterator(SVGTextPositioningElement* element)
+ : m_lengthContext(element)
+ , m_xList(element->x()->currentValue())
+ , m_xListRemaining(m_xList->length())
+ , m_yList(element->y()->currentValue())
+ , m_yListRemaining(m_yList->length())
+ , m_dxList(element->dx()->currentValue())
+ , m_dxListRemaining(m_dxList->length())
+ , m_dyList(element->dy()->currentValue())
+ , m_dyListRemaining(m_dyList->length())
+ , m_rotateList(element->rotate()->currentValue())
+ , m_rotateListRemaining(m_rotateList->length())
+ , m_lastRotation(SVGTextLayoutAttributes::emptyValue())
+{
}
-void SVGTextLayoutAttributesBuilder::fillCharacterDataMap(const TextPosition& position)
+inline void AttributeListsIterator::updateCharacterData(unsigned index, SVGCharacterData& data)
{
- RawPtr<SVGLengthList> xList = position.element->x()->currentValue();
- RawPtr<SVGLengthList> yList = position.element->y()->currentValue();
- RawPtr<SVGLengthList> dxList = position.element->dx()->currentValue();
- RawPtr<SVGLengthList> dyList = position.element->dy()->currentValue();
- RawPtr<SVGNumberList> rotateList = position.element->rotate()->currentValue();
-
- unsigned xListSize = xList->length();
- unsigned yListSize = yList->length();
- unsigned dxListSize = dxList->length();
- unsigned dyListSize = dyList->length();
- unsigned rotateListSize = rotateList->length();
- if (!xListSize && !yListSize && !dxListSize && !dyListSize && !rotateListSize)
- return;
+ if (m_xListRemaining) {
+ data.x = m_xList->at(index)->value(m_lengthContext);
+ --m_xListRemaining;
+ }
+ if (m_yListRemaining) {
+ data.y = m_yList->at(index)->value(m_lengthContext);
+ --m_yListRemaining;
+ }
+ if (m_dxListRemaining) {
+ data.dx = m_dxList->at(index)->value(m_lengthContext);
+ --m_dxListRemaining;
+ }
+ if (m_dyListRemaining) {
+ data.dy = m_dyList->at(index)->value(m_lengthContext);
+ --m_dyListRemaining;
+ }
+ if (m_rotateListRemaining) {
+ data.rotate = m_rotateList->at(index)->value();
+ m_lastRotation = data.rotate;
pdr. 2016/04/04 22:12:17 Not a fan of this, but I see you've done it to hel
+ --m_rotateListRemaining;
+ }
+}
- float lastRotation = SVGTextLayoutAttributes::emptyValue();
- SVGLengthContext lengthContext(position.element);
- for (unsigned i = 0; i < position.length; ++i) {
- const SVGLengthList* xListPtr = i < xListSize ? xList.get() : 0;
- const SVGLengthList* yListPtr = i < yListSize ? yList.get() : 0;
- const SVGLengthList* dxListPtr = i < dxListSize ? dxList.get() : 0;
- const SVGLengthList* dyListPtr = i < dyListSize ? dyList.get() : 0;
- const SVGNumberList* rotateListPtr = i < rotateListSize ? rotateList.get() : 0;
- if (!xListPtr && !yListPtr && !dxListPtr && !dyListPtr && !rotateListPtr)
- break;
+} // namespace
+void SVGTextLayoutAttributesBuilder::fillCharacterDataMap(const TextPosition& position)
+{
+ AttributeListsIterator attrLists(position.element);
+ for (unsigned i = 0; attrLists.hasAttributes() && i < position.length; ++i) {
SVGCharacterData& data = m_characterDataMap.add(position.start + i + 1, SVGCharacterData()).storedValue->value;
- updateCharacterData(i, lastRotation, data, lengthContext, xListPtr, yListPtr, dxListPtr, dyListPtr, rotateListPtr);
+ attrLists.updateCharacterData(i, data);
}
- // The last rotation value always spans the whole scope.
- if (SVGTextLayoutAttributes::isEmptyValue(lastRotation))
+ if (!attrLists.hasRotation())
return;
- for (unsigned i = rotateList->length(); i < position.length; ++i) {
+ // The last rotation value always spans the whole scope.
pdr. 2016/04/04 22:12:17 TIL
+ for (unsigned i = attrLists.rotateEnd(); i < position.length; ++i) {
SVGCharacterData& data = m_characterDataMap.add(position.start + i + 1, SVGCharacterData()).storedValue->value;
- data.rotate = lastRotation;
+ data.rotate = attrLists.lastRotation();
}
}
« 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