Commit 311581d2 authored by fs@opera.com's avatar fs@opera.com

Don't drop type information returned from locateRenderSVGTextAncestor

LayoutSVGText::locateRenderSVGTextAncestor returns a LayoutSVGText*, so
widening it to LayoutObject only serves to lose information - for the
primary benefit of "interface hiding".
This in turn mean that some calls can be devirtualized.

Also restructure the methods themselves to avoid stating the predicate
twice (negated and not.)

Review URL: https://codereview.chromium.org/1308983006

git-svn-id: svn://svn.chromium.org/blink/trunk@201319 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent badb017d
...@@ -63,24 +63,24 @@ InlineFlowBox* LayoutSVGInline::createInlineFlowBox() ...@@ -63,24 +63,24 @@ InlineFlowBox* LayoutSVGInline::createInlineFlowBox()
FloatRect LayoutSVGInline::objectBoundingBox() const FloatRect LayoutSVGInline::objectBoundingBox() const
{ {
if (const LayoutObject* object = LayoutSVGText::locateLayoutSVGTextAncestor(this)) if (const LayoutSVGText* textRoot = LayoutSVGText::locateLayoutSVGTextAncestor(this))
return object->objectBoundingBox(); return textRoot->objectBoundingBox();
return FloatRect(); return FloatRect();
} }
FloatRect LayoutSVGInline::strokeBoundingBox() const FloatRect LayoutSVGInline::strokeBoundingBox() const
{ {
if (const LayoutObject* object = LayoutSVGText::locateLayoutSVGTextAncestor(this)) if (const LayoutSVGText* textRoot = LayoutSVGText::locateLayoutSVGTextAncestor(this))
return object->strokeBoundingBox(); return textRoot->strokeBoundingBox();
return FloatRect(); return FloatRect();
} }
FloatRect LayoutSVGInline::paintInvalidationRectInLocalCoordinates() const FloatRect LayoutSVGInline::paintInvalidationRectInLocalCoordinates() const
{ {
if (const LayoutObject* object = LayoutSVGText::locateLayoutSVGTextAncestor(this)) if (const LayoutSVGText* textRoot = LayoutSVGText::locateLayoutSVGTextAncestor(this))
return object->paintInvalidationRectInLocalCoordinates(); return textRoot->paintInvalidationRectInLocalCoordinates();
return FloatRect(); return FloatRect();
} }
...@@ -102,11 +102,11 @@ const LayoutObject* LayoutSVGInline::pushMappingToContainer(const LayoutBoxModel ...@@ -102,11 +102,11 @@ const LayoutObject* LayoutSVGInline::pushMappingToContainer(const LayoutBoxModel
void LayoutSVGInline::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const void LayoutSVGInline::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const
{ {
const LayoutObject* object = LayoutSVGText::locateLayoutSVGTextAncestor(this); const LayoutSVGText* textRoot = LayoutSVGText::locateLayoutSVGTextAncestor(this);
if (!object) if (!textRoot)
return; return;
FloatRect textBoundingBox = object->strokeBoundingBox(); FloatRect textBoundingBox = textRoot->strokeBoundingBox();
for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox()) for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox())
quads.append(localToAbsoluteQuad(FloatRect(textBoundingBox.x() + box->x().toFloat(), textBoundingBox.y() + box->y().toFloat(), box->logicalWidth().toFloat(), box->logicalHeight().toFloat()), false, wasFixed)); quads.append(localToAbsoluteQuad(FloatRect(textBoundingBox.x() + box->x().toFloat(), textBoundingBox.y() + box->y().toFloat(), box->logicalWidth().toFloat(), box->logicalHeight().toFloat()), false, wasFixed));
} }
......
...@@ -54,6 +54,20 @@ ...@@ -54,6 +54,20 @@
namespace blink { namespace blink {
namespace {
const LayoutSVGText* findTextRoot(const LayoutObject* start)
{
ASSERT(start);
for (; start; start = start->parent()) {
if (start->isSVGText())
return toLayoutSVGText(start);
}
return nullptr;
}
}
LayoutSVGText::LayoutSVGText(SVGTextElement* node) LayoutSVGText::LayoutSVGText(SVGTextElement* node)
: LayoutSVGBlock(node) : LayoutSVGBlock(node)
, m_needsReordering(false) , m_needsReordering(false)
...@@ -75,22 +89,12 @@ bool LayoutSVGText::isChildAllowed(LayoutObject* child, const ComputedStyle&) co ...@@ -75,22 +89,12 @@ bool LayoutSVGText::isChildAllowed(LayoutObject* child, const ComputedStyle&) co
LayoutSVGText* LayoutSVGText::locateLayoutSVGTextAncestor(LayoutObject* start) LayoutSVGText* LayoutSVGText::locateLayoutSVGTextAncestor(LayoutObject* start)
{ {
ASSERT(start); return const_cast<LayoutSVGText*>(findTextRoot(start));
while (start && !start->isSVGText())
start = start->parent();
if (!start || !start->isSVGText())
return nullptr;
return toLayoutSVGText(start);
} }
const LayoutSVGText* LayoutSVGText::locateLayoutSVGTextAncestor(const LayoutObject* start) const LayoutSVGText* LayoutSVGText::locateLayoutSVGTextAncestor(const LayoutObject* start)
{ {
ASSERT(start); return findTextRoot(start);
while (start && !start->isSVGText())
start = start->parent();
if (!start || !start->isSVGText())
return nullptr;
return toLayoutSVGText(start);
} }
static inline void collectLayoutAttributes(LayoutObject* text, Vector<SVGTextLayoutAttributes*>& attributes) static inline void collectLayoutAttributes(LayoutObject* text, Vector<SVGTextLayoutAttributes*>& attributes)
......
...@@ -30,7 +30,6 @@ namespace blink { ...@@ -30,7 +30,6 @@ namespace blink {
class LayoutSVGInlineText; class LayoutSVGInlineText;
class SVGTextElement; class SVGTextElement;
class LayoutSVGInlineText;
class LayoutSVGText final : public LayoutSVGBlock { class LayoutSVGText final : public LayoutSVGBlock {
public: public:
...@@ -43,6 +42,8 @@ public: ...@@ -43,6 +42,8 @@ public:
void setNeedsTransformUpdate() override { m_needsTransformUpdate = true; } void setNeedsTransformUpdate() override { m_needsTransformUpdate = true; }
void setNeedsTextMetricsUpdate() { m_needsTextMetricsUpdate = true; } void setNeedsTextMetricsUpdate() { m_needsTextMetricsUpdate = true; }
FloatRect paintInvalidationRectInLocalCoordinates() const override; FloatRect paintInvalidationRectInLocalCoordinates() const override;
FloatRect objectBoundingBox() const override { return FloatRect(frameRect()); }
FloatRect strokeBoundingBox() const override;
static LayoutSVGText* locateLayoutSVGTextAncestor(LayoutObject*); static LayoutSVGText* locateLayoutSVGTextAncestor(LayoutObject*);
static const LayoutSVGText* locateLayoutSVGTextAncestor(const LayoutObject*); static const LayoutSVGText* locateLayoutSVGTextAncestor(const LayoutObject*);
...@@ -75,9 +76,6 @@ private: ...@@ -75,9 +76,6 @@ private:
void removeChild(LayoutObject*) override; void removeChild(LayoutObject*) override;
void willBeDestroyed() override; void willBeDestroyed() override;
FloatRect objectBoundingBox() const override { return FloatRect(frameRect()); }
FloatRect strokeBoundingBox() const override;
RootInlineBox* createRootInlineBox() override; RootInlineBox* createRootInlineBox() override;
bool shouldHandleSubtreeMutations() const; bool shouldHandleSubtreeMutations() const;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment