Add helper for computing outset for 'outline'

De-duplicates code from InlinePainter and SVGLayoutSupport.

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

git-svn-id: svn://svn.chromium.org/blink/trunk@196880 bbb929c8-8fbe-4397-9dbb-9b2b20218538
diff --git a/Source/core/layout/svg/SVGLayoutSupport.cpp b/Source/core/layout/svg/SVGLayoutSupport.cpp
index ebe2d4b..a999094 100644
--- a/Source/core/layout/svg/SVGLayoutSupport.cpp
+++ b/Source/core/layout/svg/SVGLayoutSupport.cpp
@@ -51,26 +51,15 @@
     return LayoutRect(enclosingIntRect(rect));
 }
 
-static void inflateWithOutlineIfNeeded(FloatRect& paintInvalidationRect, const ComputedStyle& style)
-{
-    if (!style.hasOutline())
-        return;
-    int outlineSize = 0;
-    if (style.outlineStyleIsAuto())
-        outlineSize = GraphicsContext::focusRingOutsetExtent(style.outlineOffset(), style.outlineWidth());
-    else
-        outlineSize = style.outlineSize();
-    paintInvalidationRect.inflate(outlineSize);
-}
-
 LayoutRect SVGLayoutSupport::clippedOverflowRectForPaintInvalidation(const LayoutObject& object, const LayoutBoxModelObject* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState)
 {
     // Return early for any cases where we don't actually paint
-    if (object.style()->visibility() != VISIBLE && !object.enclosingLayer()->hasVisibleContent())
+    if (object.styleRef().visibility() != VISIBLE && !object.enclosingLayer()->hasVisibleContent())
         return LayoutRect();
 
     FloatRect paintInvalidationRect = object.paintInvalidationRectInLocalCoordinates();
-    inflateWithOutlineIfNeeded(paintInvalidationRect, object.styleRef());
+    if (int outlineOutset = object.styleRef().outlineOutset())
+        paintInvalidationRect.inflate(outlineOutset);
 
     if (paintInvalidationState && paintInvalidationState->canMapToContainer(paintInvalidationContainer)) {
         // Compute accumulated SVG transform and apply to local paint rect.
diff --git a/Source/core/paint/InlinePainter.cpp b/Source/core/paint/InlinePainter.cpp
index d7cb3e9..92a9afb 100644
--- a/Source/core/paint/InlinePainter.cpp
+++ b/Source/core/paint/InlinePainter.cpp
@@ -31,12 +31,7 @@
 
 LayoutRect InlinePainter::outlinePaintRect(const Vector<LayoutRect>& outlineRects, const LayoutPoint& paintOffset) const
 {
-    const ComputedStyle& style = m_layoutInline.styleRef();
-    int outlineOutset;
-    if (style.outlineStyleIsAuto())
-        outlineOutset = GraphicsContext::focusRingOutsetExtent(style.outlineOffset(), style.outlineWidth());
-    else
-        outlineOutset = style.outlineSize();
+    int outlineOutset = m_layoutInline.styleRef().outlineOutset();
     LayoutRect outlineRect;
     for (const LayoutRect& rect : outlineRects) {
         LayoutRect inflatedRect(rect);
diff --git a/Source/core/style/ComputedStyle.cpp b/Source/core/style/ComputedStyle.cpp
index aca2e94..aa60c3b 100644
--- a/Source/core/style/ComputedStyle.cpp
+++ b/Source/core/style/ComputedStyle.cpp
@@ -41,6 +41,7 @@
 #include "platform/fonts/Font.h"
 #include "platform/fonts/FontSelector.h"
 #include "platform/geometry/FloatRoundedRect.h"
+#include "platform/graphics/GraphicsContext.h"
 #include "wtf/MathExtras.h"
 
 #include <algorithm>
@@ -1611,6 +1612,15 @@
     rareNonInheritedData.access()->m_transform.access()->m_motion.m_path = nullptr;
 }
 
+int ComputedStyle::outlineOutset() const
+{
+    if (!hasOutline())
+        return 0;
+    if (outlineStyleIsAuto())
+        return GraphicsContext::focusRingOutsetExtent(outlineOffset(), outlineWidth());
+    return outlineSize();
+}
+
 bool ComputedStyle::columnRuleEquivalent(const ComputedStyle* otherStyle) const
 {
     return columnRuleStyle() == otherStyle->columnRuleStyle()
diff --git a/Source/core/style/ComputedStyle.h b/Source/core/style/ComputedStyle.h
index bbd7a2b..81e482f 100644
--- a/Source/core/style/ComputedStyle.h
+++ b/Source/core/style/ComputedStyle.h
@@ -532,6 +532,7 @@
     bool hasOutline() const { return outlineWidth() > 0 && outlineStyle() > BHIDDEN; }
     EBorderStyle outlineStyle() const { return m_background->outline().style(); }
     OutlineIsAuto outlineStyleIsAuto() const { return static_cast<OutlineIsAuto>(m_background->outline().isAuto()); }
+    int outlineOutset() const;
 
     EOverflow overflowX() const { return static_cast<EOverflow>(noninherited_flags.overflowX); }
     EOverflow overflowY() const { return static_cast<EOverflow>(noninherited_flags.overflowY); }