X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Fdissolve-effect%2Fdissolve-effect-example.cpp;h=d9ce5821d6093df0cb6727750bdbc2831690f63a;hb=80cdb8fb6a112954c040613d61417b12185dc5bd;hp=59da358fa4c9c72f25899ae6658d0c6878f87b6d;hpb=2a8a2120f4a6831bf88ef50d9852f0396631520c;p=platform%2Fcore%2Fuifw%2Fdali-demo.git diff --git a/examples/dissolve-effect/dissolve-effect-example.cpp b/examples/dissolve-effect/dissolve-effect-example.cpp index 59da358..d9ce582 100644 --- a/examples/dissolve-effect/dissolve-effect-example.cpp +++ b/examples/dissolve-effect/dissolve-effect-example.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,9 @@ #include "shared/view.h" #include +#include #include +#include using namespace Dali; @@ -32,37 +34,41 @@ using Dali::Toolkit::TextLabel; namespace { -const char * const TOOLBAR_IMAGE( DALI_IMAGE_DIR "top-bar.png" ); +const char * const TOOLBAR_IMAGE( DEMO_IMAGE_DIR "top-bar.png" ); const char * const APPLICATION_TITLE_HIGHP( "Dissolve Effect(highp)" ); const char * const APPLICATION_TITLE_MEDIUMP( "Dissolve Effect(mediump)" ); -const char * const EFFECT_HIGHP_IMAGE( DALI_IMAGE_DIR "icon-highp.png" ); -const char * const EFFECT_MEDIUMP_IMAGE( DALI_IMAGE_DIR "icon-mediump.png" ); -const char * const PLAY_ICON( DALI_IMAGE_DIR "icon-play.png" ); -const char * const STOP_ICON( DALI_IMAGE_DIR "icon-stop.png" ); +const char * const EFFECT_HIGHP_IMAGE( DEMO_IMAGE_DIR "icon-highp.png" ); +const char * const EFFECT_HIGHP_IMAGE_SELECTED( DEMO_IMAGE_DIR "icon-highp-selected.png" ); +const char * const EFFECT_MEDIUMP_IMAGE( DEMO_IMAGE_DIR "icon-mediump.png" ); +const char * const EFFECT_MEDIUMP_IMAGE_SELECTED( DEMO_IMAGE_DIR "icon-mediump-selected.png" ); +const char * const PLAY_ICON( DEMO_IMAGE_DIR "icon-play.png" ); +const char * const PLAY_ICON_SELECTED( DEMO_IMAGE_DIR "icon-play-selected.png" ); +const char * const STOP_ICON( DEMO_IMAGE_DIR "icon-stop.png" ); +const char * const STOP_ICON_SELECTED( DEMO_IMAGE_DIR "icon-stop-selected.png" ); const char* IMAGES[] = { - DALI_IMAGE_DIR "gallery-large-1.jpg", - DALI_IMAGE_DIR "gallery-large-2.jpg", - DALI_IMAGE_DIR "gallery-large-3.jpg", - DALI_IMAGE_DIR "gallery-large-4.jpg", - DALI_IMAGE_DIR "gallery-large-5.jpg", - DALI_IMAGE_DIR "gallery-large-6.jpg", - DALI_IMAGE_DIR "gallery-large-7.jpg", - DALI_IMAGE_DIR "gallery-large-8.jpg", - DALI_IMAGE_DIR "gallery-large-9.jpg", - DALI_IMAGE_DIR "gallery-large-10.jpg", - DALI_IMAGE_DIR "gallery-large-11.jpg", - DALI_IMAGE_DIR "gallery-large-12.jpg", - DALI_IMAGE_DIR "gallery-large-13.jpg", - DALI_IMAGE_DIR "gallery-large-14.jpg", - DALI_IMAGE_DIR "gallery-large-15.jpg", - DALI_IMAGE_DIR "gallery-large-16.jpg", - DALI_IMAGE_DIR "gallery-large-17.jpg", - DALI_IMAGE_DIR "gallery-large-18.jpg", - DALI_IMAGE_DIR "gallery-large-19.jpg", - DALI_IMAGE_DIR "gallery-large-20.jpg", - DALI_IMAGE_DIR "gallery-large-21.jpg", + DEMO_IMAGE_DIR "gallery-large-1.jpg", + DEMO_IMAGE_DIR "gallery-large-2.jpg", + DEMO_IMAGE_DIR "gallery-large-3.jpg", + DEMO_IMAGE_DIR "gallery-large-4.jpg", + DEMO_IMAGE_DIR "gallery-large-5.jpg", + DEMO_IMAGE_DIR "gallery-large-6.jpg", + DEMO_IMAGE_DIR "gallery-large-7.jpg", + DEMO_IMAGE_DIR "gallery-large-8.jpg", + DEMO_IMAGE_DIR "gallery-large-9.jpg", + DEMO_IMAGE_DIR "gallery-large-10.jpg", + DEMO_IMAGE_DIR "gallery-large-11.jpg", + DEMO_IMAGE_DIR "gallery-large-12.jpg", + DEMO_IMAGE_DIR "gallery-large-13.jpg", + DEMO_IMAGE_DIR "gallery-large-14.jpg", + DEMO_IMAGE_DIR "gallery-large-15.jpg", + DEMO_IMAGE_DIR "gallery-large-16.jpg", + DEMO_IMAGE_DIR "gallery-large-17.jpg", + DEMO_IMAGE_DIR "gallery-large-18.jpg", + DEMO_IMAGE_DIR "gallery-large-19.jpg", + DEMO_IMAGE_DIR "gallery-large-20.jpg", + DEMO_IMAGE_DIR "gallery-large-21.jpg", }; const int NUM_IMAGES( sizeof(IMAGES) / sizeof(IMAGES[0]) ); @@ -72,24 +78,30 @@ const int VIEWINGTIME = 2000; // 2 seconds const float TRANSITION_DURATION = 2.5f; //2.5 second -const float INITIAL_DEPTH = -10.0f; +const float INITIAL_DEPTH = 10.0f; /** - * @brief Load an image, scaled-down to no more than the stage dimensions. + * @brief Create an image view with an image which would be scaled-down to no more than the stage dimensions. * - * Uses image scaling mode ImageAttributes::ScaleToFill to resize the image at + * Uses image scaling mode SCALE_TO_FILL to resize the image at * load time to cover the entire stage with pixels with no borders, - * and filter mode ImageAttributes::BoxThenLinear to sample the image with - * maximum quality. + * and filter mode BOX_THEN_LINEAR to sample the image with maximum quality. */ -ResourceImage LoadStageFillingImage( const char * const imagePath ) +Toolkit::ImageView CreateStageFillingImageView( const char * const imagePath ) { Size stageSize = Stage::GetCurrent().GetSize(); - ImageAttributes attributes; - attributes.SetSize( stageSize.x, stageSize.y ); - attributes.SetFilterMode( ImageAttributes::BoxThenLinear ); - attributes.SetScalingMode( ImageAttributes::ScaleToFill ); - return ResourceImage::New( imagePath, attributes ); + Toolkit::ImageView imageView = Toolkit::ImageView::New(); + Property::Map map; + map[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE; + map[Toolkit::ImageVisual::Property::URL] = imagePath; + map[Toolkit::ImageVisual::Property::DESIRED_WIDTH] = stageSize.x; + map[Toolkit::ImageVisual::Property::DESIRED_HEIGHT] = stageSize.y; + map[Toolkit::ImageVisual::Property::FITTING_MODE] = FittingMode::SCALE_TO_FILL; + map[Toolkit::ImageVisual::Property::SAMPLING_MODE] = SamplingMode::BOX_THEN_LINEAR; + map[Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING] = true; + imageView.SetProperty( Toolkit::ImageView::Property::IMAGE, map ); + + return imageView; } } // namespace @@ -156,18 +168,19 @@ private: private: Application& mApplication; - Toolkit::View mView; + Toolkit::Control mView; Toolkit::ToolBar mToolBar; Layer mContent; Toolkit::TextLabel mTitleActor; Actor mParent; - ImageActor mCurrentImage; - ImageActor mNextImage; + Toolkit::ImageView mCurrentImage; + Toolkit::ImageView mNextImage; unsigned int mIndex; - Toolkit::DissolveEffect mCurrentImageEffect; - Toolkit::DissolveEffect mNextImageEffect; + Property::Map mDissolveEffect; + Property::Map mEmptyEffect; + bool mUseHighPrecision; Animation mAnimation; @@ -179,12 +192,7 @@ private: bool mTimerReady; unsigned int mCentralLineIndex; - Image mIconPlay; - Image mIconStop; Toolkit::PushButton mPlayStopButton; - - Image mIconHighP; - Image mIconMediumP; Toolkit::PushButton mEffectChangeButton; }; @@ -207,18 +215,15 @@ DissolveEffectApp::~DissolveEffectApp() void DissolveEffectApp::OnInit( Application& application ) { - DemoHelper::RequestThemeChange(); - Stage::GetCurrent().KeyEventSignal().Connect(this, &DissolveEffectApp::OnKeyEvent); // Creates a default view with a default tool bar, the view is added to the stage. mContent = DemoHelper::CreateView( application, mView,mToolBar, "", TOOLBAR_IMAGE, "" ); // Add an effect-changing button on the right of the tool bar. - mIconHighP = ResourceImage::New( EFFECT_HIGHP_IMAGE ); - mIconMediumP = ResourceImage::New( EFFECT_MEDIUMP_IMAGE ); mEffectChangeButton = Toolkit::PushButton::New(); - mEffectChangeButton.SetBackgroundImage(mIconHighP); + mEffectChangeButton.SetProperty( Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, EFFECT_HIGHP_IMAGE ); + mEffectChangeButton.SetProperty( Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, EFFECT_HIGHP_IMAGE_SELECTED ); mEffectChangeButton.ClickedSignal().Connect( this, &DissolveEffectApp::OnEffectButtonClicked ); mToolBar.AddControl( mEffectChangeButton, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, Toolkit::Alignment::HorizontalRight, DemoHelper::DEFAULT_MODE_SWITCH_PADDING ); @@ -227,10 +232,9 @@ void DissolveEffectApp::OnInit( Application& application ) mToolBar.AddControl( mTitleActor, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarTitlePercentage, Toolkit::Alignment::HorizontalCenter ); // Add an slide-show button on the right of the title - mIconPlay = ResourceImage::New( PLAY_ICON ); - mIconStop = ResourceImage::New( STOP_ICON ); mPlayStopButton = Toolkit::PushButton::New(); - mPlayStopButton.SetBackgroundImage( mIconPlay ); + mPlayStopButton.SetProperty( Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, PLAY_ICON ); + mPlayStopButton.SetProperty( Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, PLAY_ICON_SELECTED ); mPlayStopButton.ClickedSignal().Connect( this, &DissolveEffectApp::OnSildeshowButtonClicked ); mToolBar.AddControl( mPlayStopButton, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, Toolkit::Alignment::HorizontalCenter, DemoHelper::DEFAULT_PLAY_PADDING ); @@ -238,10 +242,6 @@ void DissolveEffectApp::OnInit( Application& application ) mPanGestureDetector = PanGestureDetector::New(); mPanGestureDetector.DetectedSignal().Connect( this, &DissolveEffectApp::OnPanGesture ); - // create the dissolve effect object - mCurrentImageEffect = Toolkit::DissolveEffect::New(mUseHighPrecision); - mNextImageEffect = Toolkit::DissolveEffect::New(mUseHighPrecision); - mViewTimer = Timer::New( VIEWINGTIME ); mViewTimer.TickSignal().Connect( this, &DissolveEffectApp::OnTimerTick ); mTimerReady = true; @@ -249,18 +249,21 @@ void DissolveEffectApp::OnInit( Application& application ) // Set size to stage size to avoid seeing a black border on transition mParent = Actor::New(); mParent.SetSize( Stage::GetCurrent().GetSize() ); - mParent.SetPositionInheritanceMode( USE_PARENT_POSITION ); + mParent.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mContent.Add( mParent ); // show the first image - mCurrentImage = ImageActor::New( LoadStageFillingImage( IMAGES[mIndex] ) ); - mCurrentImage.SetRelayoutEnabled( false ); - mCurrentImage.SetPositionInheritanceMode(USE_PARENT_POSITION_PLUS_LOCAL_POSITION); + mCurrentImage = CreateStageFillingImageView( IMAGES[mIndex] ); + mCurrentImage.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mCurrentImage.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); - mCurrentImage.SetSizeScalePolicy( SizeScalePolicy::FIT_WITH_ASPECT_RATIO ); + mCurrentImage.SetProperty( Actor::Property::SIZE_SCALE_POLICY, SizeScalePolicy::FIT_WITH_ASPECT_RATIO ); mParent.Add( mCurrentImage ); mPanGestureDetector.Attach( mCurrentImage ); + + mDissolveEffect = Dali::Toolkit::CreateDissolveEffect( mUseHighPrecision ); + Property::Map emptyShaderMap; + mEmptyEffect.Insert( "shader", emptyShaderMap ); } // signal handler, called when the pan gesture is detected @@ -283,15 +286,13 @@ void DissolveEffectApp::OnPanGesture( Actor actor, const PanGesture& gesture ) mIndex = (mIndex + NUM_IMAGES -1)%NUM_IMAGES; } - Image image = LoadStageFillingImage( IMAGES[ mIndex ] ); - mNextImage = ImageActor::New( image ); - mNextImage.SetRelayoutEnabled( false ); - mNextImage.SetPositionInheritanceMode(USE_PARENT_POSITION_PLUS_LOCAL_POSITION); + mNextImage = CreateStageFillingImageView( IMAGES[ mIndex ] ); + mNextImage.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mNextImage.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); - mNextImage.SetSizeScalePolicy( SizeScalePolicy::FIT_WITH_ASPECT_RATIO ); + mNextImage.SetProperty( Actor::Property::SIZE_SCALE_POLICY, SizeScalePolicy::FIT_WITH_ASPECT_RATIO ); mNextImage.SetZ(INITIAL_DEPTH); mParent.Add( mNextImage ); - Vector2 size = Vector2( mCurrentImage.GetCurrentSize() ); + Vector2 size = Vector2( mCurrentImage.GetCurrentProperty< Vector3 >( Actor::Property::SIZE ) ); StartTransition( gesture.position / size, gesture.displacement * Vector2(1.0, size.x/size.y)); } } @@ -300,24 +301,22 @@ void DissolveEffectApp::StartTransition(Vector2 position, Vector2 displacement) { mAnimation = Animation::New(TRANSITION_DURATION); - mCurrentImageEffect.SetCentralLine(position,displacement); - mCurrentImageEffect.SetDistortion(0.0f); - mCurrentImage.SetShaderEffect(mCurrentImageEffect); - mAnimation.AnimateTo( Property(mCurrentImageEffect, mCurrentImageEffect.GetDistortionPropertyName()), 1.0f, AlphaFunctions::Linear ); + Dali::Toolkit::DissolveEffectSetCentralLine( mCurrentImage, position, displacement, 0.0f ); + mCurrentImage.SetProperty( Toolkit::ImageView::Property::IMAGE, mDissolveEffect ); + mAnimation.AnimateTo( Property( mCurrentImage, "uPercentage" ), 1.0f, AlphaFunction::LINEAR ); - mNextImage.SetOpacity(0.0f); - mAnimation.AnimateTo( Property( mNextImage, Actor::Property::COLOR_ALPHA ), 1.0f, AlphaFunctions::Linear ); + mNextImage.SetProperty( DevelActor::Property::OPACITY,0.0f); + mAnimation.AnimateTo( Property( mNextImage, Actor::Property::COLOR_ALPHA ), 1.0f, AlphaFunction::LINEAR ); if(mUseHighPrecision) { - mNextImageEffect.SetCentralLine(position,-displacement); - mNextImageEffect.SetDistortion(1.0f); - mNextImage.SetShaderEffect(mNextImageEffect); - mAnimation.AnimateTo( Property(mNextImageEffect, mNextImageEffect.GetDistortionPropertyName()), 0.0f, AlphaFunctions::Linear ); + Dali::Toolkit::DissolveEffectSetCentralLine( mNextImage, position, displacement, 1.0f ); + mNextImage.SetProperty( Toolkit::ImageView::Property::IMAGE, mDissolveEffect ); + mAnimation.AnimateTo( Property( mNextImage, "uPercentage" ), 0.0f, AlphaFunction::LINEAR ); } else { - mAnimation.AnimateTo( Property( mNextImage, Actor::Property::POSITION ), Vector3( 0.0f, 0.0f, 0.0f ), AlphaFunctions::Linear ); + mAnimation.AnimateTo( Property( mNextImage, Actor::Property::POSITION ), Vector3( 0.0f, 0.0f, 0.0f ), AlphaFunction::LINEAR ); } mAnimation.FinishedSignal().Connect( this, &DissolveEffectApp::OnTransitionCompleted ); @@ -339,16 +338,18 @@ void DissolveEffectApp::OnKeyEvent(const KeyEvent& event) bool DissolveEffectApp::OnEffectButtonClicked( Toolkit::Button button ) { mUseHighPrecision = !mUseHighPrecision; - mCurrentImageEffect = Toolkit::DissolveEffect::New(mUseHighPrecision); + mDissolveEffect = Dali::Toolkit::CreateDissolveEffect(mUseHighPrecision); if(mUseHighPrecision) { mTitleActor.SetProperty( TextLabel::Property::TEXT, std::string(APPLICATION_TITLE_HIGHP) ); - mEffectChangeButton.SetBackgroundImage(mIconHighP); + mEffectChangeButton.SetProperty( Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, EFFECT_HIGHP_IMAGE ); + mEffectChangeButton.SetProperty( Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, EFFECT_HIGHP_IMAGE_SELECTED ); } else { mTitleActor.SetProperty( TextLabel::Property::TEXT, std::string(APPLICATION_TITLE_MEDIUMP) ); - mEffectChangeButton.SetBackgroundImage(mIconMediumP); + mEffectChangeButton.SetProperty( Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, EFFECT_MEDIUMP_IMAGE ); + mEffectChangeButton.SetProperty( Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, EFFECT_MEDIUMP_IMAGE_SELECTED ); } return true; @@ -359,14 +360,16 @@ bool DissolveEffectApp::OnSildeshowButtonClicked( Toolkit::Button button ) mSlideshow = !mSlideshow; if( mSlideshow ) { - mPlayStopButton.SetBackgroundImage( mIconStop ); + mPlayStopButton.SetProperty( Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, STOP_ICON ); + mPlayStopButton.SetProperty( Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, STOP_ICON_SELECTED ); mPanGestureDetector.Detach( mParent ); mViewTimer.Start(); mTimerReady = false; } else { - mPlayStopButton.SetBackgroundImage( mIconPlay ); + mPlayStopButton.SetProperty( Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, PLAY_ICON ); + mPlayStopButton.SetProperty( Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, PLAY_ICON_SELECTED ); mTimerReady = true; mPanGestureDetector.Attach( mParent ); } @@ -375,8 +378,10 @@ bool DissolveEffectApp::OnSildeshowButtonClicked( Toolkit::Button button ) void DissolveEffectApp::OnTransitionCompleted( Animation& source ) { - mCurrentImage.RemoveShaderEffect(); - mNextImage.RemoveShaderEffect(); + if(mUseHighPrecision) + { + mNextImage.SetProperty( Toolkit::ImageView::Property::IMAGE, mEmptyEffect ); + } mParent.Remove( mCurrentImage ); mPanGestureDetector.Detach( mCurrentImage ); mCurrentImage = mNextImage; @@ -396,11 +401,10 @@ bool DissolveEffectApp::OnTimerTick() if(mSlideshow) { mIndex = (mIndex + 1)%NUM_IMAGES; - Image image = LoadStageFillingImage( IMAGES[ mIndex ] ); - mNextImage = ImageActor::New( image ); - mNextImage.SetPositionInheritanceMode(USE_PARENT_POSITION_PLUS_LOCAL_POSITION); + mNextImage = CreateStageFillingImageView( IMAGES[ mIndex ] ); + mNextImage.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mNextImage.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); - mNextImage.SetSizeScalePolicy( SizeScalePolicy::FIT_WITH_ASPECT_RATIO ); + mNextImage.SetProperty( Actor::Property::SIZE_SCALE_POLICY, SizeScalePolicy::FIT_WITH_ASPECT_RATIO ); mNextImage.SetZ(INITIAL_DEPTH); mParent.Add( mNextImage ); switch( mCentralLineIndex%4 ) @@ -432,10 +436,9 @@ bool DissolveEffectApp::OnTimerTick() return false; //return false to stop the timer } -// Entry point for Linux & Tizen applications -int main( int argc, char **argv ) +int DALI_EXPORT_API main( int argc, char **argv ) { - Application application = Application::New( &argc, &argv ); + Application application = Application::New( &argc, &argv, DEMO_THEME_PATH ); DissolveEffectApp test( application ); application.MainLoop();