Changeset 92529 in webkit
- Timestamp:
- Aug 5, 2011 5:15:53 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r92528 r92529 1 2011-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 1 15 2011-08-05 Kenichi Ishibashi <bashi@chromium.org> 2 16 -
trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp
r92340 r92529 1330 1330 } 1331 1331 1332 static 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 1332 1349 void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, const RenderStyle* style, const RoundedRect& outerBorder, const RoundedRect& innerBorder, 1333 1350 const BorderEdge edges[], BorderEdgeFlags edgeSet, BackgroundBleedAvoidance bleedAvoidance, … … 1341 1358 1342 1359 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); 1345 1361 1346 1362 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSTop].style) || borderWillArcInnerEdge(innerBorder.radii().topLeft(), innerBorder.radii().topRight())); … … 1349 1365 1350 1366 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); 1353 1368 1354 1369 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSBottom].style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().bottomRight())); … … 1357 1372 1358 1373 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); 1361 1375 1362 1376 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSLeft].style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().topLeft())); … … 1365 1379 1366 1380 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); 1369 1382 1370 1383 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSRight].style) || borderWillArcInnerEdge(innerBorder.radii().bottomRight(), innerBorder.radii().topRight())); … … 1444 1457 if (currEdge.presentButInvisible()) { 1445 1458 allEdgesVisible = false; 1459 allEdgesShareColor = false; 1446 1460 continue; 1447 1461 } … … 1470 1484 1471 1485 // isRenderable() check avoids issue described in https://bugs.webkit.org/show_bug.cgi?id=38787 1472 if (haveAllSolidEdges && allEdges Visible && allEdgesShareColor && innerBorder.isRenderable()) {1486 if (haveAllSolidEdges && allEdgesShareColor && innerBorder.isRenderable()) { 1473 1487 // Fast path for drawing all solid edges. 1474 if ( outerBorder.isRounded() || haveAlphaColor) {1488 if (allEdgesVisible && (outerBorder.isRounded() || haveAlphaColor)) { 1475 1489 Path path; 1476 1490 … … 1488 1502 graphicsContext->setFillColor(edges[firstVisibleEdge].color, style->colorSpace()); 1489 1503 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 } 1494 1523 } 1495 1524
Note: See TracChangeset
for help on using the changeset viewer.