Support CutoutPolicy::CUTOUT_OUTSIDE 33/318133/6
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 13 Jan 2025 08:51:09 +0000 (17:51 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Mon, 20 Jan 2025 10:13:33 +0000 (10:13 +0000)
Let we support cutout policy to ignore outside of view, for color visual.
It will be useful if user want to impelemnt InnerShadow effect as visual level

Change-Id: I57b83e3acfd9318a6a2b46fbff4434f6196a8156
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp
dali-toolkit/devel-api/visuals/color-visual-properties-devel.h
dali-toolkit/internal/graphics/shaders/color-visual-shader.frag
dali-toolkit/internal/visuals/color/color-visual.cpp

index d6d5b24d808e36220af0103fe8e8997aaae955bc..8af9b8502b7e15e7e27f7f146d503c683a08df57 100644 (file)
@@ -7004,6 +7004,7 @@ int UtcDaliVisualCutoutPolicyChangeShader01(void)
   static std::vector<UniformData> customUniforms =
     {
       UniformData("uCutoutWithCornerRadius", Property::Type::INTEGER),
+      UniformData("uCutoutOutside", Property::Type::INTEGER),
     };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
@@ -7011,8 +7012,8 @@ int UtcDaliVisualCutoutPolicyChangeShader01(void)
 
   VisualFactory factory = VisualFactory::Get();
 
-  // Test (Enable/Disable) CornerRadius, (Enable/Disable) Borderline, (Enable/Disable) Blur, and 3 kind of CutoutPolicy
-  for(int testCase = 0; testCase < 2 * 2 * 2 * 3; ++testCase)
+  // Test (Enable/Disable) CornerRadius, (Enable/Disable) Borderline, (Enable/Disable) Blur, and 5 kind of CutoutPolicy
+  for(int testCase = 0; testCase < 2 * 2 * 2 * 5; ++testCase)
   {
     const bool enableCornerRadius = (testCase & 1);
     const bool enableBorderline   = (testCase & 2);
@@ -7021,7 +7022,9 @@ int UtcDaliVisualCutoutPolicyChangeShader01(void)
     // clang-format off
     const DevelColorVisual::CutoutPolicy::Type cutoutPolicy = (testCase / 8) == 0 ? DevelColorVisual::CutoutPolicy::NONE :
                                                               (testCase / 8) == 1 ? DevelColorVisual::CutoutPolicy::CUTOUT_VIEW :
-                                                                                    DevelColorVisual::CutoutPolicy::CUTOUT_VIEW_WITH_CORNER_RADIUS;
+                                                              (testCase / 8) == 2 ? DevelColorVisual::CutoutPolicy::CUTOUT_VIEW_WITH_CORNER_RADIUS :
+                                                              (testCase / 8) == 3 ? DevelColorVisual::CutoutPolicy::CUTOUT_OUTSIDE :
+                                                                                    DevelColorVisual::CutoutPolicy::CUTOUT_OUTSIDE_WITH_CORNER_RADIUS;
     // clang-format on
 
     Property::Map propertyMap;
@@ -7069,7 +7072,8 @@ int UtcDaliVisualCutoutPolicyChangeShader01(void)
     if(cutoutPolicy != DevelColorVisual::CutoutPolicy::NONE)
     {
       auto& gl = application.GetGlAbstraction();
-      DALI_TEST_EQUALS(gl.CheckUniformValue<int>("uCutoutWithCornerRadius", cutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_VIEW_WITH_CORNER_RADIUS ? 1 : 0), true, TEST_LOCATION);
+      DALI_TEST_EQUALS(gl.CheckUniformValue<int>("uCutoutWithCornerRadius", (cutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_VIEW_WITH_CORNER_RADIUS || cutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_OUTSIDE_WITH_CORNER_RADIUS) ? 1 : 0), true, TEST_LOCATION);
+      DALI_TEST_EQUALS(gl.CheckUniformValue<int>("uCutoutOutside", (cutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_OUTSIDE || cutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_OUTSIDE_WITH_CORNER_RADIUS) ? 1 : 0), true, TEST_LOCATION);
     }
     dummyControl.Unparent();
 
index 105a5bc8ab5ab01731d1b8a05f8d9f46dda3de81..065bbab1c6aefa984892d9e42713f9696a0e68c2 100644 (file)
@@ -68,9 +68,11 @@ namespace CutoutPolicy
 {
 enum Type
 {
-  NONE,                           ///< Fully render the visual area (Default)
-  CUTOUT_VIEW,                    ///< Cutout the area of the view. It will use size of view.
-  CUTOUT_VIEW_WITH_CORNER_RADIUS, ///< Cutout the area of the view include visual's corner radius. It will use size of view.
+  NONE,                              ///< Fully render the visual area (Default)
+  CUTOUT_VIEW,                       ///< Cutout the area of the view. It will use size of view.
+  CUTOUT_VIEW_WITH_CORNER_RADIUS,    ///< Cutout the area of the view include visual's corner radius. It will use size of view.
+  CUTOUT_OUTSIDE,                    ///< Cutout the outside area of the view. It will use size of view.
+  CUTOUT_OUTSIDE_WITH_CORNER_RADIUS, ///< Cutout the outside area of the view include visual's corner radius. It will use size of view.
 };
 } // namespace CutoutPolicy
 
index 363a56a8071e8e53afbeb37c5a7352b694d04453..c0eb82381518a665a36fba170af4799652d40afa 100644 (file)
@@ -27,6 +27,7 @@ UNIFORM_BLOCK FragBlock
 
 #if defined(IS_REQUIRED_CUTOUT)
     UNIFORM lowp int uCutoutWithCornerRadius;
+    UNIFORM lowp int uCutoutOutside;
 #endif
 
 #ifdef IS_REQUIRED_SQUIRCLE_CORNER
@@ -395,6 +396,7 @@ void main()
 
 #ifdef IS_REQUIRED_CUTOUT
   mediump float discardOpacity = 1.0;
+  lowp int cutoutInsideOccured = 0;
 
   if(abs(vPositionFromCenter.x) <= uSize.x * 0.5 && abs(vPositionFromCenter.y) <= uSize.y * 0.5)
   {
@@ -414,14 +416,26 @@ void main()
     {
       discardOpacity = 0.0;
     }
-
-    if(discardOpacity < 0.001)
-    {
-      discard;
-    }
 #else
-    discard;
+    cutoutInsideOccured = 1;
+#endif
+  }
+
+#if defined(IS_REQUIRED_ROUNDED_CORNER)
+  if(uCutoutOutside == 1)
+  {
+    discardOpacity = 1.0 - discardOpacity;
+  }
+
+  if(discardOpacity < 0.001)
+  {
+    cutoutInsideOccured = 1;
+  }
 #endif
+
+  if((uCutoutOutside ^ cutoutInsideOccured) == 0)
+  {
+    discard;
   }
 #endif
 
index fbd455ca2af11aaeef6141b8577acddb71f162e8..f2d6f888c7327ae32f6db680bf59bd1032da0a63 100644 (file)
@@ -49,6 +49,8 @@ DALI_ENUM_TO_STRING_TABLE_BEGIN(CUTOUT_POLICY)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::Toolkit::DevelColorVisual::CutoutPolicy, NONE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::Toolkit::DevelColorVisual::CutoutPolicy, CUTOUT_VIEW)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::Toolkit::DevelColorVisual::CutoutPolicy, CUTOUT_VIEW_WITH_CORNER_RADIUS)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::Toolkit::DevelColorVisual::CutoutPolicy, CUTOUT_OUTSIDE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::Toolkit::DevelColorVisual::CutoutPolicy, CUTOUT_OUTSIDE_WITH_CORNER_RADIUS)
 DALI_ENUM_TO_STRING_TABLE_END(CUTOUT_POLICY)
 
 } // unnamed namespace
@@ -237,8 +239,10 @@ void ColorVisual::OnInitialize()
 
   if(IsCutoutRequired())
   {
-    int cutoutWithCornerRadius = (mCutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_VIEW_WITH_CORNER_RADIUS) ? 1 : 0;
+    int cutoutWithCornerRadius = ((mCutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_VIEW_WITH_CORNER_RADIUS) || (mCutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_OUTSIDE_WITH_CORNER_RADIUS));
+    int cutoutOutside          = ((mCutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_OUTSIDE) || (mCutoutPolicy == DevelColorVisual::CutoutPolicy::CUTOUT_OUTSIDE_WITH_CORNER_RADIUS));
     mImpl->mRenderer.RegisterUniqueProperty("uCutoutWithCornerRadius", cutoutWithCornerRadius);
+    mImpl->mRenderer.RegisterUniqueProperty("uCutoutOutside", cutoutOutside);
   }
 
   // Register transform properties