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

Side by Side Diff: sky/engine/core/rendering/RenderLayer.cpp

Issue 878023002: Merge outline paint phases into the foreground phase. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: rebase Created 5 years, 11 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after
984 984
985 context->clipPath(clipPath->path(rootRelativeBounds), clipPath-> windRule()); 985 context->clipPath(clipPath->path(rootRelativeBounds), clipPath-> windRule());
986 } 986 }
987 } 987 }
988 } 988 }
989 989
990 LayerPaintingInfo localPaintingInfo(paintingInfo); 990 LayerPaintingInfo localPaintingInfo(paintingInfo);
991 FilterEffectRendererHelper filterPainter(filterRenderer() && paintsWithFilte rs()); 991 FilterEffectRendererHelper filterPainter(filterRenderer() && paintsWithFilte rs());
992 992
993 LayoutRect layerBounds; 993 LayoutRect layerBounds;
994 ClipRect backgroundRect, foregroundRect, outlineRect; 994 ClipRect backgroundRect, foregroundRect;
995 ClipRectsContext clipRectsContext(localPaintingInfo.rootLayer, PaintingClipR ects, localPaintingInfo.subPixelAccumulation); 995 ClipRectsContext clipRectsContext(localPaintingInfo.rootLayer, PaintingClipR ects, localPaintingInfo.subPixelAccumulation);
996 clipper().calculateRects(clipRectsContext, localPaintingInfo.paintDirtyRect, 996 clipper().calculateRects(clipRectsContext, localPaintingInfo.paintDirtyRect,
997 layerBounds, backgroundRect, foregroundRect, outlineRect, 997 layerBounds, backgroundRect, foregroundRect,
998 &offsetFromRoot); 998 &offsetFromRoot);
999 999
1000 bool isPaintingOverlayScrollbars = paintFlags == PaintOverlayScrollbars; 1000 bool isPaintingOverlayScrollbars = paintFlags == PaintOverlayScrollbars;
1001 bool shouldPaintContent = isSelfPaintingLayer() && !isPaintingOverlayScrollb ars 1001 bool shouldPaintContent = isSelfPaintingLayer() && !isPaintingOverlayScrollb ars
1002 && intersectsDamageRect(layerBounds, backgroundRect.rect(), localPaintin gInfo.rootLayer, &offsetFromRoot); 1002 && intersectsDamageRect(layerBounds, backgroundRect.rect(), localPaintin gInfo.rootLayer, &offsetFromRoot);
1003 1003
1004 bool haveTransparency = isTransparent(); 1004 bool haveTransparency = isTransparent();
1005 1005
1006 if (filterPainter.haveFilterEffect()) { 1006 if (filterPainter.haveFilterEffect()) {
1007 ASSERT(this->filterInfo()); 1007 ASSERT(this->filterInfo());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1041 if (localPaintingInfo.paintingRoot && !renderer()->isDescendantOf(localPaint ingInfo.paintingRoot)) 1041 if (localPaintingInfo.paintingRoot && !renderer()->isDescendantOf(localPaint ingInfo.paintingRoot))
1042 paintingRootForRenderer = localPaintingInfo.paintingRoot; 1042 paintingRootForRenderer = localPaintingInfo.paintingRoot;
1043 1043
1044 LayoutPoint layerLocation = toPoint(layerBounds.location() - renderBoxLocati on() + localPaintingInfo.subPixelAccumulation); 1044 LayoutPoint layerLocation = toPoint(layerBounds.location() - renderBoxLocati on() + localPaintingInfo.subPixelAccumulation);
1045 1045
1046 if (shouldPaintContent) { 1046 if (shouldPaintContent) {
1047 paintForeground(context, transparencyLayerContext, paintingInfo.paintDir tyRect, haveTransparency, 1047 paintForeground(context, transparencyLayerContext, paintingInfo.paintDir tyRect, haveTransparency,
1048 localPaintingInfo, paintingRootForRenderer, layerLocation, foregroun dRect); 1048 localPaintingInfo, paintingRootForRenderer, layerLocation, foregroun dRect);
1049 } 1049 }
1050 1050
1051 paintOutline(context, localPaintingInfo, paintingRootForRenderer, layerLocat ion, outlineRect);
1052 paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, painting Info, paintFlags); 1051 paintChildren(NormalFlowChildren | PositiveZOrderChildren, context, painting Info, paintFlags);
1053 1052
1054 if (isPaintingOverlayScrollbars) 1053 if (isPaintingOverlayScrollbars)
1055 paintOverflowControls(context, localPaintingInfo, layerLocation, backgro undRect); 1054 paintOverflowControls(context, localPaintingInfo, layerLocation, backgro undRect);
1056 1055
1057 if (filterPainter.hasStartedFilterEffect()) { 1056 if (filterPainter.hasStartedFilterEffect()) {
1058 context = filterPainter.applyFilterEffect(); 1057 context = filterPainter.applyFilterEffect();
1059 restoreClip(transparencyLayerContext, localPaintingInfo.paintDirtyRect, backgroundRect); 1058 restoreClip(transparencyLayerContext, localPaintingInfo.paintDirtyRect, backgroundRect);
1060 } 1059 }
1061 1060
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 if (shouldClip) 1127 if (shouldClip)
1129 clipToRect(localPaintingInfo, context, layerForegroundRect); 1128 clipToRect(localPaintingInfo, context, layerForegroundRect);
1130 1129
1131 if (!foregroundRectIsEmpty) { 1130 if (!foregroundRectIsEmpty) {
1132 // We have to loop through every fragment multiple times, since we have to issue paint invalidations in each specific phase in order for 1131 // We have to loop through every fragment multiple times, since we have to issue paint invalidations in each specific phase in order for
1133 // interleaving of the fragments to work properly. 1132 // interleaving of the fragments to work properly.
1134 // FIXME(sky): Do we still need this for anything now that we don't have fragments? 1133 // FIXME(sky): Do we still need this for anything now that we don't have fragments?
1135 paintForegroundWithPhase(PaintPhaseForeground, 1134 paintForegroundWithPhase(PaintPhaseForeground,
1136 context, localPaintingInfo, paintingRootForRenderer, 1135 context, localPaintingInfo, paintingRootForRenderer,
1137 layerLocation, layerForegroundRect); 1136 layerLocation, layerForegroundRect);
1138 paintForegroundWithPhase(PaintPhaseChildOutlines,
1139 context, localPaintingInfo, paintingRootForRenderer,
1140 layerLocation, layerForegroundRect);
1141 } 1137 }
1142 1138
1143 if (shouldClip) 1139 if (shouldClip)
1144 restoreClip(context, localPaintingInfo.paintDirtyRect, layerForegroundRe ct); 1140 restoreClip(context, localPaintingInfo.paintDirtyRect, layerForegroundRe ct);
1145 } 1141 }
1146 1142
1147 void RenderLayer::paintForegroundWithPhase(PaintPhase phase, GraphicsContext* co ntext, 1143 void RenderLayer::paintForegroundWithPhase(PaintPhase phase, GraphicsContext* co ntext,
1148 const LayerPaintingInfo& localPaintingInfo, RenderObject* paintingRootForRen derer, LayoutPoint& layerLocation, ClipRect& layerForegroundRect) 1144 const LayerPaintingInfo& localPaintingInfo, RenderObject* paintingRootForRen derer, LayoutPoint& layerLocation, ClipRect& layerForegroundRect)
1149 { 1145 {
1150 PaintInfo paintInfo(context, pixelSnappedIntRect(layerForegroundRect.rect()) , phase, paintingRootForRenderer, localPaintingInfo.rootLayer->renderer()); 1146 PaintInfo paintInfo(context, pixelSnappedIntRect(layerForegroundRect.rect()) , phase, paintingRootForRenderer, localPaintingInfo.rootLayer->renderer());
1151 renderer()->paint(paintInfo, layerLocation); 1147 renderer()->paint(paintInfo, layerLocation);
1152 } 1148 }
1153 1149
1154 void RenderLayer::paintOutline(GraphicsContext* context, const LayerPaintingInfo & localPaintingInfo,
1155 RenderObject* paintingRootForRenderer, LayoutPoint& layerLocation, ClipRect& layerOutlineRect)
1156 {
1157 if (layerOutlineRect.isEmpty())
1158 return;
1159
1160 PaintInfo paintInfo(context, pixelSnappedIntRect(layerOutlineRect.rect()), P aintPhaseSelfOutline, paintingRootForRenderer, localPaintingInfo.rootLayer->rend erer());
1161 clipToRect(localPaintingInfo, context, layerOutlineRect, DoNotIncludeSelfFor BorderRadius);
1162 renderer()->paint(paintInfo, layerLocation);
1163 restoreClip(context, localPaintingInfo.paintDirtyRect, layerOutlineRect);
1164 }
1165
1166 void RenderLayer::paintMask(GraphicsContext* context, const LayerPaintingInfo& l ocalPaintingInfo, 1150 void RenderLayer::paintMask(GraphicsContext* context, const LayerPaintingInfo& l ocalPaintingInfo,
1167 RenderObject* paintingRootForRenderer, LayoutPoint& layerLocation, ClipRect& layerBackgroundRect) 1151 RenderObject* paintingRootForRenderer, LayoutPoint& layerLocation, ClipRect& layerBackgroundRect)
1168 { 1152 {
1169 if (localPaintingInfo.clipToDirtyRect) 1153 if (localPaintingInfo.clipToDirtyRect)
1170 clipToRect(localPaintingInfo, context, layerBackgroundRect, DoNotInclude SelfForBorderRadius); // Mask painting will handle clipping to self. 1154 clipToRect(localPaintingInfo, context, layerBackgroundRect, DoNotInclude SelfForBorderRadius); // Mask painting will handle clipping to self.
1171 1155
1172 // Paint the mask. 1156 // Paint the mask.
1173 // FIXME: Eventually we will collect the region from the fragment itself ins tead of just from the paint info. 1157 // FIXME: Eventually we will collect the region from the fragment itself ins tead of just from the paint info.
1174 PaintInfo paintInfo(context, pixelSnappedIntRect(layerBackgroundRect.rect()) , PaintPhaseMask, paintingRootForRenderer, localPaintingInfo.rootLayer->renderer ()); 1158 PaintInfo paintInfo(context, pixelSnappedIntRect(layerBackgroundRect.rect()) , PaintPhaseMask, paintingRootForRenderer, localPaintingInfo.rootLayer->renderer ());
1175 renderer()->paint(paintInfo, layerLocation); 1159 renderer()->paint(paintInfo, layerLocation);
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1409 // Now check our overflow objects. 1393 // Now check our overflow objects.
1410 hitLayer = hitTestChildren(NormalFlowChildren, rootLayer, request, result, h itTestRect, hitTestLocation, 1394 hitLayer = hitTestChildren(NormalFlowChildren, rootLayer, request, result, h itTestRect, hitTestLocation,
1411 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants); 1395 localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
1412 if (hitLayer) { 1396 if (hitLayer) {
1413 if (!depthSortDescendants) 1397 if (!depthSortDescendants)
1414 return hitLayer; 1398 return hitLayer;
1415 candidateLayer = hitLayer; 1399 candidateLayer = hitLayer;
1416 } 1400 }
1417 1401
1418 LayoutRect layerBounds; 1402 LayoutRect layerBounds;
1419 ClipRect backgroundRect, foregroundRect, outlineRect; 1403 ClipRect backgroundRect, foregroundRect;
1420 ClipRectsContext clipRectsContext(rootLayer, RootRelativeClipRects); 1404 ClipRectsContext clipRectsContext(rootLayer, RootRelativeClipRects);
1421 clipper().calculateRects(clipRectsContext, hitTestRect, layerBounds, backgro undRect, foregroundRect, outlineRect); 1405 clipper().calculateRects(clipRectsContext, hitTestRect, layerBounds, backgro undRect, foregroundRect);
1422 1406
1423 // Next we want to see if the mouse pos is inside the child RenderObjects of the layer. 1407 // Next we want to see if the mouse pos is inside the child RenderObjects of the layer.
1424 if (isSelfPaintingLayer() && foregroundRect.intersects(hitTestLocation)) { 1408 if (isSelfPaintingLayer() && foregroundRect.intersects(hitTestLocation)) {
1425 // Hit test with a temporary HitTestResult, because we only want to comm it to 'result' if we know we're frontmost. 1409 // Hit test with a temporary HitTestResult, because we only want to comm it to 'result' if we know we're frontmost.
1426 HitTestResult tempResult(result.hitTestLocation()); 1410 HitTestResult tempResult(result.hitTestLocation());
1427 if (hitTestContents(request, tempResult, layerBounds, hitTestLocation, H itTestDescendants) 1411 if (hitTestContents(request, tempResult, layerBounds, hitTestLocation, H itTestDescendants)
1428 && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTra nsformState.get())) { 1412 && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTra nsformState.get())) {
1429 if (result.isRectBasedTest()) 1413 if (result.isRectBasedTest())
1430 result.append(tempResult); 1414 result.append(tempResult);
1431 else 1415 else
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
1847 } 1831 }
1848 } 1832 }
1849 1833
1850 void showLayerTree(const blink::RenderObject* renderer) 1834 void showLayerTree(const blink::RenderObject* renderer)
1851 { 1835 {
1852 if (!renderer) 1836 if (!renderer)
1853 return; 1837 return;
1854 showLayerTree(renderer->enclosingLayer()); 1838 showLayerTree(renderer->enclosingLayer());
1855 } 1839 }
1856 #endif 1840 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698