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

Unified Diff: sky/engine/core/rendering/RenderLayer.cpp

Issue 939793003: Change the return value of RenderLayer::hitTestLayer. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: fix indentation Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/engine/core/rendering/RenderLayer.h ('k') | sky/engine/core/rendering/RenderView.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/engine/core/rendering/RenderLayer.cpp
diff --git a/sky/engine/core/rendering/RenderLayer.cpp b/sky/engine/core/rendering/RenderLayer.cpp
index c789bab4e2445764c6846adfde3ae3e11ae4fdc3..37a3337f4332d393b09f653929a3195b6351c9c9 100644
--- a/sky/engine/core/rendering/RenderLayer.cpp
+++ b/sky/engine/core/rendering/RenderLayer.cpp
@@ -847,11 +847,8 @@ PassRefPtr<HitTestingTransformState> RenderLayer::createLocalTransformState(Rend
}
-static bool isHitCandidate(const RenderLayer* hitLayer, bool canDepthSort, double* zOffset, const HitTestingTransformState* transformState)
+static bool isHitCandidate(bool canDepthSort, double* zOffset, const HitTestingTransformState* transformState)
{
- if (!hitLayer)
- return false;
-
// The hit layer is depth-sorting with other layers, so just say that it was hit.
if (canDepthSort)
return true;
@@ -879,7 +876,7 @@ static bool isHitCandidate(const RenderLayer* hitLayer, bool canDepthSort, doubl
//
// If zOffset is non-null (which indicates that the caller wants z offset information),
// *zOffset on return is the z offset of the hit point relative to the containing flattening layer.
-RenderLayer* RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult& result,
+bool RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult& result,
const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation,
const HitTestingTransformState* transformState, double* zOffset)
{
@@ -966,26 +963,17 @@ RenderLayer* RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLayer* cont
zOffsetForContentsPtr = zOffset;
}
- // This variable tracks which layer the mouse ends up being inside.
- RenderLayer* candidateLayer = 0;
-
// Begin by walking our list of positive layers from highest z-index down to the lowest z-index.
- RenderLayer* hitLayer = hitTestChildren(PositiveZOrderChildren, rootLayer, request, result, localHitTestRect, localHitTestLocation,
- localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
- if (hitLayer) {
- if (!depthSortDescendants)
- return hitLayer;
- candidateLayer = hitLayer;
- }
+ bool hitLayer = hitTestChildren(PositiveZOrderChildren, rootLayer, request, result, localHitTestRect, localHitTestLocation,
+ localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
+ if (hitLayer && !depthSortDescendants)
+ return true;
// Now check our overflow objects.
hitLayer = hitTestChildren(NormalFlowChildren, rootLayer, request, result, localHitTestRect, localHitTestLocation,
- localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
- if (hitLayer) {
- if (!depthSortDescendants)
- return hitLayer;
- candidateLayer = hitLayer;
- }
+ localTransformState.get(), zOffsetForDescendantsPtr, zOffset, unflattenedTransformState.get(), depthSortDescendants);
+ if (hitLayer && !depthSortDescendants)
+ return true;
LayoutRect layerBounds;
// FIXME(sky): Remove foregroundRect. It's unused.
@@ -998,21 +986,21 @@ RenderLayer* RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLayer* cont
// Hit test with a temporary HitTestResult, because we only want to commit to 'result' if we know we're frontmost.
HitTestResult tempResult(result.hitTestLocation());
if (hitTestContents(request, tempResult, layerBounds, localHitTestLocation)
- && isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTransformState.get())) {
+ && isHitCandidate(false, zOffsetForContentsPtr, unflattenedTransformState.get())) {
if (result.isRectBasedTest())
result.append(tempResult);
else
result = tempResult;
if (!depthSortDescendants)
- return this;
+ return true;
// Foreground can depth-sort with descendant layers, so keep this as a candidate.
- candidateLayer = this;
+ hitLayer = true;
} else if (result.isRectBasedTest()) {
result.append(tempResult);
}
}
- return candidateLayer;
+ return hitLayer;
}
bool RenderLayer::hitTestContents(const HitTestRequest& request, HitTestResult& result, const LayoutRect& layerBounds, const HitTestLocation& hitTestLocation) const
@@ -1041,7 +1029,7 @@ bool RenderLayer::hitTestContents(const HitTestRequest& request, HitTestResult&
return true;
}
-RenderLayer* RenderLayer::hitTestChildren(ChildrenIteration childrentoVisit, RenderLayer* rootLayer,
+bool RenderLayer::hitTestChildren(ChildrenIteration childrentoVisit, RenderLayer* rootLayer,
const HitTestRequest& request, HitTestResult& result,
const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation,
const HitTestingTransformState* transformState,
@@ -1052,21 +1040,19 @@ RenderLayer* RenderLayer::hitTestChildren(ChildrenIteration childrentoVisit, Ren
if (!hasSelfPaintingLayerDescendant())
return 0;
- RenderLayer* resultLayer = 0;
+ bool hitLayer = false;
RenderLayerStackingNodeReverseIterator iterator(*m_stackingNode, childrentoVisit);
while (RenderLayerStackingNode* child = iterator.next()) {
RenderLayer* childLayer = child->layer();
- RenderLayer* hitLayer = 0;
HitTestResult tempResult(result.hitTestLocation());
- hitLayer = childLayer->hitTestLayer(rootLayer, this, request, tempResult, hitTestRect, hitTestLocation, transformState, zOffsetForDescendants);
+ hitLayer |= childLayer->hitTestLayer(rootLayer, this, request, tempResult, hitTestRect, hitTestLocation, transformState, zOffsetForDescendants);
// If it a rect-based test, we can safely append the temporary result since it might had hit
// nodes but not necesserily had hitLayer set.
if (result.isRectBasedTest())
result.append(tempResult);
- if (isHitCandidate(hitLayer, depthSortDescendants, zOffset, unflattenedTransformState)) {
- resultLayer = hitLayer;
+ if (hitLayer && isHitCandidate(depthSortDescendants, zOffset, unflattenedTransformState)) {
if (!result.isRectBasedTest())
result = tempResult;
if (!depthSortDescendants)
@@ -1074,7 +1060,7 @@ RenderLayer* RenderLayer::hitTestChildren(ChildrenIteration childrentoVisit, Ren
}
}
- return resultLayer;
+ return hitLayer;
}
bool RenderLayer::intersectsDamageRect(const LayoutRect& layerBounds, const LayoutRect& damageRect, const RenderLayer* rootLayer, const LayoutPoint* offsetFromRoot) const
« no previous file with comments | « sky/engine/core/rendering/RenderLayer.h ('k') | sky/engine/core/rendering/RenderView.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698