evas vg json: refactor masks construct 67/267867/3
authorMichal Maciola <m.maciola@samsung.com>
Fri, 10 Dec 2021 15:56:35 +0000 (16:56 +0100)
committerChun <jykeon@samsung.com>
Mon, 3 Jan 2022 02:20:10 +0000 (02:20 +0000)
This patch changes how nodes that have masks are handled.
TVG doesn't implement masking as mask Substract/Intersect/Difference.
If such masks was used, for most cases, the whole node was masked and
incorrectly invisible. After this patch it should be working correctly
(or just better) for most basic cases with a single mask.

Change-Id: I9204255b79bc6adf551a844de156a8d3e3e41665

src/static_libs/vg_common/vg_common_json.c

index d79a737..7117872 100644 (file)
@@ -260,56 +260,36 @@ _construct_mask_nodes(Tvg_Paint *parent, LOTMask *mask, int depth EINA_UNUSED)
 static Tvg_Paint*
 _construct_masks(Tvg_Paint *mtarget, LOTMask *masks, unsigned int mask_cnt, int depth)
 {
+   //FIXME : TVG doesn't implement masking as mask Substract/Intersect/Difference nor allow for embeded masks.
+   //Implementation below will work correctly only for basic cases: multiple MaskAdd or single mask of other type.
    Tvg_Paint *msource = tvg_scene_new();
-   tvg_paint_set_composite_method(mtarget, msource, TVG_COMPOSITE_METHOD_ALPHA_MASK);
-   mtarget = msource;
+   LOTMaskType ptype = masks[0].mMode;
 
    //Make mask layers
    for (unsigned int i = 0; i < mask_cnt; i++)
      {
         LOTMask *mask = &masks[i];
-        _construct_mask_nodes(msource, mask, depth + 1);
 
 #if DEBUG
         for (int i = 0; i < depth; i++) printf("    ");
-        printf("[mask %03d] mode:%d\n", i, mask->mMode);
+        printf("[mask %03d] mode:%d%s\n", i, mask->mMode, (mask->mMode != ptype)?" NOT SUPPORTED-SKIPPING":"");
 #endif
 
-        //FIX_TVG: mask->mMode not supported
-#if 0
-        Efl_Gfx_Vg_Composite_Method mask_mode;
-        switch (mask->mMode)
-          {
-           case MaskSubstract:
-              mask_mode = EFL_GFX_VG_COMPOSITE_METHOD_MASK_SUBSTRACT;
-              break;
-           case MaskIntersect:
-              mask_mode = EFL_GFX_VG_COMPOSITE_METHOD_MASK_INTERSECT;
-              break;
-           case MaskDifference:
-              mask_mode = EFL_GFX_VG_COMPOSITE_METHOD_MASK_DIFFERENCE;
-              break;
-           case MaskAdd:
-           default:
-              mask_mode = EFL_GFX_VG_COMPOSITE_METHOD_MASK_ADD;
-              break;
-          }
-        efl_canvas_vg_node_comp_method_set(mtarget, msource, mask_mode);
-        mtarget = msource;
-#endif
+        //FIXME: Temporary solution for supporting basic masks only
+        if (mask->mMode != ptype) continue;
+        _construct_mask_nodes(msource, mask, depth + 1);
      }
-   return mtarget;
+
+   tvg_paint_set_composite_method(mtarget, msource, (ptype == MaskSubstract) ? TVG_COMPOSITE_METHOD_INVERSE_ALPHA_MASK : TVG_COMPOSITE_METHOD_ALPHA_MASK);
+   return msource;
 }
 
 static void
 _update_vg_tree(Tvg_Paint *root, const LOTLayerNode *layer, int depth EINA_UNUSED)
 {
-   Tvg_Paint *ptree = NULL;
-
    //Note: We assume that if matte is valid, next layer must be a matte source.
    Tvg_Composite_Method matte_mode = TVG_COMPOSITE_METHOD_NONE;
-   Tvg_Paint *mtarget = NULL;
-   LOTLayerNode *mlayer = NULL;
+   Tvg_Paint *ptree = NULL;
 
    tvg_paint_set_opacity(root, layer->mAlpha);
 
@@ -325,13 +305,12 @@ _update_vg_tree(Tvg_Paint *root, const LOTLayerNode *layer, int depth EINA_UNUSE
 
         if (!clayer->mVisible)
           {
-             if (ptree && matte_mode != TVG_COMPOSITE_METHOD_NONE)
-               tvg_paint_set_opacity(ptree, 0);
+             //If layer has some masking layers, skip them
+             while (clayer->mMatte != MatteNone)
+               {
+                  clayer = layer->mLayerList.ptr[++i];
+               }
              matte_mode = TVG_COMPOSITE_METHOD_NONE;
-             mtarget = NULL;
-
-             //If layer has a masking layer, skip it
-             if (clayer->mMatte != MatteNone) i++;
              continue;
           }
 
@@ -346,7 +325,6 @@ _update_vg_tree(Tvg_Paint *root, const LOTLayerNode *layer, int depth EINA_UNUSE
         else
           {
              tvg_paint_set_composite_method(ptree, ctree, matte_mode);
-             mtarget = ctree;
           }
 
         ptree = ctree;
@@ -378,15 +356,8 @@ _update_vg_tree(Tvg_Paint *root, const LOTLayerNode *layer, int depth EINA_UNUSE
 
         if (clayer->mMaskList.size > 0)
           {
-             mlayer = clayer;
-             if (!mtarget) mtarget = ptree;
+            ptree = _construct_masks(ptree, clayer->mMaskList.ptr, clayer->mMaskList.size, depth + 1);
           }
-        else
-           mtarget = NULL;
-
-        //Construct node that have mask.
-        if (mlayer && mtarget)
-          ptree = _construct_masks(mtarget, mlayer->mMaskList.ptr, mlayer->mMaskList.size, depth + 1);
      }
 
    //Construct drawable nodes.