transform core merge with viewport transform
authorSungbae Park <sb34.park@samsung.com>
Fri, 22 Jul 2016 04:35:44 +0000 (13:35 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Mon, 25 Jul 2016 13:34:25 +0000 (22:34 +0900)
Signed-off-by: Sungbae Park <sb34.park@samsung.com>
Change-Id: I59ea15cd3530f65979f48223ae44ca3e4a7a21f2

Conflicts:
src/bin/e_comp_wl.h

src/bin/e_client.c
src/bin/e_comp_object.c
src/bin/e_comp_object.h
src/bin/e_comp_wl.c
src/bin/e_comp_wl.h
src/bin/e_info_server.c
src/bin/e_util_transform.c
src/bin/e_util_transform.h

index 4950cdcaabfcbbebd4cba8151c2d7a9fe36b73d9..dc6f26ba7ba1298f9c6e15ca56ed944862398a45 100644 (file)
@@ -1753,6 +1753,7 @@ _e_client_cb_evas_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_
    e_remember_update(ec);
    ec->pre_cb.w = w; ec->pre_cb.h = h;
 
+   e_client_transform_core_update(ec);
    e_client_visibility_calculate();
 }
 
@@ -2874,12 +2875,18 @@ _e_client_visibility_zone_calculate(E_Zone *zone)
 static Eina_Bool
 _e_client_transform_core_check_change(E_Client *ec)
 {
-   Eina_Bool check = EINA_FALSE;
    int w = 0;
    int h = 0;
-
+   Eina_Bool check = EINA_FALSE;
    if (!ec) return EINA_FALSE;
 
+   // wait viewport setting
+   if (!ec->transform_core.transform_list)
+     {
+        if (ec->comp_data && ec->comp_data->scaler.viewport)
+          return EINA_FALSE;
+     }
+
    if (ec->frame)
      evas_object_geometry_get(ec->frame, 0, 0, &w, &h);
 
@@ -2888,26 +2895,16 @@ _e_client_transform_core_check_change(E_Client *ec)
        ec->y != ec->transform_core.backup.client_y ||
        ec->w != ec->transform_core.backup.client_w ||
        ec->h != ec->transform_core.backup.client_h ||
-           w != ec->transform_core.backup.frame_w  ||
-           h != ec->transform_core.backup.frame_h)
+       w     != ec->transform_core.backup.frame_w ||
+       h     != ec->transform_core.backup.frame_h)
      {
         check = EINA_TRUE;
         ec->transform_core.backup.client_x = ec->x;
         ec->transform_core.backup.client_y = ec->y;
         ec->transform_core.backup.client_w = ec->w;
         ec->transform_core.backup.client_h = ec->h;
-
-        if (ec->frame)
-          {
-             evas_object_geometry_get(ec->frame, 0, 0,
-                                      &ec->transform_core.backup.frame_w,
-                                      &ec->transform_core.backup.frame_h);
-          }
-        else
-          {
-             ec->transform_core.backup.frame_w = 0;
-             ec->transform_core.backup.frame_h = 0;
-          }
+        ec->transform_core.backup.frame_w = w;
+        ec->transform_core.backup.frame_h = h;
      }
 
    // check new transform or del transform
@@ -3015,7 +3012,10 @@ _e_client_transform_core_boundary_update(E_Client *ec, E_Util_Transform_Rect_Ver
 }
 
 static void
