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

Unified Diff: Source/core/rendering/RenderBoxModelObject.cpp

Issue 550363004: Factor painting code out of RenderBox into a new class called BoxPainter. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix Created 6 years, 3 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
Index: Source/core/rendering/RenderBoxModelObject.cpp
diff --git a/Source/core/rendering/RenderBoxModelObject.cpp b/Source/core/rendering/RenderBoxModelObject.cpp
index 73ecfa184ae293b19fa69210a4dd17232a5b2713..3e4c3e8c397f494a47ac5fad99423a7380fba2e7 100644
--- a/Source/core/rendering/RenderBoxModelObject.cpp
+++ b/Source/core/rendering/RenderBoxModelObject.cpp
@@ -42,6 +42,7 @@
#include "core/rendering/RenderView.h"
#include "core/rendering/compositing/CompositedLayerMapping.h"
#include "core/rendering/compositing/RenderLayerCompositor.h"
+#include "core/rendering/style/BorderEdge.h"
#include "core/rendering/style/ShadowList.h"
#include "platform/LengthFunctions.h"
#include "platform/geometry/TransformState.h"
@@ -1231,77 +1232,6 @@ bool RenderBoxModelObject::paintNinePieceImage(GraphicsContext* graphicsContext,
return true;
}
-class BorderEdge {
-public:
- BorderEdge(int edgeWidth, const Color& edgeColor, EBorderStyle edgeStyle, bool edgeIsTransparent, bool edgeIsPresent = true)
- : width(edgeWidth)
- , color(edgeColor)
- , style(edgeStyle)
- , isTransparent(edgeIsTransparent)
- , isPresent(edgeIsPresent)
- {
- if (style == DOUBLE && edgeWidth < 3)
- style = SOLID;
- }
-
- BorderEdge()
- : width(0)
- , style(BHIDDEN)
- , isTransparent(false)
- , isPresent(false)
- {
- }
-
- bool hasVisibleColorAndStyle() const { return style > BHIDDEN && !isTransparent; }
- bool shouldRender() const { return isPresent && width && hasVisibleColorAndStyle(); }
- bool presentButInvisible() const { return usedWidth() && !hasVisibleColorAndStyle(); }
- bool obscuresBackgroundEdge(float scale) const
- {
- if (!isPresent || isTransparent || (width * scale) < 2 || color.hasAlpha() || style == BHIDDEN)
- return false;
-
- if (style == DOTTED || style == DASHED)
- return false;
-
- if (style == DOUBLE)
- return width >= 5 * scale; // The outer band needs to be >= 2px wide at unit scale.
-
- return true;
- }
- bool obscuresBackground() const
- {
- if (!isPresent || isTransparent || color.hasAlpha() || style == BHIDDEN)
- return false;
-
- if (style == DOTTED || style == DASHED || style == DOUBLE)
- return false;
-
- return true;
- }
-
- int usedWidth() const { return isPresent ? width : 0; }
-
- void getDoubleBorderStripeWidths(int& outerWidth, int& innerWidth) const
- {
- int fullWidth = usedWidth();
- outerWidth = fullWidth / 3;
- innerWidth = fullWidth * 2 / 3;
-
- // We need certain integer rounding results
- if (fullWidth % 3 == 2)
- outerWidth += 1;
-
- if (fullWidth % 3 == 1)
- innerWidth += 1;
- }
-
- int width;
- Color color;
- EBorderStyle style;
- bool isTransparent;
- bool isPresent;
-};
-
static bool allCornersClippedOut(const RoundedRect& border, const LayoutRect& clipRect)
{
LayoutRect boundingRect = border.rect();
@@ -1364,11 +1294,6 @@ static inline bool includesAdjacentEdges(BorderEdgeFlags flags)
|| (flags & (LeftBorderEdge | TopBorderEdge)) == (LeftBorderEdge | TopBorderEdge);
}
-inline bool edgesShareColor(const BorderEdge& firstEdge, const BorderEdge& secondEdge)
-{
- return firstEdge.color == secondEdge.color;
-}
-
inline bool styleRequiresClipPolygon(EBorderStyle style)
{
return style == DOTTED || style == DASHED; // These are drawn with a stroke, so we have to clip to get corner miters.
@@ -1409,7 +1334,7 @@ static inline bool colorsMatchAtCorner(BoxSide side, BoxSide adjacentSide, const
if (edges[side].shouldRender() != edges[adjacentSide].shouldRender())
return false;
- if (!edgesShareColor(edges[side], edges[adjacentSide]))
+ if (!edges[side].sharesColorWith(edges[adjacentSide]))
return false;
return !borderStyleHasUnmatchedColorsAtCorner(edges[side].style, side, adjacentSide);
@@ -1424,7 +1349,7 @@ static inline bool colorNeedsAntiAliasAtCorner(BoxSide side, BoxSide adjacentSid
if (edges[side].shouldRender() != edges[adjacentSide].shouldRender())
return false;
- if (!edgesShareColor(edges[side], edges[adjacentSide]))
+ if (!edges[side].sharesColorWith(edges[adjacentSide]))
return true;
return borderStyleHasUnmatchedColorsAtCorner(edges[side].style, side, adjacentSide);
@@ -1439,7 +1364,7 @@ static inline bool willBeOverdrawn(BoxSide side, BoxSide adjacentSide, const Bor
if (edges[adjacentSide].presentButInvisible())
return false;
- if (!edgesShareColor(edges[side], edges[adjacentSide]) && edges[adjacentSide].color.hasAlpha())
+ if (!edges[side].sharesColorWith(edges[adjacentSide]) && edges[adjacentSide].color.hasAlpha())
return false;
if (!borderStyleFillsBorderArea(edges[adjacentSide].style))
@@ -1477,7 +1402,7 @@ static bool joinRequiresMitre(BoxSide side, BoxSide adjacentSide, const BorderEd
if (allowOverdraw && willBeOverdrawn(side, adjacentSide, edges))
return false;
- if (!edgesShareColor(edges[side], edges[adjacentSide]))
+ if (!edges[side].sharesColorWith(edges[adjacentSide]))
return true;
if (borderStylesRequireMitre(side, adjacentSide, edges[side].style, edges[adjacentSide].style))
@@ -1650,7 +1575,7 @@ void RenderBoxModelObject::paintBorder(const PaintInfo& info, const LayoutRect&
return;
BorderEdge edges[4];
- getBorderEdgeInfo(edges, style, includeLogicalLeftEdge, includeLogicalRightEdge);
+ style->getBorderEdgeInfo(edges, includeLogicalLeftEdge, includeLogicalRightEdge);
RoundedRect outerBorder = style->getRoundedBorderFor(rect, includeLogicalLeftEdge, includeLogicalRightEdge);
RoundedRect innerBorder = style->getRoundedInnerBorderFor(borderInnerRectAdjustedForBleedAvoidance(graphicsContext, rect, bleedAvoidance), includeLogicalLeftEdge, includeLogicalRightEdge);
@@ -2273,72 +2198,6 @@ void RenderBoxModelObject::clipBorderSideForComplexInnerPath(GraphicsContext* gr
graphicsContext->clipOutRoundedRect(adjustedInnerRect);
}
-void RenderBoxModelObject::getBorderEdgeInfo(BorderEdge edges[], const RenderStyle* style, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const
-{
- bool horizontal = style->isHorizontalWritingMode();
-
- edges[BSTop] = BorderEdge(style->borderTopWidth(),
- resolveColor(style, CSSPropertyBorderTopColor),
- style->borderTopStyle(),
- style->borderTopIsTransparent(),
- horizontal || includeLogicalLeftEdge);
-
- edges[BSRight] = BorderEdge(style->borderRightWidth(),
- resolveColor(style, CSSPropertyBorderRightColor),
- style->borderRightStyle(),
- style->borderRightIsTransparent(),
- !horizontal || includeLogicalRightEdge);
-
- edges[BSBottom] = BorderEdge(style->borderBottomWidth(),
- resolveColor(style, CSSPropertyBorderBottomColor),
- style->borderBottomStyle(),
- style->borderBottomIsTransparent(),
- horizontal || includeLogicalRightEdge);
-
- edges[BSLeft] = BorderEdge(style->borderLeftWidth(),
- resolveColor(style, CSSPropertyBorderLeftColor),
- style->borderLeftStyle(),
- style->borderLeftIsTransparent(),
- !horizontal || includeLogicalLeftEdge);
-}
-
-bool RenderBoxModelObject::borderObscuresBackgroundEdge(const FloatSize& contextScale) const
-{
- BorderEdge edges[4];
- getBorderEdgeInfo(edges, style());
-
- for (int i = BSTop; i <= BSLeft; ++i) {
- const BorderEdge& currEdge = edges[i];
- // FIXME: for vertical text
- float axisScale = (i == BSTop || i == BSBottom) ? contextScale.height() : contextScale.width();
- if (!currEdge.obscuresBackgroundEdge(axisScale))
- return false;
- }
-
- return true;
-}
-
-bool RenderBoxModelObject::borderObscuresBackground() const
-{
- if (!style()->hasBorder())
- return false;
-
- // Bail if we have any border-image for now. We could look at the image alpha to improve this.
- if (style()->borderImage().image())
- return false;
-
- BorderEdge edges[4];
- getBorderEdgeInfo(edges, style());
-
- for (int i = BSTop; i <= BSLeft; ++i) {
- const BorderEdge& currEdge = edges[i];
- if (!currEdge.obscuresBackground())
- return false;
- }
-
- return true;
-}
-
bool RenderBoxModelObject::boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox* inlineFlowBox) const
{
if (bleedAvoidance != BackgroundBleedNone)

Powered by Google App Engine
This is Rietveld 408576698