2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "control-renderer-data-impl.h"
22 #include <dali/public-api/common/dali-common.h>
23 #include <dali/integration-api/debug.h>
24 #include <dali/public-api/object/property-array.h>
40 const char * const CUSTOM_SHADER( "shader" );
41 const char * const CUSTOM_VERTEX_SHADER( "vertexShader" );
42 const char * const CUSTOM_FRAGMENT_SHADER( "fragmentShader" );
43 const char * const CUSTOM_SUBDIVIDE_GRID_X( "subdivideGridX" );
44 const char * const CUSTOM_SUBDIVIDE_GRID_Y( "subdivideGridY" );
45 const char * const CUSTOM_SHADER_HINTS( "hints" ); ///< type STRING for a hint from the below hint strings or an ARRAY of of hint strings
48 * where hints should be contain strings of the following shader hints:
49 * "none" | corresponds to HINT_NONE
50 * "requiresSelfDepthTest" | corresponds to HINT_REQUIRES_SELF_DEPTH_TEST
51 * "outputIsTransparent" | corresponds to HINT_OUTPUT_IS_TRANSPARENT
52 * "outputIsOpaque" | corresponds to HINT_OUTPUT_IS_OPAQUE
53 * "modifiesGeometry" | corresponds to HINT_MODIFIES_GEOMETRY
56 Shader::ShaderHints HintFromString( std::string hintString )
58 if( hintString == "none" )
60 return Shader::HINT_NONE;
62 else if( hintString == "requiresSelfDepthTest" )
64 return Shader::HINT_REQUIRES_SELF_DEPTH_TEST;
66 else if( hintString == "outputIsTransparent" )
68 return Shader::HINT_OUTPUT_IS_TRANSPARENT;
70 else if( hintString == "outputIsOpaque" )
72 return Shader::HINT_OUTPUT_IS_OPAQUE;
74 else if( hintString == "modifiesGeometry" )
76 return Shader::HINT_MODIFIES_GEOMETRY;
80 DALI_LOG_ERROR( "'%s' hint string is not recognised", hintString.c_str() );
83 return Shader::HINT_NONE;
88 Internal::ControlRenderer::Impl::Impl()
89 : mCustomShader(NULL),
95 Internal::ControlRenderer::Impl::~Impl()
100 Internal::ControlRenderer::Impl::CustomShader::CustomShader( const Property::Map& map )
102 mHints( Shader::HINT_NONE )
104 SetPropertyMap( map );
107 void Internal::ControlRenderer::Impl::CustomShader::SetPropertyMap( const Property::Map& propertyMap )
109 Property::Value* shaderValue = propertyMap.Find( CUSTOM_SHADER );
112 mVertexShader.clear();
113 mFragmentShader.clear();
114 mGridSize = ImageDimensions( 1, 1 );
115 mHints = Shader::HINT_NONE;
117 Property::Map shaderMap;
118 if( shaderValue->Get( shaderMap ) )
120 Property::Value* vertexShaderValue = shaderMap.Find( CUSTOM_VERTEX_SHADER );
121 if( vertexShaderValue )
123 if( !vertexShaderValue->Get( mVertexShader ) )
125 DALI_LOG_ERROR( "'%s' parameter does not correctly specify a string", CUSTOM_VERTEX_SHADER );
129 Property::Value* fragmentShaderValue = shaderMap.Find( CUSTOM_FRAGMENT_SHADER );
130 if( fragmentShaderValue )
132 if( !fragmentShaderValue->Get( mFragmentShader ) )
134 DALI_LOG_ERROR( "'%s' parameter does not correctly specify a string", CUSTOM_FRAGMENT_SHADER );
138 Property::Value* subdivideXValue = shaderMap.Find( CUSTOM_SUBDIVIDE_GRID_X );
139 if( subdivideXValue )
142 if( !subdivideXValue->Get( subdivideX ) || subdivideX < 1 )
144 DALI_LOG_ERROR( "'%s' parameter does not correctly specify a value greater than 1", CUSTOM_SUBDIVIDE_GRID_X );
148 mGridSize = ImageDimensions( subdivideX, mGridSize.GetY() );
152 Property::Value* subdivideYValue = shaderMap.Find( CUSTOM_SUBDIVIDE_GRID_Y );
153 if( subdivideYValue )
156 if( !subdivideYValue->Get( subdivideY ) || subdivideY < 1 )
158 DALI_LOG_ERROR( "'%s' parameter does not correctly specify a value greater than 1", CUSTOM_SUBDIVIDE_GRID_Y );
162 mGridSize = ImageDimensions( mGridSize.GetX(), subdivideY );
166 Property::Value* hintsValue = shaderMap.Find( CUSTOM_SHADER_HINTS );
169 std::string hintString;
170 Property::Array hintsArray;
172 if( hintsValue->Get( hintString ) )
174 mHints = HintFromString( hintString );
176 else if( hintsValue->Get( hintsArray ) )
178 int hints = Shader::HINT_NONE;
179 for( Property::Array::SizeType i = 0; i < hintsArray.Count(); ++i)
181 Property::Value hintValue = hintsArray[ i ];
182 if( hintValue.Get( hintString ) )
184 hints |= static_cast< int >( HintFromString( hintString ) );
188 DALI_LOG_ERROR( "'%s' parameter does not correctly specify an hint string at index %d", CUSTOM_SHADER_HINTS, i );
191 mHints = static_cast< Shader::ShaderHints >( hints );
196 DALI_LOG_ERROR( "'%s' parameter does not correctly specify a hint string or an array of hint strings", CUSTOM_SHADER_HINTS );
202 //use value with no type to mean reseting the shader back to default
203 if( shaderValue->GetType() != Dali::Property::NONE )
205 DALI_LOG_ERROR( "'%s' parameter does not correctly specify a property map", CUSTOM_SHADER );
211 void Internal::ControlRenderer::Impl::CustomShader::CreatePropertyMap( Property::Map& map ) const
213 if( !mVertexShader.empty() || !mFragmentShader.empty() )
215 Property::Map customShader;
216 if( !mVertexShader.empty() )
218 customShader.Insert(CUSTOM_VERTEX_SHADER, mVertexShader );
220 if( !mFragmentShader.empty() )
222 customShader.Insert(CUSTOM_FRAGMENT_SHADER, mFragmentShader );
225 if( mGridSize.GetWidth() != 1 )
227 customShader.Insert(CUSTOM_SUBDIVIDE_GRID_X, mGridSize.GetWidth() );
229 if( mGridSize.GetHeight() != 1 )
231 customShader.Insert(CUSTOM_SUBDIVIDE_GRID_Y, mGridSize.GetHeight() );
234 if( mHints != Dali::Shader::HINT_NONE )
236 customShader.Insert(CUSTOM_SHADER_HINTS, static_cast< int >(mHints) );
239 map.Insert( CUSTOM_SHADER, customShader );
243 } // namespace Internal
245 } // namespace Toolkit