Changeset 92529 in webkit


Ignore:
Timestamp:
Aug 5, 2011 5:15:53 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

Introduced fast path for border rendering when all visible sides are solid, same rgba color but not all visible
https://bugs.webkit.org/show_bug.cgi?id=65762

Patch by Ben Wells <benwells@chromium.org> on 2011-08-05
Reviewed by Simon Fraser.

No intended change in behaviour, no new tests.

  • rendering/RenderBoxModelObject.cpp:

(WebCore::calculateSideRect):
(WebCore::RenderBoxModelObject::paintBorderSides):
(WebCore::RenderBoxModelObject::paintBorder):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r92528 r92529  
     12011-08-05  Ben Wells  <benwells@chromium.org>
     2
     3        Introduced fast path for border rendering when all visible sides are solid, same rgba color but not all visible
     4        https://bugs.webkit.org/show_bug.cgi?id=65762
     5
     6        Reviewed by Simon Fraser.
     7
     8        No intended change in behaviour, no new tests.
     9
     10        * rendering/RenderBoxModelObject.cpp:
     11        (WebCore::calculateSideRect):
     12        (WebCore::RenderBoxModelObject::paintBorderSides):
     13        (WebCore::RenderBoxModelObject::paintBorder):
     14
    1152011-08-05  Kenichi Ishibashi  <bashi@chromium.org>
    216
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp

    r92340 r92529  
    13301330}
    13311331
     1332static LayoutRect calculateSideRect(const RoundedRect& outerBorder, const BorderEdge edges[], int side)
     1333{
     1334    LayoutRect sideRect = outerBorder.rect();
     1335    int width = edges[side].width;
     1336
     1337    if (side == BSTop)
     1338        sideRect.setHeight(width);
     1339    else if (side == BSBottom)
     1340        sideRect.shiftYEdgeTo(sideRect.maxY() - width);
     1341    else if (side == BSLeft)
     1342        sideRect.setWidth(width);
     1343    else
     1344        sideRect.shiftXEdgeTo(sideRect.maxX() - width);
     1345
     1346    return sideRect;
     1347}
     1348
    13321349void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, const RenderStyle* style, const RoundedRect& outerBorder, const RoundedRect& innerBorder,
    13331350                                            const BorderEdge edges[], BorderEdgeFlags edgeSet, BackgroundBleedAvoidance bleedAvoidance,
     
    13411358   
    13421359    if (edges[BSTop].shouldRender() && includesEdge(edgeSet, BSTop)) {
    1343         LayoutRect sideRect = outerBorder.rect();
    1344         sideRect.setHeight(edges[BSTop].width);
     1360        LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSTop);
    13451361
    13461362        bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSTop].style) || borderWillArcInnerEdge(innerBorder.radii().topLeft(), innerBorder.radii().topRight()));
     
    13491365
    13501366    if (edges[BSBottom].shouldRender() && includesEdge(edgeSet, BSBottom)) {
    1351         LayoutRect sideRect = outerBorder.rect();
    1352         sideRect.shiftYEdgeTo(sideRect.maxY() - edges[BSBottom].width);
     1367        LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSBottom);
    13531368
    13541369        bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSBottom].style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().bottomRight()));
     
    13571372
    13581373    if (edges[BSLeft].shouldRender() && includesEdge(edgeSet, BSLeft)) {
    1359         LayoutRect sideRect = outerBorder.rect();
    1360         sideRect.setWidth(edges[BSLeft].width);
     1374        LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSLeft);
    13611375
    13621376        bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSLeft].style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().topLeft()));
     
    13651379
    13661380    if (edges[BSRight].shouldRender() && includesEdge(edgeSet, BSRight)) {
    1367         LayoutRect sideRect = outerBorder.rect();
    1368         sideRect.shiftXEdgeTo(sideRect.maxX() - edges[BSRight].width);
     1381        LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSRight);
    13691382
    13701383        bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSRight].style) || borderWillArcInnerEdge(innerBorder.radii().bottomRight(), innerBorder.radii().topRight()));
     
    14441457        if (currEdge.presentButInvisible()) {
    14451458            allEdgesVisible = false;
     1459            allEdgesShareColor = false;
    14461460            continue;
    14471461        }
     
    14701484
    14711485    // isRenderable() check avoids issue described in https://bugs.webkit.org/show_bug.cgi?id=38787
    1472     if (haveAllSolidEdges && allEdgesVisible && allEdgesShareColor && innerBorder.isRenderable()) {
     1486    if (haveAllSolidEdges && allEdgesShareColor && innerBorder.isRenderable()) {
    14731487        // Fast path for drawing all solid edges.
    1474         if (outerBorder.isRounded() || haveAlphaColor) {
     1488        if (allEdgesVisible && (outerBorder.isRounded() || haveAlphaColor)) {
    14751489            Path path;
    14761490           
     
    14881502            graphicsContext->setFillColor(edges[firstVisibleEdge].color, style->colorSpace());
    14891503            graphicsContext->fillPath(path);
    1490         } else
    1491             paintBorderSides(graphicsContext, style, outerBorder, innerBorder, edges, AllBorderEdges, bleedAvoidance, includeLogicalLeftEdge, includeLogicalRightEdge, antialias);
    1492    
    1493         return;
     1504            return;
     1505        }
     1506        // Avoid creating transparent layers
     1507        if (!allEdgesVisible && !outerBorder.isRounded() && haveAlphaColor) {
     1508            Path path;
     1509
     1510            for (int i = BSTop; i <= BSLeft; ++i) {
     1511                const BorderEdge& currEdge = edges[i];
     1512                if (currEdge.shouldRender()) {
     1513                    LayoutRect sideRect = calculateSideRect(outerBorder, edges, i);
     1514                    path.addRect(sideRect);
     1515                }
     1516            }
     1517
     1518            graphicsContext->setFillRule(RULE_NONZERO);
     1519            graphicsContext->setFillColor(edges[firstVisibleEdge].color, style->colorSpace());
     1520            graphicsContext->fillPath(path);
     1521            return;
     1522        }
    14941523    }
    14951524
Note: See TracChangeset for help on using the changeset viewer.