static inline bool findPreviousAndNextAttributes(RenderSVGText* root, RenderSVGInlineText* locateElement, SVGTextLayoutAttributes*& previous, SVGTextLayoutAttributes*& next) { ASSERT(root); ASSERT(locateElement); bool stopAfterNext = false; RenderObject* current = root->firstChild(); while (current) { if (current->isSVGInlineText()) { RenderSVGInlineText* text = toRenderSVGInlineText(current); if (locateElement != text) { if (stopAfterNext) { next = text->layoutAttributes(); return true; } previous = text->layoutAttributes(); } else { stopAfterNext = true; } } else if (current->isSVGInline()) { // Descend into text content (if possible). if (RenderObject* child = toRenderSVGInline(current)->firstChild()) { current = child; continue; } } current = current->nextInPreOrderAfterChildren(root); } return false; }
static void walkTree(RenderSVGText* start, RenderSVGInlineText* stopAtLeaf, MeasureTextData* data) { RenderObject* child = start->firstChild(); while (child) { if (child->isSVGInlineText()) { RenderSVGInlineText* text = toRenderSVGInlineText(child); measureTextRenderer(text, data, !stopAtLeaf || stopAtLeaf == text); if (stopAtLeaf && stopAtLeaf == text) return; } else if (child->isSVGInline()) { // Visit children of text content elements. if (RenderObject* inlineChild = toRenderSVGInline(child)->firstChild()) { child = inlineChild; continue; } } child = child->nextInPreOrderAfterChildren(start); } }