2 * Copyright (c) 2017 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.
17 #include "image-channel-control-impl.h"
18 #include <dali-toolkit/dali-toolkit.h>
19 #include <dali/public-api/object/type-registry-helper.h>
20 #include <dali-toolkit/devel-api/align-enums.h>
21 #include <dali-toolkit/devel-api/controls/control-devel.h>
22 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
23 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
27 using namespace Dali; // Needed for macros
37 const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
38 varying mediump vec2 vTexCoord;\n
39 uniform sampler2D sTexture;\n
40 uniform mediump vec4 uColor;\n
41 uniform mediump vec3 mixColor;\n
42 uniform mediump float opacity;\n
43 uniform mediump vec3 uChannels;\n
47 gl_FragColor = texture2D( sTexture, vTexCoord ) * vec4(mixColor,opacity) * uColor * vec4(uChannels, 1.0) ;\n
51 Dali::BaseHandle Create()
53 return Demo::ImageChannelControl::New();
56 DALI_TYPE_REGISTRATION_BEGIN( ImageChannelControl, Dali::Toolkit::Control, Create );
58 DALI_PROPERTY_REGISTRATION( Demo, ImageChannelControl, "url", STRING, RESOURCE_URL );
59 DALI_PROPERTY_REGISTRATION( Demo, ImageChannelControl, "redChannel", FLOAT, RED_CHANNEL );
60 DALI_PROPERTY_REGISTRATION( Demo, ImageChannelControl, "greenChannel", FLOAT, GREEN_CHANNEL );
61 DALI_PROPERTY_REGISTRATION( Demo, ImageChannelControl, "blueChannel", FLOAT, BLUE_CHANNEL );
63 DALI_PROPERTY_REGISTRATION( Demo, ImageChannelControl, "visibility", BOOLEAN, VISIBILITY );
64 DALI_PROPERTY_REGISTRATION( Demo, ImageChannelControl, "enableVisibilityTransition", ARRAY, ENABLE_VISIBILITY_TRANSITION );
65 DALI_PROPERTY_REGISTRATION( Demo, ImageChannelControl, "disableVisibilityTransition", ARRAY, DISABLE_VISIBILITY_TRANSITION );
67 DALI_PROPERTY_REGISTRATION( Demo, ImageChannelControl, "imageVisual", MAP, IMAGE_VISUAL );
68 DALI_TYPE_REGISTRATION_END();
70 } // anonymous namespace
73 Internal::ImageChannelControl::ImageChannelControl()
74 : Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ),
75 mChannels( 1.0f, 1.0f, 1.0f ),
76 mChannelIndex( Property::INVALID_INDEX ),
78 mTargetVisibility(true)
82 Internal::ImageChannelControl::~ImageChannelControl()
86 Demo::ImageChannelControl Internal::ImageChannelControl::New()
88 IntrusivePtr<Internal::ImageChannelControl> impl = new Internal::ImageChannelControl();
89 Demo::ImageChannelControl handle = Demo::ImageChannelControl( *impl );
94 void ImageChannelControl::SetImage( const std::string& url )
100 Property::Map properties;
101 Property::Map shader;
102 shader[Dali::Toolkit::Visual::Shader::Property::FRAGMENT_SHADER] = FRAGMENT_SHADER;
103 properties[Dali::Toolkit::Visual::Property::TYPE] = Dali::Toolkit::Visual::IMAGE;
104 properties[Dali::Toolkit::Visual::Property::SHADER]=shader;
105 properties[Dali::Toolkit::ImageVisual::Property::URL] = url;
107 mVisual = Toolkit::VisualFactory::Get().CreateVisual( properties );
108 Toolkit::DevelControl::RegisterVisual( *this, Demo::ImageChannelControl::Property::IMAGE_VISUAL, mVisual );
109 mVisual.SetName("imageVisual");
114 void ImageChannelControl::SetVisibility( bool visibility )
116 printf("ImageChannelControl %s: SetVisibility( %s )\n", Self().GetName().c_str(), visibility?"T":"F" );
121 mAnimation.FinishedSignal().Disconnect( this, &ImageChannelControl::OnStateChangeAnimationFinished );
122 OnStateChangeAnimationFinished(mAnimation);
125 if( mVisibility != visibility )
129 if( mDisableVisibilityTransition.Count() > 0 )
131 mAnimation = Toolkit::DevelControl::CreateTransition( *this, mDisableVisibilityTransition );
136 if( mEnableVisibilityTransition.Count() > 0 )
138 mAnimation = Toolkit::DevelControl::CreateTransition( *this, mEnableVisibilityTransition );
145 mAnimation.FinishedSignal().Connect( this, &ImageChannelControl::OnStateChangeAnimationFinished );
147 mTargetVisibility = visibility;
151 mVisibility = visibility;
155 void ImageChannelControl::OnStateChangeAnimationFinished( Animation& src )
157 mVisibility = mTargetVisibility;
160 void ImageChannelControl::OnInitialize()
163 mChannelIndex = self.RegisterProperty( "uChannels", Vector3(1.0f, 1.0f, 1.0f) );
166 void ImageChannelControl::OnStageConnection( int depth )
168 Control::OnStageConnection( depth );
171 void ImageChannelControl::OnStageDisconnection()
173 Control::OnStageDisconnection();
176 void ImageChannelControl::OnSizeSet( const Vector3& targetSize )
178 Control::OnSizeSet( targetSize );
182 Vector2 size( targetSize );
183 Property::Map transformMap;
185 .Add( Toolkit::DevelVisual::Transform::Property::OFFSET, Vector2(0.0f, 0.0f) )
186 .Add( Toolkit::DevelVisual::Transform::Property::SIZE, Vector2(1.0f, 1.0f) )
187 .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::CENTER )
188 .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, Toolkit::Align::CENTER )
189 .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::DevelVisual::Transform::Policy::RELATIVE, Toolkit::DevelVisual::Transform::Policy::RELATIVE ) )
190 .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::DevelVisual::Transform::Policy::RELATIVE, Toolkit::DevelVisual::Transform::Policy::RELATIVE ) );
192 mVisual.SetTransformAndSize( transformMap, size );
196 Vector3 ImageChannelControl::GetNaturalSize()
201 mVisual.GetNaturalSize(naturalSize);
202 return Vector3(naturalSize);
204 return Vector3::ZERO;
207 void ImageChannelControl::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change )
210 Control::OnStyleChange( styleManager, change );
214 ///////////////////////////////////////////////////////////
219 void ImageChannelControl::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
221 Demo::ImageChannelControl imageChannelControl = Demo::ImageChannelControl::DownCast( Dali::BaseHandle( object ) );
223 if( imageChannelControl )
225 ImageChannelControl& impl = GetImpl( imageChannelControl );
226 Actor self = impl.Self();
229 case Demo::ImageChannelControl::Property::RESOURCE_URL:
231 impl.SetImage( value.Get<std::string>() );
234 case Demo::ImageChannelControl::Property::IMAGE_VISUAL:
236 Property::Map* map = value.GetMap();
239 impl.mVisual = Toolkit::VisualFactory::Get().CreateVisual( *map );
240 Toolkit::DevelControl::RegisterVisual( impl, Demo::ImageChannelControl::Property::IMAGE_VISUAL, impl.mVisual );
244 case Demo::ImageChannelControl::Property::VISIBILITY:
246 impl.SetVisibility( value.Get<bool>() );
249 case Demo::ImageChannelControl::Property::ENABLE_VISIBILITY_TRANSITION:
251 if( value.GetType() == Property::ARRAY )
253 impl.mEnableVisibilityTransition = Toolkit::TransitionData::New( *value.GetArray());
255 else if( value.GetType() == Property::MAP )
257 impl.mEnableVisibilityTransition = Toolkit::TransitionData::New( *value.GetMap() );
261 case Demo::ImageChannelControl::Property::DISABLE_VISIBILITY_TRANSITION:
263 if( value.GetType() == Property::ARRAY )
265 impl.mDisableVisibilityTransition = Toolkit::TransitionData::New( *value.GetArray());
267 else if( value.GetType() == Property::MAP )
269 impl.mDisableVisibilityTransition = Toolkit::TransitionData::New( *value.GetMap() );
273 case Demo::ImageChannelControl::Property::RED_CHANNEL:
275 impl.mChannels[0] = value.Get<float>();
276 self.SetProperty( impl.mChannelIndex, impl.mChannels );
279 case Demo::ImageChannelControl::Property::GREEN_CHANNEL:
281 impl.mChannels[1] = value.Get<float>();
282 self.SetProperty( impl.mChannelIndex, impl.mChannels );
285 case Demo::ImageChannelControl::Property::BLUE_CHANNEL:
287 impl.mChannels[2] = value.Get<float>();
288 self.SetProperty( impl.mChannelIndex, impl.mChannels );
295 Property::Value ImageChannelControl::GetProperty( BaseObject* object, Property::Index propertyIndex )
297 Property::Value value;
299 Demo::ImageChannelControl imageChannelControl = Demo::ImageChannelControl::DownCast( Dali::BaseHandle( object ) );
301 if ( imageChannelControl )
303 ImageChannelControl& impl = GetImpl( imageChannelControl );
304 switch ( propertyIndex )
306 case Demo::ImageChannelControl::Property::RED_CHANNEL:
308 value = impl.mChannels[0];
311 case Demo::ImageChannelControl::Property::GREEN_CHANNEL:
313 value = impl.mChannels[1];
316 case Demo::ImageChannelControl::Property::BLUE_CHANNEL:
318 value = impl.mChannels[2];
321 case Demo::ImageChannelControl::Property::VISIBILITY:
323 value = impl.mVisibility;