-_e_client_transform_core_vertices_apply(E_Client *ec EINA_UNUSED, Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
+_e_client_transform_core_vertices_apply(E_Client *ec EINA_UNUSED,
+                                        Evas_Object *obj,
+                                        E_Util_Transform_Rect_Vertex *vertices,
+                                        E_Util_Transform *transform)
 {
    Evas_Map *map = NULL;
    int i, x, y;
@@ -3041,6 +3041,13 @@ _e_client_transform_core_vertices_apply(E_Client *ec EINA_UNUSED, Evas_Object *o
              y = (int)(dy + 0.5);
 
              evas_map_point_coord_set(map, i, x, y, 1.0);
+
+             if (transform && e_util_transform_texcoord_flag_get(transform))
+               {
+                  double u = 0.0; double v = 0.0;
+                  e_util_transform_texcoord_get(transform, i, &u, &v);
+                  evas_map_point_image_uv_set(map, i, u, v);
+               }
           }
 
         evas_object_map_set(obj, map);
@@ -3065,7 +3072,7 @@ _e_client_transform_core_sub_update(E_Client *ec, E_Util_Transform_Rect_Vertex *
    cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
 
    if (cdata->sub.below_obj)
-      _e_client_transform_core_vertices_apply(ec, cdata->sub.below_obj, vertices);
+     _e_client_transform_core_vertices_apply(ec, cdata->sub.below_obj, vertices, NULL);
 
    EINA_LIST_FOREACH(cdata->sub.list, l, subc)
       e_client_transform_core_update(subc);
@@ -5977,7 +5984,7 @@ e_client_transform_core_add(E_Client *ec, E_Util_Transform *transform)
    ec->transform_core.transform_list = eina_list_append(ec->transform_core.transform_list, transform);
    ec->transform_core.changed = EINA_TRUE;
    e_util_transform_ref(transform);
-   e_client_transform_core_update(ec);
+  // e_client_transform_core_update(ec);
 }
 
 E_API void
@@ -6000,15 +6007,10 @@ e_client_transform_core_remove(E_Client *ec, E_Util_Transform *transform)
 E_API void
 e_client_transform_core_update(E_Client *ec)
 {
-   E_Comp_Wl_Client_Data *cdata;
-
    if (!ec) return;
    if (ec->new_client) return;
    if (!_e_client_transform_core_check_change(ec)) return;
 
-   cdata = (E_Comp_Wl_Client_Data *)ec->comp_data;
-   if (cdata && cdata->scaler.viewport) return;
-
    if (ec->transform_core.transform_list || ec->transform_core.parent.enable)
      {
         E_Util_Transform_Rect source_rect;
@@ -6025,7 +6027,15 @@ e_client_transform_core_update(E_Client *ec)
         // 2. merge transform
         EINA_LIST_FOREACH(ec->transform_core.transform_list, l, temp_trans)
           {
-             ec->transform_core.result.transform = e_util_transform_merge(&ec->transform_core.result.transform, temp_trans);
+             e_util_transform_merge(&ec->transform_core.result.transform, temp_trans);
+          }
+
+        // 2.5 check viewport
+        if (e_util_transform_viewport_flag_get(&ec->transform_core.result.transform))
+          {
+             int vx = 0, vy = 0, vw = 0, vh = 0;
+             e_util_transform_viewport_get(&ec->transform_core.result.transform, &vx, &vy, &vw, &vh);
+             e_util_transform_rect_init(&source_rect, vx, vy, vw, vh);
           }
 
         // 3. covert to matrix and apply keep_ratio
@@ -6054,6 +6064,24 @@ e_client_transform_core_update(E_Client *ec)
              ec->transform_core.keep_ratio = keep_ratio;
           }
 
+        // 3.1 if 24bit window then set transp rect
+        if (!ec->argb)
+          {
+             int angle = 0;
+             double dangle = 0.0;
+             e_util_transform_rotation_get(&ec->transform_core.result.transform, 0, 0, &dangle);
+
+             angle = (int)(dangle + 0.5);
+             angle %= 90;
+
+             if (angle == 0) // when transform angle is 0, 90, 180, 270, 360. then set transp rect
+               e_comp_object_transform_transp_set(ec->frame, EINA_TRUE);
+             else
+               e_comp_object_transform_transp_set(ec->frame, EINA_FALSE);
+          }
+        else
+          e_comp_object_transform_transp_set(ec->frame, EINA_FALSE);
+
         // 3.5 parent matrix multiply
         if (ec->transform_core.parent.enable)
           {
@@ -6073,18 +6101,24 @@ e_client_transform_core_update(E_Client *ec)
                                                                                                    &ec->transform_core.result.boundary.vertices);
 
         // 5. apply vertices
+        e_comp_object_transform_transp_vertices_set(ec->frame, &ec->transform_core.result.vertices);
         e_comp_object_transform_bg_vertices_set(ec->frame, &ec->transform_core.result.boundary.vertices);
         _e_client_transform_core_boundary_update(ec, &ec->transform_core.result.boundary.vertices);
-        _e_client_transform_core_vertices_apply(ec, ec->frame, &ec->transform_core.result.vertices);
+        _e_client_transform_core_vertices_apply(ec, ec->frame, &ec->transform_core.result.vertices, &ec->transform_core.result.transform);
 
         // 6. subsurface update'
         _e_client_transform_core_sub_update(ec, &ec->transform_core.result.vertices);
      }
    else
      {
-        ec->transform_core.result.enable = EINA_FALSE;
-        _e_client_transform_core_vertices_apply(ec, ec->frame, NULL);
-        _e_client_transform_core_sub_update(ec, NULL);
+        if (ec->transform_core.result.enable)
+          {
+             ec->transform_core.result.enable = EINA_FALSE;
+             _e_client_transform_core_vertices_apply(ec, ec->frame, NULL, NULL);
+             e_comp_object_transform_bg_set(ec->frame, EINA_FALSE);
+             e_comp_object_transform_transp_set(ec->frame, EINA_FALSE);
+             _e_client_transform_core_sub_update(ec, NULL);
+          }
      }
 
    e_client_visibility_calculate();
index 4c670c47ea14f9868dd6a65c481b19aaa85e3db8..77f9c821486d5b203c82ac9e3991d762b1582927 100644 (file)
@@ -89,7 +89,8 @@ typedef struct _E_Comp_Object
    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.
-   Evas_Object         *transform_bg_obj; // transform backgroung with keep_ratio option
+   Evas_Object         *transform_bg_obj;   // transform backgroung with keep_ratio option
+   Evas_Object         *transform_tranp_obj;// transform transp rect obj
    unsigned int         layer; //e_comp_canvas_layer_map(cw->ec->layer)
    Eina_List           *obj_mirror;  // extra mirror objects
    Eina_Tiler          *updates; //render update regions
@@ -299,19 +300,74 @@ _e_comp_object_cb_mirror_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
 /////////////////////////////////////
 
 static void
-_e_comp_object_transform_bg_stack_update(Evas_Object *obj)
+_e_comp_object_transform_obj_stack_update(Evas_Object *obj)
 {
-    API_ENTRY;
-    EINA_SAFETY_ON_NULL_RETURN(cw->ec);
-    if (cw->ec->input_only) return;
-    if (!cw->transform_bg_obj) return;
+   int layer = 0;
+   API_ENTRY;
+   EINA_SAFETY_ON_NULL_RETURN(cw->ec);
+   if (cw->ec->input_only) return;
 
-    if (evas_object_layer_get(obj) != evas_object_layer_get(cw->transform_bg_obj))
-    {
-        int layer = evas_object_layer_get(obj);
-        evas_object_layer_set(cw->transform_bg_obj, layer);
-    }
-    evas_object_stack_below(cw->transform_bg_obj, obj);
+   layer = evas_object_layer_get(obj);
+
+   if (cw->transform_bg_obj)
+     {
+        if (layer != evas_object_layer_get(cw->transform_bg_obj))
+          {
+             evas_object_layer_set(cw->transform_bg_obj, layer);
+          }
+
+        evas_object_stack_below(cw->transform_bg_obj, obj);
+     }
+
+   if (cw->transform_tranp_obj)
+     {
+        if (layer != evas_object_layer_get(cw->transform_tranp_obj))
+          {
+             evas_object_layer_set(cw->transform_tranp_obj, layer);
+          }
+
+        evas_object_stack_below(cw->transform_tranp_obj, obj);
+     }
+}
+
+static void
+_e_comp_object_transform_obj_map_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
+{
+   if (!obj) return;
+
+   if (vertices)
+     {
+        Evas_Map *map = evas_map_new(4);
+
+        if (map)
+          {
+             int i;
+             evas_map_util_points_populate_from_object_full(map, obj, 0);
+             evas_map_util_points_color_set(map, 255, 255, 255, 255);
+
+             for (i = 0 ; i < 4 ; ++i)
+               {
+                  double dx, dy;
+                  int x, y;
+
+                  e_util_transform_vertices_pos_get(vertices, i, &dx, &dy, 0, 0);
+
+                  x = (int)(dx + 0.5);
+                  y = (int)(dy + 0.5);
+
+                  evas_map_point_coord_set(map, i, x, y, 1.0);
+               }
+
+             evas_object_map_set(obj, map);
+             evas_object_map_enable_set(obj, EINA_TRUE);
+
+             evas_map_free(map);
+          }
+     }
+   else
+     {
+        evas_object_map_enable_set(obj, EINA_FALSE);
+     }
 }
 
 /////////////////////////////////////
@@ -1398,6 +1454,7 @@ _e_comp_intercept_layer_set(void *data, Evas_Object *obj, int layer)
    if (!cw->visible) return;
    e_comp_render_queue();
    e_comp_shape_queue();
+   _e_comp_object_transform_obj_stack_update(obj);
 }
 
 typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
@@ -1514,7 +1571,8 @@ _e_comp_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above)
 
    TRACE_DS_BEGIN(COMP:INTERCEPT STACK ABOVE);
    _e_comp_intercept_stack_helper(data, above, evas_object_stack_above);
