[Tizen] Use update object size in CalculateActorScreenPosition 75/272775/3
authorHeeyong Song <heeyong.song@samsung.com>
Thu, 24 Mar 2022 06:56:08 +0000 (15:56 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Tue, 5 Apr 2022 02:50:37 +0000 (11:50 +0900)
Change-Id: I475166706a0eb4defd1761ce56d185da7fe753a1

automated-tests/src/dali/utc-Dali-Actor.cpp
dali/internal/event/actors/actor-coords.cpp

index 35a756c..3755f84 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -7014,6 +7014,51 @@ int UtcDaliActorGetScreenPositionPositionUsesAnchorPointFalse(void)
   END_TEST;
 }
 
+int UtcDaliActorGetScreenPositionResizeScene(void)
+{
+  tet_infoline("UtcDaliActorGetScreenPositionResizeScene Check screen position after resizing the scene size");
+
+  TestApplication    application;
+  Integration::Scene scene = application.GetScene();
+
+  Actor actorA = Actor::New();
+  actorA.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+  actorA.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  actorA.SetProperty(Actor::Property::SIZE, Vector2(10.0f, 10.0f));
+
+  scene.Add(actorA);
+
+  application.SendNotification();
+  application.Render();
+
+  Vector2 sceneSize           = scene.GetSize();
+  Vector2 actorScreenPosition = actorA.GetProperty(Actor::Property::SCREEN_POSITION).Get<Vector2>();
+
+  DALI_TEST_EQUALS(actorScreenPosition, sceneSize / 2, TEST_LOCATION);
+
+  // Resize the scene
+  Vector2 newSize(1000.0f, 2000.0f);
+  DALI_TEST_CHECK(scene.GetSize() != newSize);
+
+  scene.SurfaceResized(newSize.width, newSize.height);
+
+  actorScreenPosition = actorA.GetProperty(Actor::Property::SCREEN_POSITION).Get<Vector2>();
+
+  // The screen position should not be updated yet
+  DALI_TEST_EQUALS(actorScreenPosition, sceneSize / 2, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render();
+
+  actorScreenPosition = actorA.GetProperty(Actor::Property::SCREEN_POSITION).Get<Vector2>();
+
+  // The screen position should be updated
+  sceneSize = scene.GetSize();
+  DALI_TEST_EQUALS(actorScreenPosition, sceneSize / 2, TEST_LOCATION);
+
+  END_TEST;
+}
+
 int utcDaliActorPositionUsesAnchorPoint(void)
 {
   TestApplication application;
index 7a7275a..ae5eaba 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -136,7 +136,8 @@ const Vector2 CalculateActorScreenPosition(const Actor& actor, BufferIndex buffe
     worldPosition -= cameraPosition;
 
     Vector3 actorSize = node.GetSize(bufferIndex) * node.GetWorldScale(bufferIndex);
-    Vector2 halfSceneSize(scene.GetSize() * 0.5f); // World position origin is center of scene
+    auto    sceneSize = scene.GetCurrentSurfaceRect();                      // Use the update object's size
+    Vector2 halfSceneSize(sceneSize.width * 0.5f, sceneSize.height * 0.5f); // World position origin is center of scene
     Vector3 halfActorSize(actorSize * 0.5f);
     Vector3 anchorPointOffSet = halfActorSize - actorSize * actor.GetAnchorPointForPosition();
     return Vector2(halfSceneSize.width + worldPosition.x - anchorPointOffSet.x,