video_shell: Refactor out 34/317734/1 accepted/tizen/unified/20240919.163739 accepted/tizen/unified/dev/20240920.060442 accepted/tizen/unified/x/20240920.053207
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 13 Sep 2024 01:48:23 +0000 (10:48 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 13 Sep 2024 08:15:06 +0000 (17:15 +0900)
To improve readability, this patch renames functions and divides quite
big functions into smaller ones.

Change-Id: I9de746821c5bc410a0af9964a38b955b06e2e8a7

src/bin/server/e_video_shell.c

index 8747672bf19c2bd9d6dc97b212b9135befbc2645..751996e6e6d3591739e9edd181d618a0cd592836 100644 (file)
@@ -950,7 +950,7 @@ _letter_box_geometry_calc(Eina_Rectangle *in_out, double ratio_width, double rat
 }
 
 static void
-_source_viewport_destination_update(E_Video_Viewport_Source *source)
+_source_destination_update(E_Video_Viewport_Source *source)
 {
    E_Video_Viewport *viewport = source->viewport;
    Eina_Rectangle dest_rect = {0, 0, -1, -1};
@@ -991,7 +991,58 @@ end:
 }
 
 static void
-_source_viewport_transform_update(E_Video_Viewport_Source *source)
+_source_viewport_update(E_Video_Viewport_Source *source)
+{
+   E_Client *ec = e_surface_ec_get(source->surface->surface);
+   E_Comp_Wl_Buffer_Viewport *vp;
+   E_Comp_Wl_Client_Data *cdata;
+   int x1, y1, x2, y2, x, y;
+
+   e_view_client_map_update(e_client_view_get(ec));
+
+   e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y);
+   e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), x, y);
+
+   cdata = ec->comp_data;
+   if (!cdata->viewport_transform)
+     {
+        cdata->viewport_transform = e_util_transform_new();
+        e_util_transform_role_set(cdata->viewport_transform, "viewport_transform");
+        e_client_transform_core_add(ec, cdata->viewport_transform);
+     }
+
+   e_util_transform_viewport_set(cdata->viewport_transform, x, y,
+                                 ec->comp_data->width_from_viewport,
+                                 ec->comp_data->height_from_viewport);
+
+   vp = &cdata->scaler.buffer_viewport;
+   if (vp->buffer.src_width == wl_fixed_from_int(-1))
+     {
+        x1 = 0;
+        y1 = 0;
+        x2 = cdata->width_from_buffer;
+        y2 = cdata->height_from_buffer;
+     }
+   else
+     {
+        x1 = wl_fixed_to_int(vp->buffer.src_x);
+        y1 = wl_fixed_to_int(vp->buffer.src_y);
+        x2 = wl_fixed_to_int(vp->buffer.src_x + vp->buffer.src_width);
+        y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height);
+     }
+
+   e_util_transform_texcoord_set(cdata->viewport_transform, 0, x1, y1);
+   e_util_transform_texcoord_set(cdata->viewport_transform, 1, x2, y1);
+   e_util_transform_texcoord_set(cdata->viewport_transform, 2, x2, y2);
+   e_util_transform_texcoord_set(cdata->viewport_transform, 3, x1, y2);
+
+   VS_INF("SOURCE %p| Update viewport: source(%d,%d %dx%d) destination(%d,%d %dx%d)",
+          source, x1, y1, (x2 - x1), (y2 - y1),
+          ec->x, ec->y, ec->comp_data->width_from_viewport, ec->comp_data->height_from_viewport);
+}
+
+static void
+_source_rotation_update(E_Video_Viewport_Source *source)
 {
    E_Video_Viewport *viewport = source->viewport;
    E_Client *ec = e_surface_ec_get(source->surface->surface);
@@ -1009,7 +1060,6 @@ _source_viewport_transform_update(E_Video_Viewport_Source *source)
              e_client_transform_core_remove(ec, source->transform);
              e_util_transform_del(source->transform);
              source->transform = NULL;
-             goto end;
           }
         return;
      }
