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);
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;
}
else
{
tvg_paint_set_composite_method(ptree, ctree, matte_mode);
- mtarget = ctree;
}
ptree = ctree;
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.