Replaced ImageView for widget by Renderer 61/155961/7 accepted/tizen/unified/20171117.124959 submit/tizen/20171023.083435 submit/tizen/20171115.054905
authortaeyoon0.lee <taeyoon0.lee@samsung.com>
Mon, 16 Oct 2017 14:38:41 +0000 (23:38 +0900)
committertaeyoon0.lee <taeyoon0.lee@samsung.com>
Tue, 17 Oct 2017 12:06:30 +0000 (21:06 +0900)
Change-Id: I78a2febcb099d95a40034566ba411f9942f5dabb

widget_viewer_dali/internal/widget_view/widget_view_impl.cpp
widget_viewer_dali/internal/widget_view/widget_view_impl.h

index 8a9f205697005b53757f0165d2282d4513257c56..674aa48eba0efc2dbd48758f75d71a36467ffbf1 100644 (file)
 #include <dali/public-api/images/native-image.h>
 #include <dali/public-api/object/type-registry.h>
 #include <dali/public-api/object/type-registry-helper.h>
+#include <dali/public-api/object/property-array.h>
 #include <dali-toolkit/public-api/visuals/visual-properties.h>
 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
 #include <dali/integration-api/debug.h>
+#include <dali/devel-api/images/texture-set-image.h>
 #include <string.h>
 #include <Ecore_Wayland.h>
 #include <Ecore_Input.h>
@@ -115,6 +117,35 @@ const char* const TEXT_POINT_SIZE( "textPointSize" );
 const char* const TEXT_COLOR( "textColor" );
 const char* const TEXT_VISIBLE( "textVisible" ); //ToDo: it should be removed after retry text property is public one
 
+const char* const CUSTOM_SHADER( "shader" );
+const char* const CUSTOM_VERTEX_SHADER( "vertexShader" );
+const char* const CUSTOM_FRAGMENT_SHADER( "fragmentShader" );
+const char* const DEFAULT_SAMPLER_TYPE_NAME( "sampler2D" );
+const char* const CUSTOM_SAMPLER_TYPE_NAME( "samplerExternalOES" );
+
+static const char* VERTEX_SHADER_TEXTURE = DALI_COMPOSE_SHADER(
+    attribute mediump vec2 aPosition;\n
+    varying mediump vec2 vTexCoord;\n
+    uniform mediump mat4 uMvpMatrix;\n
+    uniform mediump vec3 uSize;\n
+    varying mediump vec2 sTexCoordRect;\n
+    void main()\n
+    {\n
+      gl_Position = uMvpMatrix * vec4(aPosition * uSize.xy, 0.0, 1.0);\n
+      vTexCoord = aPosition + vec2(0.5);\n
+    }\n
+);
+
+static const char* FRAGMENT_SHADER_TEXTURE = DALI_COMPOSE_SHADER(
+    uniform lowp vec4 uColor;\n
+    varying mediump vec2 vTexCoord;\n
+    uniform samplerExternalOES sTexture;\n
+    void main()\n
+    {\n
+      gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n
+    }\n
+);
+
 // ToDo: Now dali provides only dali key codes.
 // This funtion will be used to get platform specific key codes from key name
 struct KeyCodeMap
@@ -191,11 +222,11 @@ static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type
 
   if( widgetView )
   {
-    if( !widgetView->IsWidgetImageView() )
+    if( !widgetView->IsWidgetRenderer() )
     {
       tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
 
-      widgetView->CreateWidgetImageView();
+      widgetView->CreateWidgetRenderer();
       widgetView->ConnectSignal( surface );
     }
 
@@ -229,7 +260,7 @@ static void OnSurfaceRemoved( const char *appid, const char *instance_id, const
   if( widgetView && !widgetView->IsWidgetFaulted() )
   {
     widgetView->CloseRemoteSurface();
-    widgetView->RemoveWidgetImage();
+    widgetView->RemoveWidgetRenderer();
   }
 }
 
@@ -499,27 +530,24 @@ bool WidgetView::IsPermanentDelete()
   return mPermanentDelete;
 }
 
