e_output: support external output mode change
authorJunkyeong Kim <jk0430.kim@samsung.com>
Tue, 22 Jan 2019 04:52:57 +0000 (13:52 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 23 Jan 2019 04:32:41 +0000 (13:32 +0900)
Change-Id: I3277e2a3914c67fc0d7a3d8d5b57b85ee8771d9b
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/bin/e_output.c
src/bin/e_output.h

index f0c795c3c71f6fe798bd34846f5816856afef8cc..28cd46f0a08f5d75b4c00149569040b3dbddd8dc 100644 (file)
@@ -3664,3 +3664,66 @@ e_output_external_update(E_Output *output)
 
    return EINA_TRUE;
 }
+
+EINTERN Eina_Bool
+e_output_external_mode_change(E_Output *output, E_Output_Mode *mode)
+{
+   E_Output_Mode *emode = NULL, *current_emode = NULL;
+   Eina_List *l;
+   Eina_Bool found = EINA_FALSE;
+   E_Output *output_primary = NULL;
+   E_Plane *ep = NULL;
+   int w, h, p_w, p_h;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(mode, EINA_FALSE);
+
+   if (e_output_connected(output) != EINA_TRUE)
+     return EINA_FALSE;
+
+   current_emode = e_output_current_mode_get( output);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(current_emode, EINA_FALSE);
+
+   if (current_emode == mode)
+     return EINA_TRUE;
+
+   EINA_LIST_FOREACH(output->info.modes, l, emode)
+     {
+        if (mode == emode)
+          {
+             found = EINA_TRUE;
+             break;
+          }
+     }
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(found == EINA_TRUE, EINA_FALSE);
+
+   ep = e_output_fb_target_get(output);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ep, EINA_FALSE);
+
+   output_primary = e_comp_screen_primary_output_get(e_comp->e_comp_screen);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(output_primary, EINA_FALSE);
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(output_primary == output, EINA_FALSE);
+
+   e_comp_canvas_norender_push();
+
+   if (e_output_mode_apply(output, mode) == EINA_FALSE)
+     {
+        ERR("fail to e_output_mode_apply.");
+        e_comp_canvas_norender_pop();
+        return EINA_FALSE;
+     }
+
+   e_output_size_get(output, &w, &h);
+   e_output_size_get(output_primary, &p_w, &p_h);
+   _e_output_external_rect_get(output_primary, p_w, p_h, w, h, &output->zoom_conf.rect);
+
+   e_eom_mode_change(output, mode);
+   e_plane_external_reset(ep, &output->zoom_conf.rect);
+
+   _e_output_render_update(output_primary);
+   e_comp_canvas_norender_pop();
+
+   DBG("e_output_external_reset done: output:%s (%dx%d)", output->id, mode->w, mode->h);
+
+   return EINA_TRUE;
+}
index 1dde6191a4ba46ca89a70902cfbd4b8620927b8c..9d4cb2325c9c2bbdb3bf08fa144f6291ed7c9e37 100644 (file)
@@ -194,6 +194,7 @@ EINTERN const char      * e_output_output_id_get(E_Output *output);
 EINTERN Eina_Bool         e_output_external_set(E_Output *output, E_Output_Ext_State state);
 EINTERN void              e_output_external_unset(E_Output *output);
 EINTERN Eina_Bool         e_output_external_update(E_Output *output);
+EINTERN Eina_Bool         e_output_external_mode_change(E_Output *output, E_Output_Mode *mode);
 E_API E_Output          * e_output_find(const char *id);
 E_API E_Output          * e_output_find_by_index(int index);
 E_API const Eina_List   * e_output_planes_get(E_Output *output);