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()
FloatRect LayoutSVGInline::objectBoundingBox() const
{
if (const LayoutObject* object = LayoutSVGText::locateLayoutSVGTextAncestor(this))
return object->objectBoundingBox();
if (const LayoutSVGText* textRoot = LayoutSVGText::locateLayoutSVGTextAncestor(this))
return textRoot->objectBoundingBox();
return FloatRect();
}
FloatRect LayoutSVGInline::strokeBoundingBox() const
{
if (const LayoutObject* object = LayoutSVGText::locateLayoutSVGTextAncestor(this))
return object->strokeBoundingBox();
if (const LayoutSVGText* textRoot = LayoutSVGText::locateLayoutSVGTextAncestor(this))
return textRoot->strokeBoundingBox();
return FloatRect();
}
FloatRect LayoutSVGInline::paintInvalidationRectInLocalCoordinates() const
{
if (const LayoutObject* object = LayoutSVGText::locateLayoutSVGTextAncestor(this))
return object->paintInvalidationRectInLocalCoordinates();
if (const LayoutSVGText* textRoot = LayoutSVGText::locateLayoutSVGTextAncestor(this))
return textRoot->paintInvalidationRectInLocalCoordinates();
return FloatRect();
}
......@@ -102,11 +102,11 @@ const LayoutObject* LayoutSVGInline::pushMappingToContainer(const LayoutBoxModel
void LayoutSVGInline::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const
{
const LayoutObject* object = LayoutSVGText::locateLayoutSVGTextAncestor(this);
if (!object)
const LayoutSVGText* textRoot = LayoutSVGText::locateLayoutSVGTextAncestor(this);
if (!textRoot)
return;
FloatRect textBoundingBox = object->strokeBoundingBox();
FloatRect textBoundingBox = textRoot->strokeBoundingBox();
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));
}
......
......@@ -54,6 +54,20 @@
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)
: LayoutSVGBlock(node)
, m_needsReordering(false)
......@@ -75,22 +89,12 @@ bool LayoutSVGText::isChildAllowed(LayoutObject* child, const ComputedStyle&) co
LayoutSVGText* LayoutSVGText::locateLayoutSVGTextAncestor(LayoutObject* start)
{
ASSERT(start);
while (start && !start->isSVGText())
start = start->parent();
if (!start || !start->isSVGText())
return nullptr;
return toLayoutSVGText(start);
return const_cast<LayoutSVGText*>(findTextRoot(start));
}
const LayoutSVGText* LayoutSVGText::locateLayoutSVGTextAncestor(const LayoutObject* start)
{
ASSERT(start);
while (start && !start->isSVGText())
start = start->parent();
if (!start || !start->isSVGText())
return nullptr;
return toLayoutSVGText(start);
return findTextRoot(start);
}
static inline void collectLayoutAttributes(LayoutObject* text, Vector<SVGTextLayoutAttributes*>& attributes)
......
......@@ -30,7 +30,6 @@ namespace blink {
class LayoutSVGInlineText;
class SVGTextElement;
class LayoutSVGInlineText;
class LayoutSVGText final : public LayoutSVGBlock {
public:
......@@ -43,6 +42,8 @@ public:
void setNeedsTransformUpdate() override { m_needsTransformUpdate = true; }
void setNeedsTextMetricsUpdate() { m_needsTextMetricsUpdate = true; }
FloatRect paintInvalidationRectInLocalCoordinates() const override;
FloatRect objectBoundingBox() const override { return FloatRect(frameRect()); }
FloatRect strokeBoundingBox() const override;
static LayoutSVGText* locateLayoutSVGTextAncestor(LayoutObject*);
static const LayoutSVGText* locateLayoutSVGTextAncestor(const LayoutObject*);
......@@ -75,9 +76,6 @@ private:
void removeChild(LayoutObject*) override;
void willBeDestroyed() override;
FloatRect objectBoundingBox() const override { return FloatRect(frameRect()); }
FloatRect strokeBoundingBox() const override;
RootInlineBox* createRootInlineBox() override;
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