-   _e_comp_object_transform_bg_stack_update(obj);
+   _e_comp_object_transform_obj_stack_update(obj);
+   _e_comp_object_transform_obj_stack_update(above);
    TRACE_DS_END();
 }
 
@@ -1526,7 +1584,8 @@ _e_comp_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below)
 
    TRACE_DS_BEGIN(COMP:INTERCEPT STACK BELOW);
    _e_comp_intercept_stack_helper(data, below, evas_object_stack_below);
-   _e_comp_object_transform_bg_stack_update(obj);
+   _e_comp_object_transform_obj_stack_update(obj);
+   _e_comp_object_transform_obj_stack_update(below);
    TRACE_DS_END();
 }
 
@@ -1557,7 +1616,7 @@ _e_comp_intercept_lower(void *data, Evas_Object *obj)
    if (e_comp->hwc && e_comp_is_on_overlay(cw->ec)) e_comp_nocomp_end(__FUNCTION__);
    e_comp_render_queue();
    e_comp_shape_queue();
-   _e_comp_object_transform_bg_stack_update(obj);
+   _e_comp_object_transform_obj_stack_update(obj);
 
 end:
    TRACE_DS_END();
@@ -1610,7 +1669,7 @@ _e_comp_intercept_raise(void *data, Evas_Object *obj)
       e_comp_nocomp_end(__FUNCTION__);
    e_comp_render_queue();
    e_comp_shape_queue();
