/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
// INTERNAL INCLUDES
#include <dali/public-api/rendering/property-buffer.h>
-#include <dali/internal/event/common/stage-impl.h>
#include <dali/internal/update/manager/update-manager.h>
namespace Dali
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::STRING:
case Property::ARRAY:
case Property::MAP:
+ case Property::EXTENTS:
{
// already handled by higher level code
}
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() ),
+: mEventThreadServices( EventThreadServices::Get() ),
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)
{
DALI_ABORT( "Property::Type not supported in PropertyBuffer" );
}
- unsigned int elementSize = GetPropertyImplementationSize( type );
- unsigned int elementAlignment = GetPropertyImplementationAlignment( type );
+ 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::STRING:
case Property::ARRAY:
case Property::MAP:
+ case Property::EXTENTS:
{
// already handled by higher level code
}