@@ -1070,69 +1120,25 @@ _source_viewport_transform_update(E_Video_Viewport_Source *source)
          assert(0);
      }
 
-end:
-   e_client_transform_core_update(ec);
+   VS_INF("SOURCE %p| Update rotation: %s", source, _viewport_transform_to_str(viewport->current.transform));
 }
 
 static void
-_source_viewport_apply(E_Video_Viewport_Source *source)
+_source_transform_update(E_Video_Viewport_Source *source)
 {
    E_Client *ec = e_surface_ec_get(source->surface->surface);
-   E_Comp_Wl_Buffer_Viewport *vp;
-   E_Comp_Wl_Client_Data *cdata;
-   int x1, y1, x2, y2, x, y;
+   E_Desk *desk;
    Eina_Bool zoom_animating = EINA_FALSE;
 
    e_comp_wl_map_size_cal_from_viewport(ec);
 
-   // FIXME: This code is copied from e_comp_wl_map_apply()
-   e_view_client_map_update(e_client_view_get(ec));
-
-   e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y);
-   e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), x, y);
-
-   cdata = ec->comp_data;
-   if (!cdata->viewport_transform)
-     {
-        cdata->viewport_transform = e_util_transform_new();
-        e_util_transform_role_set(cdata->viewport_transform, "viewport_transform");
-        e_client_transform_core_add(ec, cdata->viewport_transform);
-     }
-
-   e_util_transform_viewport_set(cdata->viewport_transform, x, y,
-                                 ec->comp_data->width_from_viewport,
-                                 ec->comp_data->height_from_viewport);
+   _source_viewport_update(source);
+   _source_rotation_update(source);
 
-   vp = &cdata->scaler.buffer_viewport;
-   if (vp->buffer.src_width == wl_fixed_from_int(-1))
-     {
-        x1 = 0;
-        y1 = 0;
-        x2 = cdata->width_from_buffer;
-        y2 = cdata->height_from_buffer;
-     }
-   else
-     {
-        x1 = wl_fixed_to_int(vp->buffer.src_x);
-        y1 = wl_fixed_to_int(vp->buffer.src_y);
-        x2 = wl_fixed_to_int(vp->buffer.src_x + vp->buffer.src_width);
-        y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height);
-     }
-
-   e_util_transform_texcoord_set(cdata->viewport_transform, 0, x1, y1);
-   e_util_transform_texcoord_set(cdata->viewport_transform, 1, x2, y1);
-   e_util_transform_texcoord_set(cdata->viewport_transform, 2, x2, y2);
-   e_util_transform_texcoord_set(cdata->viewport_transform, 3, x1, y2);
-
-   E_Desk *desk;
    desk = e_comp_desk_find_by_ec(ec);
    if (desk)
      zoom_animating = e_desk_zoom_is_animating(desk);
 
-   ELOGF("TRANSFORM", "viewport map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d), zoom_animating: %d",
-         ec, ec->x, ec->y, ec->comp_data->width_from_viewport,
-         ec->comp_data->height_from_viewport, x1, y1, x2, y1, x2, y2, x1, y2, zoom_animating);
-
    /* workaround:: when the desk zoom is doing their animation,
       the transform core update can override animation's zoom boundary.
       so, don't doing transform core update while desk zoom animation */
