#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>
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
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 );
}
if( widgetView && !widgetView->IsWidgetFaulted() )
{
widgetView->CloseRemoteSurface();
- widgetView->RemoveWidgetImage();
+ widgetView->RemoveWidgetRenderer();
}
}
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 );
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 );
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()
{
mWidgetFaultedSignal.Emit( handle );
CloseRemoteSurface();
- RemoveWidgetImage();
+ RemoveWidgetRenderer();
break;
}
case WIDGET_INSTANCE_EVENT_CREATE_ABORTED:
Property::Map map;
if( value.Get( map ) )
{
- impl.SetWidgetImagePropertyMap( map );
+ impl.SetEffectPropertyMap( map );
}
break;
}
Property::Map map;
if( value.Get( map ) )
{
- impl.SetWidgetImagePropertyMap( map );
+ impl.SetEffectPropertyMap( map );
}
break;
}
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 )
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;
}
}
-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 );
}
}
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
#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>
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 );
void SetRetryTextPropertyMap( Dali::Property::Map map );
- void SetWidgetImagePropertyMap( Dali::Property::Map map );
+ void SetEffectPropertyMap( Dali::Property::Map map );
void ShowLoadingState( bool show );
float TextPixelToPointSize( int pixelSize );
+ Dali::Shader CreateShader();
+
+ Dali::Geometry CreateQuadGeometry();
+
+ bool GetStringFromProperty( const Dali::Property::Value& value, std::string& output );
+
private: // From Control
/**
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;
screen_connector_toolkit_h mWatcherHandle;
tizen_remote_surface* mRemoteSurface;
- Dali::Property::Map mWidgetImagePropertyMap;
+ Dali::Property::Map mEffectPropertyMap;
// Signals
Dali::WidgetView::WidgetView::WidgetViewSignalType mWidgetAddedSignal;