e_output: use zpos to make capture image for hwc_windows 38/220638/2
authorJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 20 Dec 2019 06:44:25 +0000 (15:44 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Thu, 26 Dec 2019 06:12:39 +0000 (06:12 +0000)
Change-Id: Iff9795e43830884ddb0dc49424d2950e8068f54b
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/bin/e_output.c

index 6ed61c1..36a7ac9 100644 (file)
@@ -1930,6 +1930,63 @@ _e_output_layer_sort_cb(const void *d1, const void *d2)
    return (e_layer_1->zpos - e_layer_2->zpos);
 }
 
+static int
+_e_output_cb_hwc_window_sort(const void *d1, const void *d2)
+{
+   E_Hwc_Window *hwc_window1 = (E_Hwc_Window *)d1;
+   E_Hwc_Window *hwc_window2 = (E_Hwc_Window *)d2;
+
+   if (!hwc_window1) return(1);
+   if (!hwc_window2) return(-1);
+
+   return (e_hwc_window_zpos_get(hwc_window1) - e_hwc_window_zpos_get(hwc_window2));
+}
+
+static Eina_Bool
+_e_output_vbuf_capture_hwc_windows(E_Output *output, E_Hwc_Window *hwc_window, E_Comp_Wl_Video_Buf *vbuf, int rotate, Eina_Bool rotate_check)
+{
+   int w = 0, h = 0;
+   E_Comp_Wl_Video_Buf *tmp = NULL;
+   tbm_surface_h surface = NULL;
+   Eina_Rectangle showing_pos = {0, };
+   Eina_Rectangle dst_pos = {0, };
+   Eina_Rectangle src_crop = {0, };
+   Eina_Rectangle dst_crop = {0, };
+   Eina_Bool ret = EINA_FALSE;
+
+   e_output_size_get(output, &w, &h);
+
+   surface = e_hwc_window_displaying_surface_get(hwc_window);
+   if (!surface) return EINA_FALSE;
+
+   tmp = e_comp_wl_video_buffer_create_tbm(surface);
+   if (tmp == NULL)
+     return EINA_FALSE;
+
+   ret = _e_output_capture_src_crop_get_hwc_window(output, hwc_window, &src_crop, &showing_pos);
+   if (ret == EINA_FALSE)
+     goto done;
+
+   ret = _e_output_capture_position_get(output, vbuf->width, vbuf->height, &dst_pos, rotate_check);
+   if (ret == EINA_FALSE)
+     goto done;
+
+   _e_output_capture_dst_crop_get_hwc_window(output, hwc_window, tmp, vbuf, w, h,
+                                             &dst_pos, &showing_pos, &dst_crop, rotate);
+
+   e_comp_wl_video_buffer_convert(tmp, vbuf,
+                                  src_crop.x, src_crop.y, src_crop.w, src_crop.h,
+                                  dst_crop.x, dst_crop.y, dst_crop.w, dst_crop.h,
+                                  EINA_TRUE, rotate, 0, 0);
+
+   ret = EINA_TRUE;
+
+done:
+   e_comp_wl_video_buffer_unref(tmp);
+
+   return ret;
+}
+
 static Eina_Bool
 _e_output_vbuf_capture_hwc_window(E_Output *output, E_Comp_Wl_Video_Buf *vbuf, int rotate, Eina_Bool rotate_check)
 {
@@ -1937,62 +1994,61 @@ _e_output_vbuf_capture_hwc_window(E_Output *output, E_Comp_Wl_Video_Buf *vbuf, i
    E_Hwc *hwc = NULL;
    E_Hwc_Window *hwc_window = NULL;
    Eina_List *l;
-   Eina_Bool ret = EINA_FALSE;
+   Eina_List *visible_list = NULL;
+   Eina_Bool target_window = EINA_FALSE;
 
    e_output_size_get(output, &width, &height);
    if (width == 0 || height == 0)
-     return ret;
+     return EINA_FALSE;
 
    hwc = output->hwc;
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
 
    EINA_LIST_FOREACH(hwc->hwc_windows, l, hwc_window)
      {
-        E_Comp_Wl_Video_Buf *tmp = NULL;
-        tbm_surface_h surface = NULL;
-        Eina_Rectangle showing_pos = {0, };
-        Eina_Rectangle dst_pos = {0, };
-        Eina_Rectangle src_crop = {0, };
-        Eina_Rectangle dst_crop = {0, };
-
         if (!hwc_window) continue;
+        if (hwc_window->is_target) continue;
         if (e_hwc_window_is_video(hwc_window)) continue;
+        if (e_hwc_window_zpos_get(hwc_window) == -999) continue;
 
-        surface = e_hwc_window_displaying_surface_get(hwc_window);
-        if (!surface) continue;
-
-        tmp = e_comp_wl_video_buffer_create_tbm(surface);
-        if (tmp == NULL) continue;
-
-        ret = _e_output_capture_src_crop_get_hwc_window(output, hwc_window, &src_crop, &showing_pos);
-        if (ret == EINA_FALSE)
+        if (e_hwc_window_accepted_state_get(hwc_window) == E_HWC_WINDOW_STATE_CLIENT)
           {
-             e_comp_wl_video_buffer_unref(tmp);
+             target_window = EINA_TRUE;
+             visible_list = eina_list_append(visible_list, hwc_window);
              continue;
           }
 
-        ret = _e_output_capture_position_get(output, vbuf->width, vbuf->height, &dst_pos, rotate_check);
-        if (ret == EINA_FALSE)
+        if (e_hwc_window_accepted_state_get(hwc_window) == E_HWC_WINDOW_STATE_DEVICE)
+          visible_list = eina_list_append(visible_list, hwc_window);
+     }
+
+   if (eina_list_count(visible_list) == 0)
+     {
+        EOINF("no visible hwc_window for capture", output);
+        _e_output_vbuf_capture_hwc_windows(output, (E_Hwc_Window *)hwc->target_hwc_window, vbuf, rotate, rotate_check);
+        return EINA_TRUE;
+     }
+
+   visible_list = eina_list_sort(visible_list, eina_list_count(visible_list), _e_output_cb_hwc_window_sort);
+
+   EINA_LIST_FOREACH(visible_list, l, hwc_window)
+     {
+        if (e_hwc_window_accepted_state_get(hwc_window) == E_HWC_WINDOW_STATE_CLIENT)
           {
-             e_comp_wl_video_buffer_unref(tmp);
+             if (target_window)
+               {
+                  target_window = EINA_FALSE;
+                  _e_output_vbuf_capture_hwc_windows(output, (E_Hwc_Window *)hwc->target_hwc_window, vbuf, rotate, rotate_check);
+               }
              continue;
           }
 
-        _e_output_capture_dst_crop_get_hwc_window(output, hwc_window, tmp, vbuf, width, height,
-                                       &dst_pos, &showing_pos, &dst_crop, rotate);
-
-        e_comp_wl_video_buffer_convert(tmp, vbuf,
-                                       src_crop.x, src_crop.y, src_crop.w, src_crop.h,
-                                       dst_crop.x, dst_crop.y, dst_crop.w, dst_crop.h,
-                                       EINA_TRUE, rotate, 0, 0);
-
-        e_comp_wl_video_buffer_unref(tmp);
+        _e_output_vbuf_capture_hwc_windows(output, hwc_window, vbuf, rotate, rotate_check);
      }
 
-   ret = EINA_TRUE;
-
-   return ret;
+   return EINA_TRUE;
 }
+
 static Eina_Bool
 _e_output_vbuf_capture(E_Output *output, E_Comp_Wl_Video_Buf *vbuf, int rotate, Eina_Bool rotate_check)
 {