@@ -1164,7 +1170,6 @@ static void
 _source_cb_surface_commit(struct wl_listener *listener, void *data)
 {
    E_Video_Viewport_Source *source = wl_container_of(listener, source, surface_commit);
-   Eina_Bool need_apply = EINA_FALSE;
 
    source->current = source->pending;
    source->pending.committed = E_VIDEO_VIEWPORT_SOURCE_STATE_CLEAN;
@@ -1176,22 +1181,14 @@ _source_cb_surface_commit(struct wl_listener *listener, void *data)
    _source_map_state_update(source);
 
    if (source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_SOURCE_REGION)
-     {
-        _source_viewport_source_box_update(source);
-        need_apply = EINA_TRUE;
-     }
+     _source_viewport_source_box_update(source);
 
    if (source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO)
-     {
-        _source_viewport_destination_update(source);
-        need_apply = EINA_TRUE;
-     }
+     _source_destination_update(source);
 
-   if (need_apply)
-     {
-        _source_viewport_apply(source);
-        _source_viewport_transform_update(source);
-     }
+   if ((source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_SOURCE_REGION) ||
+       (source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO))
+     _source_transform_update(source);
 }
 
 static const char *
@@ -1334,9 +1331,8 @@ _source_viewport_link(E_Video_Viewport_Source *source, E_Video_Viewport *viewpor
    if (source->surface->stand_alone)
      source->base.stand_alone = EINA_TRUE;
 
-   _source_viewport_destination_update(source);
-   _source_viewport_apply(source);
-   _source_viewport_transform_update(source);
+   _source_destination_update(source);
+   _source_transform_update(source);
 
    return EINA_TRUE;
 }
@@ -1355,21 +1351,14 @@ static void
 _source_viewport_committed(E_Video_Viewport_Source *source)
 {
    E_Video_Viewport_State *state = &source->viewport->current;
-   Eina_Bool need_transform = EINA_FALSE;
 
    VS_DBG("SOURCE %p| viewport committed", source);
 
    if (state->committed & E_VIDEO_VIEWPORT_STATE_DESTINATION ||
        state->committed & E_VIDEO_VIEWPORT_STATE_TRANSFORM)
      {
-        _source_viewport_destination_update(source);
-        _source_viewport_apply(source);
-        need_transform = EINA_TRUE;
-     }
-
-   if (need_transform || (state->committed & E_VIDEO_VIEWPORT_STATE_TRANSFORM))
-     {
-        _source_viewport_transform_update(source);
+        _source_destination_update(source);
+        _source_transform_update(source);
      }
 }
 
@@ -1992,12 +1981,67 @@ _e_video_shell_transform_to_wtz(E_Video_Shell_Transform e_transform)
    return wtz_transform;
 }
 
