[TBMBackend] Add rotation feature to TBM backend 05/157905/2
authorWonsik, Jung <sidein@samsung.com>
Fri, 27 Oct 2017 00:48:15 +0000 (09:48 +0900)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Fri, 27 Oct 2017 01:30:57 +0000 (01:30 +0000)
Add rotation feature to Ecore Evas TBM Backend

Change-Id: I56227d6f7054a9fcd471f969d6c561622d51f593

src/lib/ecore_evas/ecore_evas_tbm.c
src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
src/modules/evas/engines/gl_tbm/evas_tbm_main.c
src/modules/evas/engines/software_tbm/evas_outbuf.c

index bff2836..45fc4ae 100755 (executable)
@@ -35,7 +35,30 @@ _ecore_evas_tbm_free(Ecore_Evas *ee)
 }
 
 static void
-_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
+_ecore_evas_tbm_callback_resize_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
+{
+   ee->func.fn_resize = func;
+}
+
+static void
+_ecore_evas_tbm_callback_move_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
+{
+   ee->func.fn_move = func;
+}
+
+static void
+_ecore_evas_tbm_move(Ecore_Evas *ee, int x, int y)
+{
+   ee->req.x = x;
+   ee->req.y = y;
+   if ((ee->x == x) && (ee->y == y)) return;
+   ee->x = x;
+   ee->y = y;
+   if (ee->func.fn_move) ee->func.fn_move(ee);
+}
+
+static void
+_ecore_evas_tbm_resize(Ecore_Evas *ee, int w, int h)
 {
    Ecore_Evas_Engine_Tbm_Data *tbm_data = ee->engine.data;
 
@@ -58,13 +81,170 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
 }
 
 static void
