[Tizen] Apply screen rotation to create window 27/243727/1
authorWonsik Jung <sidein@samsung.com>
Wed, 9 Sep 2020 09:39:15 +0000 (18:39 +0900)
committerWonsik Jung <sidein@samsung.com>
Wed, 9 Sep 2020 09:45:19 +0000 (18:45 +0900)
Apply screen rotation to create window.
Current solution is to use output transform event.
It has one problem which  the not rotated scene is shown when output transform event is received too late.
To fix the problem, window(scene) should be create with screen rotation angle.

Change-Id: If59d2d94f5a5b22d291354539804bd50a7b1ef42

dali/integration-api/adaptor-framework/scene-holder-impl.cpp
dali/internal/window-system/common/window-render-surface.cpp
dali/internal/window-system/common/window-render-surface.h

index 66da5dbc41a68809b16e52872d826a2fab97ca78..09f8a2bc6179f1594346b674eb56203bc85a248b 100644 (file)
@@ -262,7 +262,8 @@ void SceneHolder::SetAdaptor(Dali::Adaptor& adaptor)
 
   // Create the scene
   PositionSize surfacePositionSize = mSurface->GetPositionSize();
-  mScene = Dali::Integration::Scene::New( Size(static_cast<float>( surfacePositionSize.width ), static_cast<float>( surfacePositionSize.height )) );
+  int orientation = mSurface->GetOrientation();
+  mScene = Dali::Integration::Scene::New( Size(static_cast<float>( surfacePositionSize.width ), static_cast<float>( surfacePositionSize.height )), orientation );
 
   Internal::Adaptor::Adaptor& adaptorImpl = Internal::Adaptor::Adaptor::GetImplementation( adaptor );
   mAdaptor = &adaptorImpl;
index 2ec42bfe99da271689dc7e3ea5ea9296c6f46511..9c65eb7ffe8eaa4d17835f9a6086dc5c3c6a1aaa 100644 (file)
@@ -75,6 +75,7 @@ WindowRenderSurface::WindowRenderSurface( Dali::PositionSize positionSize, Any s
   mRotationFinished( true ),
   mScreenRotationFinished( true ),
   mResizeFinished( true ),
+  mDefaultScreenRotationAvailable( false ),
   mDpiHorizontal( 0 ),
   mDpiVertical( 0 )
 {
@@ -107,6 +108,16 @@ void WindowRenderSurface::Initialize( Any surface )
 
   // Connect signals
   mWindowBase->OutputTransformedSignal().Connect( this, &WindowRenderSurface::OutputTransformed );
+
+  // Check screen rotation
+  mScreenRotationAngle = mWindowBase->GetScreenRotationAngle();
+  if( mScreenRotationAngle != 0 )
+  {
+    mScreenRotationFinished = false;
+    mResizeFinished = false;
+    mDefaultScreenRotationAvailable = true;
+    DALI_LOG_RELEASE_INFO("WindowRenderSurface::Initialize, screen rotation is enabled, screen rotation angle:[%d]\n", mScreenRotationAngle );
+  }
 }
 
 Any WindowRenderSurface::GetNativeWindow()
@@ -217,8 +228,20 @@ void WindowRenderSurface::CreateSurface()
 {
   DALI_LOG_TRACE_METHOD( gWindowRenderSurfaceLogFilter );
 
+  int width, height;
+  if( mScreenRotationAngle == 0 || mScreenRotationAngle == 180 )
+  {
+    width = mPositionSize.width;
+    height = mPositionSize.height;
+  }
+  else
+  {
+    width = mPositionSize.height;
+    height = mPositionSize.width;
+  }
+
   // Create the EGL window
-  EGLNativeWindowType window = mWindowBase->CreateEglWindow( mPositionSize.width, mPositionSize.height );
+  EGLNativeWindowType window = mWindowBase->CreateEglWindow( width, height );
 
   auto eglGraphics = static_cast<EglGraphics *>(mGraphics);
 
@@ -405,7 +428,7 @@ bool WindowRenderSurface::PreRender( bool resizingSurface, const std::vector<Rec
 
   auto eglGraphics = static_cast<EglGraphics *>(mGraphics);
 
-  if( resizingSurface )
+  if( resizingSurface || mDefaultScreenRotationAvailable )
   {
     int totalAngle = (mRotationAngle + mScreenRotationAngle) % 360;
 
@@ -418,7 +441,7 @@ bool WindowRenderSurface::PreRender( bool resizingSurface, const std::vector<Rec
       // Reset only screen rotation flag
       mScreenRotationFinished = true;
 
-      DALI_LOG_INFO( gWindowRenderSurfaceLogFilter, Debug::Verbose, "WindowRenderSurface::PreRender: Set rotation [%d] [%d]\n", mRotationAngle, mScreenRotationAngle );
+      DALI_LOG_RELEASE_INFO( "WindowRenderSurface::PreRender: Set rotation [%d] [%d]\n", mRotationAngle, mScreenRotationAngle );
     }
 
     // Only window rotate
@@ -446,7 +469,7 @@ bool WindowRenderSurface::PreRender( bool resizingSurface, const std::vector<Rec
       mWindowBase->ResizeEglWindow( positionSize );
       mResizeFinished = true;
 
-      DALI_LOG_INFO( gWindowRenderSurfaceLogFilter, Debug::Verbose, "WindowRenderSurface::PreRender: Set resize\n" );
+      DALI_LOG_RELEASE_INFO( "WindowRenderSurface::PreRender: Set resize\n" );
     }
 
     if (eglGraphics)
@@ -454,6 +477,7 @@ bool WindowRenderSurface::PreRender( bool resizingSurface, const std::vector<Rec
       Internal::Adaptor::EglImplementation& eglImpl = eglGraphics->GetEglImplementation();
       eglImpl.SetFullSwapNextFrame();
     }
+    mDefaultScreenRotationAvailable = false;
   }
 
   if (eglGraphics)
index b1ef6d958efa92c900483490bbffe78b2c850c5d..3a715862bb3ef94cab21c0a7f264a1d146ee91ed 100644 (file)
@@ -299,6 +299,7 @@ private: // Data
   bool                            mRotationFinished;
   bool                            mScreenRotationFinished;
   bool                            mResizeFinished;
+  bool                            mDefaultScreenRotationAvailable;
 
   uint32_t                        mDpiHorizontal;
   uint32_t                        mDpiVertical;