#include <dali/public-api/render-tasks/render-task-list.h>
#include <dali/public-api/render-tasks/render-task.h>
#include <dali/public-api/actors/camera-actor.h>
+#include <dali-toolkit/devel-api/controls/control-devel.h>
+#include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
+#include <dali-toolkit/public-api/image-loader/image.h>
+#include <dali-toolkit/public-api/image-loader/image-url.h>
#include <dali-toolkit/public-api/visuals/visual-properties.h>
+#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
+#include <dali-toolkit/public-api/visuals/image-visual-properties.h>
#include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
#include <dali-toolkit/devel-api/controls/control-devel.h>
#include <dali/integration-api/debug.h>
mPaused( false ),
mPausedManually( false ),
mWindowVisible( true ),
- mPreviewEnable( true )
+ mPreviewEnable( true ),
+ mIsReadyToRender(false),
+ mCornerRadius(Vector4::ZERO),
+ mCornerRadiusPolicy(1.0f)
{
}
mPaused( false ),
mPausedManually( false ),
mWindowVisible( true ),
- mPreviewEnable( true )
+ mPreviewEnable( true ),
+ mIsReadyToRender(false),
+ mCornerRadius(Vector4::ZERO),
+ mCornerRadiusPolicy(1.0f)
{
}
void WidgetView::CreateWidgetRenderer()
{
- Dali::Any source;
- mImageSource = Dali::NativeImageSource::New( source );
- Dali::Texture texture = Dali::Texture::New( *mImageSource );
- Dali::Geometry geometry = CreateQuadGeometry();
- Dali::Shader shader = CreateShader();
- mRenderer = Dali::Renderer::New( geometry, shader );
+ // Check CornerRadius is enabled
+ Toolkit::Visual::Base widgetVisual = Dali::Toolkit::DevelControl::GetVisual(*this, Dali::WidgetView::WidgetView::Property::WIDGET_ID);
+ if(widgetVisual)
+ {
+ Property::Map widgetMap;
+ widgetVisual.CreatePropertyMap(widgetMap);
+ Property::Value* cornerRadiusValue = widgetMap.Find(Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS);
+ mCornerRadius = cornerRadiusValue->Get<Vector4>();
+ Property::Value* cornerRadiusValuePolicy = widgetMap.Find(Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY);
+ mCornerRadiusPolicy = cornerRadiusValuePolicy->Get<int>();
+ DALI_LOG_RELEASE_INFO("Create widgetVisual for CornerRadius corner(%f,%f,%f,%f), policy:%f \n", mCornerRadius.x, mCornerRadius.y, mCornerRadius.z, mCornerRadius.w, mCornerRadiusPolicy);
+ }
+ else
+ {
+ DALI_LOG_ERROR("widgetVisual is null, we can't use corner radius %d", Dali::WidgetView::WidgetView::Property::WIDGET_ID);
+ }
- Dali::TextureSet textureSet = Dali::TextureSet::New();
- textureSet.SetTexture( 0u, texture );
- mRenderer.SetTextures( textureSet );
+ // Create Renderer if cornderRadius is disabled.
+ if(mCornerRadius == Vector4::ZERO)
+ {
+ // We don't need WidgetVisual anymore, so we can delete it.
+ Dali::Toolkit::DevelControl::UnregisterVisual(*this, Dali::WidgetView::WidgetView::Property::WIDGET_ID);
- //EFL app should be pre multiplied image.
- mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true );
+ Dali::Any source;
+ mImageSource = Dali::NativeImageSource::New( source );
+ Dali::Texture texture = Dali::Texture::New( *mImageSource );
+ Dali::Geometry geometry = CreateQuadGeometry();
+ Dali::Shader shader = CreateShader();
+ mRenderer = Dali::Renderer::New( geometry, shader );
- Self().AddRenderer( mRenderer );
+ Dali::TextureSet textureSet = Dali::TextureSet::New();
+ textureSet.SetTexture( 0u, texture );
+ mRenderer.SetTextures( textureSet );
+
+ //EFL app should be pre multiplied image.
+ 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 );
+ // Renderer is created by WidgetView or widgetVisual
+ mIsReadyToRender = true;
+
DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetRenderer: Widget image is added. [%p]\n", this );
}
void WidgetView::RemoveWidgetRenderer()
{
- if( mRenderer )
+ if(mIsReadyToRender)
{
- Self().RemoveRenderer( mRenderer );
+ if(mRenderer)
+ {
+ Self().RemoveRenderer( mRenderer );
+ }
ShowRetryState( true );
Dali::WidgetView::WidgetView handle( GetOwner() );
mWidgetDeletedSignal.Emit( handle );
+
+ mIsReadyToRender = false;
}
DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetRenderer: Widget image is removed. [%p]\n", this );
mStateTextActor.Add( mRetryText );
mRetryText.SetProperty( Actor::Property::VISIBLE, false );
+ // Create WidgetVisual for WidgetView
+ Property::Map propertyMap;
+ Dali::Any source;
+ mImageSource = Dali::NativeImageSource::New(source);
+ Dali::Toolkit::ImageUrl nativeImageUrl = Dali::Toolkit::Image::GenerateUrl(mImageSource);
+ propertyMap.Insert(Dali::Toolkit::Visual::Property::TYPE, Dali::Toolkit::Visual::IMAGE);
+ propertyMap.Insert(Dali::Toolkit::ImageVisual::Property::URL, nativeImageUrl.GetUrl());
+ Toolkit::Visual::Base widgetVisual = Toolkit::VisualFactory::Get().CreateVisual(propertyMap);
+ if(widgetVisual)
+ {
+ DALI_LOG_RELEASE_INFO("Create WidgetVisual for CornerRadius corner(%f,%f,%f,%f), policy:%f \n", mCornerRadius.x, mCornerRadius.y, mCornerRadius.z, mCornerRadius.w, mCornerRadiusPolicy);
+ Dali::Toolkit::DevelControl::RegisterVisual(*this, Dali::WidgetView::WidgetView::Property::WIDGET_ID, widgetVisual);
+ }
+ else
+ {
+ DALI_LOG_ERROR("fail to create WidgetVisual for CornerRadius corner(%f,%f,%f,%f), policy:%f \n", mCornerRadius.x, mCornerRadius.y, mCornerRadius.z, mCornerRadius.w, mCornerRadiusPolicy);
+ Dali::Toolkit::DevelControl::UnregisterVisual(*this, Dali::WidgetView::WidgetView::Property::WIDGET_ID);
+ }
+
// launch widget
LaunchWidget();
self.TouchedSignal().Connect( this, &WidgetView::OnTouch );
{
}
-bool WidgetView::IsWidgetRenderer()
+bool WidgetView::IsReadyToRender()
{
- return ( mRenderer )? true: false;
+ return mIsReadyToRender;
}
void WidgetView::UpdateImageSource( tbm_surface_h source )
{
mImageSource = Dali::NativeImageSource::New( source );
- Dali::Texture texture = Dali::Texture::New( *mImageSource );
+ // Create NativeImageSource using tbm_surface
if( mRenderer )
{
+ Dali::Texture texture = Dali::Texture::New(*mImageSource);
Dali::TextureSet textureSet = mRenderer.GetTextures();
textureSet.SetTexture( 0u, texture );
mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true );
}
+ else
+ {
+ // Create WidgetVisual for new tbm surface
+ Dali::Toolkit::ImageUrl nativeImageUrl = Dali::Toolkit::Image::GenerateUrl(mImageSource);
+
+ Property::Map propertyMap;
+ propertyMap.Insert(Dali::Toolkit::Visual::Property::TYPE, Dali::Toolkit::Visual::IMAGE);
+ propertyMap.Insert(Dali::Toolkit::ImageVisual::Property::URL, nativeImageUrl.GetUrl());
+ propertyMap.Insert(Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS, mCornerRadius);
+ propertyMap.Insert(Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, mCornerRadiusPolicy);
+ Dali::Toolkit::Visual::Base widgetVisual= Toolkit::VisualFactory::Get().CreateVisual(propertyMap);
+ if(widgetVisual)
+ {
+ Dali::Toolkit::DevelControl::RegisterVisual(*this, Dali::WidgetView::WidgetView::Property::WIDGET_ID, widgetVisual);
+ }
+ else
+ {
+ Dali::Toolkit::DevelControl::UnregisterVisual(*this, Dali::WidgetView::WidgetView::Property::WIDGET_ID);
+ }
+ }
- // Register a callback using WidgetBuffer class
auto widgetBuffer = new WidgetBuffer(mBuffer,*this,mImageSource);
Dali::DevelNativeImageSource::SetResourceDestructionCallback(*mImageSource, new EventThreadCallback(MakeCallback(widgetBuffer, &WidgetBuffer::OnResourceDestruction)));
mBufferContainer.push_back(std::unique_ptr<WidgetBuffer>(widgetBuffer));
void WidgetView::UpdateBuffer( struct tizen_remote_surface *surface, struct wl_buffer *buffer, int32_t fd)
{
- if( !IsWidgetRenderer() )
+ if( !IsReadyToRender() )
{
tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);