From: Tom Robinson Date: Fri, 21 Oct 2016 11:31:06 +0000 (+0100) Subject: Hit test includes clipping actors as well as their children X-Git-Tag: dali_1.2.12~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;ds=sidebyside;h=refs%2Fchanges%2F64%2F93264%2F3;p=platform%2Fcore%2Fuifw%2Fdali-core.git Hit test includes clipping actors as well as their children Change-Id: Id9a4917fc4a40b57a32ef8017b0ee1f8488d0fe2 --- diff --git a/automated-tests/src/dali/utc-Dali-HoverProcessing.cpp b/automated-tests/src/dali/utc-Dali-HoverProcessing.cpp index fd4a7e5..93630ed 100644 --- a/automated-tests/src/dali/utc-Dali-HoverProcessing.cpp +++ b/automated-tests/src/dali/utc-Dali-HoverProcessing.cpp @@ -1264,6 +1264,13 @@ int UtcDaliHoverClippingActor(void) clippingActor.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN ); stage.Add( clippingActor ); + // Add a child to the clipped region. + Actor clippingChild = Actor::New(); + clippingChild.SetSize( 50.0f, 50.0f ); + clippingChild.SetPosition( 25.0f, 25.0f ); + clippingChild.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + clippingActor.Add( clippingChild ); + // Render and notify. application.SendNotification(); application.Render(); @@ -1273,9 +1280,9 @@ int UtcDaliHoverClippingActor(void) HoverEventFunctor functor( data ); actor.HoveredSignal().Connect( &application, functor ); - // Emit an event within clipped area. + // Emit an event within clipped area - no hit. application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 10.0f, 10.0f ) ) ); - DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); // Emit an event outside the clipped area but within the actor area, we should have a hit. @@ -1283,5 +1290,12 @@ int UtcDaliHoverClippingActor(void) DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); + clippingChild.HoveredSignal().Connect( &application, functor ); + + // Emit an event inside part of the child which is within the clipped area, we should have a hit. + application.ProcessEvent( GenerateSingleHover( TouchPoint::Started, Vector2( 30.0f, 30.0f ) ) ); + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + data.Reset(); + END_TEST; } diff --git a/automated-tests/src/dali/utc-Dali-TouchDataProcessing.cpp b/automated-tests/src/dali/utc-Dali-TouchDataProcessing.cpp index 9b519d3..2ec12df 100644 --- a/automated-tests/src/dali/utc-Dali-TouchDataProcessing.cpp +++ b/automated-tests/src/dali/utc-Dali-TouchDataProcessing.cpp @@ -1542,6 +1542,13 @@ int UtcDaliTouchDataClippedActor(void) clippingActor.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN ); stage.Add( clippingActor ); + // Add a child to the clipped region. + Actor clippingChild = Actor::New(); + clippingChild.SetSize( 50.0f, 50.0f ); + clippingChild.SetPosition( 25.0f, 25.0f ); + clippingChild.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + clippingActor.Add( clippingChild ); + // Render and notify. application.SendNotification(); application.Render(); @@ -1551,9 +1558,9 @@ int UtcDaliTouchDataClippedActor(void) TouchDataFunctor functor( data ); actor.TouchSignal().Connect( &application, functor ); - // Emit an event within clipped area. + // Emit an event within clipped area - no hit. application.ProcessEvent( GenerateSingleTouch( PointState::DOWN, Vector2( 10.0f, 10.0f ) ) ); - DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); // Emit an event outside the clipped area but within the actor area, we should have a hit. @@ -1561,6 +1568,13 @@ int UtcDaliTouchDataClippedActor(void) DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); + clippingChild.TouchSignal().Connect( &application, functor ); + + // Emit an event inside part of the child which is within the clipped area, we should have a hit. + application.ProcessEvent( GenerateSingleTouch( PointState::DOWN, Vector2( 30.0f, 30.0f ) ) ); + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + data.Reset(); + END_TEST; } diff --git a/automated-tests/src/dali/utc-Dali-TouchProcessing.cpp b/automated-tests/src/dali/utc-Dali-TouchProcessing.cpp index 82d514b..6e48db1 100644 --- a/automated-tests/src/dali/utc-Dali-TouchProcessing.cpp +++ b/automated-tests/src/dali/utc-Dali-TouchProcessing.cpp @@ -1316,6 +1316,13 @@ int UtcDaliTouchClippingActor(void) clippingActor.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN ); stage.Add( clippingActor ); + // Add a child to the clipped region. + Actor clippingChild = Actor::New(); + clippingChild.SetSize( 50.0f, 50.0f ); + clippingChild.SetPosition( 25.0f, 25.0f ); + clippingChild.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + clippingActor.Add( clippingChild ); + // Render and notify. application.SendNotification(); application.Render(); @@ -1325,9 +1332,9 @@ int UtcDaliTouchClippingActor(void) TouchEventFunctor functor( data ); actor.TouchedSignal().Connect( &application, functor ); - // Emit an event within clipped area. + // Emit an event within clipped area - no hit. application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) ); - DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); // Emit an event outside the clipped area but within the actor area, we should have a hit. @@ -1335,6 +1342,13 @@ int UtcDaliTouchClippingActor(void) DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); data.Reset(); + clippingChild.TouchedSignal().Connect( &application, functor ); + + // Emit an event inside part of the child which is within the clipped area, we should have a hit. + application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 30.0f, 30.0f ) ) ); + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + data.Reset(); + END_TEST; } diff --git a/dali/internal/event/events/hit-test-algorithm-impl.cpp b/dali/internal/event/events/hit-test-algorithm-impl.cpp index d27c5f2..62ad33f 100644 --- a/dali/internal/event/events/hit-test-algorithm-impl.cpp +++ b/dali/internal/event/events/hit-test-algorithm-impl.cpp @@ -233,7 +233,8 @@ HitActor HitTestWithinLayer( Actor& actor, // Here we calculate a comparison mask by setting all the bits up to the current depth value. // EG. a depth of 4 (10000 binary) = a mask of 1111 binary. // This allows us a fast way of comparing all bits are set up to this depth. - unsigned int clippingDepthMask = ( 1u << clippingDepth ) - 1u; + // Note: If the current Actor has clipping, that is included in the depth mask too. + unsigned int clippingDepthMask = ( 1u << newClippingDepth ) - 1u; // The two masks must be equal to be a hit, as we are already assuming a hit // (for non-clipping mode) then they must be not-equal to disqualify the hit.