-void WidgetView::CreateWidgetImageView()
+void WidgetView::CreateWidgetRenderer()
 {
-  Any source;
+  Dali::Any source;
   mImageSource = Dali::NativeImageSource::New( source );
   Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
 
-  mWidgetImageView = Dali::Toolkit::ImageView::New( image );
-
-  mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
-  mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
-  mWidgetImageView.SetSize( mWidth, mHeight );
-
-  if( !mWidgetImagePropertyMap.Empty() )
-  {
-    mWidgetImageView.SetProperty( Toolkit::ImageView::Property::IMAGE, mWidgetImagePropertyMap );
-  }
+  Dali::Geometry geometry = CreateQuadGeometry();
+  Dali::Shader shader = CreateShader();
+  mRenderer = Dali::Renderer::New( geometry, shader );
 
-  Self().Add( mWidgetImageView );
+  Dali::TextureSet textureSet = Dali::TextureSet::New();
+  Dali::TextureSetImage( textureSet, 0u, image );
+  mRenderer.SetTextures( textureSet );
 
   //EFL app should be pre multiplied image.
-  mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
+  mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true );
+
+  Self().AddRenderer( mRenderer );
 
   // Disable preview and text
   ShowLoadingState( false );
@@ -528,15 +556,14 @@ void WidgetView::CreateWidgetImageView()
   Dali::WidgetView::WidgetView handle( GetOwner() );
   mWidgetAddedSignal.Emit( handle );
 
-  DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetImageView: Widget image is added.\n" );
+  DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetRenderer: Widget image is added.\n" );
 }
 
-void WidgetView::RemoveWidgetImage()
+void WidgetView::RemoveWidgetRenderer()
 {
-  if( mWidgetImageView )
+  if( mRenderer )
   {
-    mWidgetImageView.SetVisible( false );
-    mWidgetImageView.Reset();
+    Self().RemoveRenderer( mRenderer );
 
     ShowRetryState( true );
 
@@ -544,7 +571,7 @@ void WidgetView::RemoveWidgetImage()
     mWidgetDeletedSignal.Emit( handle );
   }
 
-  DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetImage: Widget image is removed.\n" );
+  DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetRenderer: Widget image is removed.\n" );
 }
 
 bool WidgetView::TerminateWidget()
@@ -604,7 +631,7 @@ void WidgetView::SendWidgetEvent( int event )
     {
       mWidgetFaultedSignal.Emit( handle );
       CloseRemoteSurface();
-      RemoveWidgetImage();
+      RemoveWidgetRenderer();
       break;
     }
     case WIDGET_INSTANCE_EVENT_CREATE_ABORTED:
@@ -756,7 +783,7 @@ void WidgetView::SetProperty( BaseObject* object, Property::Index index, const P
         Property::Map map;
         if( value.Get( map ) )
         {
-          impl.SetWidgetImagePropertyMap( map );
+          impl.SetEffectPropertyMap( map );
         }
         break;
       }
@@ -774,7 +801,7 @@ void WidgetView::SetProperty( BaseObject* object, Property::Index index, const P
         Property::Map map;
         if( value.Get( map ) )
         {
-          impl.SetWidgetImagePropertyMap( map );
+          impl.SetEffectPropertyMap( map );
         }
         break;
       }
@@ -1000,15 +1027,11 @@ void WidgetView::OnStageDisconnection()
 
 void WidgetView::OnSizeSet( const Vector3& targetSize )
 {
-  if( mWidgetImageView )
-  {
-    mWidgetImageView.SetSize( targetSize );
-  }
 }
 
-bool WidgetView::IsWidgetImageView()
+bool WidgetView::IsWidgetRenderer()
 {
-  return ( mWidgetImageView )? true: false;
+  return ( mRenderer )? true: false;
 }
 
 void WidgetView::UpdateImageSource( tbm_surface_h source )
@@ -1016,16 +1039,17 @@ void WidgetView::UpdateImageSource( tbm_surface_h source )
   mImageSource = Dali::NativeImageSource::New( source );
   Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
 
