X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fvisual-base-data-impl.cpp;h=19c2c746884e208567175a739e7f14d453d7887e;hp=f539dd6650f386823bc5aab5f5ef0700e17d8c1c;hb=5a2a5883422f4d114902ac57d57d7d1e973fbb2e;hpb=c5651d9850075a3d2d96444883ee8e23844a5f3e diff --git a/dali-toolkit/internal/visuals/visual-base-data-impl.cpp b/dali-toolkit/internal/visuals/visual-base-data-impl.cpp index f539dd6..19c2c74 100644 --- a/dali-toolkit/internal/visuals/visual-base-data-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-base-data-impl.cpp @@ -1,5 +1,5 @@ /* - * 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. @@ -25,7 +25,8 @@ #include // INTERNAL INCLUDES -#include +#include +#include #include namespace Dali @@ -46,11 +47,50 @@ DALI_ENUM_TO_STRING_WITH_SCOPE( Shader::Hint, OUTPUT_IS_TRANSPARENT ) DALI_ENUM_TO_STRING_WITH_SCOPE( Shader::Hint, MODIFIES_GEOMETRY ) DALI_ENUM_TO_STRING_TABLE_END( SHADER_HINT ) +DALI_ENUM_TO_STRING_TABLE_BEGIN( ALIGN ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Align, TOP_BEGIN ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Align, TOP_CENTER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Align, TOP_END ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Align, CENTER_BEGIN ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Align, CENTER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Align, CENTER_END ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Align, BOTTOM_BEGIN ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Align, BOTTOM_CENTER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Align, BOTTOM_END ) +DALI_ENUM_TO_STRING_TABLE_END( ALIGN ) + +Dali::Vector2 PointToVector2( Toolkit::Align::Type point, Toolkit::Direction::Type direction ) +{ + static const float pointToVector2[] = { 0.0f,0.0f, + 0.5f,0.0f, + 1.0f,0.0f, + 0.0f,0.5f, + 0.5f,0.5f, + 1.0f,0.5f, + 0.0f,1.0f, + 0.5f,1.0f, + 1.0f,1.0f }; + + Vector2 result( &pointToVector2[point*2] ); + if( direction == Direction::RIGHT_TO_LEFT ) + { + result.x = 1.0f - result.x; + } + + return result; +} + } // unnamed namespace Internal::Visual::Base::Impl::Impl() -: mCustomShader(NULL), +: mCustomShader( NULL ), + mBlendSlotDelegate( NULL ), + mTransform(), + mMixColor( Color::WHITE ), + mControlSize( Vector2::ZERO ), mDepthIndex( 0.0f ), + mMixColorIndex( Property::INVALID_INDEX ), + mOpacityIndex( Property::INVALID_INDEX ), mFlags( 0 ) { } @@ -58,6 +98,7 @@ Internal::Visual::Base::Impl::Impl() Internal::Visual::Base::Impl::~Impl() { delete mCustomShader; + delete mBlendSlotDelegate; } Internal::Visual::Base::Impl::CustomShader::CustomShader( const Property::Map& map ) @@ -77,7 +118,7 @@ void Internal::Visual::Base::Impl::CustomShader::SetPropertyMap( const Property: Property::Value* vertexShaderValue = shaderMap.Find( Toolkit::Visual::Shader::Property::VERTEX_SHADER, CUSTOM_VERTEX_SHADER ); if( vertexShaderValue ) { - if( !vertexShaderValue->Get( mVertexShader ) ) + if( ! GetStringFromProperty( *vertexShaderValue, mVertexShader ) ) { DALI_LOG_ERROR( "'%s' parameter does not correctly specify a string\n", CUSTOM_VERTEX_SHADER ); } @@ -86,7 +127,7 @@ void Internal::Visual::Base::Impl::CustomShader::SetPropertyMap( const Property: Property::Value* fragmentShaderValue = shaderMap.Find( Toolkit::Visual::Shader::Property::FRAGMENT_SHADER, CUSTOM_FRAGMENT_SHADER ); if( fragmentShaderValue ) { - if( !fragmentShaderValue->Get( mFragmentShader ) ) + if( ! GetStringFromProperty( *fragmentShaderValue, mFragmentShader ) ) { DALI_LOG_ERROR( "'%s' parameter does not correctly specify a string\n", CUSTOM_FRAGMENT_SHADER ); } @@ -158,10 +199,127 @@ void Internal::Visual::Base::Impl::CustomShader::CreatePropertyMap( Property::Ma customShader.Insert( Toolkit::Visual::Shader::Property::HINTS, static_cast< int >( mHints ) ); } - map.Insert( Toolkit::Visual::Property::SHADER, customShader ); + map.Insert( Toolkit::DevelVisual::Property::SHADER, customShader ); + } +} + +Internal::Visual::Base::Impl::Transform::Transform() +: mOffset( 0.0f,0.0f ), + mSize( 1.0f,1.0f ), + mOffsetSizeMode( 0.0f,0.0f,0.0f,0.0f ), + mOrigin( Toolkit::Align::CENTER ), + mAnchorPoint( Toolkit::Align::CENTER ) +{ +} + +void Internal::Visual::Base::Impl::Transform::SetPropertyMap( const Property::Map& map ) +{ + // Set default values + mOffset = Vector2( 0.0f,0.0f ); + mSize = Vector2( 1.0f,1.0f ); + mOffsetSizeMode = Vector4( 0.0f,0.0f,0.0f,0.0f ); + mOrigin = Toolkit::Align::CENTER; + mAnchorPoint = Toolkit::Align::CENTER; + + UpdatePropertyMap( map ); +} + +void Internal::Visual::Base::Impl::Transform::UpdatePropertyMap( const Property::Map& map ) +{ + for( Property::Map::SizeType i(0); i( keyValue.second, ALIGN_TABLE, ALIGN_TABLE_COUNT, mOrigin ); + break; + } + case Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT: + { + Scripting::GetEnumerationProperty< Toolkit::Align::Type >( keyValue.second, ALIGN_TABLE, ALIGN_TABLE_COUNT, mAnchorPoint ); + break; + } + case Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE: + { + keyValue.second.Get( mOffsetSizeMode ); + break; + } + } + } + else // Key type is STRING + { + if( keyValue.first == "offset" ) + { + keyValue.second.Get( mOffset ); + } + else if( keyValue.first == "size" ) + { + keyValue.second.Get( mSize ); + } + else if( keyValue.first == "origin" ) + { + Toolkit::Align::Type align(Toolkit::Align::CENTER); + if( Scripting::GetEnumerationProperty< Toolkit::Align::Type >( keyValue.second, ALIGN_TABLE, ALIGN_TABLE_COUNT, align ) ) + { + mOrigin = align; + } + } + else if( keyValue.first == "anchorPoint" ) + { + Toolkit::Align::Type align(Toolkit::Align::CENTER); + if( Scripting::GetEnumerationProperty< Toolkit::Align::Type >( keyValue.second, ALIGN_TABLE, ALIGN_TABLE_COUNT, align ) ) + { + mAnchorPoint = align; + } + } + else if( keyValue.first == "offsetSizeMode" ) + { + keyValue.second.Get( mOffsetSizeMode ); + } + } } } +void Internal::Visual::Base::Impl::Transform::GetPropertyMap( Property::Map& map ) const +{ + map.Clear(); + map.Add( Toolkit::DevelVisual::Transform::Property::OFFSET, mOffset ) + .Add( Toolkit::DevelVisual::Transform::Property::SIZE, mSize ) + .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, mOrigin ) + .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, mAnchorPoint ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, mOffsetSizeMode ); +} + +void Internal::Visual::Base::Impl::Transform::RegisterUniforms( Dali::Renderer renderer, Toolkit::Direction::Type direction ) +{ + renderer.RegisterProperty( SIZE, mSize ); + renderer.RegisterProperty( OFFSET, direction == Toolkit::Direction::LEFT_TO_RIGHT ? mOffset : mOffset * Vector2(-1.0f,1.0f)); + renderer.RegisterProperty( OFFSET_SIZE_MODE, mOffsetSizeMode ); + renderer.RegisterProperty( ORIGIN, PointToVector2( mOrigin, direction ) - Vector2(0.5,0.5) ); + renderer.RegisterProperty( ANCHOR_POINT, Vector2(0.5,0.5) - PointToVector2( mAnchorPoint, direction ) ); +} + +Vector2 Internal::Visual::Base::Impl::Transform::GetVisualSize( const Vector2& controlSize ) +{ + return Vector2( Lerp( mOffsetSizeMode.x, mSize.x * controlSize.x, mSize.x ), + Lerp( mOffsetSizeMode.y, mSize.y * controlSize.y, mSize.y ) ); +} + + } // namespace Internal } // namespace Toolkit