2 * Copyright (c) 2020 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-toolkit/devel-api/controls/control-devel.h>
20 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
24 using namespace Dali; // Needed for macros
34 const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
35 varying mediump vec2 vTexCoord;\n
36 uniform sampler2D sTexture;\n
37 uniform mediump vec4 uColor;\n
38 uniform mediump vec3 mixColor;\n
39 uniform mediump vec3 uChannels;\n
43 gl_FragColor = texture2D( sTexture, vTexCoord ) * vec4(mixColor,1.0) * uColor * vec4(uChannels, 1.0) ;\n
48 Dali::BaseHandle Create()
50 return Demo::ImageChannelControl::New();
53 DALI_TYPE_REGISTRATION_BEGIN(ImageChannelControl, Dali::Toolkit::Control, Create);
55 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "url", STRING, RESOURCE_URL);
56 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "redChannel", FLOAT, RED_CHANNEL);
57 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "greenChannel", FLOAT, GREEN_CHANNEL);
58 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "blueChannel", FLOAT, BLUE_CHANNEL);
60 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "visibility", BOOLEAN, VISIBILITY);
61 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "enableVisibilityTransition", ARRAY, ENABLE_VISIBILITY_TRANSITION);
62 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "disableVisibilityTransition", ARRAY, DISABLE_VISIBILITY_TRANSITION);
64 DALI_PROPERTY_REGISTRATION(Demo, ImageChannelControl, "imageVisual", MAP, IMAGE_VISUAL);
65 DALI_TYPE_REGISTRATION_END();
67 } // anonymous namespace
69 Internal::ImageChannelControl::ImageChannelControl()
70 : Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)),
71 mChannels(1.0f, 1.0f, 1.0f),
72 mChannelIndex(Property::INVALID_INDEX),
74 mTargetVisibility(true)
78 Internal::ImageChannelControl::~ImageChannelControl()
82 Demo::ImageChannelControl Internal::ImageChannelControl::New()
84 IntrusivePtr<Internal::ImageChannelControl> impl = new Internal::ImageChannelControl();
85 Demo::ImageChannelControl handle = Demo::ImageChannelControl(*impl);
90 void ImageChannelControl::SetImage(const std::string& url)
96 Property::Map properties;
98 shader[Dali::Toolkit::Visual::Shader::Property::FRAGMENT_SHADER] = FRAGMENT_SHADER;
99 properties[Dali::Toolkit::Visual::Property::TYPE] = Dali::Toolkit::Visual::IMAGE;
100 properties[Dali::Toolkit::Visual::Property::SHADER] = shader;
101 properties[Dali::Toolkit::ImageVisual::Property::URL] = url;
103 mVisual = Toolkit::VisualFactory::Get().CreateVisual(properties);
104 Toolkit::DevelControl::RegisterVisual(*this, Demo::ImageChannelControl::Property::IMAGE_VISUAL, mVisual);
105 mVisual.SetName("imageVisual");
110 void ImageChannelControl::SetVisibility(bool visibility)
112 printf("ImageChannelControl %s: SetVisibility( %s )\n", Self().GetProperty<std::string>(Dali::Actor::Property::NAME).c_str(), visibility ? "T" : "F");
117 mAnimation.FinishedSignal().Disconnect(this, &ImageChannelControl::OnStateChangeAnimationFinished);
118 OnStateChangeAnimationFinished(mAnimation);
121 if(mVisibility != visibility)
125 if(mDisableVisibilityTransition.Count() > 0)
127 mAnimation = Toolkit::DevelControl::CreateTransition(*this, mDisableVisibilityTransition);
132 if(mEnableVisibilityTransition.Count() > 0)
134 mAnimation = Toolkit::DevelControl::CreateTransition(*this, mEnableVisibilityTransition);
141 mAnimation.FinishedSignal().Connect(this, &ImageChannelControl::OnStateChangeAnimationFinished);
143 mTargetVisibility = visibility;
147 mVisibility = visibility;
151 void ImageChannelControl::OnStateChangeAnimationFinished(Animation& src)
153 mVisibility = mTargetVisibility;
156 void ImageChannelControl::OnInitialize()
159 mChannelIndex = self.RegisterProperty("uChannels", Vector3(1.0f, 1.0f, 1.0f));
162 void ImageChannelControl::OnSceneConnection(int depth)
164 Control::OnSceneConnection(depth);
167 void ImageChannelControl::OnSceneDisconnection()
169 Control::OnSceneDisconnection();
172 void ImageChannelControl::OnSizeSet(const Vector3& targetSize)
174 Control::OnSizeSet(targetSize);
178 Vector2 size(targetSize);
179 Property::Map transformMap;
181 .Add(Toolkit::Visual::Transform::Property::OFFSET, Vector2(0.0f, 0.0f))
182 .Add(Toolkit::Visual::Transform::Property::SIZE, Vector2(1.0f, 1.0f))
183 .Add(Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::CENTER)
184 .Add(Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::CENTER)
185 .Add(Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2(Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE))
186 .Add(Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2(Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE));
188 mVisual.SetTransformAndSize(transformMap, size);
192 Vector3 ImageChannelControl::GetNaturalSize()
197 mVisual.GetNaturalSize(naturalSize);
198 return Vector3(naturalSize);
200 return Vector3::ZERO;
203 void ImageChannelControl::OnStyleChange(Toolkit::StyleManager styleManager, StyleChange::Type change)
206 Control::OnStyleChange(styleManager, change);
209 ///////////////////////////////////////////////////////////
214 void ImageChannelControl::SetProperty(BaseObject* object, Property::Index index, const Property::Value& value)
216 Demo::ImageChannelControl imageChannelControl = Demo::ImageChannelControl::DownCast(Dali::BaseHandle(object));
218 if(imageChannelControl)
220 ImageChannelControl& impl = GetImpl(imageChannelControl);
221 Actor self = impl.Self();
224 case Demo::ImageChannelControl::Property::RESOURCE_URL:
226 impl.SetImage(value.Get<std::string>());
229 case Demo::ImageChannelControl::Property::IMAGE_VISUAL:
231 Property::Map* map = value.GetMap();
234 impl.mVisual = Toolkit::VisualFactory::Get().CreateVisual(*map);
235 Toolkit::DevelControl::RegisterVisual(impl, Demo::ImageChannelControl::Property::IMAGE_VISUAL, impl.mVisual);
239 case Demo::ImageChannelControl::Property::VISIBILITY:
241 impl.SetVisibility(value.Get<bool>());
244 case Demo::ImageChannelControl::Property::ENABLE_VISIBILITY_TRANSITION:
246 if(value.GetType() == Property::ARRAY)
248 impl.mEnableVisibilityTransition = Toolkit::TransitionData::New(*value.GetArray());
250 else if(value.GetType() == Property::MAP)
252 impl.mEnableVisibilityTransition = Toolkit::TransitionData::New(*value.GetMap());
256 case Demo::ImageChannelControl::Property::DISABLE_VISIBILITY_TRANSITION:
258 if(value.GetType() == Property::ARRAY)
260 impl.mDisableVisibilityTransition = Toolkit::TransitionData::New(*value.GetArray());
262 else if(value.GetType() == Property::MAP)
264 impl.mDisableVisibilityTransition = Toolkit::TransitionData::New(*value.GetMap());
268 case Demo::ImageChannelControl::Property::RED_CHANNEL:
270 impl.mChannels[0] = value.Get<float>();
271 self.SetProperty(impl.mChannelIndex, impl.mChannels);
274 case Demo::ImageChannelControl::Property::GREEN_CHANNEL:
276 impl.mChannels[1] = value.Get<float>();
277 self.SetProperty(impl.mChannelIndex, impl.mChannels);
280 case Demo::ImageChannelControl::Property::BLUE_CHANNEL:
282 impl.mChannels[2] = value.Get<float>();
283 self.SetProperty(impl.mChannelIndex, impl.mChannels);
290 Property::Value ImageChannelControl::GetProperty(BaseObject* object, Property::Index propertyIndex)
292 Property::Value value;
294 Demo::ImageChannelControl imageChannelControl = Demo::ImageChannelControl::DownCast(Dali::BaseHandle(object));
296 if(imageChannelControl)
298 ImageChannelControl& impl = GetImpl(imageChannelControl);
299 switch(propertyIndex)
301 case Demo::ImageChannelControl::Property::RED_CHANNEL:
303 value = impl.mChannels[0];
306 case Demo::ImageChannelControl::Property::GREEN_CHANNEL:
308 value = impl.mChannels[1];
311 case Demo::ImageChannelControl::Property::BLUE_CHANNEL:
313 value = impl.mChannels[2];
316 case Demo::ImageChannelControl::Property::VISIBILITY:
318 value = impl.mVisibility;
329 } // namespace Internal