-  if( mWidgetImageView )
+  if( mRenderer )
   {
-    mWidgetImageView.SetImage( image );
-    mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
+    Dali::TextureSet textureSet = mRenderer.GetTextures();
+    Dali::TextureSetImage( textureSet, 0u, image );
+    mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true );
   }
 }
 
 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
 {
-  if( mWidgetImageView && surface )
+  if( mRenderer && surface )
   {
     mRemoteSurface = surface;
 
@@ -1300,12 +1324,23 @@ void WidgetView::SetRetryTextPropertyMap( Property::Map map )
   }
 }
 
-void WidgetView::SetWidgetImagePropertyMap( Property::Map map )
+void WidgetView::SetEffectPropertyMap( Property::Map map )
 {
-  mWidgetImagePropertyMap = map;
-  if( mWidgetImageView )
+  Property::Value* shaderValue;
+  if( !map.Empty() )
   {
-    mWidgetImageView.SetProperty( Toolkit::ImageView::Property::IMAGE, map );
+    shaderValue = map.Find( CUSTOM_SHADER );
+
+    if( shaderValue && map.Count() == 1u )
+    {
+      mEffectPropertyMap = *( shaderValue->GetMap() );
+    }
+  }
+
+  if( mRenderer && !mEffectPropertyMap.Empty() )
+  {
+    Dali::Shader shader = CreateShader();
+    mRenderer.SetShader( shader );
   }
 }
 
@@ -1478,6 +1513,112 @@ bool WidgetView::TouchEvent( const Dali::TouchData& event )
   return true;
 }
 
+Dali::Shader WidgetView::CreateShader()
+{
+  std::string fragmentShader = "#extension GL_OES_EGL_image_external:require\n";
+  fragmentShader += "\n";
+  std::string vertexShader;
+  std::string customFragmentShader;
+
+  if( !mEffectPropertyMap.Empty() )
+  {
+    Property::Value* vertexShaderValue = mEffectPropertyMap.Find( CUSTOM_VERTEX_SHADER );
+    if( vertexShaderValue )
+    {
+      if( !GetStringFromProperty( *vertexShaderValue, vertexShader ) )
+      {
+        DALI_LOG_ERROR( "'%s' parameter does not correctly specify a string\n", CUSTOM_VERTEX_SHADER );
+      }
+    }
+    else
+    {
+      vertexShader = VERTEX_SHADER_TEXTURE;
+    }
+
+    Property::Value* fragmentShaderValue = mEffectPropertyMap.Find( CUSTOM_FRAGMENT_SHADER );
+    if( fragmentShaderValue )
+    {
+      if( !GetStringFromProperty( *fragmentShaderValue, customFragmentShader ) )
+      {
+        DALI_LOG_ERROR( "'%s' parameter does not correctly specify a string\n", CUSTOM_FRAGMENT_SHADER );
+      }
+      fragmentShader += customFragmentShader;
+      fragmentShader.replace( fragmentShader.find( DEFAULT_SAMPLER_TYPE_NAME ), strlen( DEFAULT_SAMPLER_TYPE_NAME ), CUSTOM_SAMPLER_TYPE_NAME );
+    }
+    else
+    {
+      fragmentShader += FRAGMENT_SHADER_TEXTURE;
+    }
+  }
+  else
+  {
+    vertexShader = VERTEX_SHADER_TEXTURE;
+    fragmentShader += FRAGMENT_SHADER_TEXTURE;
+  }
+
+  return Dali::Shader::New( vertexShader, fragmentShader );
+}
+
+Dali::Geometry WidgetView::CreateQuadGeometry()
+{
+  const float halfWidth = 0.5f;
+  const float halfHeight = 0.5f;
+  struct QuadVertex { Vector2 position;};
+  QuadVertex quadVertexData[4] =
+  {
+      { Vector2(-halfWidth, -halfHeight) },
+      { Vector2(-halfWidth, halfHeight)  },
+      { Vector2( halfWidth, -halfHeight) },
+      { Vector2( halfWidth, halfHeight)  }
+  };
+
+  Property::Map quadVertexFormat;
+  quadVertexFormat["aPosition"] = Property::VECTOR2;
+  PropertyBuffer quadVertices = PropertyBuffer::New( quadVertexFormat );
+  quadVertices.SetData( quadVertexData, 4 );
+
+  // Create the geometry object
+  Dali::Geometry geometry = Dali::Geometry::New();
+  geometry.AddVertexBuffer( quadVertices );
+  geometry.SetType( Geometry::TRIANGLE_STRIP );
+
+  return geometry;
+}
+
+bool WidgetView::GetStringFromProperty( const Dali::Property::Value& value, std::string& output )
+{
+  bool extracted = false;
+  if( value.Get( output ) )
+  {
+    extracted = true;
+  }
+  else
+  {
+    Dali::Property::Array* array = value.GetArray();
+    if( array )
+    {
+      const unsigned int arraySize = array->Size();
+      for( unsigned int i = 0; i < arraySize; ++i )
+      {
+        std::string element;
+        if( array->GetElementAt( i ).Get( element ) )
+        {
+          extracted = true;
+          output += element + '\n';
+        }
+        else
+        {
+          output.clear();
+          extracted = false;
+          break;
+        }
+      }
+    }
+  }
+
+  return extracted;
+}
+
 } // namespace Internal
 
 } // namespace WidgetView