-   _e_comp_object_transform_bg_stack_update(obj);
+   _e_comp_object_transform_obj_stack_update(obj);
 
 end:
    TRACE_DS_END();
@@ -1863,9 +1922,6 @@ _e_comp_intercept_show(void *data, Evas_Object *obj EINA_UNUSED)
    if (cw->mask_obj)
      evas_object_resize(cw->mask_obj, cw->w, cw->h);
 
-   if (cw->transform_bg_obj)
-      evas_object_resize(cw->transform_bg_obj, cw->w, cw->h);
-
    _e_comp_intercept_show_helper(cw);
 }
 
@@ -2433,6 +2489,7 @@ _e_comp_smart_hide(Evas_Object *obj)
    if (cw->input_obj) evas_object_hide(cw->input_obj);
    evas_object_hide(cw->effect_obj);
    if (cw->transform_bg_obj) evas_object_hide(cw->transform_bg_obj);
+   if (cw->transform_tranp_obj) evas_object_hide(cw->transform_tranp_obj);
    if (cw->ec->dead)
      {
         Evas_Object *o;
@@ -2505,6 +2562,7 @@ _e_comp_smart_show(Evas_Object *obj)
      evas_object_show(cw->ec->internal_elm_win);
    if (cw->mask_obj) evas_object_show(cw->mask_obj);
    if (cw->transform_bg_obj) evas_object_show(cw->transform_bg_obj);
+   if (cw->transform_tranp_obj) evas_object_show(cw->transform_tranp_obj);
    e_comp_render_queue();
    if (cw->ec->input_only)
      {
@@ -2582,6 +2640,7 @@ _e_comp_smart_del(Evas_Object *obj)
    evas_object_del(cw->obj);
    evas_object_del(cw->mask_obj);
    evas_object_del(cw->transform_bg_obj);
+   evas_object_del(cw->transform_tranp_obj);
    e_comp_shape_queue();
    eina_stringshare_del(cw->frame_theme);
    eina_stringshare_del(cw->frame_name);
@@ -2643,8 +2702,6 @@ _e_comp_smart_resize(Evas_Object *obj, int w, int h)
           evas_object_resize(cw->input_obj, w, h);
         if (cw->mask_obj)
           evas_object_resize(cw->mask_obj, w, h);
-        if (cw->transform_bg_obj)
-          evas_object_resize(cw->transform_bg_obj, w, h);
         /* resize render update tiler */
         if (!first)
           {
@@ -3939,8 +3996,6 @@ e_comp_object_dirty(Evas_Object *obj)
      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);
-   if (cw->transform_bg_obj) evas_object_resize(cw->transform_bg_obj, w, h);
-
    if (cw->pending_updates)
      eina_tiler_area_size_set(cw->pending_updates, w, h);
    EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
@@ -4588,14 +4643,14 @@ e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set)
           {
              Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
              evas_object_move(o, 0, 0);
-             evas_object_resize(o, cw->w, cw->h);
+             evas_object_resize(o, 1, 1);
              evas_object_render_op_set(o, EVAS_RENDER_COPY);
              evas_object_color_set(o, 0, 0, 0, 255);
              if (cw->visible) evas_object_show(o);
 
              cw->transform_bg_obj = o;
           }
-        _e_comp_object_transform_bg_stack_update(obj);
+        _e_comp_object_transform_obj_stack_update(obj);
      }
    else
      {
@@ -4615,41 +4670,55 @@ e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_
    if (cw->ec->input_only) return;
    if (!cw->transform_bg_obj) return;
 
-   if (vertices)
-     {
-        Evas_Map *map = evas_map_new(4);
-
-        if (map)
-          {
-             int i;
-             evas_map_util_points_populate_from_object_full(map, cw->transform_bg_obj, 0);
-             evas_map_util_points_color_set(map, 255, 255, 255, 255);
-
-             for (i = 0 ; i < 4 ; ++i)
-               {
-                  double dx, dy;
-                  int x, y;
-
-                  e_util_transform_vertices_pos_get(vertices, i, &dx, &dy, 0, 0);
+   _e_comp_object_transform_obj_map_set(cw->transform_bg_obj, vertices);
+}
 
-                  x = (int)(dx + 0.5);
-                  y = (int)(dy + 0.5);
+E_API void
+e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set)
+{
+   Eina_Bool transform_set = EINA_FALSE;
+   API_ENTRY;
+   EINA_SAFETY_ON_NULL_RETURN(cw->ec);
+   if (cw->ec->input_only) return;
 
-                  evas_map_point_coord_set(map, i, x, y, 1.0);
-               }
+   transform_set = !!set;
 
-             evas_object_map_set(cw->transform_bg_obj, map);
-             evas_object_map_enable_set(cw->transform_bg_obj, EINA_TRUE);
+   if (transform_set)
+     {
+        if (!cw->transform_tranp_obj)
+          {
+             Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
+             evas_object_move(o, 0, 0);
+             evas_object_resize(o, 1, 1);
+             evas_object_render_op_set(o, EVAS_RENDER_COPY);
+             evas_object_color_set(o, 0, 0, 0, 0);
+             if (cw->visible) evas_object_show(o);
 
-             evas_map_free(map);
+             cw->transform_tranp_obj = o;
           }
+        _e_comp_object_transform_obj_stack_update(obj);
      }
    else
      {
-        evas_object_map_enable_set(cw->transform_bg_obj, EINA_FALSE);
+        if (cw->transform_tranp_obj)
+          {
+             evas_object_smart_member_del(cw->transform_tranp_obj);
+             E_FREE_FUNC(cw->transform_tranp_obj, evas_object_del);
+          }
      }
 }
 
+E_API void
+e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
+{
+   API_ENTRY;
+   EINA_SAFETY_ON_NULL_RETURN(cw->ec);
+   if (cw->ec->input_only) return;
+   if (!cw->transform_tranp_obj) return;
+
+   _e_comp_object_transform_obj_map_set(cw->transform_tranp_obj, vertices);
+}
+
 E_API void
 e_comp_object_layer_update(Evas_Object *obj,
                            Evas_Object *above, Evas_Object *below)
index ae5d38ef026f752276bc0ed57567db2d5ddac36d..9ee82db08d69534c9bedfb13a36565de2deac912 100644 (file)
@@ -127,6 +127,8 @@ E_API void e_comp_object_mask_set(Evas_Object *obj, Eina_Bool set);
 E_API void e_comp_object_size_update(Evas_Object *obj, int w, int h);
 E_API void e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set);
 E_API void e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices);
