Merge "Support asynchronous svg loading" into devel/master
authorHeeyong Song <heeyong.song@samsung.com>
Tue, 17 May 2022 10:11:45 +0000 (10:11 +0000)
committerGerrit Code Review <gerrit@review>
Tue, 17 May 2022 10:11:45 +0000 (10:11 +0000)
1  2 
automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp

@@@ -23,6 -23,7 +23,7 @@@
  
  #include <dali-toolkit-test-suite-utils.h>
  #include <toolkit-event-thread-callback.h>
+ #include <toolkit-vector-image-renderer.h>
  #include "dummy-control.h"
  
  #include <test-encoded-image-buffer.h>
@@@ -784,25 -785,9 +785,25 @@@ int UtcDaliImageViewAsyncLoadingEncoded
    Property::Map imageMap;
  
    imageMap[ImageVisual::Property::URL]            = url.GetUrl();
 +  imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 600;
 +  imageMap[ImageVisual::Property::DESIRED_WIDTH]  = 600;
 +  imageMap[ImageVisual::Property::ATLASING]       = true;
 +
 +  // No atlasing with big image
 +  ImageView imageView_bigdesired = ImageView::New();
 +  imageView_bigdesired.SetProperty(ImageView::Property::IMAGE, imageMap);
 +  imageView_bigdesired.SetProperty(Toolkit::Control::Property::PADDING, Extents(10u, 10u, 10u, 10u));
 +
 +  imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 0;
 +  imageMap[ImageVisual::Property::DESIRED_WIDTH]  = 0;
 +
 +  // No atlasing with zero desired size
 +  ImageView imageView_nodesired = ImageView::New();
 +  imageView_nodesired.SetProperty(ImageView::Property::IMAGE, imageMap);
 +  imageView_nodesired.SetProperty(Toolkit::Control::Property::PADDING, Extents(10u, 10u, 10u, 10u));
 +
    imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 34;
    imageMap[ImageVisual::Property::DESIRED_WIDTH]  = 34;
 -  imageMap[ImageVisual::Property::ATLASING]       = true;
  
    ImageView imageView = ImageView::New();
    imageView.SetProperty(ImageView::Property::IMAGE, imageMap);
  
    // By default, Aysnc loading is used
    // loading is not started if the actor is offScene
 -
    application.GetScene().Add(imageView);
 +  application.GetScene().Add(imageView_bigdesired);
 +  application.GetScene().Add(imageView_nodesired);
    application.SendNotification();
    application.Render(16);
 +
 +  // loading started, this waits for the loader thread for max 30 seconds
 +  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
 +
    application.Render(16);
    application.SendNotification();
  
@@@ -869,7 -849,6 +870,7 @@@ int UtcDaliImageViewSyncLoadingEncodedB
      // Sync loading is used
      Property::Map syncLoadingMap;
      syncLoadingMap["url"]                = url.GetUrl();
 +    syncLoadingMap["alphaMaskUrl"]       = gImage_34_RGBA;
      syncLoadingMap["desiredHeight"]      = 34;
      syncLoadingMap["desiredWidth"]       = 34;
      syncLoadingMap["synchronousLoading"] = true;
