From f54eec2bc66e98276b94c686f361db647e33372a Mon Sep 17 00:00:00 2001 From: "taeyoon0.lee" Date: Mon, 16 Oct 2017 23:38:41 +0900 Subject: [PATCH] Replaced ImageView for widget by Renderer Change-Id: I78a2febcb099d95a40034566ba411f9942f5dabb --- .../internal/widget_view/widget_view_impl.cpp | 221 ++++++++++++++---- .../internal/widget_view/widget_view_impl.h | 21 +- 2 files changed, 196 insertions(+), 46 deletions(-) diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp index 8a9f205..674aa48 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp @@ -28,9 +28,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -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 diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.h b/widget_viewer_dali/internal/widget_view/widget_view_impl.h index c7e2039..d926d60 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.h +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.h @@ -22,6 +22,7 @@ #include // EXTERNAL INCLUDES +#include #include #include #include @@ -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; -- 2.34.1