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

Side by Side Diff: Source/WebCore/rendering/RenderBoxModelObject.cpp

Issue 7585032: Merge 92529 - Introduced fast path for border rendering when all visible sides are solid, same rg... (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/835/
Patch Set: Created 9 years, 4 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 unified diff | Download patch
« no previous file with comments | « Source/WebCore/ChangeLog ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
7 * Copyright (C) 2010 Google Inc. All rights reserved. 7 * Copyright (C) 2010 Google Inc. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 1280 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 // Since we clipped, no need to draw with a mitre. 1291 // Since we clipped, no need to draw with a mitre.
1292 mitreAdjacentSide1 = false; 1292 mitreAdjacentSide1 = false;
1293 mitreAdjacentSide2 = false; 1293 mitreAdjacentSide2 = false;
1294 } 1294 }
1295 1295
1296 drawLineForBoxSide(graphicsContext, sideRect.x(), sideRect.y(), sideRect .maxX(), sideRect.maxY(), side, colorToPaint, edgeToRender.style, 1296 drawLineForBoxSide(graphicsContext, sideRect.x(), sideRect.y(), sideRect .maxX(), sideRect.maxY(), side, colorToPaint, edgeToRender.style,
1297 mitreAdjacentSide1 ? adjacentEdge1.width : 0, mitreAdjacentSide2 ? adjacentEdge2.width : 0, antialias); 1297 mitreAdjacentSide1 ? adjacentEdge1.width : 0, mitreAdjacentSide2 ? adjacentEdge2.width : 0, antialias);
1298 } 1298 }
1299 } 1299 }
1300 1300
1301 static LayoutRect calculateSideRect(const RoundedRect& outerBorder, const Border Edge edges[], int side)
1302 {
1303 LayoutRect sideRect = outerBorder.rect();
1304 int width = edges[side].width;
1305
1306 if (side == BSTop)
1307 sideRect.setHeight(width);
1308 else if (side == BSBottom)
1309 sideRect.shiftYEdgeTo(sideRect.maxY() - width);
1310 else if (side == BSLeft)
1311 sideRect.setWidth(width);
1312 else
1313 sideRect.shiftXEdgeTo(sideRect.maxX() - width);
1314
1315 return sideRect;
1316 }
1317
1301 void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co nst RenderStyle* style, const RoundedRect& outerBorder, const RoundedRect& inner Border, 1318 void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co nst RenderStyle* style, const RoundedRect& outerBorder, const RoundedRect& inner Border,
1302 const BorderEdge edges[], BorderEdge Flags edgeSet, BackgroundBleedAvoidance bleedAvoidance, 1319 const BorderEdge edges[], BorderEdge Flags edgeSet, BackgroundBleedAvoidance bleedAvoidance,
1303 bool includeLogicalLeftEdge, bool in cludeLogicalRightEdge, bool antialias, const Color* overrideColor) 1320 bool includeLogicalLeftEdge, bool in cludeLogicalRightEdge, bool antialias, const Color* overrideColor)
1304 { 1321 {
1305 bool renderRadii = outerBorder.isRounded(); 1322 bool renderRadii = outerBorder.isRounded();
1306 1323
1307 Path roundedPath; 1324 Path roundedPath;
1308 if (renderRadii) 1325 if (renderRadii)
1309 roundedPath.addRoundedRect(outerBorder); 1326 roundedPath.addRoundedRect(outerBorder);
1310 1327
1311 if (edges[BSTop].shouldRender() && includesEdge(edgeSet, BSTop)) { 1328 if (edges[BSTop].shouldRender() && includesEdge(edgeSet, BSTop)) {
1312 LayoutRect sideRect = outerBorder.rect(); 1329 LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSTop);
1313 sideRect.setHeight(edges[BSTop].width);
1314 1330
1315 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSTop].st yle) || borderWillArcInnerEdge(innerBorder.radii().topLeft(), innerBorder.radii( ).topRight())); 1331 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSTop].st yle) || borderWillArcInnerEdge(innerBorder.radii().topLeft(), innerBorder.radii( ).topRight()));
1316 paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sid eRect, BSTop, BSLeft, BSRight, edges, usePath ? &roundedPath : 0, bleedAvoidance , includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor); 1332 paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sid eRect, BSTop, BSLeft, BSRight, edges, usePath ? &roundedPath : 0, bleedAvoidance , includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor);
1317 } 1333 }
1318 1334
1319 if (edges[BSBottom].shouldRender() && includesEdge(edgeSet, BSBottom)) { 1335 if (edges[BSBottom].shouldRender() && includesEdge(edgeSet, BSBottom)) {
1320 LayoutRect sideRect = outerBorder.rect(); 1336 LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSBottom);
1321 sideRect.shiftYEdgeTo(sideRect.maxY() - edges[BSBottom].width);
1322 1337
1323 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSBottom] .style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder. radii().bottomRight())); 1338 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSBottom] .style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder. radii().bottomRight()));
1324 paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sid eRect, BSBottom, BSLeft, BSRight, edges, usePath ? &roundedPath : 0, bleedAvoida nce, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor); 1339 paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sid eRect, BSBottom, BSLeft, BSRight, edges, usePath ? &roundedPath : 0, bleedAvoida nce, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor);
1325 } 1340 }
1326 1341
1327 if (edges[BSLeft].shouldRender() && includesEdge(edgeSet, BSLeft)) { 1342 if (edges[BSLeft].shouldRender() && includesEdge(edgeSet, BSLeft)) {
1328 LayoutRect sideRect = outerBorder.rect(); 1343 LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSLeft);
1329 sideRect.setWidth(edges[BSLeft].width);
1330 1344
1331 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSLeft].s tyle) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.ra dii().topLeft())); 1345 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSLeft].s tyle) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.ra dii().topLeft()));
1332 paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sid eRect, BSLeft, BSTop, BSBottom, edges, usePath ? &roundedPath : 0, bleedAvoidanc e, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor); 1346 paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sid eRect, BSLeft, BSTop, BSBottom, edges, usePath ? &roundedPath : 0, bleedAvoidanc e, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor);
1333 } 1347 }
1334 1348
1335 if (edges[BSRight].shouldRender() && includesEdge(edgeSet, BSRight)) { 1349 if (edges[BSRight].shouldRender() && includesEdge(edgeSet, BSRight)) {
1336 LayoutRect sideRect = outerBorder.rect(); 1350 LayoutRect sideRect = calculateSideRect(outerBorder, edges, BSRight);
1337 sideRect.shiftXEdgeTo(sideRect.maxX() - edges[BSRight].width);
1338 1351
1339 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSRight]. style) || borderWillArcInnerEdge(innerBorder.radii().bottomRight(), innerBorder. radii().topRight())); 1352 bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSRight]. style) || borderWillArcInnerEdge(innerBorder.radii().bottomRight(), innerBorder. radii().topRight()));
1340 paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sid eRect, BSRight, BSTop, BSBottom, edges, usePath ? &roundedPath : 0, bleedAvoidan ce, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor); 1353 paintOneBorderSide(graphicsContext, style, outerBorder, innerBorder, sid eRect, BSRight, BSTop, BSBottom, edges, usePath ? &roundedPath : 0, bleedAvoidan ce, includeLogicalLeftEdge, includeLogicalRightEdge, antialias, overrideColor);
1341 } 1354 }
1342 } 1355 }
1343 1356
1344 void RenderBoxModelObject::paintTranslucentBorderSides(GraphicsContext* graphics Context, const RenderStyle* style, const RoundedRect& outerBorder, const Rounded Rect& innerBorder, 1357 void RenderBoxModelObject::paintTranslucentBorderSides(GraphicsContext* graphics Context, const RenderStyle* style, const RoundedRect& outerBorder, const Rounded Rect& innerBorder,
1345 const BorderEdge edges[], BackgroundBleedAvoidance bleedAvoidance, bool includeLogicalLeftEdge, bool incl udeLogicalRightEdge, bool antialias) 1358 const BorderEdge edges[], BackgroundBleedAvoidance bleedAvoidance, bool includeLogicalLeftEdge, bool incl udeLogicalRightEdge, bool antialias)
1346 { 1359 {
1347 BorderEdgeFlags edgesToDraw = AllBorderEdges; 1360 BorderEdgeFlags edgesToDraw = AllBorderEdges;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1446 bool haveAlphaColor = false; 1459 bool haveAlphaColor = false;
1447 bool haveAllSolidEdges = true; 1460 bool haveAllSolidEdges = true;
1448 bool allEdgesVisible = true; 1461 bool allEdgesVisible = true;
1449 bool allEdgesShareColor = true; 1462 bool allEdgesShareColor = true;
1450 int firstVisibleEdge = -1; 1463 int firstVisibleEdge = -1;
1451 1464
1452 for (int i = BSTop; i <= BSLeft; ++i) { 1465 for (int i = BSTop; i <= BSLeft; ++i) {
1453 const BorderEdge& currEdge = edges[i]; 1466 const BorderEdge& currEdge = edges[i];
1454 if (currEdge.presentButInvisible()) { 1467 if (currEdge.presentButInvisible()) {
1455 allEdgesVisible = false; 1468 allEdgesVisible = false;
1469 allEdgesShareColor = false;
1456 continue; 1470 continue;
1457 } 1471 }
1458 1472
1459 if (!currEdge.width) { 1473 if (!currEdge.width) {
1460 allEdgesVisible = false; 1474 allEdgesVisible = false;
1461 continue; 1475 continue;
1462 } 1476 }
1463 1477
1464 if (firstVisibleEdge == -1) 1478 if (firstVisibleEdge == -1)
1465 firstVisibleEdge = i; 1479 firstVisibleEdge = i;
1466 else if (currEdge.color != edges[firstVisibleEdge].color) 1480 else if (currEdge.color != edges[firstVisibleEdge].color)
1467 allEdgesShareColor = false; 1481 allEdgesShareColor = false;
1468 1482
1469 if (currEdge.color.hasAlpha()) 1483 if (currEdge.color.hasAlpha())
1470 haveAlphaColor = true; 1484 haveAlphaColor = true;
1471 1485
1472 if (currEdge.style != SOLID) 1486 if (currEdge.style != SOLID)
1473 haveAllSolidEdges = false; 1487 haveAllSolidEdges = false;
1474 } 1488 }
1475 1489
1476 // If one of the corners falls outside the clip region, pretend it has no 1490 // If one of the corners falls outside the clip region, pretend it has no
1477 // radius to improve performance. 1491 // radius to improve performance.
1478 if (haveAllSolidEdges) 1492 if (haveAllSolidEdges)
1479 unroundClippedCorners(outerBorder, info.rect); 1493 unroundClippedCorners(outerBorder, info.rect);
1480 1494
1481 // isRenderable() check avoids issue described in https://bugs.webkit.org/sh ow_bug.cgi?id=38787 1495 // isRenderable() check avoids issue described in https://bugs.webkit.org/sh ow_bug.cgi?id=38787
1482 if (haveAllSolidEdges && allEdgesVisible && allEdgesShareColor && innerBorde r.isRenderable()) { 1496 if (haveAllSolidEdges && allEdgesShareColor && innerBorder.isRenderable()) {
1483 // Fast path for drawing all solid edges. 1497 // Fast path for drawing all solid edges.
1484 if (outerBorder.isRounded() || haveAlphaColor) { 1498 if (allEdgesVisible && (outerBorder.isRounded() || haveAlphaColor)) {
1485 Path path; 1499 Path path;
1486 1500
1487 if (outerBorder.isRounded() && bleedAvoidance != BackgroundBleedUseT ransparencyLayer) 1501 if (outerBorder.isRounded() && bleedAvoidance != BackgroundBleedUseT ransparencyLayer)
1488 path.addRoundedRect(outerBorder); 1502 path.addRoundedRect(outerBorder);
1489 else 1503 else
1490 path.addRect(outerBorder.rect()); 1504 path.addRect(outerBorder.rect());
1491 1505
1492 if (innerBorder.isRounded()) 1506 if (innerBorder.isRounded())
1493 path.addRoundedRect(innerBorder); 1507 path.addRoundedRect(innerBorder);
1494 else 1508 else
1495 path.addRect(innerBorder.rect()); 1509 path.addRect(innerBorder.rect());
1496 1510
1497 graphicsContext->setFillRule(RULE_EVENODD); 1511 graphicsContext->setFillRule(RULE_EVENODD);
1498 graphicsContext->setFillColor(edges[firstVisibleEdge].color, style-> colorSpace()); 1512 graphicsContext->setFillColor(edges[firstVisibleEdge].color, style-> colorSpace());
1499 graphicsContext->fillPath(path); 1513 graphicsContext->fillPath(path);
1500 } else 1514 return;
1501 paintBorderSides(graphicsContext, style, outerBorder, innerBorder, e dges, AllBorderEdges, bleedAvoidance, includeLogicalLeftEdge, includeLogicalRigh tEdge, antialias); 1515 }
1502 1516 // Avoid creating transparent layers
1503 return; 1517 if (!allEdgesVisible && !outerBorder.isRounded() && haveAlphaColor) {
1518 Path path;
1519
1520 for (int i = BSTop; i <= BSLeft; ++i) {
1521 const BorderEdge& currEdge = edges[i];
1522 if (currEdge.shouldRender()) {
1523 LayoutRect sideRect = calculateSideRect(outerBorder, edges, i);
1524 path.addRect(sideRect);
1525 }
1526 }
1527
1528 graphicsContext->setFillRule(RULE_NONZERO);
1529 graphicsContext->setFillColor(edges[firstVisibleEdge].color, style-> colorSpace());
1530 graphicsContext->fillPath(path);
1531 return;
1532 }
1504 } 1533 }
1505 1534
1506 bool clipToOuterBorder = outerBorder.isRounded(); 1535 bool clipToOuterBorder = outerBorder.isRounded();
1507 GraphicsContextStateSaver stateSaver(*graphicsContext, clipToOuterBorder); 1536 GraphicsContextStateSaver stateSaver(*graphicsContext, clipToOuterBorder);
1508 if (clipToOuterBorder) { 1537 if (clipToOuterBorder) {
1509 // Clip to the inner and outer radii rects. 1538 // Clip to the inner and outer radii rects.
1510 if (bleedAvoidance != BackgroundBleedUseTransparencyLayer) 1539 if (bleedAvoidance != BackgroundBleedUseTransparencyLayer)
1511 graphicsContext->addRoundedRectClip(outerBorder); 1540 graphicsContext->addRoundedRectClip(outerBorder);
1512 graphicsContext->clipOutRoundedRect(innerBorder); 1541 graphicsContext->clipOutRoundedRect(innerBorder);
1513 } 1542 }
(...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after
2349 if (!continuationMap) 2378 if (!continuationMap)
2350 continuationMap = new ContinuationMap; 2379 continuationMap = new ContinuationMap;
2351 continuationMap->set(this, continuation); 2380 continuationMap->set(this, continuation);
2352 } else { 2381 } else {
2353 if (continuationMap) 2382 if (continuationMap)
2354 continuationMap->remove(this); 2383 continuationMap->remove(this);
2355 } 2384 }
2356 } 2385 }
2357 2386
2358 } // namespace WebCore 2387 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/WebCore/ChangeLog ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698