| Index: Source/WebCore/rendering/RenderBoxModelObject.cpp
|
| ===================================================================
|
| --- Source/WebCore/rendering/RenderBoxModelObject.cpp (revision 92583)
|
| +++ Source/WebCore/rendering/RenderBoxModelObject.cpp (working copy)
|
| @@ -1298,6 +1298,23 @@
|
| }
|
| }
|
|
|
| +static LayoutRect calculateSideRect(const RoundedRect& outerBorder, const BorderEdge edges[], int side)
|
| +{
|
| + LayoutRect sideRect = outerBorder.rect();
|
| + int width = edges[side].width;
|
| +
|
| + if (side == BSTop)
|
| + sideRect.setHeight(width);
|
| + else if (side == BSBottom)
|
| + sideRect.shiftYEdgeTo(sideRect.maxY() - width);
|
| + else if (side == BSLeft)
|
| + sideRect.setWidth(width);
|
| + else
|
| + sideRect.shiftXEdgeTo(sideRect.maxX() - width);
|
| +
|
| + return sideRect;
|
| +}
|
| +
|
| void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, const RenderStyle* style, const RoundedRect& outerBorder, const RoundedRect& innerBorder,
|
| const BorderEdge edges[], BorderEdgeFlags edgeSet, BackgroundBleedAvoidance bleedAvoidance,
|
| bool includeLogicalLeftEdge, bool includeLogicalRightEdge, bool antialias, const Color* overrideColor)
|
| @@ -1309,32 +1326,28 @@
|
| roundedPath.addRoundedRect(outerBorder);
|
|
|
| if (edges[BSTop].shouldRender() && includesEdge(edgeSet, BSTop)) {
|
| - LayoutRect sideRect = outerBorder.rect();
|
| - sideRect.setHeight(edges[BSTop].width);
|
| + LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSTop);
|
|
|
| bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSTop].style) || 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);
|
| }
|
|
|
| if (edges[BSBottom].shouldRender() && includesEdge(edgeSet, BSBottom)) {
|
| - LayoutRect sideRect = outerBorder.rect();
|
| - sideRect.shiftYEdgeTo(sideRect.maxY() - edges[BSBottom].width);
|
| + LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSBottom);
|
|
|
| bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSBottom].style) || 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);
|
| }
|
|
|
| if (edges[BSLeft].shouldRender() && includesEdge(edgeSet, BSLeft)) {
|
| - LayoutRect sideRect = outerBorder.rect();
|
| - sideRect.setWidth(edges[BSLeft].width);
|
| + LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSLeft);
|
|
|
| bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSLeft].style) || 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);
|
| }
|
|
|
| if (edges[BSRight].shouldRender() && includesEdge(edgeSet, BSRight)) {
|
| - LayoutRect sideRect = outerBorder.rect();
|
| - sideRect.shiftXEdgeTo(sideRect.maxX() - edges[BSRight].width);
|
| + LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSRight);
|
|
|
| bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSRight].style) || 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);
|
| @@ -1453,6 +1466,7 @@
|
| const BorderEdge& currEdge = edges[i];
|
| if (currEdge.presentButInvisible()) {
|
| allEdgesVisible = false;
|
| + allEdgesShareColor = false;
|
| continue;
|
| }
|
|
|
| @@ -1479,9 +1493,9 @@
|
| unroundClippedCorners(outerBorder, info.rect);
|
|
|
| // isRenderable() check avoids issue described in https://bugs.webkit.org/show_bug.cgi?id=38787
|
| - if (haveAllSolidEdges && allEdgesVisible && allEdgesShareColor && innerBorder.isRenderable()) {
|
| + if (haveAllSolidEdges && allEdgesShareColor && innerBorder.isRenderable()) {
|
| // Fast path for drawing all solid edges.
|
| - if (outerBorder.isRounded() || haveAlphaColor) {
|
| + if (allEdgesVisible && (outerBorder.isRounded() || haveAlphaColor)) {
|
| Path path;
|
|
|
| if (outerBorder.isRounded() && bleedAvoidance != BackgroundBleedUseTransparencyLayer)
|
| @@ -1497,10 +1511,25 @@
|
| graphicsContext->setFillRule(RULE_EVENODD);
|
| graphicsContext->setFillColor(edges[firstVisibleEdge].color, style->colorSpace());
|
| graphicsContext->fillPath(path);
|
| - } else
|
| - paintBorderSides(graphicsContext, style, outerBorder, innerBorder, edges, AllBorderEdges, bleedAvoidance, includeLogicalLeftEdge, includeLogicalRightEdge, antialias);
|
| -
|
| - return;
|
| + return;
|
| + }
|
| + // Avoid creating transparent layers
|
| + if (!allEdgesVisible && !outerBorder.isRounded() && haveAlphaColor) {
|
| + Path path;
|
| +
|
| + for (int i = BSTop; i <= BSLeft; ++i) {
|
| + const BorderEdge& currEdge = edges[i];
|
| + if (currEdge.shouldRender()) {
|
| + LayoutRect sideRect = calculateSideRect(outerBorder, edges, i);
|
| + path.addRect(sideRect);
|
| + }
|
| + }
|
| +
|
| + graphicsContext->setFillRule(RULE_NONZERO);
|
| + graphicsContext->setFillColor(edges[firstVisibleEdge].color, style->colorSpace());
|
| + graphicsContext->fillPath(path);
|
| + return;
|
| + }
|
| }
|
|
|
| bool clipToOuterBorder = outerBorder.isRounded();
|
|
|