added mask object to show H/W underlay plane 06/40206/1
authorGwanglim Lee <gl77.lee@samsung.com>
Sat, 30 May 2015 10:55:31 +0000 (19:55 +0900)
committerBoram Park <boram1288.park@samsung.com>
Mon, 1 Jun 2015 06:04:42 +0000 (15:04 +0900)
Change-Id: I9a37c2491487405b71dac3d82c46af1053481926

src/bin/e_comp_object.c
src/bin/e_comp_object.h
src/bin/e_comp_wl.c

index f160cfc1f421a63d361e4b440c3fcc161ecb6cad..17d52be8d8de24b285f3b76b13b69095563be2df 100644 (file)
@@ -86,6 +86,7 @@ typedef struct _E_Comp_Object
    Evas_Object         *zoomobj; // zoomap
    Evas_Object         *shobj;  // shadow object
    Evas_Object         *effect_obj; // effects object
+   Evas_Object         *mask_obj; // mask object: transparent parts of this comp object allow to copy the alpha to current H/W plane.
    unsigned int         layer; //e_comp_canvas_layer_map(cw->ec->layer)
    Eina_List           *obj_mirror;  // extra mirror objects
    Eina_Tiler          *updates; //render update regions
@@ -2062,6 +2063,7 @@ _e_comp_smart_show(Evas_Object *obj)
    evas_object_show(cw->effect_obj);
    if (cw->ec->internal_elm_win && (!evas_object_visible_get(cw->ec->internal_elm_win)))
      evas_object_show(cw->ec->internal_elm_win);
+   if (cw->mask_obj) evas_object_show(cw->mask_obj);
    e_comp_render_queue(cw->comp);
    if (cw->ec->input_only)
      {
@@ -2133,6 +2135,7 @@ _e_comp_smart_del(Evas_Object *obj)
    evas_object_del(cw->zoomobj);
    evas_object_del(cw->input_obj);
    evas_object_del(cw->obj);
+   evas_object_del(cw->mask_obj);
    e_comp_shape_queue(cw->comp);
    eina_stringshare_del(cw->frame_theme);
    eina_stringshare_del(cw->frame_name);
@@ -2186,6 +2189,8 @@ _e_comp_smart_resize(Evas_Object *obj, int w, int h)
         if (cw->zoomobj) e_zoomap_child_resize(cw->zoomobj, pw, ph);
         if (cw->input_obj)
           evas_object_geometry_set(cw->input_obj, cw->x + cw->input_rect.x, cw->y + cw->input_rect.y, cw->input_rect.w, cw->input_rect.h);
+        if (cw->mask_obj)
+          evas_object_resize(cw->mask_obj, w, h);
         /* resize render update tiler */
         if (!first)
           {
@@ -3357,6 +3362,7 @@ e_comp_object_dirty(Evas_Object *obj)
    if (!dirty)
      evas_object_image_data_set(cw->obj, NULL);
    evas_object_image_size_set(cw->obj, w, h);
+   if (cw->mask_obj) evas_object_resize(cw->mask_obj, w, h);
 
    e_pixmap_image_opaque_get(cw->ec->pixmap, &bx, &by, &bxx, &byy);
    if (bxx && byy)
@@ -3917,3 +3923,41 @@ e_comp_object_alpha_set(Evas_Object *obj, Eina_Bool alpha)
 
    evas_object_image_alpha_set(cw->obj, alpha);
 }
+
+EAPI void
+e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set)
+{
+   Eina_Bool mask_set = EINA_FALSE;
+   Evas_Object *o;
+
+   API_ENTRY;
+   EINA_SAFETY_ON_NULL_RETURN(cw->ec);
+   if (cw->ec->input_only) return;
+   mask_set = !!set;
+
+   if (mask_set)
+     {
+        if (!cw->mask_obj)
+          {
+             o = evas_object_rectangle_add(cw->comp->evas);
+             evas_object_color_set(o, 0, 0, 0, 0);
+             evas_object_clip_set(cw->input_obj, o);
+             evas_object_smart_member_add(o, obj);
+             evas_object_move(o, 0, 0);
+             evas_object_render_op_set(o, EVAS_RENDER_COPY);
+             if (cw->visible) evas_object_show(o);
+
+             cw->mask_obj = o;
+          }
+
+        evas_object_layer_set(cw->mask_obj, 9998);
+     }
+   else
+     {
+        if (cw->mask_obj)
+          {
+             evas_object_smart_member_del(cw->mask_obj);
+             E_FREE_FUNC(cw->mask_obj, evas_object_del);
+          }
+     }
+}
index bbcd3b22809e7cefaa1701fb682c53707bd5c7d5..e8d2f199f3034ff40b700527fcfdf01179fe8c49 100644 (file)
@@ -109,6 +109,7 @@ EAPI void e_comp_object_intercept_hook_del(E_Comp_Object_Intercept_Hook *ch);
 #endif
 EAPI unsigned int e_comp_object_is_animating(Evas_Object *obj);
 EAPI void e_comp_object_alpha_set(Evas_Object *obj, Eina_Bool alpha);
+EAPI void e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set);
 
 #endif
 #endif
index 84f60cce82e2872715398991deb56a7f45708bf0..c439552cb2792d9e48d3aa720c240ef13e8ed90f 100644 (file)
@@ -1225,6 +1225,7 @@ _e_comp_wl_subsurface_restack(E_Client *ec)
    EINA_LIST_FOREACH(ec->comp_data->sub.list, l, subc)
      {
         evas_object_stack_above(subc->frame, temp->frame);
+        e_comp_object_mask_set(subc->frame, EINA_FALSE);
         temp = subc;
      }
 
@@ -1233,6 +1234,9 @@ _e_comp_wl_subsurface_restack(E_Client *ec)
      {
         evas_object_stack_below(subc->frame, temp->frame);
         temp = subc;
+
+        /* TODO: need to check that H/W underlay is available */
+        e_comp_object_mask_set(subc->frame, EINA_TRUE);
      }
 
    if (ec->comp_data->sub.below_obj)