2 * Copyright (c) 2019 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 * @file text-memory-profiling-example.cpp
20 * @brief Memory consumption profiling for TextLabel
24 #include <dali/dali.h>
25 #include <dali-toolkit/dali-toolkit.h>
26 #include <dali-toolkit/devel-api/controls/navigation-view/navigation-view.h>
29 #include "shared/view.h"
32 using namespace Dali::Toolkit;
40 SINGLE_COLOR_TEXT_WITH_STYLE,
41 SINGLE_COLOR_TEXT_WITH_EMOJI,
42 SINGLE_COLOR_TEXT_WITH_STYLE_EMOJI,
44 MULTI_COLOR_TEXT_WITH_STYLE,
45 MULTI_COLOR_TEXT_WITH_EMOJI,
46 MULTI_COLOR_TEXT_WITH_STYLE_EMOJI,
47 SMALL_TEXT_IN_LARGE_TEXT_LABEL,
51 std::string TEXT_TYPE_STRING[ NUMBER_OF_TYPES ] =
54 "Single color text with style",
55 "Single color text with emoji",
56 "Single color text with style and emoji",
58 "Multi color text with style",
59 "Multi color text with emoji",
60 "Multi color text with style and emoji",
61 "Small text in large Text Label"
64 const int NUMBER_OF_LABELS = 500;
66 const char* BACKGROUND_IMAGE( "" );
67 const char* TOOLBAR_IMAGE( DEMO_IMAGE_DIR "top-bar.png" );
68 const char* BACK_IMAGE( DEMO_IMAGE_DIR "icon-change.png" );
69 const char* BACK_IMAGE_SELECTED( DEMO_IMAGE_DIR "icon-change-selected.png" );
70 const char* INDICATOR_IMAGE( DEMO_IMAGE_DIR "loading.png" );
72 } // anonymous namespace
75 * @brief The main class of the demo.
77 class TextMemoryProfilingExample : public ConnectionTracker, public Toolkit::ItemFactory
81 TextMemoryProfilingExample( Application& application )
82 : mApplication( application ),
83 mCurrentTextStyle( SINGLE_COLOR_TEXT )
85 // Connect to the Application's Init signal
86 mApplication.InitSignal().Connect( this, &TextMemoryProfilingExample::Create );
89 ~TextMemoryProfilingExample()
91 // Nothing to do here.
95 * @brief Create a text label in the given type
97 TextLabel SetupTextLabel( int type )
99 TextLabel label = TextLabel::New();
100 label.SetAnchorPoint( ParentOrigin::TOP_LEFT );
101 label.SetAnchorPoint( AnchorPoint::TOP_LEFT );
102 label.SetProperty( TextLabel::Property::TEXT_COLOR, Color::BLACK );
103 label.SetProperty( TextLabel::Property::POINT_SIZE, 12.0f );
104 Property::Map shadowMap;
105 shadowMap.Insert( "color", Color::YELLOW );
106 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
107 label.SetProperty( TextLabel::Property::ENABLE_MARKUP, true );
109 Vector2 stageSize = Stage::GetCurrent().GetSize();
110 label.SetPosition( Vector3( Random::Range( 0.0f, stageSize.x ), Random::Range( 0.0f, stageSize.y ), 0.0f) );
114 case SINGLE_COLOR_TEXT:
116 label.SetProperty( TextLabel::Property::TEXT, "A Quick Brown Fox Jumps Over The Lazy Dog" );
118 shadowMap.Insert( "offset", Vector2( 0.0f, 0.0f ) );
119 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
122 case SINGLE_COLOR_TEXT_WITH_STYLE:
124 label.SetProperty( TextLabel::Property::TEXT, "A Quick Brown Fox Jumps Over The Lazy Dog" );
126 shadowMap.Insert( "offset", Vector2( 2.0f, 2.0f ) );
127 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
130 case SINGLE_COLOR_TEXT_WITH_EMOJI:
132 label.SetProperty( TextLabel::Property::TEXT, "\xF0\x9F\x98\x81 A Quick Brown Fox Jumps Over The Lazy Dog" );
134 shadowMap.Insert( "offset", Vector2( 0.0f, 0.0f ) );
135 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
138 case SINGLE_COLOR_TEXT_WITH_STYLE_EMOJI:
140 label.SetProperty( TextLabel::Property::TEXT, "\xF0\x9F\x98\x81 A Quick Brown Fox Jumps Over The Lazy Dog" );
142 shadowMap.Insert( "offset", Vector2( 2.0f, 2.0f ) );
143 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
146 case MULTI_COLOR_TEXT:
148 label.SetProperty( TextLabel::Property::TEXT, "A <color value='cyan'>Quick Brown Fox</color> Jumps Over The <color value='yellow'>Lazy Dog</color>" );
150 shadowMap.Insert( "offset", Vector2( 0.0f, 0.0f ) );
151 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
154 case MULTI_COLOR_TEXT_WITH_STYLE:
156 label.SetProperty( TextLabel::Property::TEXT, "A <color value='cyan'>Quick Brown Fox</color> Jumps Over The <color value='yellow'>Lazy Dog</color>" );
158 shadowMap.Insert( "offset", Vector2( 2.0f, 2.0f ) );
159 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
162 case MULTI_COLOR_TEXT_WITH_EMOJI:
164 label.SetProperty( TextLabel::Property::TEXT, " \xF0\x9F\x98\x81 A <color value='cyan'>Quick Brown Fox</color> Jumps Over The <color value='yellow'>Lazy Dog</color>" );
166 shadowMap.Insert( "offset", Vector2( 0.0f, 0.0f ) );
167 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
170 case MULTI_COLOR_TEXT_WITH_STYLE_EMOJI:
172 label.SetProperty( TextLabel::Property::TEXT, " \xF0\x9F\x98\x81 A <color value='cyan'>Quick Brown Fox</color> Jumps Over The <color value='yellow'>Lazy Dog</color>" );
174 shadowMap.Insert( "offset", Vector2( 2.0f, 2.0f ) );
175 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
178 case SMALL_TEXT_IN_LARGE_TEXT_LABEL:
180 label.SetProperty( TextLabel::Property::TEXT, "A Quick Brown Fox Jumps Over The Lazy Dog" );
182 shadowMap.Insert( "offset", Vector2( 0.0f, 0.0f ) );
183 label.SetProperty( TextLabel::Property::SHADOW, shadowMap );
184 label.SetSize(stageSize.x, stageSize.y * 0.25f); // Set the text label in larger size
195 * @brief Create the main menu
197 void CreateMainMenu()
199 Stage stage = Stage::GetCurrent();
200 Vector2 stageSize = stage.GetSize();
202 mTapDetector = TapGestureDetector::New();
203 mTapDetector.DetectedSignal().Connect( this, &TextMemoryProfilingExample::OnTap );
205 // Create an item view for the main menu
206 mItemView = ItemView::New( *this );
208 mItemView.SetParentOrigin( ParentOrigin::CENTER );
209 mItemView.SetAnchorPoint( AnchorPoint::CENTER );
211 mLayout = DefaultItemLayout::New( DefaultItemLayout::LIST );
212 mLayout->SetItemSize( Vector3( stageSize.width, 60.0f, 0.0f ) );
214 mItemView.AddLayout( *mLayout );
216 // Activate the layout
217 mItemView.ActivateLayout( 0, Vector3( stageSize ), 0.0f );
221 * @brief Return the number of items in the main menu
223 virtual unsigned int GetNumberOfItems()
225 return NUMBER_OF_TYPES;
229 * @brief Create new item for the main menu
231 virtual Actor NewItem( unsigned int itemId )
233 TextLabel label = TextLabel::New( TEXT_TYPE_STRING[itemId] );
234 label.SetStyleName( "BuilderLabel" );
235 label.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
237 // Hook up tap detector
238 mTapDetector.Attach( label );
244 * @brief Create text labels for memory profiling
246 void CreateTextLabels( int type )
248 Stage stage = Stage::GetCurrent();
250 // Render tasks may have been setup last load so remove them
251 RenderTaskList taskList = stage.GetRenderTaskList();
252 if( taskList.GetTaskCount() > 1 )
254 typedef std::vector<RenderTask> Collection;
255 typedef Collection::iterator ColIter;
258 for( unsigned int i = 1; i < taskList.GetTaskCount(); ++i )
260 tasks.push_back( taskList.GetTask(i) );
263 for( ColIter iter = tasks.begin(); iter != tasks.end(); ++iter )
265 taskList.RemoveTask(*iter);
268 RenderTask defaultTask = taskList.GetTask( 0 );
269 defaultTask.SetSourceActor( stage.GetRootLayer() );
270 defaultTask.SetTargetFrameBuffer( FrameBufferImage() );
273 // Delete any existing text labels
274 unsigned int numChildren = mLayer.GetChildCount();
276 for( unsigned int i = 0; i < numChildren; ++i )
278 mLayer.Remove( mLayer.GetChildAt( 0 ) );
281 mLayer.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
282 mLayer.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
283 mLayer.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH );
284 mLayer.SetResizePolicy( ResizePolicy::SIZE_FIXED_OFFSET_FROM_PARENT, Dimension::HEIGHT );
285 mLayer.SetSizeModeFactor( Vector3( 0.0f, -DemoHelper::DEFAULT_VIEW_STYLE.mToolBarHeight, 0.0f ) );
287 mNavigationView.Push( mLayer );
289 // Create new text labels
290 for ( int i = 0; i < NUMBER_OF_LABELS; i++ )
292 TextLabel label = SetupTextLabel( type );
296 mTitle.SetProperty( TextLabel::Property::TEXT, "Run memps on target" );
300 * @brief One-time setup in response to Application InitSignal.
302 void Create( Application& application )
304 Stage stage = Stage::GetCurrent();
306 stage.KeyEventSignal().Connect(this, &TextMemoryProfilingExample::OnKeyEvent);
308 Layer contents = DemoHelper::CreateView( mApplication,
315 mTitle = DemoHelper::CreateToolBarLabel( "" );
316 mTitle.SetProperty( TextLabel::Property::TEXT, "Select the type of text" );
318 // Add title to the tool bar.
319 mToolBar.AddControl( mTitle, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarTitlePercentage, Alignment::HorizontalCenter );
321 // Create a layer to contain dynamically created text labels
322 mLayer = Layer::New();
324 mIndicator = Toolkit::ImageView::New(INDICATOR_IMAGE);
325 mIndicator.SetParentOrigin( ParentOrigin::CENTER );
326 mIndicator.SetAnchorPoint( AnchorPoint::CENTER );
327 mIndicator.SetProperty( Actor::Property::VISIBLE, false );
329 // Create a back button in the left of toolbar
330 PushButton backButton = PushButton::New();
331 backButton.SetProperty( Button::Property::UNSELECTED_BACKGROUND_VISUAL, BACK_IMAGE );
332 backButton.SetProperty( Button::Property::SELECTED_BACKGROUND_VISUAL, BACK_IMAGE_SELECTED );
333 backButton.ClickedSignal().Connect( this, &TextMemoryProfilingExample::OnBackButtonPressed );
334 backButton.SetLeaveRequired( true );
335 mToolBar.AddControl( backButton, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, Alignment::HorizontalLeft, DemoHelper::DEFAULT_MODE_SWITCH_PADDING );
337 // Create a navigation view to navigate different types of text labels
338 mNavigationView = NavigationView::New();
339 mNavigationView.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
340 mNavigationView.SetAnchorPoint( AnchorPoint::TOP_LEFT );
341 mNavigationView.SetBackgroundColor( Color::WHITE );
342 stage.Add( mNavigationView );
345 mNavigationView.Push( mItemView );
347 mItemView.Add(mIndicator);
349 PropertyNotification notification = mIndicator.AddPropertyNotification( Actor::Property::VISIBLE, GreaterThanCondition(0.01f) );
350 notification.NotifySignal().Connect( this, &TextMemoryProfilingExample::OnIndicatorVisible );
354 * @brief Main key event handler
356 void OnKeyEvent( const KeyEvent& event )
358 if( event.state == KeyEvent::Down )
360 if( IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK ) )
362 ReturnToPreviousScreen();
368 * @brief Tap gesture handler
370 void OnTap( Actor actor, const TapGesture& tap )
372 mCurrentTextStyle = mItemView.GetItemId( actor );
374 // Show the loading indicator
375 mIndicator.SetProperty( Actor::Property::VISIBLE, true );
383 mAnimation = Animation::New( 0.8f );
384 mAnimation.AnimateBy( Property( mIndicator, Actor::Property::ORIENTATION ), Quaternion( Radian( Degree(180.0f) ), Vector3::ZAXIS ) );
385 mAnimation.SetLooping( true );
390 * @brief Property notification handler
392 void OnIndicatorVisible( PropertyNotification& source )
394 CreateTextLabels( mCurrentTextStyle );
396 // Hide the loading indicator
398 mIndicator.SetProperty( Actor::Property::VISIBLE, false );
402 * @brief Button signal handler
404 bool OnBackButtonPressed( Toolkit::Button button )
406 ReturnToPreviousScreen();
411 * @brief Returns to the previous screen
413 void ReturnToPreviousScreen()
415 if ( mItemView.OnStage() )
417 // Quit the application if it is in the main menu
422 // Return to the main menu
423 mNavigationView.Pop();
425 mTitle.SetProperty( TextLabel::Property::TEXT, "Select type of text to test" );
431 Application& mApplication;
433 ItemLayoutPtr mLayout;
435 NavigationView mNavigationView;
440 ImageView mIndicator;
441 Animation mAnimation;
445 TapGestureDetector mTapDetector;
447 unsigned int mCurrentTextStyle;
450 int DALI_EXPORT_API main( int argc, char **argv )
452 Application application = Application::New( &argc, &argv, DEMO_THEME_PATH );
453 TextMemoryProfilingExample test( application );
454 application.MainLoop();