// We always need the first update!
mStatus.keepUpdating = Integration::KeepUpdating::STAGE_KEEP_RENDERING;
- mCore = Dali::Integration::Core::New(
- mRenderController,
- mPlatformAbstraction,
- mGlAbstraction,
- mGlSyncAbstraction,
- mGestureManager,
- mDataRetentionPolicy);
+ mCore = Dali::Integration::Core::New( mRenderController,
+ mPlatformAbstraction,
+ mGlAbstraction,
+ mGlSyncAbstraction,
+ mGestureManager,
+ mDataRetentionPolicy,
+ false );
mCore->ContextCreated();
mCore->SurfaceResized( mSurfaceWidth, mSurfaceHeight );
unsigned int nextVSyncTime = mLastVSyncTime + intervalMilliseconds;
float elapsedSeconds = intervalMilliseconds / 1e3f;
- mCore->Update( elapsedSeconds, mLastVSyncTime, nextVSyncTime, mStatus );
+ mCore->Update( elapsedSeconds, mLastVSyncTime, nextVSyncTime, mStatus, false, false );
GetRenderController().Initialize();
dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, smallVisual );
actor.SetSize( 200.f, 200.f );
+
+ Toolkit::Visual::ResourceStatus resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL);
DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION );
Stage::GetCurrent().Add( actor );
application.SendNotification();
application.SendNotification();
application.Render();
+ resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL);
DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION );
Visual::Base largeVisual = factory.CreateVisual( propertyMapLarge );
largeVisual.SetName("largeVisual");
dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL2, largeVisual, false );
+ resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL2);
+ DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION );
+
application.SendNotification();
- application.Render();
+ resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL2);
DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION );
+
+ dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL2, true );
+
+ DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
+
+ application.SendNotification();
+
+ resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL2);
+ DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION );
END_TEST;
}
label.SetProperty( TextLabel::Property::ELLIPSIS, true );
DALI_TEST_CHECK( label.GetProperty<bool>( TextLabel::Property::ELLIPSIS ) );
+ // Check the layout direction property
+ label.SetProperty( Actor::Property::LAYOUT_DIRECTION, LayoutDirection::RIGHT_TO_LEFT );
+ DALI_TEST_EQUALS( label.GetProperty< int >( Actor::Property::LAYOUT_DIRECTION ), static_cast< int >( LayoutDirection::RIGHT_TO_LEFT ), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render();
+
END_TEST;
}
return controlDataImpl.IsVisualEnabled( index );
}
+Toolkit::Visual::ResourceStatus GetVisualResourceStatus( const Internal::Control& control, Dali::Property::Index index )
+{
+ const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
+ return controlDataImpl.GetVisualResourceStatus( index );
+}
+
Dali::Animation CreateTransition( Internal::Control& control, const Toolkit::TransitionData& handle )
{
Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
// INTERNAL INCLUDES
#include <dali-toolkit/public-api/controls/control.h>
+#include <dali-toolkit/devel-api/visual-factory/visual-base.h>
namespace Dali
{
DALI_IMPORT_API bool IsVisualEnabled( const Internal::Control& control, Dali::Property::Index index );
/**
+ * @brief Get the loading state of the visual resource.
+ *
+ * @param[in] control The control
+ * @param[in] index The Property index of the visual
+ * @return Return the loading status (PREPARING, READY and FAILED) of visual resource
+ */
+DALI_IMPORT_API Toolkit::Visual::ResourceStatus GetVisualResourceStatus( const Internal::Control& control, Dali::Property::Index index );
+
+/**
* @brief Create a transition effect on the control.
*
* Only generates an animation if the properties described in the transition
namespace Visual
{
+
+enum class ResourceStatus
+{
+ PREPARING,
+ READY,
+ FAILED
+};
+
/**
* @brief A Visual provides a renderer for drawing a control component. A control may have multiple visuals.
*
return true;
}
+Toolkit::Visual::ResourceStatus Control::Impl::GetVisualResourceStatus( Property::Index index ) const
+{
+ RegisteredVisualContainer::Iterator iter;
+ if ( FindVisual( index, mVisuals, iter ) )
+ {
+ const Toolkit::Visual::Base visual = (*iter)->visual;
+ const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual );
+ return visualImpl.GetResourceStatus( );
+ }
+
+ return Toolkit::Visual::ResourceStatus::PREPARING;
+}
Dali::Animation Control::Impl::CreateTransition( const Toolkit::TransitionData& handle )
{
void StartObservingVisual( Toolkit::Visual::Base& visual);
/**
+ * @copydoc Dali::Toolkit::DevelControl::GetVisualResourceStatus()
+ */
+ Toolkit::Visual::ResourceStatus GetVisualResourceStatus( Property::Index index ) const;
+
+ /**
* @copydoc Dali::Toolkit::DevelControl::CreateTransition()
*/
Dali::Animation CreateTransition( const Toolkit::TransitionData& transitionData );
#define __DALI_TOOLKIT_INTERNAL_IMAGE_VIEW_H__
/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// Creates a background visual. Even if the color is transparent it updates the stencil.
mStencil.SetProperty( Toolkit::Control::Property::BACKGROUND,
- Property::Map().Add( Toolkit::Visual::Property::TYPE, Visual::COLOR ).
+ Property::Map().Add( Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR ).
Add( ColorVisual::Property::MIX_COLOR, Color::TRANSPARENT ) );
// Enable the clipping property.
float TextLabel::GetHeightForWidth( float width )
{
- Padding padding;
- Self().GetPadding( padding );
+ Extents padding;
+ padding = Self().GetProperty<Extents>( Toolkit::Control::Property::PADDING );
+
return mController->GetHeightForWidth( width ) + padding.top + padding.bottom;
}
{
DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel::OnRelayout\n" );
- Padding padding;
- Self().GetPadding( padding );
- Vector2 contentSize( size.x - ( padding.left + padding.right ), size.y - ( padding.top + padding.bottom ) );
+ Extents padding;
+ padding = Self().GetProperty<Extents>( Toolkit::Control::Property::PADDING );
+
+ Vector2 contentSize( size.x - ( padding.start + padding.end ), size.y - ( padding.top + padding.bottom ) );
const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize );
// Update the visual
TextVisual::EnableRendererUpdate( mVisual );
- Padding padding;
- Self().GetPadding( padding );
+ Dali::LayoutDirection::Type layoutDirection = static_cast<Dali::LayoutDirection::Type>( Self().GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get<int>() );
+ if( Dali::LayoutDirection::RIGHT_TO_LEFT == layoutDirection )
+ {
+ std::swap(padding.start, padding.end);
+ }
Property::Map visualTransform;
visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, contentSize )
.Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
- .Add( Toolkit::Visual::Transform::Property::OFFSET, Vector2(padding.left, padding.top) )
+ .Add( Toolkit::Visual::Transform::Property::OFFSET, Vector2(padding.start, padding.top) )
.Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) )
.Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
.Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN );
mFrameDelayTimer.Start();
DALI_LOG_INFO(gAnimImgLogFilter,Debug::Concise,"ResourceReady()\n");
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
TextureSet AnimatedImageVisual::PrepareTextureSet()
actor.AddRenderer( mImpl->mRenderer );
// Border Visual Generated and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
void BorderVisual::DoCreatePropertyMap( Property::Map& map ) const
actor.AddRenderer( mImpl->mRenderer );
// Color Visual generated and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
void ColorVisual::DoCreatePropertyMap( Property::Map& map ) const
actor.AddRenderer( mImpl->mRenderer );
// Gradient Visual generated and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
void GradientVisual::DoCreatePropertyMap( Property::Map& map ) const
mPlacementActor.Reset();
// Image loaded and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
}
map.Insert( Toolkit::ImageVisual::Property::WRAP_MODE_V, mWrapModeV );
map.Insert( Toolkit::ImageVisual::Property::ATLASING, mAttemptAtlasing );
+
if( mMaskingData != NULL )
{
map.Insert( Toolkit::ImageVisual::Property::ALPHA_MASK_URL, mMaskingData->mAlphaMaskUrl.GetUrl() );
}
}
+bool ImageVisual::IsResourceReady() const
+{
+ return ( mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::READY ||
+ mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::FAILED );
+}
+
Shader ImageVisual::GetImageShader( VisualFactoryCache& factoryCache, bool atlasing, bool defaultTextureWrapping )
{
Shader shader;
// From Texture Manager
void ImageVisual::UploadComplete( bool loadingSuccess, int32_t textureId, TextureSet textureSet, bool usingAtlas, const Vector4& atlasRectangle )
{
+ Toolkit::Visual::ResourceStatus resourceStatus;
Actor actor = mPlacementActor.GetHandle();
if( actor )
{
sampler.SetWrapMode( mWrapModeU, mWrapModeV );
textureSet.SetSampler( 0u, sampler );
mImpl->mRenderer.SetTextures(textureSet);
+
+ resourceStatus = Toolkit::Visual::ResourceStatus::READY;
}
else
{
mImpl->mRenderer.SetTextures( textureSet );
ApplyImageToSampler( brokenImage );
+
+ resourceStatus = Toolkit::Visual::ResourceStatus::FAILED;
}
// Image loaded and ready to display
- ResourceReady();
+ ResourceReady( resourceStatus );
}
}
mLoading = false;
*/
virtual void OnSetTransform();
+ /**
+ * @copydoc Visual::Base::IsResourceReady
+ */
+ virtual bool IsResourceReady() const;
+
public:
/**
actor.AddRenderer( mImpl->mRenderer );
// Mesh loaded and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
void MeshVisual::DoCreatePropertyMap( Property::Map& map ) const
actor.AddRenderer( mImpl->mRenderer );
// npatch loaded and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
void NPatchVisual::DoSetOffStage( Actor& actor )
actor.AddRenderer( mImpl->mRenderer );
// Primitive generated and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
void PrimitiveVisual::DoCreatePropertyMap( Property::Map& map ) const
mPlacementActor = actor;
// SVG visual needs it's size set before it can be rasterized hence set ResourceReady once on stage
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
void SvgVisual::DoSetOffStage( Actor& actor )
}
// Svg loaded and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
}
}
// Nothing else to do if the relayout size is zero.
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
return;
}
control.AddRenderer( mImpl->mRenderer );
// Text rendered and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
}
}
mMixColorIndex( Property::INVALID_INDEX ),
mOpacityIndex( Property::INVALID_INDEX ),
mFlags( 0 ),
- mResourceReady( false )
+ mResourceStatus( Toolkit::Visual::ResourceStatus::PREPARING )
{
}
Property::Index mMixColorIndex;
Property::Index mOpacityIndex;
int mFlags;
- bool mResourceReady:1;
+ Toolkit::Visual::ResourceStatus mResourceStatus;
};
} // namespace Visual
mImpl->mResourceObserver = NULL;
}
-void Visual::Base::ResourceReady()
+void Visual::Base::ResourceReady(Toolkit::Visual::ResourceStatus resourceStatus)
{
- if( mImpl->mResourceReady )
+ if( mImpl->mResourceStatus != resourceStatus )
{
- // only inform the observer the first time the resource is ready
- return;
- }
- mImpl->mResourceReady = true;
+ mImpl->mResourceStatus = resourceStatus;
- if( mImpl->mResourceObserver )
- {
- // observer is currently a control impl
- mImpl->mResourceObserver->ResourceReady( *this );
+ if( mImpl->mResourceObserver )
+ {
+ // observer is currently a control impl
+ mImpl->mResourceObserver->ResourceReady( *this );
+ }
}
}
bool Visual::Base::IsResourceReady() const
{
- return mImpl->mResourceReady;
+ return ( mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::READY );
+}
+
+Toolkit::Visual::ResourceStatus Visual::Base::GetResourceStatus() const
+{
+ return mImpl->mResourceStatus;
}
Renderer Visual::Base::GetRenderer()
/**
* @brief Called when the visuals resources are loaded / ready
*/
- void ResourceReady();
+ void ResourceReady( Toolkit::Visual::ResourceStatus resourceStatus );
/**
* @brief Called when the visuals resources are loaded / ready
* @return true if ready, false otherwise
*/
- bool IsResourceReady() const;
+ virtual bool IsResourceReady() const;
+
+ /**
+ * @brief Get the loading state of the visual resource
+ * @return Return the loading status (PREPARING, READY and FAILED) of visual resource
+ */
+ Toolkit::Visual::ResourceStatus GetResourceStatus() const;
protected:
actor.AddRenderer( mImpl->mRenderer );
// Wireframe generated and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
void WireframeVisual::InitializeRenderer()
const unsigned int TOOLKIT_MAJOR_VERSION = 1;
const unsigned int TOOLKIT_MINOR_VERSION = 2;
-const unsigned int TOOLKIT_MICRO_VERSION = 63;
+const unsigned int TOOLKIT_MICRO_VERSION = 64;
const char * const TOOLKIT_BUILD_DATE = __DATE__ " " __TIME__;
#ifdef DEBUG_ENABLED
Name: dali-toolkit
Summary: Dali 3D engine Toolkit
-Version: 1.2.63
+Version: 1.2.64
Release: 1
Group: System/Libraries
License: Apache-2.0 and BSD-3-Clause and MIT