| Index: Source/core/rendering/RenderBoxModelObject.cpp
|
| diff --git a/Source/core/rendering/RenderBoxModelObject.cpp b/Source/core/rendering/RenderBoxModelObject.cpp
|
| index 73ecfa184ae293b19fa69210a4dd17232a5b2713..82c774028269a2f0d9cf7fb0d6ce8720f324395c 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,10 +1334,10 @@ 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);
|
| + return !borderStyleHasUnmatchedColorsAtCorner(edges[side].borderStyle(), side, adjacentSide);
|
| }
|
|
|
|
|
| @@ -1424,10 +1349,10 @@ 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);
|
| + return borderStyleHasUnmatchedColorsAtCorner(edges[side].borderStyle(), side, adjacentSide);
|
| }
|
|
|
| // This assumes that we draw in order: top, bottom, left, right.
|
| @@ -1439,10 +1364,10 @@ 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))
|
| + if (!borderStyleFillsBorderArea(edges[adjacentSide].borderStyle()))
|
| return false;
|
|
|
| return true;
|
| @@ -1477,10 +1402,10 @@ 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))
|
| + if (borderStylesRequireMitre(side, adjacentSide, edges[side].borderStyle(), edges[adjacentSide].borderStyle()))
|
| return true;
|
|
|
| return false;
|
| @@ -1511,9 +1436,9 @@ void RenderBoxModelObject::paintOneBorderSide(GraphicsContext* graphicsContext,
|
| clipBorderSideForComplexInnerPath(graphicsContext, outerBorder, innerBorder, side, edges);
|
| float thickness = std::max(std::max(edgeToRender.width, adjacentEdge1.width), adjacentEdge2.width);
|
| drawBoxSideFromPath(graphicsContext, outerBorder.rect(), *path, edges, edgeToRender.width, thickness, side, style,
|
| - colorToPaint, edgeToRender.style, bleedAvoidance, includeLogicalLeftEdge, includeLogicalRightEdge);
|
| + colorToPaint, edgeToRender.borderStyle(), bleedAvoidance, includeLogicalLeftEdge, includeLogicalRightEdge);
|
| } else {
|
| - bool clipForStyle = styleRequiresClipPolygon(edgeToRender.style) && (mitreAdjacentSide1 || mitreAdjacentSide2);
|
| + bool clipForStyle = styleRequiresClipPolygon(edgeToRender.borderStyle()) && (mitreAdjacentSide1 || mitreAdjacentSide2);
|
| bool clipAdjacentSide1 = colorNeedsAntiAliasAtCorner(side, adjacentSide1, edges) && mitreAdjacentSide1;
|
| bool clipAdjacentSide2 = colorNeedsAntiAliasAtCorner(side, adjacentSide2, edges) && mitreAdjacentSide2;
|
| bool shouldClip = clipForStyle || clipAdjacentSide1 || clipAdjacentSide2;
|
| @@ -1528,7 +1453,7 @@ void RenderBoxModelObject::paintOneBorderSide(GraphicsContext* graphicsContext,
|
| mitreAdjacentSide2 = false;
|
| }
|
|
|
| - drawLineForBoxSide(graphicsContext, sideRect.x(), sideRect.y(), sideRect.maxX(), sideRect.maxY(), side, colorToPaint, edgeToRender.style,
|
| + drawLineForBoxSide(graphicsContext, sideRect.x(), sideRect.y(), sideRect.maxX(), sideRect.maxY(), side, colorToPaint, edgeToRender.borderStyle(),
|
| mitreAdjacentSide1 ? adjacentEdge1.width : 0, mitreAdjacentSide2 ? adjacentEdge2.width : 0, antialias);
|
| }
|
| }
|
| @@ -1569,7 +1494,7 @@ void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co
|
| IntRect sideRect = outerBorder.rect();
|
| sideRect.setHeight(edges[BSTop].width + innerBorderAdjustment.y());
|
|
|
| - bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSTop].style) || borderWillArcInnerEdge(innerBorder.radii().topLeft(), innerBorder.radii().topRight()));
|
| + bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSTop].borderStyle()) || borderWillArcInnerEdge(innerBorder.radii().topLeft(), innerBorder.radii().topRight()));
|
| paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sideRect, BSTop, BSLeft, BSRight, edges, usePath ? &roundedPath : 0, bleedAvoidance, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor);
|
| }
|
|
|
| @@ -1577,7 +1502,7 @@ void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co
|
| IntRect sideRect = outerBorder.rect();
|
| sideRect.shiftYEdgeTo(sideRect.maxY() - edges[BSBottom].width - innerBorderAdjustment.y());
|
|
|
| - bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSBottom].style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().bottomRight()));
|
| + bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSBottom].borderStyle()) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().bottomRight()));
|
| paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sideRect, BSBottom, BSLeft, BSRight, edges, usePath ? &roundedPath : 0, bleedAvoidance, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor);
|
| }
|
|
|
| @@ -1585,7 +1510,7 @@ void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co
|
| IntRect sideRect = outerBorder.rect();
|
| sideRect.setWidth(edges[BSLeft].width + innerBorderAdjustment.x());
|
|
|
| - bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSLeft].style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().topLeft()));
|
| + bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSLeft].borderStyle()) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().topLeft()));
|
| paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sideRect, BSLeft, BSTop, BSBottom, edges, usePath ? &roundedPath : 0, bleedAvoidance, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor);
|
| }
|
|
|
| @@ -1593,7 +1518,7 @@ void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co
|
| IntRect sideRect = outerBorder.rect();
|
| sideRect.shiftXEdgeTo(sideRect.maxX() - edges[BSRight].width - innerBorderAdjustment.x());
|
|
|
| - bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSRight].style) || borderWillArcInnerEdge(innerBorder.radii().bottomRight(), innerBorder.radii().topRight()));
|
| + bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSRight].borderStyle()) || borderWillArcInnerEdge(innerBorder.radii().bottomRight(), innerBorder.radii().topRight()));
|
| paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sideRect, BSRight, BSTop, BSBottom, edges, usePath ? &roundedPath : 0, bleedAvoidance, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor);
|
| }
|
| }
|
| @@ -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);
|
|
|
| @@ -1696,10 +1621,10 @@ void RenderBoxModelObject::paintBorder(const PaintInfo& info, const LayoutRect&
|
| if (currEdge.color.hasAlpha())
|
| haveAlphaColor = true;
|
|
|
| - if (currEdge.style != SOLID)
|
| + if (currEdge.borderStyle() != SOLID)
|
| haveAllSolidEdges = false;
|
|
|
| - if (currEdge.style != DOUBLE)
|
| + if (currEdge.borderStyle() != DOUBLE)
|
| haveAllDoubleEdges = false;
|
| }
|
|
|
| @@ -2265,7 +2190,7 @@ static RoundedRect calculateAdjustedInnerBorder(const RoundedRect&innerBorder, B
|
| }
|
|
|
| void RenderBoxModelObject::clipBorderSideForComplexInnerPath(GraphicsContext* graphicsContext, const RoundedRect& outerBorder, const RoundedRect& innerBorder,
|
| - BoxSide side, const class BorderEdge edges[])
|
| + BoxSide side, const BorderEdge edges[])
|
| {
|
| graphicsContext->clip(calculateSideRectIncludingInner(outerBorder, edges, side));
|
| RoundedRect adjustedInnerRect = calculateAdjustedInnerBorder(innerBorder, side);
|
| @@ -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)
|
|
|