[4.0] Fix scissor clipping 73/170873/1
authorHeeyong Song <heeyong.song@samsung.com>
Wed, 21 Feb 2018 03:51:52 +0000 (12:51 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Fri, 23 Feb 2018 03:53:40 +0000 (12:53 +0900)
Sibling case should be checked seperately.

Change-Id: Ic8531d1c408a61c01ddd792a31b03734c1e95131

automated-tests/src/dali/utc-Dali-Actor.cpp
dali/internal/render/common/render-algorithms.cpp

index 1ee475f..de776df 100644 (file)
@@ -4467,8 +4467,8 @@ int UtcDaliActorPropertyScissorClippingActorNested02(void)
               |
         ┌─────┐─────┐
         A     C     D
-        |
-        B
+        |           |
+        B           E
   */
 
   const Vector2 stageSize( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT );
@@ -4476,12 +4476,14 @@ int UtcDaliActorPropertyScissorClippingActorNested02(void)
   const Vector2 sizeB{ stageSize.width, stageSize.height * 0.05f };
   const Vector2 sizeC{ stageSize.width, stageSize.height * 0.25f };
   const Vector2 sizeD{ stageSize.width, stageSize.height * 0.25f };
+  const Vector2 sizeE{ stageSize.width, stageSize.height * 0.05f };
 
   // Create a clipping actors.
   Actor clippingActorA = CreateActorWithContent( sizeA.width, sizeA.height );
   Actor clippingActorB = CreateActorWithContent( sizeB.width, sizeB.height );
   Actor clippingActorC = CreateActorWithContent( sizeC.width, sizeC.height );
   Actor clippingActorD = CreateActorWithContent( sizeD.width, sizeD.height );
+  Actor clippingActorE = CreateActorWithContent( sizeE.width, sizeE.height );
 
   clippingActorA.SetParentOrigin( ParentOrigin::CENTER_LEFT );
   clippingActorA.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
@@ -4499,15 +4501,20 @@ int UtcDaliActorPropertyScissorClippingActorNested02(void)
   clippingActorD.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
   clippingActorD.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_TO_BOUNDING_BOX );
 
+  clippingActorE.SetParentOrigin( ParentOrigin::CENTER_LEFT );
+  clippingActorE.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
+
   clippingActorA.SetPosition( 0.0f, -200.0f, 0.0f );
   clippingActorB.SetPosition( 0.0f, 0.0f, 0.0f );
   clippingActorC.SetPosition( 0.0f, 100.0f, 0.0f );
   clippingActorD.SetPosition( 0.0f, 0.0f, 0.0f );
+  clippingActorE.SetPosition( 0.0f, 0.0f, 0.0f );
 
   Stage::GetCurrent().Add( clippingActorA );
   clippingActorA.Add( clippingActorB );
   Stage::GetCurrent().Add( clippingActorC );
   Stage::GetCurrent().Add( clippingActorD );
+  clippingActorD.Add( clippingActorE );
 
   // Gather the call trace.
   GenerateTrace( application, enabledDisableTrace, scissorTrace );
@@ -4528,6 +4535,7 @@ int UtcDaliActorPropertyScissorClippingActorNested02(void)
   DALI_TEST_CHECK( scissorTrace.FindMethodAndParams( "Scissor", clipB ) );
   DALI_TEST_CHECK( scissorTrace.FindMethodAndParams( "Scissor", clipC ) );
   DALI_TEST_CHECK( scissorTrace.FindMethodAndParams( "Scissor", clipD ) );
+  DALI_TEST_CHECK( scissorTrace.CountMethod( "Scissor" ) == 4 );    // Scissor rect should not be changed in clippingActorE case. So count should be 4.
 
   END_TEST;
 }
index 4559a73..9e2c900 100644 (file)
@@ -244,9 +244,9 @@ inline void RenderAlgorithms::SetupScissorClipping( const RenderItem& item, Cont
   // So we know if we are at depth 4 and the stackDepth is 5, that we have gone up.
   // If the depth is the same then we are effectively part of a different sub-tree from the parent, we must also remove the current clip.
   // Note: Stack depth must always be at least 1, as we will have the layer or stage size as the root value.
-  if( ( childStackDepth > 0u ) && ( scissorDepth <= childStackDepth ) )
+  if( ( childStackDepth > 0u ) && ( scissorDepth < childStackDepth ) )
   {
-    while( scissorDepth <= childStackDepth )  // Pop until sibling
+    while( scissorDepth < childStackDepth )
     {
       mScissorStack.pop_back();
       --childStackDepth;
@@ -255,7 +255,7 @@ inline void RenderAlgorithms::SetupScissorClipping( const RenderItem& item, Cont
     // We traversed up the tree, we need to apply a new scissor rectangle (unless we are at the root).
     traversedUpTree = true;
   }
-  else if( clippingNode && childStackDepth > 0u && childStackDepth == scissorDepth ) // case of sibling clip area
+  if( clippingNode && childStackDepth > 0u && childStackDepth == scissorDepth ) // case of sibling clip area
   {
     mScissorStack.pop_back();
   }