+E_API void e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set);
+E_API void e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices);
 
 E_API void e_comp_object_layer_update(Evas_Object *obj, Evas_Object *above, Evas_Object *below);
 
index 34369ec290ccfb94867355297e50dd99c790b495..3959a17ff019538020948e026f5b7a153067e8cb 100644 (file)
@@ -386,13 +386,13 @@ e_comp_wl_map_apply(E_Client *ec)
 {
    E_Comp_Wl_Buffer_Viewport *vp;
    E_Comp_Wl_Subsurf_Data *sdata;
-   const Evas_Map *m;
-   Evas_Map *map;
+   E_Comp_Wl_Client_Data *cdata;
    int x1, y1, x2, y2, x, y;
    int dx, dy;
 
    if (!ec || !ec->comp_data) return;
 
+   cdata = ec->comp_data;
    sdata = ec->comp_data->sub.data;
    if (sdata)
      {
@@ -417,23 +417,18 @@ e_comp_wl_map_apply(E_Client *ec)
    if (x != dx || y != dy)
      evas_object_move(ec->frame, dx, dy);
 
-   m = evas_object_map_get(ec->frame);
-   evas_map_point_coord_get(m, 0, &x1, &y1, NULL);
-   evas_map_point_coord_get(m, 2, &x2, &y2, NULL);
-
-   if (x1 == dx && (x2 - x1) == ec->comp_data->width_from_viewport &&
-       y1 == dy && (y2 - y1) == ec->comp_data->height_from_viewport)
-     return;
-
-   map = evas_map_new(4);
+   if (!cdata->viewport_transform)
+     {
+        cdata->viewport_transform = e_util_transform_new();
+        e_client_transform_core_add(ec, cdata->viewport_transform);
+     }
 
-   evas_map_util_points_populate_from_geometry(map,
-                                               dx, dy,
-                                               ec->comp_data->width_from_viewport,
-                                               ec->comp_data->height_from_viewport,
-                                               0);
+   e_util_transform_viewport_set(cdata->viewport_transform, dx, dy,
+                                 ec->comp_data->width_from_viewport,
+                                 ec->comp_data->height_from_viewport);
 
    vp = &ec->comp_data->scaler.buffer_viewport;
+
    if (vp->buffer.src_width == wl_fixed_from_int(-1))
      {
         x1 = 0.0;
@@ -452,27 +447,24 @@ e_comp_wl_map_apply(E_Client *ec)
    _e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
                             vp->buffer.transform, vp->buffer.scale,
                             x1, y1, &x, &y);
-   evas_map_point_image_uv_set(map, 0, x, y);
+   e_util_transform_texcoord_set(cdata->viewport_transform, 0, x, y);
 
    _e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
                             vp->buffer.transform, vp->buffer.scale,
                             x2, y1, &x, &y);
-   evas_map_point_image_uv_set(map, 1, x, y);
+   e_util_transform_texcoord_set(cdata->viewport_transform, 1, x, y);
 
    _e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
                             vp->buffer.transform, vp->buffer.scale,
                             x2, y2, &x, &y);
-   evas_map_point_image_uv_set(map, 2, x, y);
+   e_util_transform_texcoord_set(cdata->viewport_transform, 2, x, y);
 
    _e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
                             vp->buffer.transform, vp->buffer.scale,
                             x1, y2, &x, &y);