+static void
+_viewport_state_transform_set(E_Video_Viewport *viewport, enum wtz_video_exported_viewport_transform transform)
+{
+   if (viewport->current.transform == transform)
+     return;
+
+   viewport->current.transform = transform;
+   viewport->current.committed |= E_VIDEO_VIEWPORT_STATE_TRANSFORM;
+
+   if (!(viewport->pending.committed & E_VIDEO_VIEWPORT_STATE_TRANSFORM))
+     viewport->pending.transform = transform;
+}
+
+static void
+_viewport_state_geometry_set(E_Video_Viewport *viewport, int x, int y, int width, int height)
+{
+   int sx, sy;
+
+   e_subsurface_position_get(viewport->subsurface, &sx, &sy);
+   if (sx == x && sy == y && viewport->current.width == width && viewport->current.height == height)
+     return;
+
+   e_subsurface_position_set(viewport->subsurface, x, y);
+
+   viewport->current.width = width;
+   viewport->current.height = height;
+   viewport->current.committed |= E_VIDEO_VIEWPORT_STATE_DESTINATION;
+
+   if (!(viewport->pending.committed & E_VIDEO_VIEWPORT_STATE_DESTINATION))
+     {
+        viewport->pending.width = width;
+        viewport->pending.height = height;
+     }
+}
+
+static void
+_source_state_aspect_ratio_set(E_Video_Viewport_Source *source, int width, int height)
+{
+   if (width == -1 && height == -1)
+     source->current.has_aspect_ratio = EINA_FALSE;
+   else if (width > 0 && height > 0)
+     source->current.has_aspect_ratio = EINA_TRUE;
+   else
+     return;
+
+   source->current.aspect_ratio.width = width;
+   source->current.aspect_ratio.height = height;
+   source->current.committed = E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO;
+
+   if (!(source->pending.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO))
+     {
+        source->pending.aspect_ratio.width = width;
+        source->pending.aspect_ratio.height = height;
+     }
+}
+
 EINTERN void
 e_video_shell_viewport_transform(const char *handle, E_Video_Shell_Transform transform, int x, int y, int width, int height, int ratio_width, int ratio_height)
 {
    E_Video_Shell *shell;
    E_Video_Viewport *viewport;
-   enum wtz_video_exported_viewport_transform wtz_transform;
 
    wl_list_for_each(shell, &shells, link)
      {
@@ -2005,50 +2049,30 @@ e_video_shell_viewport_transform(const char *handle, E_Video_Shell_Transform tra
         if (!viewport)
           continue;
 
-        if (viewport->source && ratio_width != -2 && ratio_height != -2)
-          {
-             if ((ratio_width == -1 && ratio_height == -1) ||
-                 (ratio_width > 0 && ratio_height > 0))
-               {
-                  if (ratio_width == -1 && ratio_height == -1)
-                    {
-                       viewport->source->pending.has_aspect_ratio = EINA_FALSE;
-                    }
-                  else
-                    {
-                       viewport->source->pending.has_aspect_ratio = EINA_TRUE;
-                       viewport->source->pending.aspect_ratio.width = ratio_width;
-                       viewport->source->pending.aspect_ratio.height = ratio_height;
-                    }
-                  viewport->source->pending.committed |= E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO;
-
-                  viewport->source->current = viewport->source->pending;
-                  viewport->source->pending.committed = E_VIDEO_VIEWPORT_SOURCE_STATE_CLEAN;
-
-                  _source_viewport_destination_update(viewport->source);
-                  _source_viewport_apply(viewport->source);
-                  _source_viewport_transform_update(viewport->source);
-               }
-          }
+        viewport->current.committed = E_VIDEO_VIEWPORT_STATE_CLEAN;
 
-        wtz_transform = _e_video_shell_transform_to_wtz(transform);
-        if (viewport->pending.transform != wtz_transform)
-          {
-             viewport->pending.committed |= E_VIDEO_VIEWPORT_STATE_TRANSFORM;
-             viewport->pending.transform = _e_video_shell_transform_to_wtz(transform);
-          }
+        _viewport_state_transform_set(viewport, _e_video_shell_transform_to_wtz(transform));
 
         if (width != -1 && height != -1)
+          _viewport_state_geometry_set(viewport, x, y, width, height);
+
+        if (viewport->source && ratio_width != -2 && ratio_height != -2)
+          _source_state_aspect_ratio_set(viewport->source, ratio_width, ratio_height);
+
+        if (viewport->current.committed != E_VIDEO_VIEWPORT_STATE_CLEAN)
           {
-             e_subsurface_position_set(viewport->subsurface, x, y);
+             if (viewport->current.committed & E_VIDEO_VIEWPORT_STATE_DESTINATION)
+               _viewport_border_geometry_update(viewport);
 
-             viewport->pending.committed |= E_VIDEO_VIEWPORT_STATE_DESTINATION;
-             viewport->pending.width = width;
-             viewport->pending.height = height;
+             if (viewport->source)
+               _source_viewport_committed(viewport->source);
+          }
+        else if (viewport->source && viewport->source->current.committed != E_VIDEO_VIEWPORT_SOURCE_STATE_CLEAN)
+          {
+             if (viewport->source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO)
+               _source_destination_update(viewport->source);
+             _source_transform_update(viewport->source);
           }
-
-        if (viewport->pending.committed != E_VIDEO_VIEWPORT_STATE_CLEAN)
-          _viewport_state_commit(viewport, &viewport->pending);
 
         break;
      }