2 * Copyright (c) 2014 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 <dali-toolkit/internal/controls/image-view/image-view-impl.h>
22 #include <dali/public-api/animation/constraints.h>
23 #include <dali/public-api/object/type-registry.h>
26 #include <dali-toolkit/public-api/shader-effects/distance-field-effect.h>
35 return Toolkit::ImageView::New();
37 TypeRegistration mType( typeid(Toolkit::ImageView), typeid(Toolkit::Control), Create );
40 * CameraDetailConstraint, generates detail value
41 * based on camera's position and ImageView's position.
43 struct CameraDetailConstraint
45 CameraDetailConstraint(float detailFactor)
46 : mDetailFactor(detailFactor)
51 float operator()(const float& current,
52 const PropertyInput& propertyTargetPosition,
53 const PropertyInput& propertySourcePosition)
55 const Vector3& targetPosition = propertyTargetPosition.GetVector3();
56 const Vector3& sourcePosition = propertySourcePosition.GetVector3();
57 const float distance = (targetPosition - sourcePosition).Length();
58 const float detail = mDetailFactor / distance;
63 const float mDetailFactor;
66 } // unnamed namespace
77 ///////////////////////////////////////////////////////////////////////////////////////////////////
79 ///////////////////////////////////////////////////////////////////////////////////////////////////
81 Dali::Toolkit::ImageView ImageView::New()
83 // Create the implementation
84 ImageViewPtr imageView(new ImageView());
86 // Pass ownership to CustomActor via derived handle
87 Dali::Toolkit::ImageView handle(*imageView);
89 // Second-phase init of the implementation
90 // This can only be done after the CustomActor connection has been made...
91 imageView->Initialize();
96 ImageView::ImageView()
97 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ),
98 mPropertyDetail( Property::INVALID_INDEX )
102 void ImageView::Initialize()
105 // Register property that represents the level of detail.
106 mPropertyDetail = self.RegisterProperty(Toolkit::ImageView::DETAIL_PROPERTY_NAME, 0.0f);
108 // Create an empty image actor, filling the entire size of this ImageView.
110 mImageActor = ImageActor::New( emptyImage );
111 self.Add( mImageActor );
112 mImageActor.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
113 mImageActor.SetParentOrigin( ParentOrigin::CENTER );
116 ImageView::~ImageView()
121 void ImageView::SetImage(const std::string& filename, ImageType type, float min, float max)
125 case Toolkit::ImageView::BitmapType:
127 SetImageBitmap(filename, min, max);
130 case Toolkit::ImageView::DistanceFieldType:
132 SetImageDistanceField(filename);
138 void ImageView::SetImageBitmap(const std::string& filename, float min, float max)
140 int minLevel = ceilf(logf(min) / logf(2.0f));
141 int maxLevel = ceilf(logf(max) / logf(2.0f));
143 ImageAttributes attributes;
144 const Vector3 size = Self().GetCurrentSize();
146 if(minLevel==maxLevel)
147 { // Single image detail level, no need for any notifications.
148 const float detail = powf(2.0f, maxLevel);
149 attributes.SetSize( size.x * detail, size.y * detail );
150 Image image = Image::New( filename, attributes);
151 mImageActor.SetImage( image );
154 { // Multi image detail level...
155 for( int level = minLevel; level <= maxLevel; level++)
157 const float minDetail = powf(2.0f, level - 1);
158 const float maxDetail = powf(2.0f, level);
159 ImageRequest req(filename, size.x * maxDetail, size.y * maxDetail );
163 AddImage(req, LessThanCondition(maxDetail) );
165 else if(level==maxLevel)
167 AddImage(req, GreaterThanCondition(minDetail) );
171 AddImage(req, InsideCondition(minDetail, maxDetail) );
177 void ImageView::SetImageDistanceField(const std::string& filename)
179 ImageAttributes attributes = Dali::ImageAttributes::NewDistanceField(1.0f, 1);
180 const Vector3 size = Self().GetCurrentSize();
182 attributes.SetSize( size.x, size.y );
183 Image image = Image::NewDistanceField(filename, attributes);
184 mImageActor.SetImage( image );
186 DistanceFieldEffect effect = DistanceFieldEffect::New();
187 mImageActor.SetShaderEffect( effect );
190 void ImageView::SetImage(Image image)
192 mImageActor.SetImage( image );
195 void ImageView::AddImage(ImageRequest& req, PropertyCondition condition)
199 PropertyNotification notification = self.AddPropertyNotification( mPropertyDetail, condition );
201 notification.NotifySignal().Connect( this, &ImageView::OnDetailChange );
203 mNotifications[notification] = req;
206 void ImageView::SetDetail(float detail)
208 Self().SetProperty( mPropertyDetail, detail );
211 void ImageView::SetCameraActor(CameraActor camera, float detailFactor)
213 Constraint constraint = Constraint::New<float>( mPropertyDetail,
214 LocalSource( Actor::WORLD_POSITION ),
215 Source( camera, Actor::WORLD_POSITION ),
216 CameraDetailConstraint(detailFactor));
217 Self().RemoveConstraints();
218 Self().ApplyConstraint(constraint);
221 void ImageView::OnDetailChange( PropertyNotification& notification )
223 ImageRequest& req = mNotifications[notification];
224 Image image = Image::New( req.mFilename, req.mAttributes );
225 mImageActor.SetImage( image );
228 } // namespace Internal
230 } // namespace Toolkit