-_ecore_evas_move_resize(Ecore_Evas *ee, int x EINA_UNUSED, int y EINA_UNUSED, int w, int h)
+_ecore_evas_tbm_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+   if ((ee->x != x) || (ee->y != y))
+     _ecore_evas_tbm_move(ee, x, y);
+   if ((ee->w != w) || (ee->h != h))
+     _ecore_evas_tbm_resize(ee, w, h);
+}
+
+static void
+_ecore_evas_tbm_rotation_set(Ecore_Evas *ee, int rotation, int resize)
 {
-   _ecore_evas_resize(ee, w, h);
+   int rot_dif;
+
+   if (ee->rotation == rotation) return;
+
+   /* calculate difference in rotation */
+   rot_dif = ee->rotation - rotation;
+   if (rot_dif < 0) rot_dif = -rot_dif;
+
+   /* check if rotation is just a flip */
+   if (rot_dif % 180)
+     {
+        int minw, minh, maxw, maxh;
+        int basew, baseh, stepw, steph;
+
+        /* check if we are rotating with resize */
+        if (!resize)
+          {
+             int fw, fh;
+             int ww, hh;
+
+             /* grab framespace width & height */
+             evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
+
+             /* check for fullscreen */
+             if (!ee->prop.fullscreen && !ee->prop.maximized)
+               {
+
+               }
+             else
+               {
+                  /* resize the canvas based on rotation */
+                  if ((rotation == 0) || (rotation == 180))
+                    {
+                       /* resize the canvas */
+                       evas_output_size_set(ee->evas, ee->req.w, ee->req.h);
+                       evas_output_viewport_set(ee->evas, 0, 0,
+                                                ee->req.w, ee->req.h);
+                    }
+                  else
+                    {
+                       /* resize the canvas */
+                       evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
+                       evas_output_viewport_set(ee->evas, 0, 0,
+                                                ee->req.h, ee->req.w);
+                    }
+               }
+
+             /* add canvas damage */
+             if (ECORE_EVAS_PORTRAIT(ee))
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+             else
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w);
+             ww = ee->h;
+             hh = ee->w;
+             ee->w = ww;
+             ee->h = hh;
+             ee->req.w = ww;
+             ee->req.h = hh;
+          }
+        else
+          {
+             /* resize the canvas based on rotation */
+             if ((rotation == 0) || (rotation == 180))
+               {
+                  evas_output_size_set(ee->evas, ee->w, ee->h);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+               }
+             else
+               {
+                  evas_output_size_set(ee->evas, ee->h, ee->w);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+               }
+
+             /* call the ecore_evas' resize function */
+             if (ee->func.fn_resize) ee->func.fn_resize(ee);
+
+             /* add canvas damage */
+             if (ECORE_EVAS_PORTRAIT(ee))
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+             else
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+          }
+
+        /* get min, max, base, & step sizes */
+        ecore_evas_size_min_get(ee, &minw, &minh);
+        ecore_evas_size_max_get(ee, &maxw, &maxh);
+        ecore_evas_size_base_get(ee, &basew, &baseh);
+        ecore_evas_size_step_get(ee, &stepw, &steph);
+
+        /* record the current rotation of the ecore_evas */
+        ee->rotation = rotation;
+
+        /* reset min, max, base, & step sizes */
+        ecore_evas_size_min_set(ee, minh, minw);
+        ecore_evas_size_max_set(ee, maxh, maxw);
+        ecore_evas_size_base_set(ee, baseh, basew);
+        ecore_evas_size_step_set(ee, steph, stepw);
+
+        /* send a mouse_move process
+         *
+         * NB: Is This Really Needed ?
+         * Yes, it's required to update the mouse position, relatively to
+         * widgets. After a rotation change, e.g., the mouse might not be over
+         * a button anymore. */
+        _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
+                                       ecore_loop_time_get());
+     }
+   else
+     {
+        /* record the current rotation of the ecore_evas */
+        ee->rotation = rotation;
+
+        /* send a mouse_move process
+         *
+         * NB: Is This Really Needed ? Yes, it's required to update the mouse
+         * position, relatively to widgets. */
+        _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
+                                       ecore_loop_time_get());
+
+        /* call the ecore_evas' resize function */
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
+
+        /* add canvas damage */
+        if (ECORE_EVAS_PORTRAIT(ee))
+          evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+        else
+          evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+     }
+
+   if (!strcmp(ee->driver, "software_tbm"))
+     {
+        Evas_Engine_Info_Software_Tbm *einfo;
+        einfo = (Evas_Engine_Info_Software_Tbm *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+     }
+   else if (!strcmp(ee->driver, "gl_tbm"))
+     {
+        Evas_Engine_Info_GL_Tbm *einfo;
+        einfo = (Evas_Engine_Info_GL_Tbm *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+     }
+
+   if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
 }
 
 static void
-_ecore_evas_show(Ecore_Evas *ee)
+_ecore_evas_tbm_show(Ecore_Evas *ee)
 {
    if (ee->prop.focused) return;
    ee->prop.focused = EINA_TRUE;
@@ -459,61 +639,61 @@ _ecore_evas_tbm_msg_send(Ecore_Evas *ee, int msg_domain, int msg_id, void *data,
 static Ecore_Evas_Engine_Func _ecore_tbm_engine_func =
 {
      _ecore_evas_tbm_free,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     _ecore_evas_resize,
-     _ecore_evas_move_resize,
-     NULL,
-     NULL,
-     _ecore_evas_show,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
+     _ecore_evas_tbm_callback_resize_set,
+     _ecore_evas_tbm_callback_move_set,
+     NULL, // fn_callback_show_set
+     NULL, // fn_callback_hide_set
+     NULL, // fn_callback_delete_request_set
+     NULL, // fn_callback_destroy_set
+     NULL, // fn_callback_focus_in_set
+     NULL, // fn_callback_focus_out_set
+     NULL, // fn_callback_mouse_in_set
+     NULL, // fn_callback_mouse_out_set
+     NULL, // fn_callback_sticky_set
+     NULL, // fn_callback_unsticky_set
+     NULL, // fn_callback_pre_render_set
+     NULL, // fn_callback_post_render_set
+     _ecore_evas_tbm_move,
+     NULL, // fn_managed_move
+     _ecore_evas_tbm_resize,
+     _ecore_evas_tbm_move_resize,
+     _ecore_evas_tbm_rotation_set,
+     NULL, // fn_shaped_set
+     _ecore_evas_tbm_show,
+     NULL, // fn_hide
+     NULL, // fn_raise
+     NULL, // fn_lower
+     NULL, // fn_activate
+     NULL, // fn_title_set
+     NULL, // fn_name_class_set
+     NULL, // fn_size_min_set
+     NULL, // fn_size_max_set
+     NULL, // fn_size_base_set
+     NULL, // fn_size_step_set
+     NULL, // fn_object_cursor_set
+     NULL, // fn_object_cursor_unset
+     NULL, // fn_layer_set
+     NULL, // fn_focus_set
+     NULL, // fn_iconified_set
+     NULL, // fn_borderless_set
+     NULL, // fn_override_set
+     NULL, // fn_maximized_set
+     NULL, // fn_fullscreen_set
+     NULL, // fn_avoid_damage_set
+     NULL, // fn_withdrawn_set
+     NULL, // fn_sticky_set
+     NULL, // fn_ignore_events_set
      _ecore_evas_tbm_alpha_set,
      NULL, //transparent
      NULL, // profiles_set
      _ecore_evas_tbm_profile_set,
 
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
+     NULL, // fn_window_group_set
+     NULL, // fn_aspect_set
+     NULL, // fn_urgent_set
+     NULL, // fn_modal_set
+     NULL, // fn_demands_attention_set
+     NULL, // fn_focus_skip_set
 
      _ecore_evas_tbm_render,
      NULL, // screen_geometry_get
index db63c90..fcb8d07 100644 (file)
@@ -1006,6 +1006,15 @@ _ecore_evas_drm_rotation_set(Ecore_Evas *ee, int rotation, int resize)
         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
           ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
      }
+   else if (!strcmp(ee->driver, "drm_tbm"))
+     {
+        Evas_Engine_Info_Software_Tbm *einfo;
+        einfo = (Evas_Engine_Info_Software_Tbm *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+     }
    else if (!strcmp(ee->driver, "gl_drm"))
      {
         Evas_Engine_Info_GL_Drm *einfo;
@@ -1015,6 +1024,15 @@ _ecore_evas_drm_rotation_set(Ecore_Evas *ee, int rotation, int resize)
         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
           ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
      }
+   else if (!strcmp(ee->driver, "gl_drm_tbm"))
+     {
+        Evas_Engine_Info_GL_Tbm *einfo;
+        einfo = (Evas_Engine_Info_GL_Tbm *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+     }
 
    if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
 }
index 1af328e..4afd9a4 100755 (executable)
@@ -339,7 +339,7 @@ eng_window_resurf(Outbuf *gw)
 void
 eng_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth EINA_UNUSED)
 {
-   if (ob->w != w || ob->h != h)
+   if (ob->w != w || ob->h != h || ob->rot != rot)
      {
         ob->w = w;
         ob->h = h;
@@ -347,7 +347,7 @@ eng_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth EIN
         eng_window_use(ob);
         glsym_evas_gl_common_context_resize(ob->gl_context, w, h, rot,1);
 
-        tbm_surface_queue_reset(ob->tbm_queue, w, h, TBM_FORMAT_ARGB8888);
+        //tbm_surface_queue_reset(ob->tbm_queue, w, h, TBM_FORMAT_ARGB8888);
      }
 }
 
index 7a267c1..7198c7d 100644 (file)
@@ -161,11 +161,12 @@ evas_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot EINA_UNUSED, Outbuf_De
       w,h);
 #endif
 
-   if ((ob->w != w) || (ob->h != h))
+   if ((ob->w != w) || (ob->h != h) || (ob->rotation != rot))
      {
         ob->w = w;
         ob->h = h;
-        tbm_surface_queue_reset(ob->priv.tbm_queue, w, h, TBM_FORMAT_ARGB8888);
+        ob->rotation = rot;
+        //tbm_surface_queue_reset(ob->priv.tbm_queue, w, h, TBM_FORMAT_ARGB8888);
      }
 }