index c7e2039c890f147f88590dbea139b12ccf770922..d926d603a7c12e3a6d6750c330a4f02fe1581514 100644 (file)
@@ -22,6 +22,7 @@
 #include <widget_viewer_dali/public_api/widget_view/widget_view.h>
 
 // EXTERNAL INCLUDES
+#include <dali/public-api/rendering/renderer.h>
 #include <dali/public-api/adaptor-framework/native-image-source.h>
 #include <dali-toolkit/public-api/controls/control-impl.h>
 #include <dali-toolkit/public-api/controls/text-controls/text-label.h>
@@ -129,15 +130,15 @@ public: // Internal API
 
   void SetPermanentDelete( bool permanentDelete );
 
-  void RemoveWidgetImage();
+  void RemoveWidgetRenderer();
 
   bool IsPermanentDelete();
 
-  bool IsWidgetImageView();
+  bool IsWidgetRenderer();
 
   void UpdateImageSource( tbm_surface_h source );
 
-  void CreateWidgetImageView();
+  void CreateWidgetRenderer();
 
   void ConnectSignal( tizen_remote_surface* surface );
 
@@ -151,7 +152,7 @@ public: // Internal API
 
   void SetRetryTextPropertyMap( Dali::Property::Map map );
 
-  void SetWidgetImagePropertyMap( Dali::Property::Map map );
+  void SetEffectPropertyMap( Dali::Property::Map map );
 
   void ShowLoadingState( bool show );
 
@@ -220,6 +221,12 @@ protected:
 
   float TextPixelToPointSize( int pixelSize );
 
+  Dali::Shader CreateShader();
+
+  Dali::Geometry CreateQuadGeometry();
+
+  bool GetStringFromProperty( const Dali::Property::Value& value, std::string& output );
+
 private: // From Control
 
   /**
@@ -272,13 +279,15 @@ private:
 
 private:
 
-  Toolkit::ImageView mWidgetImageView;     ///< Widget content
   Toolkit::ImageView mPreviewImage;   ///< Preview image
   Toolkit::TextLabel mLoadingText;      ///< Loading text
   Toolkit::TextLabel mRetryText;      ///< Retry text
   Dali::Actor mPreviewActor;
   Dali::Actor mStateTextActor;
   Dali::NativeImageSourcePtr mImageSource;
+  Dali::Texture mNativeTexture;
+  Dali::TextureSet mTextureSet;
+  Dali::Renderer mRenderer;
 
   std::string mWidgetId;
   std::string mInstanceId;
@@ -303,7 +312,7 @@ private:
   screen_connector_toolkit_h mWatcherHandle;
   tizen_remote_surface* mRemoteSurface;
 
-  Dali::Property::Map mWidgetImagePropertyMap;
+  Dali::Property::Map mEffectPropertyMap;
 
   // Signals
   Dali::WidgetView::WidgetView::WidgetViewSignalType mWidgetAddedSignal;