-   evas_map_point_image_uv_set(map, 3, x, y);
+   e_util_transform_texcoord_set(cdata->viewport_transform, 3, x, y);
 
-   evas_object_map_set(ec->frame, map);
-   evas_object_map_enable_set(ec->frame, map ? EINA_TRUE : EINA_FALSE);
-
-   evas_map_free(map);
+   e_client_transform_core_update(ec);
 }
 
 static void
@@ -549,25 +541,36 @@ _e_comp_wl_evas_cb_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_U
    E_Client *subc;
    Eina_List *l;
    int x, y;
-   const Evas_Map *m;
 
    if (!(ec = data)) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
 
    EINA_LIST_FOREACH(ec->comp_data->sub.list, l, subc)
      {
-        if ((m = evas_object_map_get(subc->frame))) continue;
         x = ec->x + subc->comp_data->sub.data->position.x;
         y = ec->y + subc->comp_data->sub.data->position.y;
         evas_object_move(subc->frame, x, y);
+
+        if (subc->comp_data->scaler.viewport)
+          {
+             E_Comp_Wl_Client_Data *cdata = subc->comp_data;
+             if (cdata && cdata->viewport_transform)
+               e_comp_wl_map_apply(subc);
+          }
      }
 
    EINA_LIST_FOREACH(ec->comp_data->sub.below_list, l, subc)
      {
-        if ((m = evas_object_map_get(subc->frame))) continue;
         x = ec->x + subc->comp_data->sub.data->position.x;
         y = ec->y + subc->comp_data->sub.data->position.y;
         evas_object_move(subc->frame, x, y);
+
+        if (subc->comp_data->scaler.viewport)
+          {
+             E_Comp_Wl_Client_Data *cdata = subc->comp_data;
+             if (cdata && cdata->viewport_transform)
+               e_comp_wl_map_apply(subc);
+          }
      }
 
    if (ec->comp_data->sub.below_obj)
@@ -4070,6 +4073,13 @@ _e_comp_wl_client_cb_del(void *data EINA_UNUSED, E_Client *ec)
    if (e_comp_wl->selection.cbhm == ec->comp_data->surface)
      e_comp_wl->selection.cbhm = NULL;
 
+   if (ec->comp_data->viewport_transform)
+     {
+        e_client_transform_core_remove(ec, ec->comp_data->viewport_transform);
+        e_util_transform_del(ec->comp_data->viewport_transform);
+        ec->comp_data->viewport_transform = NULL;
+     }
+
    e_pixmap_cdata_set(ec->pixmap, NULL);
 
    E_FREE(ec->comp_data);
index 45aeb22ccf10525debe74a093a9fb55c30e258fb..a7c545c74aa723302c637e575b922a4e9446c074 100644 (file)
@@ -459,6 +459,8 @@ struct _E_Comp_Wl_Client_Data
    E_Comp_Wl_Input_Device *last_device_ptr;
    E_Comp_Wl_Input_Device *last_device_touch;
    E_Comp_Wl_Input_Device *last_device_kbd;
+
+   E_Util_Transform *viewport_transform;
 };
 
 struct _E_Comp_Wl_Output
index 4c5aafca7babf5e27a8dcd4444af69ebf08e76b3..bfd8a1df55f629f3320303c82bd8d02540a9be2d 100644 (file)
@@ -490,12 +490,14 @@ _msg_window_prop_client_append(Eldbus_Message_Iter *iter, E_Client *target_ec)
         int i;
         int count = e_client_transform_core_transform_count_get(target_ec);
 
-        __WINDOW_PROP_ARG_APPEND(" ", "[id] [move] [scale] [rotation] [keep_ratio]");
+        __WINDOW_PROP_ARG_APPEND(" ", "[id] [move] [scale] [rotation] [keep_ratio] [viewport]");
         for (i = 0 ; i < count ; ++i)
           {
              double dx, dy, dsx, dsy, drz;
              int x, y, rz;
              int keep_ratio;
+             int view_port;
+             int vx, vy, vw, vh;
 
              E_Util_Transform *transform = e_client_transform_core_transform_get(target_ec, i);
              if (!transform) continue;
@@ -504,12 +506,26 @@ _msg_window_prop_client_append(Eldbus_Message_Iter *iter, E_Client *target_ec)
              e_util_transform_scale_get(transform, &dsx, &dsy, NULL);
              e_util_transform_rotation_get(transform, NULL, NULL, &drz);
              keep_ratio = e_util_transform_keep_ratio_get(transform);
+             view_port = e_util_transform_viewport_flag_get(transform);
 
              x = (int)(dx + 0.5);
              y = (int)(dy + 0.5);
              rz = (int)(drz + 0.5);
 
-             __WINDOW_PROP_ARG_APPEND_TYPE("Transform", "[%d] [%d, %d] [%2.1f, %2.1f] [%d] [%d]", i, x, y, dsx, dsy, rz, keep_ratio);
+             if (view_port)
+               {
+                  e_util_transform_viewport_get(transform, &vx, &vy, &vw, &vh);
+               }
+             else
+               {
+                  vx = 0;
+                  vy = 0;
+                  vw = 0;
+                  vh = 0;
+               }
+
+             __WINDOW_PROP_ARG_APPEND_TYPE("Transform", "[%d] [%d, %d] [%2.1f, %2.1f] [%d] [%d] [%d :%d, %d, %d, %d]",
+                                           i, x, y, dsx, dsy, rz, keep_ratio, view_port, vx, vy, vw, vh);
           }
      }
 #undef __WINDOW_PROP_ARG_APPEND
