/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
enum { VALUE = offsetof( TestStructure, data ) };
};
-unsigned int GetPropertyImplementationAlignment( Property::Type& propertyType )
+uint32_t GetPropertyImplementationAlignment( Property::Type& propertyType )
{
- unsigned int alignment = 0u;
+ uint32_t alignment = 0u;
switch( propertyType )
{
- case Property::NONE:
- case Property::STRING:
- case Property::ARRAY:
- case Property::MAP:
- {
- DALI_ASSERT_ALWAYS( false && "No size for properties with no type, or dynamic sizes" );
- break;
- }
case Property::BOOLEAN:
{
alignment = PropertyImplementationTypeAlignment< Property::BOOLEAN >::VALUE;
alignment = PropertyImplementationTypeAlignment< Property::ROTATION >::VALUE;
break;
}
+ case Property::NONE:
+ case Property::STRING:
+ case Property::ARRAY:
+ case Property::MAP:
+ case Property::EXTENTS:
+ {
+ // already handled by higher level code
+ }
}
return alignment;
return propertyBuffer;
}
-void PropertyBuffer::SetData( const void* data, std::size_t size )
+void PropertyBuffer::SetData( const void* data, uint32_t size )
{
- DALI_ASSERT_DEBUG( mFormat.Count() && "Format must be set before setting the data." );
+ mSize = size; // size is the number of elements
- mSize = size;
+ uint32_t bufferSize = mBufferFormatSize * mSize;
- // Check if format and size have been set yet
- if( mBufferFormat != NULL )
- {
- unsigned int bufferSize = mBufferFormat->size * mSize;
- mBuffer.Resize( bufferSize );
- }
+ // create a new DALi vector to store the buffer data
+ // the heap allocated vector will end up being owned by Render::PropertyBuffer
+ OwnerPointer< Vector<uint8_t> > bufferCopy = new Dali::Vector<uint8_t>();
+ bufferCopy->Resize( bufferSize );
- const char* source = static_cast<const char*>( data );
- std::copy( source, source + mBuffer.Size(), &mBuffer[0] );
+ // copy the data
+ const uint8_t* source = static_cast<const uint8_t*>( data );
+ uint8_t* destination = &((*bufferCopy)[0]);
+ std::copy( source, source + bufferSize, destination );
- SceneGraph::SetPropertyBufferData( mEventThreadServices.GetUpdateManager(), *mRenderObject, new Dali::Vector<char>( mBuffer ), mSize );
+ // Ownership of the bufferCopy is passed to the message ( uses an owner pointer )
+ SceneGraph::SetPropertyBufferData( mEventThreadServices.GetUpdateManager(), *mRenderObject, bufferCopy, mSize );
}
-std::size_t PropertyBuffer::GetSize() const
+uint32_t PropertyBuffer::GetSize() const
{
return mSize;
}
PropertyBuffer::PropertyBuffer()
: mEventThreadServices( *Stage::GetCurrent() ),
mRenderObject( NULL ),
- mBufferFormat( NULL ),
+ mBufferFormatSize( 0 ),
mSize( 0 )
{
}
void PropertyBuffer::Initialize( Dali::Property::Map& formatMap )
{
mRenderObject = new Render::PropertyBuffer();
- SceneGraph::AddPropertyBuffer(mEventThreadServices.GetUpdateManager(), *mRenderObject );
-
- mFormat = formatMap;
+ OwnerPointer< Render::PropertyBuffer > transferOwnership( mRenderObject );
+ SceneGraph::AddPropertyBuffer( mEventThreadServices.GetUpdateManager(), transferOwnership );
- size_t numComponents = mFormat.Count();
+ uint32_t numComponents = static_cast<uint32_t>( formatMap.Count() );
// Create the format
- DALI_ASSERT_DEBUG( mBufferFormat == NULL && "PropertyFormat should not be set yet" );
- Render::PropertyBuffer::Format* format = new Render::PropertyBuffer::Format();
+ OwnerPointer< Render::PropertyBuffer::Format> format = new Render::PropertyBuffer::Format();
format->components.resize( numComponents );
- unsigned int currentAlignment = 0u;
- unsigned int maxAlignmentRequired = 0u;
+ uint32_t currentAlignment = 0u;
+ uint32_t maxAlignmentRequired = 0u;
- for( size_t i = 0u; i < numComponents; ++i )
+ for( uint32_t i = 0u; i < numComponents; ++i )
{
- KeyValuePair component = mFormat.GetKeyValue( i );
+ KeyValuePair component = formatMap.GetKeyValue( i );
// Get the name
if(component.first.type == Property::Key::INDEX)
Property::Type type = Property::Type( component.second.Get<int>() );
// Get the size and alignment
- unsigned int elementSize = GetPropertyImplementationSize( type );
- unsigned int elementAlignment = GetPropertyImplementationAlignment( type );
+ if( ( type == Property::NONE ) ||
+ ( type == Property::STRING ) ||
+ ( type == Property::ARRAY ) ||
+ ( type == Property::MAP ) )
+ {
+ DALI_ABORT( "Property::Type not supported in PropertyBuffer" );
+ }
+ uint32_t elementSize = GetPropertyImplementationSize( type );
+ uint32_t elementAlignment = GetPropertyImplementationAlignment( type );
// check if current alignment is compatible with new member
- if( unsigned int offset = currentAlignment % elementAlignment )
+ if( uint32_t offset = currentAlignment % elementAlignment )
{
// Not compatible, realign
currentAlignment = currentAlignment + elementSize - offset;
// Check the alignment for the maxAlignment required to calculate the size of the format
if( maxAlignmentRequired != 0 )
{
- if( unsigned int offset = currentAlignment % maxAlignmentRequired )
+ if( uint32_t offset = currentAlignment % maxAlignmentRequired )
{
// Not compatible, realign
currentAlignment = currentAlignment + maxAlignmentRequired - offset;
// Set the format size
format->size = currentAlignment;
- mBufferFormat = format;
+ mBufferFormatSize = format->size;
SceneGraph::SetPropertyBufferFormat(mEventThreadServices.GetUpdateManager(), *mRenderObject, format );
}
-unsigned int GetPropertyImplementationSize( Property::Type& propertyType )
+uint32_t GetPropertyImplementationSize( Property::Type& propertyType )
{
- unsigned int size = 0u;
+ uint32_t size = 0u;
switch( propertyType )
{
- case Property::NONE:
- case Property::STRING:
- case Property::ARRAY:
- case Property::MAP:
- {
- DALI_ASSERT_ALWAYS( "No size for properties with no type, or dynamic sizes" );
- break;
- }
case Property::BOOLEAN:
{
size = sizeof( PropertyImplementationType< Property::BOOLEAN >::Type );
size = sizeof( PropertyImplementationType< Property::ROTATION >::Type );
break;
}
+ case Property::NONE:
+ case Property::STRING:
+ case Property::ARRAY:
+ case Property::MAP:
+ case Property::EXTENTS:
+ {
+ // already handled by higher level code
+ }
}
return size;