From 9efac538ccce5f22fde05824ae7e25857c10a412 Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Tue, 19 Sep 2017 11:58:55 -0400 Subject: [PATCH] ecore-evas-drm: Implement actual evas engine rotations in drm This patch implements handling of evas output rotation for the ecore_evas drm engine. ref T5999 Signed-off-by: Chris Michael --- .../ecore_evas/engines/drm/ecore_evas_drm.c | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c index 561dd3092c..bd569ddbd5 100644 --- a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c +++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c @@ -218,17 +218,75 @@ _drm_free(Ecore_Evas *ee) } static void -_drm_rotation_do(Ecore_Evas *ee, int rotation, int resize EINA_UNUSED) +_drm_rotation_do(Ecore_Evas *ee, int rotation, int resize) { Evas_Engine_Info_Drm *einfo; + int diff; if (ee->rotation == rotation) return; - ee->rotation = rotation; + einfo = (Evas_Engine_Info_Drm *)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); + + diff = ee->rotation - rotation; + if (diff < 0) diff = -diff; + + if (diff != 180) + { + if (!resize) + { + int ww, hh; + + 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 + { + 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); + } + + if (ee->func.fn_resize) ee->func.fn_resize(ee); + + 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); + } + + ee->rotation = rotation; + } + else + { + ee->rotation = rotation; + + if (ee->func.fn_resize) ee->func.fn_resize(ee); + + 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); + } } static void