index 4ccf96549329b9562f8bfa60cf3e2985eaf2710c..7f4857daa76ef5591ee37a18e9f1894f43197715 100644 (file)
@@ -92,6 +92,31 @@ e_util_transform_rotation(E_Util_Transform *transform, double rx, double ry, dou
    transform->changed = EINA_TRUE;
 }
 
+E_API void
+e_util_transform_texcoord_set(E_Util_Transform *transform, int index, double tu, double tv)
+{
+   if (!transform) return;
+   if (index < 0 || index > 3) return;
+
+   transform->texcoord.value[index][0] = tu;
+   transform->texcoord.value[index][1] = tv;
+   transform->use_texcoord = EINA_TRUE;
+   transform->changed = EINA_TRUE;
+}
+
+E_API void
+e_util_transform_viewport_set(E_Util_Transform *transform, int x, int y, int w, int h)
+{
+   if (!transform) return;
+
+   transform->viewport.x = x;
+   transform->viewport.y = y;
+   transform->viewport.w = w;
+   transform->viewport.h = h;
+   transform->use_viewport = EINA_TRUE;
+   transform->changed = EINA_TRUE;
+}
+
 E_API void
 e_util_transform_source_to_target(E_Util_Transform *transform,
                                   E_Util_Transform_Rect *dest,
@@ -117,32 +142,32 @@ e_util_transform_source_to_target(E_Util_Transform *transform,
    transform->changed = EINA_TRUE;
 }
 
-E_API E_Util_Transform
-e_util_transform_merge(E_Util_Transform *trans1, E_Util_Transform *trans2)
+E_API void
+e_util_transform_merge(E_Util_Transform *in_out, E_Util_Transform *input)
 {
-   E_Util_Transform result;
    int i;
 
-   e_util_transform_init(&result);
-
-   if (!trans1) return result;
-   if (!trans2) return result;
+   if (!in_out) return;
+   if (!input) return;
 
    for (i = 0 ; i < 3 ; ++i)
-      result.move.value[i] = trans1->move.value[i] + trans2->move.value[i];
-
-   for (i = 0 ; i < 3 ; ++i)
-      result.scale.value[i] = trans1->scale.value[i] * trans2->scale.value[i];
-
-   for (i = 0 ; i < 3 ; ++i)
-      result.rotation.value[i] = trans1->rotation.value[i] + trans2->rotation.value[i];
+     {
+        in_out->move.value[i] += input->move.value[i];
+        in_out->scale.value[i] *= input->scale.value[i];
+        in_out->rotation.value[i] += input->rotation.value[i];
+     }
 
-   if (trans1->keep_ratio || trans2->keep_ratio)
-      result.keep_ratio = EINA_TRUE;
+   // texcoord and viewport just one setting.
+   if (input->use_texcoord)
+     memcpy(&in_out->texcoord, &input->texcoord, sizeof(input->texcoord));
+   if (input->use_viewport)
+     memcpy(&in_out->viewport, &input->viewport, sizeof(input->viewport));
 
-   result.changed = EINA_TRUE;
+   in_out->keep_ratio |= input->keep_ratio;
+   in_out->use_texcoord |= input->use_texcoord;
+   in_out->use_viewport |= input->use_viewport;
 
-   return result;
+   in_out->changed = EINA_TRUE;
 }
 
 E_API E_Util_Transform_Matrix
@@ -259,6 +284,41 @@ e_util_transform_rotation_get(E_Util_Transform *transform, double *x, double *y,
    if (z) *z = transform->rotation.value[2];
 }
 
+E_API void
+e_util_transform_texcoord_get(E_Util_Transform *transform,int index, double *tu, double *tv)
+{
+   if (!transform) return;
+   if (index < 0 || index > 3) return;
+
+   if (tu) *tu = transform->texcoord.value[index][0];
+   if (tv) *tv = transform->texcoord.value[index][1];
+}
+
+E_API void
+e_util_transform_viewport_get(E_Util_Transform *transform, int *x, int *y, int *w, int *h)
+{
+   if (!transform) return;
+
+   if (x) *x = transform->viewport.x;
+   if (y) *y = transform->viewport.y;
+   if (w) *w = transform->viewport.w;
+   if (h) *h = transform->viewport.h;
+}
+
+E_API Eina_Bool
+e_util_transform_texcoord_flag_get(E_Util_Transform *transform)
+{
+   if (!transform) return EINA_FALSE;
+   return transform->use_texcoord;
+}
+
+E_API Eina_Bool
+e_util_transform_viewport_flag_get(E_Util_Transform *transform)
+{
+   if (!transform) return EINA_FALSE;
+   return transform->use_viewport;
+}
+
 E_API void
 e_util_transform_log(E_Util_Transform *transform, const char *str)
 {
index 62d10f44324a60a95583d0e6a59c8b940086b550..8ba61f57d25108d89eb456f80961860ff7a852ff 100644 (file)
@@ -1,6 +1,7 @@
 #ifdef E_TYPEDEFS
 
 typedef struct _E_Util_Transform_Value       E_Util_Transform_Value;
+typedef struct _E_Util_Transform_Texcoord    E_Util_Transform_Texcoord;
 typedef struct _E_Util_Transform             E_Util_Transform;
 typedef struct _E_Util_Transform_Rect        E_Util_Transform_Rect;
 typedef struct _E_Util_Transform_Vertex      E_Util_Transform_Vertex;
@@ -16,14 +17,9 @@ struct _E_Util_Transform_Value
    double value[3];
 };
 
-struct _E_Util_Transform
+struct _E_Util_Transform_Texcoord
 {
-   E_Util_Transform_Value scale;
-   E_Util_Transform_Value move;
-   E_Util_Transform_Value rotation;
-   int                    ref_count;
-   Eina_Bool              keep_ratio;
-   Eina_Bool              changed;
+   double value[4][2];
 };
 
 struct _E_Util_Transform_Rect
@@ -34,6 +30,20 @@ struct _E_Util_Transform_Rect
    int h;
 };
 