@@@ -2727,12 -2706,7 +2728,7 @@@ int UtcDaliImageViewSyncSVGLoading(void
  
    tet_infoline("ImageView Testing SVG image sync loading");
  
-   // Sync loading, automatic atlasing for small size image
    {
-     TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
-     callStack.Reset();
-     callStack.Enable(true);
      ImageView imageView = ImageView::New();
  
      // Sync loading is used
      DALI_TEST_CHECK(imageView);
  
      application.SendNotification();
-     application.Render(16);
      Vector3 naturalSize = imageView.GetNaturalSize();
  
      DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
@@@ -2761,28 -2734,27 +2756,27 @@@ int UtcDaliImageViewAsyncSVGLoading(voi
  
    tet_infoline("ImageView Testing SVG image async loading");
  
-   // Sync loading, automatic atlasing for small size image
    {
-     TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
-     callStack.Reset();
-     callStack.Enable(true);
      ImageView imageView = ImageView::New();
  
-     // Sync loading is used
-     Property::Map syncLoadingMap;
-     syncLoadingMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
-     syncLoadingMap.Insert(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/svg1.svg");
-     syncLoadingMap.Insert(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, false);
-     imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap);
+     // Async loading is used - default value of SYNCHRONOUS_LOADING is false.
+     Property::Map propertyMap;
+     propertyMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
+     propertyMap.Insert(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/svg1.svg");
+     imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
  
      application.GetScene().Add(imageView);
      DALI_TEST_CHECK(imageView);
  
      application.SendNotification();
+     // Wait for rasterization
+     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+     application.SendNotification();
      application.Render(16);
-     Vector3 naturalSize = imageView.GetNaturalSize();
  
+     Vector3 naturalSize = imageView.GetNaturalSize();
      DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
      DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION);
    }
@@@ -2795,12 -2767,8 +2789,8 @@@ int UtcDaliImageViewSVGLoadingSyncSetIn
  
    tet_infoline("ImageView Testing SVG image async loading");
  
-   // Sync loading, automatic atlasing for small size image
+   // Sync loading
    {
-     TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
-     callStack.Reset();
-     callStack.Enable(true);
      ImageView imageView = ImageView::New();
  
      // Sync loading is used
      DALI_TEST_CHECK(imageView);
  
      application.SendNotification();
+     // Wait for rasterization
+     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+     application.SendNotification();
      application.Render(16);
      Vector3 naturalSize = imageView.GetNaturalSize();
      DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
      DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION);
@@@ -2856,6 -2830,11 +2852,11 @@@ int UtcDaliImageViewSvgLoadingFailure(v
      application.GetScene().Add(imageView);
  
      application.SendNotification();
+     // loading started, this waits for the loader thread
+     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+     application.SendNotification();
      application.Render(16);
  
      DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
      application.GetScene().Add(imageView);
  
      application.SendNotification();
+     // loading started, this waits for the loader thread
+     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+     application.SendNotification();
      application.Render(16);
  
      DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
      application.GetScene().Add(imageView);
  
      application.SendNotification();
+     // loading started, this waits for the loader thread
+     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+     application.SendNotification();
      application.Render(16);
  
      DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
@@@ -3015,6 -3004,44 +3026,44 @@@ int UtcDaliImageViewSvgRasterizationFai
    END_TEST;
  }
  
+ int UtcDaliImageViewSvgChageSize(void)
+ {
+   ToolkitTestApplication application;
+   TestGlAbstraction& gl           = application.GetGlAbstraction();
+   TraceCallStack&    textureTrace = gl.GetTextureTrace();
+   textureTrace.Enable(true);
+   ImageView imageView = ImageView::New(TEST_SVG_FILE_NAME);
+   application.GetScene().Add(imageView);
+   application.SendNotification();
+   // loading started, this waits for the loader thread
+   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+   application.SendNotification();
+   application.Render(16);
+   DALI_TEST_EQUALS(Test::VectorImageRenderer::GetLoadCount(), 1, TEST_LOCATION);
+   // Change actor size, then rasterization should be done again
+   imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+   application.SendNotification();
+   // loading started, this waits for the loader thread
+   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+   application.SendNotification();
+   application.Render(16);
+   // We should not load the file again.
+   DALI_TEST_EQUALS(Test::VectorImageRenderer::GetLoadCount(), 1, TEST_LOCATION);
+   END_TEST;
+ }
  int UtcDaliImageViewTVGLoading(void)
  {
    ToolkitTestApplication application;
    tet_infoline("ImageView Testing TVG image loading");
  
    {
-     ImageView imageView = ImageView::New();
-     imageView.SetImage(TEST_RESOURCE_DIR "/test.tvg");
+     ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/test.tvg");
      application.GetScene().Add(imageView);
      DALI_TEST_CHECK(imageView);
+     application.SendNotification();
+     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+     application.SendNotification();
+     application.Render(16);
      Vector3 naturalSize = imageView.GetNaturalSize();
  
      DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
@@@ -3603,7 -3635,7 +3657,7 @@@ int UtcDaliImageViewCheckVariousCaseSen
  
    // Test broken case
    TestResourceReadyUrl(1, 0, 0, "invalid.jpg", "", TEST_LOCATION);
-   TestResourceReadyUrl(0, 0, 0, "invalid.svg", "", TEST_LOCATION); // 0 rasterize
+   TestResourceReadyUrl(1, 0, 0, "invalid.svg", "", TEST_LOCATION);
    TestResourceReadyUrl(1, 0, 0, "invalid.9.png", "", TEST_LOCATION);
    TestResourceReadyUrl(1, 0, 0, "invalid.gif", "", TEST_LOCATION);  // 1 image loading
    TestResourceReadyUrl(0, 0, 0, "invalid.json", "", TEST_LOCATION); // 0 rasterize
  
    // Test broken case
    TestResourceReadyUrl(0, 1, 0, "invalid.jpg", "", TEST_LOCATION);
-   TestResourceReadyUrl(0, 1, 0, "invalid.svg", "", TEST_LOCATION); // 0 rasterize
+   TestResourceReadyUrl(0, 1, 0, "invalid.svg", "", TEST_LOCATION);
    TestResourceReadyUrl(0, 1, 0, "invalid.9.png", "", TEST_LOCATION);
    TestResourceReadyUrl(0, 1, 0, "invalid.gif", "", TEST_LOCATION);
    TestResourceReadyUrl(0, 1, 0, "invalid.json", "", TEST_LOCATION); // 0 rasterize