[SDL_Tizen] Fix pre-rotation issue 89/118189/2
authorhuiyu.eun <huiyu.eun@samsung.com>
Wed, 8 Mar 2017 06:48:25 +0000 (15:48 +0900)
committerhuiyu.eun <huiyu.eun@samsung.com>
Tue, 14 Mar 2017 03:58:29 +0000 (12:58 +0900)
- Change prerotation location before draw call
- Remove wl_egl_window_resize() before prerotation
- Use Tizen_SetWindowSize

Change-Id: I199fad47c5638970808afeeb51786bd90d7ab502
Signed-off-by: huiyu.eun <huiyu.eun@samsung.com>
src/video/tizen/SDL_tizenopengles.c
src/video/tizen/SDL_tizenwindow.c

index 2390555..2819106 100755 (executable)
@@ -66,24 +66,6 @@ Tizen_GLES_SwapWindow(_THIS, SDL_Window *window)
     SDL_WindowData* wdata = (SDL_WindowData*)window->driverdata;
 
     if (wdata->received_rotation == 1) {
-        if(wdata->support_pre_rotation) {
-            int screen_w, screen_h;
-            if(wdata->rotation==90 || wdata->rotation==270)
-                ecore_wl_screen_size_get(&screen_h, &screen_w);
-            else
-                ecore_wl_screen_size_get(&screen_w, &screen_h);
-
-            SDL_SetWindowSize(window, screen_w, screen_h);
-            if(window->flags & SDL_WINDOW_FULLSCREEN)
-            {
-                window->w = screen_w;
-                window->h = screen_h;
-            }
-
-            wl_egl_window_resize(wdata->egl_window, window->w, window->h, 0, 0);
-            Tizen_pre_rotation_set(wdata);
-        }
-        SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SIZE_CHANGED, window->w, window->h);
         ecore_wl_window_rotation_change_done_send(wdata->window);
         wdata->received_rotation = 0;
     }
index 04e2d19..780fab7 100755 (executable)
@@ -314,6 +314,8 @@ Tizen_CreateWindow(_THIS, SDL_Window *window)
                                        window->x, window->y, window->w, window->h,
                                        ECORE_WL_WINDOW_BUFFER_TYPE_SHM);
     wind->surface = ecore_wl_window_surface_create(wind->window);
+    ecore_wl_window_type_set(wind->window, ECORE_WL_WINDOW_TYPE_UTILITY);
+
     wind->rotation = 0;
     wind->rotation_supported = 0;
     wind->received_rotation = 0;
@@ -371,23 +373,27 @@ Tizen_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered)
 }
 
 void
-_tizen_egl_window_resize(SDL_Window *window)
+_tizen_window_resize(SDL_Window *window)
 {
     SDL_WindowData *wind = window->driverdata;
     if (!wind->egl_window) {
         return;
     }
 
+    if(wind->support_pre_rotation && (wind->rotation==90 || wind->rotation==270))
+        ecore_wl_window_update_size(wind->window, window->h, window->w);
+    else
+        ecore_wl_window_update_size(wind->window, window->w, window->h);
+
     // TODO : consider to rotation status.
 #if SDL_VIDEO_OPENGL_EGL
     if (window->flags & SDL_WINDOW_OPENGL) {
-        // TODO : if window size is not FULL, we need the code about Non FullSize Window.
-        int aw, ah;
-        wl_egl_window_get_attached_size(wind->egl_window, &aw, &ah);
-        wl_egl_window_resize(wind->egl_window, aw, ah, 0, 0);
+      if(wind->support_pre_rotation && (wind->rotation==90 || wind->rotation==270))
+          wl_egl_window_resize(wind->egl_window, window->h, window->w, 0, 0);
+      else
+          wl_egl_window_resize(wind->egl_window, window->w, window->h, 0, 0);
     }
 #endif
-
 }
 
 void
@@ -397,14 +403,12 @@ _tizen_setwindowsize(SDL_Window *window)
     if (!wind->window) {
         return;
     }
-    ecore_wl_window_update_size(wind->window, window->w, window->h);
 }
 
 void
 Tizen_SetWindowSize(_THIS, SDL_Window *window)
 {
-//    _tizen_setwindowsize(window);
-//    _tizen_egl_window_resize(window);
+    _tizen_window_resize(window);
 }
 
 void
@@ -535,6 +539,59 @@ _tizen_send_rotation_event(SDL_Window *window, unsigned int angle)
     return;
 }
 
+void
+_tizen_set_window_size(SDL_Window * window, int w, int h)
+{
+    if(!window)
+    {
+        SDL_SetError("Invalid window");
+        return;
+    }
+
+    SDL_VideoDevice *_this = SDL_GetVideoDevice();
+    if (!_this) {
+        SDL_SetError("Video subsystem has not been initialized");
+        return;
+    }
+
+    if (window->magic != &_this->window_magic) {
+        return;
+    }
+
+    if (w <= 0) {
+        SDL_InvalidParamError("w");
+        return;
+    }
+    if (h <= 0) {
+        SDL_InvalidParamError("h");
+        return;
+    }
+
+    /* Make sure we don't exceed any window size limits */
+    if (window->min_w && w < window->min_w)
+    {
+        w = window->min_w;
+    }
+    if (window->max_w && w > window->max_w)
+    {
+        w = window->max_w;
+    }
+    if (window->min_h && h < window->min_h)
+    {
+        h = window->min_h;
+    }
+    if (window->max_h && h > window->max_h)
+    {
+        h = window->max_h;
+    }
+
+    window->windowed.w = w;
+    window->windowed.h = h;
+
+    window->w = w;
+    window->h = h;
+}
+
 Eina_Bool
 _tizen_cb_event_window_rotate(void *data, int type EINA_UNUSED, void *event)
 {
@@ -557,8 +614,18 @@ _tizen_cb_event_window_rotate(void *data, int type EINA_UNUSED, void *event)
         /* set ecore_wayland window rotation */
         wind->rotation = ev->angle;
         ecore_wl_window_rotation_set(ew, ev->angle);
-        // Send Rotation Event
+        if(wind->support_pre_rotation) {
+            int window_w, window_h;
+            if(wind->rotation==90 || wind->rotation==270)
+                ecore_wl_window_geometry_get(wind->window, 0, 0, &window_h, &window_w);
+            else
+                ecore_wl_window_geometry_get(wind->window, 0, 0, &window_w, &window_h);
+
+            _tizen_set_window_size(window, window_w, window_h);
+            Tizen_pre_rotation_set(wind);
+        }
         _tizen_send_rotation_event(window, ev->angle);
+        SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SIZE_CHANGED, window->w, window->h);
         wind->received_rotation = 1;
     }