+struct _E_Util_Transform
+{
+   E_Util_Transform_Value    scale;
+   E_Util_Transform_Value    move;
+   E_Util_Transform_Value    rotation;
+   E_Util_Transform_Texcoord texcoord;
+   E_Util_Transform_Rect     viewport;
+   int                       ref_count;
+   Eina_Bool                 keep_ratio;
+   Eina_Bool                 changed;
+   Eina_Bool                 use_texcoord;
+   Eina_Bool                 use_viewport;
+};
+
 struct _E_Util_Transform_Vertex
 {
    double vertex[4];
@@ -58,10 +68,12 @@ E_API void                         e_util_transform_init(E_Util_Transform *trans
 E_API void                         e_util_transform_move(E_Util_Transform *transform, double x, double y, double z);
 E_API void                         e_util_transform_scale(E_Util_Transform *transform, double sx, double sy, double sz);
 E_API void                         e_util_transform_rotation(E_Util_Transform *transform, double rx, double ry, double rz);
+E_API void                         e_util_transform_texcoord_set(E_Util_Transform *transform, int index, double tu, double tv);
+E_API void                         e_util_transform_viewport_set(E_Util_Transform *transform, int x, int y, int w, int h);
 E_API void                         e_util_transform_source_to_target(E_Util_Transform *transform,
                                                                      E_Util_Transform_Rect *dest,
                                                                      E_Util_Transform_Rect *source);
-E_API E_Util_Transform             e_util_transform_merge(E_Util_Transform *trans1, E_Util_Transform *trans2);
+E_API void                         e_util_transform_merge(E_Util_Transform *in_out, E_Util_Transform *input);
 E_API E_Util_Transform_Matrix      e_util_transform_convert_to_matrix(E_Util_Transform *transform, E_Util_Transform_Rect *source_rect);
 E_API Eina_Bool                    e_util_transform_change_get(E_Util_Transform *transform);
 E_API void                         e_util_transform_change_unset(E_Util_Transform *transform);
@@ -71,6 +83,10 @@ E_API E_Util_Transform             e_util_transform_keep_ratio_apply(E_Util_Tran
 E_API void                         e_util_transform_move_get(E_Util_Transform *transform, double *x, double *y, double *z);
 E_API void                         e_util_transform_scale_get(E_Util_Transform *transform, double *x, double *y, double *z);
 E_API void                         e_util_transform_rotation_get(E_Util_Transform *transform, double *x, double *y, double *z);
+E_API void                         e_util_transform_texcoord_get(E_Util_Transform *transform, int index, double *tu, double *tv);
+E_API void                         e_util_transform_viewport_get(E_Util_Transform *transform, int *x, int *y, int *w, int *h);
+E_API Eina_Bool                    e_util_transform_texcoord_flag_get(E_Util_Transform *transform);
+E_API Eina_Bool                    e_util_transform_viewport_flag_get(E_Util_Transform *transform);
 E_API void                         e_util_transform_log(E_Util_Transform *transform, const char *str);
 
 E_API void                         e_util_transform_rect_init(E_Util_Transform_Rect *rect, int x, int y, int w, int h);