image-scaling-irregular-grid.example \
buttons.example \
text-view.example \
- logging.example
-
+ logging.example \
+ bloom-view.example \
+ gaussian-blur-view.example
daliimagedir = $(appdatadir)/images/
dalimodeldir = $(appdatadir)/models/
logging_example_CXXFLAGS = $(EXAMPLE_CXXFLAGS)
logging_example_DEPENDENCIES = $(EXAMPLE_DEPS)
logging_example_LDADD = $(EXAMPLE_LDADD)
+
+bloom_view_example_SOURCES = $(examples_src_dir)/bloom-view/bloom-view-example.cpp
+bloom_view_example_CXXFLAGS = $(EXAMPLE_CXXFLAGS)
+bloom_view_example_DEPENDENCIES = $(EXAMPLE_DEPS)
+bloom_view_example_LDADD = $(EXAMPLE_LDADD)
+
+gaussian_blur_view_example_SOURCES = $(examples_src_dir)/gaussian-blur-view/gaussian-blur-view-example.cpp
+gaussian_blur_view_example_CXXFLAGS = $(EXAMPLE_CXXFLAGS)
+gaussian_blur_view_example_DEPENDENCIES = $(EXAMPLE_DEPS)
+gaussian_blur_view_example_LDADD = $(EXAMPLE_LDADD)
<ui-application appid="logging.example" exec="/usr/apps/com.samsung.dali-demo/bin/logging.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true">
<label>Logging</label>
</ui-application>
+ <ui-application appid="bloom-view.example" exec="/usr/apps/com.samsung.dali-demo/bin/bloom-view.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true">
+ <label>Bloom View</label>
+ </ui-application>
+ <ui-application appid="gaussian-blur-view.example" exec="/usr/apps/com.samsung.dali-demo/bin/gaussian-blur-view.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true">
+ <label>Gaussian Blur View</label>
+ </ui-application>
</manifest>
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <dali/dali.h>
+#include <dali-toolkit/dali-toolkit.h>
+
+using namespace Dali;
+using namespace Dali::Toolkit;
+
+namespace
+{
+
+//#define ADD_REMOVE_FROM_STAGE_TEST
+
+const char* BACKGROUND_IMAGE_PATH = DALI_IMAGE_DIR "desktop_background_1440x2560.png";
+const char* UI_DIFFUSE_IMAGE( DALI_IMAGE_DIR "UI-Leather-DIFF.png" );
+
+const Rect<int> UI_PIXEL_AREA( 0, 0, 720, 1280 );
+
+const Rect<int> PANEL1_PIXEL_AREA( 0, 0, 720, 39 );
+const Rect<int> PANEL2_PIXEL_AREA( 0, 39, 720, 100 );
+
+const unsigned int NUM_MOVEMENT_ANIMATIONS = 2;
+
+// for animating bloom intensity on tap gesture
+const float PULSE_BLOOM_INCREASE_ANIM_TIME = 1.175;
+const float PULSE_BLOOM_DECREASE_ANIM_TIME = 2.4;
+const float PULSE_BLOOM_TOTAL_ANIM_TIME = PULSE_BLOOM_INCREASE_ANIM_TIME + PULSE_BLOOM_DECREASE_ANIM_TIME;
+const float PULSE_BLOOM_INTENSITY_DEFAULT = 1.0f;
+const float PULSE_BLOOM_INTENSITY_INCREASE = 3.0f;
+
+
+
+// buttons
+const char* BUTTON_BACKGROUND_IMAGE_PATH = DALI_IMAGE_DIR "GreyThinLine30x30-76x78.png";
+
+// These values depend on the button background image
+const Vector4 BUTTON_IMAGE_BORDER(16.0f, 16.0f, 16.0f, 20.0f);
+
+
+const float UI_MARGIN = 4.0f; ///< Screen Margin for placement of UI buttons
+const Vector3 BUTTON_SIZE_CONSTRAINT( 0.24f, 0.09f, 1.0f );
+const char * BUTTON_QUIT = "Quit";
+
+} // namespace
+
+
+
+/**
+ * This example demonstrates a bloom effect.
+ */
+class TestApp : public ConnectionTracker
+{
+public:
+
+ TestApp( Application &application )
+ : mApplication(application)
+ , mCurrentAnimation(0)
+ {
+ application.InitSignal().Connect(this, &TestApp::Create);
+ }
+
+ ~TestApp()
+ {
+ }
+
+public:
+
+ void Create(Application& application)
+ {
+ // Preload images
+ mDiffuseImage = Image::New( UI_DIFFUSE_IMAGE );
+
+ // Creation is deferred until images have loaded
+ mDiffuseImage.LoadingFinishedSignal().Connect( this, &TestApp::Create2 );
+ }
+
+#ifdef ADD_REMOVE_FROM_STAGE_TEST
+ void Create2(Image loadedImage)
+ {
+ Stage stage = Stage::GetCurrent();
+ Vector2 stageSize = stage.GetSize();
+
+ mStageRootActor = Actor::New();
+ mStageRootActor.SetParentOrigin(ParentOrigin::CENTER);
+ mStageRootActor.SetSize(stageSize);
+ stage.Add(mStageRootActor);
+
+ // Create the object that will perform the blooming work
+ mBloomView = Dali::Toolkit::BloomView::New();
+ mBloomView.SetParentOrigin(ParentOrigin::CENTER);
+ mBloomView.SetSize(stageSize * 0.75f);
+ mStageRootActor.Add(mBloomView);
+ mBloomView.Activate();
+
+ // Create the background image
+ Image background = Image::New(BACKGROUND_IMAGE_PATH);
+ ImageActor backgroundImage = ImageActor::New(background);
+ backgroundImage.SetParentOrigin(ParentOrigin::CENTER);
+ backgroundImage.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+
+ Layer backgroundLayer = Layer::New();
+ backgroundLayer.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ backgroundLayer.SetParentOrigin( ParentOrigin::CENTER );
+ mBloomView.Add( backgroundLayer );
+ backgroundLayer.Add( backgroundImage );
+
+ Layer foregroundLayer = Layer::New();
+ foregroundLayer.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ foregroundLayer.SetParentOrigin( ParentOrigin::CENTER );
+ mBloomView.Add( foregroundLayer );
+
+ // Create visible actors
+ mObjectRootActor = Actor::New();
+ mObjectRootActor.SetParentOrigin( ParentOrigin::CENTER );
+ mObjectRootActor.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ foregroundLayer.Add( mObjectRootActor );
+
+ ImageActor imageActor = ImageActor::New( mDiffuseImage );
+ imageActor.SetParentOrigin( ParentOrigin::CENTER );
+ imageActor.SetSize( stageSize * 0.75f);
+ mObjectRootActor.Add( imageActor );
+
+ imageActor = ImageActor::New( mDiffuseImage );
+ imageActor.SetParentOrigin( ParentOrigin::CENTER );
+ imageActor.SetSize( stageSize * 0.5f );
+ imageActor.SetPosition(0.0f, 0.0f, 100.0f);
+ mObjectRootActor.Add( imageActor );
+
+ AnimateBloomView();
+ PulseBloomIntensity();
+
+ // Gesture detection
+ mTapGestureDetector = TapGestureDetector::New();
+ mTapGestureDetector.Attach( mStageRootActor );
+ mTapGestureDetector.DetectedSignal().Connect( this, &TestApp::OnTap );
+ }
+
+ void AnimateBloomView()
+ {
+ if(mRotationAnimation)
+ {
+ mRotationAnimation.Stop();
+ }
+ if(mResizeAnimation)
+ {
+ mResizeAnimation.Stop();
+ }
+ if(mTranslationAnimation)
+ {
+ mTranslationAnimation.Stop();
+ }
+ if(mBlurAnimation)
+ {
+ mBlurAnimation.Stop();
+ }
+
+ // ROTATE
+ float animDuration = 10.0f;
+ mRotationAnimation = Animation::New(animDuration);
+ mRotationAnimation.RotateBy(mBloomView, Degree(720), Vector3::YAXIS, AlphaFunctions::EaseInOut);
+ mRotationAnimation.SetEndAction( Animation::Discard );
+ mRotationAnimation.SetLooping( true );
+ mRotationAnimation.Play();
+
+ // BLUR
+ mBlurAnimation = Animation::New( 4.0f );
+ mBlurAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBlurStrengthPropertyIndex() ), 0.0f, AlphaFunctions::Linear, TimePeriod(0.0f, 0.5f) );
+ mBlurAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBlurStrengthPropertyIndex() ), 1.0f, AlphaFunctions::Linear, TimePeriod(2.0f, 0.5f) );
+ mBlurAnimation.SetEndAction( Animation::Discard );
+ mBlurAnimation.SetLooping( true );
+ mBlurAnimation.Play();
+ }
+#else //#ifdef ADD_REMOVE_FROM_STAGE_TEST
+
+ void Create2(Image loadedImage)
+ {
+ Stage stage = Stage::GetCurrent();
+ Vector2 stageSize = stage.GetSize();
+
+ mStageRootActor = Actor::New();
+ mStageRootActor.SetParentOrigin(ParentOrigin::CENTER);
+ mStageRootActor.SetSize(stageSize);
+ stage.Add(mStageRootActor);
+
+ // Create the object that will perform the blooming work
+ mBloomView = Dali::Toolkit::BloomView::New();
+ mBloomView.SetParentOrigin(ParentOrigin::CENTER);
+ mBloomView.SetSize(stageSize * 0.75f);
+ mStageRootActor.Add(mBloomView);
+ mBloomView.Activate();
+
+ // Create the Quit button
+ PushButton button;
+ button = CreateButton(BUTTON_QUIT, BUTTON_QUIT, BUTTON_SIZE_CONSTRAINT);
+ button.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
+ button.SetParentOrigin(ParentOrigin::BOTTOM_RIGHT);
+ button.SetPosition(-UI_MARGIN, -UI_MARGIN);
+
+ // Create the background image
+ Image background = Image::New(BACKGROUND_IMAGE_PATH);
+ ImageActor backgroundImage = ImageActor::New(background);
+ backgroundImage.SetParentOrigin(ParentOrigin::CENTER);
+ backgroundImage.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+
+ Layer backgroundLayer = Layer::New();
+ backgroundLayer.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ backgroundLayer.SetParentOrigin( ParentOrigin::CENTER );
+ mBloomView.Add( backgroundLayer );
+ backgroundLayer.Add( backgroundImage );
+
+ Layer foregroundLayer = Layer::New();
+ foregroundLayer.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ foregroundLayer.SetParentOrigin( ParentOrigin::CENTER );
+ mBloomView.Add( foregroundLayer );
+
+ // Create visible actors
+ mObjectRootActor = Actor::New();
+ mObjectRootActor.SetParentOrigin( ParentOrigin::CENTER );
+ mObjectRootActor.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ foregroundLayer.Add( mObjectRootActor );
+
+ ImageActor imageActor = ImageActor::New( mDiffuseImage );
+ imageActor.SetParentOrigin( ParentOrigin::CENTER );
+ imageActor.SetSize( stageSize * 0.75f);
+ mObjectRootActor.Add( imageActor );
+
+ imageActor = ImageActor::New( mDiffuseImage );
+ imageActor.SetParentOrigin( ParentOrigin::CENTER );
+ imageActor.SetSize( stageSize * 0.5f );
+ imageActor.SetPosition(0.0f, 0.0f, 100.0f);
+ mObjectRootActor.Add( imageActor );
+
+ ToggleAnimation();
+ PulseBloomIntensity();
+
+ // Gesture detection
+ mTapGestureDetector = TapGestureDetector::New();
+ mTapGestureDetector.Attach( mStageRootActor );
+ mTapGestureDetector.DetectedSignal().Connect( this, &TestApp::OnTap );
+ }
+
+ PushButton CreateButton(const std::string& name, const std::string& label, const Vector3& sizeConstraint)
+ {
+ // Create the button
+ Image img = Image::New(BUTTON_BACKGROUND_IMAGE_PATH);
+ ImageActor background = ImageActor::New(img);
+
+ background.SetStyle(ImageActor::STYLE_NINE_PATCH);
+ background.SetNinePatchBorder(BUTTON_IMAGE_BORDER);
+
+ PushButton button = PushButton::New();
+ button.SetName(name);
+ button.SetBackgroundImage(background);
+
+ // Set the button's size
+ button.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), RelativeToConstraint( sizeConstraint ) ) );
+
+ // Make sure the button only takes up its natural or allocated width.
+ button.SetSizePolicy( Toolkit::Control::Fixed, Toolkit::Control::Fixed );
+
+ mStageRootActor.Add(button);
+
+ button.ClickedSignal().Connect(this, &TestApp::OnButtonTouchEvent);
+
+ SetButtonLabel(button, label, TextView::Center);
+
+ return button;
+ }
+
+ void SetButtonLabel(PushButton button, const std::string& label, const TextView::LineJustification justification)
+ {
+ Font font = Font::New();
+ Vector3 textSize = font.MeasureText(label);
+
+ // Add a text label to the button
+ TextView textView = TextView::New( label );
+ textView.SetAnchorPoint( AnchorPoint::CENTER );
+ textView.SetParentOrigin( ParentOrigin::CENTER );
+ textView.SetMultilinePolicy(TextView::SplitByWord);
+ textView.SetWidthExceedPolicy(TextView::Original);
+ textView.SetTextAlignment(static_cast< Alignment::Type >( Alignment::HorizontalCenter | Alignment::VerticalCenter ));
+ textView.SetLineJustification(justification);
+ textView.SetSize(textSize);
+
+ Alignment align = Alignment::New();
+ align.Add(textView);
+ align.SetScaling( Alignment::ShrinkToFitKeepAspect );
+
+ button.SetLabelText(align);
+ }
+
+ /**
+ * Signal handler, called when the button is pressed
+ */
+ bool OnButtonTouchEvent(Button button)
+ {
+ if(button.GetName() == BUTTON_QUIT)
+ {
+ // quit the application
+ mApplication.Quit();
+ }
+
+ return true;
+ }
+
+ void AnimateBloomView()
+ {
+ if(mRotationAnimation)
+ {
+ mRotationAnimation.Stop();
+ }
+ if(mResizeAnimation)
+ {
+ mResizeAnimation.Stop();
+ }
+ if(mTranslationAnimation)
+ {
+ mTranslationAnimation.Stop();
+ }
+ if(mBlurAnimation)
+ {
+ mBlurAnimation.Stop();
+ }
+
+ // ROTATE
+ float animDuration = 10.0f;
+ mRotationAnimation = Animation::New(animDuration);
+ mRotationAnimation.RotateBy(mBloomView, Degree(720), Vector3::YAXIS, AlphaFunctions::EaseInOut);
+ mRotationAnimation.SetEndAction( Animation::Discard );
+ mRotationAnimation.SetLooping( true );
+ mRotationAnimation.Play();
+
+
+ // RESIZE
+ Stage stage = Stage::GetCurrent();
+ Vector3 stageSize(stage.GetSize().width, stage.GetSize().height, 1.0f);
+ mResizeAnimation = Animation::New( 7.5f );
+ mResizeAnimation.AnimateTo( Property(mBloomView, Actor::SIZE), stageSize * Vector3(0.5f, 0.5f, 1.0f), AlphaFunctions::Bounce, TimePeriod(2.5f) );
+ mResizeAnimation.SetEndAction( Animation::Discard );
+ mResizeAnimation.SetLooping( true );
+ mResizeAnimation.Play();
+
+
+ // TRANSLATE
+ mTranslationAnimation = Animation::New( 7.5f );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(100.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(2.5f) );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(300.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(2.5f, 2.5f) );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(0.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(5.0f, 2.5f) );
+ mTranslationAnimation.SetEndAction( Animation::Discard );
+ mTranslationAnimation.SetLooping( true );
+ mTranslationAnimation.Play();
+
+
+ // BLUR
+ mBlurAnimation = Animation::New( 4.0f );
+ mBlurAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBlurStrengthPropertyIndex() ), 0.0f, AlphaFunctions::Linear, TimePeriod(0.0f, 0.5f) );
+ mBlurAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBlurStrengthPropertyIndex() ), 1.0f, AlphaFunctions::Linear, TimePeriod(2.0f, 0.5f) );
+ mBlurAnimation.SetEndAction( Animation::Discard );
+ mBlurAnimation.SetLooping( true );
+ mBlurAnimation.Play();
+ }
+
+ void AnimateActorRoot()
+ {
+ if(mRotationAnimation)
+ {
+ mRotationAnimation.Stop();
+ }
+ if(mResizeAnimation)
+ {
+ mResizeAnimation.Stop();
+ }
+ if(mTranslationAnimation)
+ {
+ mTranslationAnimation.Stop();
+ }
+ if(mBlurAnimation)
+ {
+ mBlurAnimation.Stop();
+ }
+
+ // ROTATE
+ float animDuration = 10.0f;
+ mRotationAnimation = Animation::New(animDuration);
+ mRotationAnimation.RotateBy(mObjectRootActor, Degree(720), Vector3::YAXIS, AlphaFunctions::EaseInOut);
+ mRotationAnimation.SetEndAction( Animation::Discard );
+ mRotationAnimation.SetLooping( true );
+ mRotationAnimation.Play();
+
+
+ // RESIZE
+ Stage stage = Stage::GetCurrent();
+ Vector3 stageSize(stage.GetSize().width, stage.GetSize().height, 1.0f);
+ mResizeAnimation = Animation::New( 7.5f );
+ mResizeAnimation.AnimateTo( Property(mBloomView, Actor::SIZE), stageSize * Vector3(0.5f, 0.5f, 1.0f), AlphaFunctions::Bounce, TimePeriod(2.5f) );
+ mResizeAnimation.SetEndAction( Animation::Discard );
+ mResizeAnimation.SetLooping( true );
+ mResizeAnimation.Play();
+
+
+ // TRANSLATE
+ mTranslationAnimation = Animation::New( 7.5f );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(100.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(2.5f) );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(300.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(2.5f, 2.5f) );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(0.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(5.0f, 2.5f) );
+ mTranslationAnimation.SetEndAction( Animation::Discard );
+ mTranslationAnimation.SetLooping( true );
+ mTranslationAnimation.Play();
+
+
+ // BLUR
+ mBlurAnimation = Animation::New( 4.0f );
+ mBlurAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBlurStrengthPropertyIndex() ), 0.0f, AlphaFunctions::Linear, TimePeriod(0.0f, 0.5f) );
+ mBlurAnimation.AnimateTo( Property( mBloomView, mBloomView.GetBlurStrengthPropertyIndex() ), 1.0f, AlphaFunctions::Linear, TimePeriod(2.0f, 0.5f) );
+ mBlurAnimation.SetEndAction( Animation::Discard );
+ mBlurAnimation.SetLooping( true );
+ mBlurAnimation.Play();
+ }
+
+ void ToggleAnimation()
+ {
+ mCurrentAnimation++;
+ if(mCurrentAnimation == NUM_MOVEMENT_ANIMATIONS)
+ {
+ mCurrentAnimation = 0;
+ }
+
+ switch(mCurrentAnimation)
+ {
+ case 0:
+ AnimateActorRoot();
+ break;
+
+ case 1:
+ AnimateBloomView();
+ break;
+ }
+ }
+#endif //#ifdef ADD_REMOVE_FROM_STAGE_TEST
+
+ void PulseBloomIntensity()
+ {
+ mPulseBloomIntensityAnim = Animation::New( 2.5f );
+ mPulseBloomIntensityAnim.AnimateTo( Property(mBloomView, mBloomView.GetBloomIntensityPropertyIndex()), 3.0f, AlphaFunctions::Bounce, TimePeriod(2.5f) );
+ mPulseBloomIntensityAnim.SetEndAction( Animation::Discard );
+ mPulseBloomIntensityAnim.SetLooping( true );
+ mPulseBloomIntensityAnim.Play();
+ }
+
+ void OnTap( Actor actor, const TapGesture& tapGesture )
+ {
+ Stage stage = Stage::GetCurrent();
+
+#ifdef ADD_REMOVE_FROM_STAGE_TEST
+ if(mBloomView.OnStage())
+ {
+ mStageRootActor.Remove(mBloomView);
+ mBloomView.Deactivate();
+ }
+ else
+ {
+ mStageRootActor.Add(mBloomView);
+ mBloomView.Activate();
+ }
+#else //#ifdef ADD_REMOVE_FROM_STAGE_TEST
+ ToggleAnimation();
+#endif //#ifdef ADD_REMOVE_FROM_STAGE_TEST
+ }
+
+private:
+
+ Application& mApplication;
+
+ TapGestureDetector mTapGestureDetector;
+
+ Actor mStageRootActor;
+
+ Actor mObjectRootActor;
+ Image mDiffuseImage;
+
+ unsigned int mCurrentAnimation;
+ Animation mRotationAnimation;
+ Animation mResizeAnimation;
+ Animation mTranslationAnimation;
+ Animation mBlurAnimation;
+ Animation mPulseBloomIntensityAnim;
+
+ // for rendering the blur / bloom
+ GaussianBlurView mGaussianBlurView;
+ BloomView mBloomView;
+};
+
+/*****************************************************************************/
+
+static void
+RunTest( Application& application )
+{
+ TestApp theApp(application);
+ application.MainLoop();
+}
+
+/*****************************************************************************/
+
+int
+main(int argc, char **argv)
+{
+ Application application = Application::New(&argc, &argv);
+
+ RunTest(application);
+
+ return 0;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <dali/dali.h>
+#include <dali-toolkit/dali-toolkit.h>
+
+using namespace Dali;
+using namespace Dali::Toolkit;
+
+namespace
+{
+
+//#define ADD_REMOVE_FROM_STAGE_TEST
+
+const char* BACKGROUND_IMAGE_PATH = DALI_IMAGE_DIR "desktop_background_1440x2560.png";
+const char* UI_DIFFUSE_IMAGE( DALI_IMAGE_DIR "UI-Leather-DIFF.png" );
+
+const Rect<int> UI_PIXEL_AREA( 0, 0, 720, 1280 );
+
+const Rect<int> PANEL1_PIXEL_AREA( 0, 0, 720, 39 );
+const Rect<int> PANEL2_PIXEL_AREA( 0, 39, 720, 100 );
+
+const unsigned int NUM_MOVEMENT_ANIMATIONS = 2;
+
+// for animating bloom intensity on tap gesture
+const float PULSE_BLOOM_INCREASE_ANIM_TIME = 1.175;
+const float PULSE_BLOOM_DECREASE_ANIM_TIME = 2.4;
+const float PULSE_BLOOM_TOTAL_ANIM_TIME = PULSE_BLOOM_INCREASE_ANIM_TIME + PULSE_BLOOM_DECREASE_ANIM_TIME;
+const float PULSE_BLOOM_INTENSITY_DEFAULT = 1.0f;
+const float PULSE_BLOOM_INTENSITY_INCREASE = 3.0f;
+
+
+// buttons
+const char* BUTTON_BACKGROUND_IMAGE_PATH = DALI_IMAGE_DIR "GreyThinLine30x30-76x78.png";
+
+// These values depend on the button background image
+const float BUTTON_IMAGE_BORDER_LEFT = 16.0f;
+const float BUTTON_IMAGE_BORDER_RIGHT = 16.0f;
+const float BUTTON_IMAGE_BORDER_TOP = 13.0f;
+const float BUTTON_IMAGE_BORDER_BOTTOM = 20.0f;
+
+const Vector4 BUTTON_IMAGE_BORDER( BUTTON_IMAGE_BORDER_LEFT, BUTTON_IMAGE_BORDER_TOP, BUTTON_IMAGE_BORDER_RIGHT, BUTTON_IMAGE_BORDER_BOTTOM );
+
+const float UI_MARGIN = 4.0f; ///< Screen Margin for placement of UI buttons
+const Vector3 BUTTON_SIZE_CONSTRAINT( 0.24f, 0.09f, 1.0f );
+const char * BUTTON_QUIT = "Quit";
+const char * BUTTON_QUIT_LABEL ="Quit";
+
+} // namespace
+
+
+
+/**
+ * This example demonstrates a blur effect.
+ */
+class TestApp : public ConnectionTracker
+{
+public:
+
+ TestApp( Application &application )
+ : mApplication(application)
+ , mCurrentAnimation(0)
+ {
+ application.InitSignal().Connect(this, &TestApp::Create);
+ application.TerminateSignal().Connect(this, &TestApp::Terminate);
+ }
+
+ ~TestApp()
+ {
+ }
+
+public:
+
+ void Create(Application& application)
+ {
+ // Preload images
+ mDiffuseImage = Image::New( UI_DIFFUSE_IMAGE );
+
+ // Creation is deferred until images have loaded
+ mDiffuseImage.LoadingFinishedSignal().Connect( this, &TestApp::Create2 );
+ }
+
+#ifdef ADD_REMOVE_FROM_STAGE_TEST
+ void Create2(Image loadedImage)
+ {
+ Stage stage = Stage::GetCurrent();
+ Vector2 stageSize = stage.GetSize();
+
+ mStageRootActor = Actor::New();
+ mStageRootActor.SetParentOrigin(ParentOrigin::CENTER);
+ mStageRootActor.SetSize(stageSize);
+ stage.Add(mStageRootActor);
+
+ // Create the object that will perform the blurring work
+ mGaussianBlurView = Dali::Toolkit::GaussianBlurView::New();
+ mGaussianBlurView.SetParentOrigin(ParentOrigin::CENTER);
+ mGaussianBlurView.SetSize(stageSize * 0.75f);
+ mStageRootActor.Add(mGaussianBlurView);
+ mGaussianBlurView.Activate();
+
+ // Create the background image
+ Image background = Image::New(BACKGROUND_IMAGE_PATH);
+ ImageActor backgroundImage = ImageActor::New(background);
+ backgroundImage.SetParentOrigin(ParentOrigin::CENTER);
+ backgroundImage.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+
+ Layer backgroundLayer = Layer::New();
+ backgroundLayer.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ backgroundLayer.SetParentOrigin( ParentOrigin::CENTER );
+ mGaussianBlurView.Add( backgroundLayer );
+ backgroundLayer.Add( backgroundImage );
+
+ Layer foregroundLayer = Layer::New();
+ foregroundLayer.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ foregroundLayer.SetParentOrigin( ParentOrigin::CENTER );
+ mGaussianBlurView.Add( foregroundLayer );
+
+ // Create visible actors
+ mObjectRootActor = Actor::New();
+ mObjectRootActor.SetParentOrigin( ParentOrigin::CENTER );
+ mObjectRootActor.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ foregroundLayer.Add( mObjectRootActor );
+
+ ImageActor imageActor = ImageActor::New( mDiffuseImage );
+ imageActor.SetParentOrigin( ParentOrigin::CENTER );
+ imageActor.SetSize( stageSize * 0.75f);
+ mObjectRootActor.Add( imageActor );
+
+ imageActor = ImageActor::New( mDiffuseImage );
+ imageActor.SetParentOrigin( ParentOrigin::CENTER );
+ imageActor.SetSize( stageSize * 0.5f );
+ imageActor.SetPosition(0.0f, 0.0f, 100.0f);
+ mObjectRootActor.Add( imageActor );
+
+ AnimateGaussianBlurView();
+
+ // Gesture detection
+ mTapGestureDetector = TapGestureDetector::New();
+ mTapGestureDetector.Attach( mStageRootActor );
+ mTapGestureDetector.DetectedSignal().Connect( this, &TestApp::OnTap );
+ }
+
+ void AnimateGaussianBlurView()
+ {
+ if(mRotationAnimation)
+ {
+ mRotationAnimation.Stop();
+ }
+ if(mResizeAnimation)
+ {
+ mResizeAnimation.Stop();
+ }
+ if(mTranslationAnimation)
+ {
+ mTranslationAnimation.Stop();
+ }
+ if(mBlurAnimation)
+ {
+ mBlurAnimation.Stop();
+ }
+
+ // ROTATE
+ float animDuration = 10.0f;
+ mRotationAnimation = Animation::New(animDuration);
+ mRotationAnimation.RotateBy(mGaussianBlurView, Degree(720), Vector3::YAXIS, AlphaFunctions::EaseInOut);
+ mRotationAnimation.SetEndAction( Animation::Discard );
+ mRotationAnimation.SetLooping( true );
+ mRotationAnimation.Play();
+
+ // BLUR
+ mBlurAnimation = Animation::New( 4.0f );
+ mBlurAnimation.AnimateTo( Property( mGaussianBlurView, mGaussianBlurView.GetBlurStrengthPropertyIndex() ), 0.0f, AlphaFunctions::Linear, TimePeriod(0.0f, 0.5f) );
+ mBlurAnimation.AnimateTo( Property( mGaussianBlurView, mGaussianBlurView.GetBlurStrengthPropertyIndex() ), 1.0f, AlphaFunctions::Linear, TimePeriod(2.0f, 0.5f) );
+ mBlurAnimation.SetEndAction( Animation::Discard );
+ mBlurAnimation.SetLooping( true );
+ mBlurAnimation.Play();
+ }
+#else //#ifdef ADD_REMOVE_FROM_STAGE_TEST
+
+ void Create2(Image loadedImage)
+ {
+ Stage stage = Stage::GetCurrent();
+ Vector2 stageSize = stage.GetSize();
+
+ mStageRootActor = Actor::New();
+ mStageRootActor.SetParentOrigin(ParentOrigin::CENTER);
+ mStageRootActor.SetSize(stageSize);
+ stage.Add(mStageRootActor);
+
+ // Create the object that will perform the blurring work
+ mGaussianBlurView = Dali::Toolkit::GaussianBlurView::New();
+ mGaussianBlurView.SetParentOrigin(ParentOrigin::CENTER);
+ mGaussianBlurView.SetSize(stageSize * 0.75f);
+ mStageRootActor.Add(mGaussianBlurView);
+ mGaussianBlurView.Activate();
+
+ // Create the Quit button
+ PushButton button;
+ button = CreateButton(BUTTON_QUIT, BUTTON_QUIT_LABEL, BUTTON_SIZE_CONSTRAINT);
+ button.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
+ button.SetParentOrigin(ParentOrigin::BOTTOM_RIGHT);
+ button.SetPosition(-UI_MARGIN, -UI_MARGIN);
+
+ // Create the background image
+ Image background = Image::New(BACKGROUND_IMAGE_PATH);
+ ImageActor backgroundImage = ImageActor::New(background);
+ backgroundImage.SetParentOrigin(ParentOrigin::CENTER);
+ backgroundImage.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+
+ Layer backgroundLayer = Layer::New();
+ backgroundLayer.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ backgroundLayer.SetParentOrigin( ParentOrigin::CENTER );
+ mGaussianBlurView.Add( backgroundLayer );
+ backgroundLayer.Add( backgroundImage );
+
+ Layer foregroundLayer = Layer::New();
+ foregroundLayer.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ foregroundLayer.SetParentOrigin( ParentOrigin::CENTER );
+ mGaussianBlurView.Add( foregroundLayer );
+
+ // Create visible actors
+ mObjectRootActor = Actor::New();
+ mObjectRootActor.SetParentOrigin( ParentOrigin::CENTER );
+ mObjectRootActor.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
+ foregroundLayer.Add( mObjectRootActor );
+
+ ImageActor imageActor = ImageActor::New( mDiffuseImage );
+ imageActor.SetParentOrigin( ParentOrigin::CENTER );
+ imageActor.SetSize( stageSize * 0.75f);
+ mObjectRootActor.Add( imageActor );
+
+ imageActor = ImageActor::New( mDiffuseImage );
+ imageActor.SetParentOrigin( ParentOrigin::CENTER );
+ imageActor.SetSize( stageSize * 0.5f );
+ imageActor.SetPosition(0.0f, 0.0f, 100.0f);
+ mObjectRootActor.Add( imageActor );
+
+ ToggleAnimation();
+
+ // Gesture detection
+ mTapGestureDetector = TapGestureDetector::New();
+ mTapGestureDetector.Attach( mStageRootActor );
+ mTapGestureDetector.DetectedSignal().Connect( this, &TestApp::OnTap );
+ }
+
+ PushButton CreateButton(const std::string& name, const std::string& label, const Vector3& sizeConstraint)
+ {
+ // Create the button
+ Image img = Image::New(BUTTON_BACKGROUND_IMAGE_PATH);
+ ImageActor background = ImageActor::New(img);
+
+ background.SetStyle(ImageActor::STYLE_NINE_PATCH);
+ background.SetNinePatchBorder(BUTTON_IMAGE_BORDER);
+
+ PushButton button = PushButton::New();
+ button.SetName(name);
+ button.SetBackgroundImage(background);
+
+ // Set the button's size
+ button.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), RelativeToConstraint( sizeConstraint ) ) );
+
+ mStageRootActor.Add(button);
+
+ button.ClickedSignal().Connect(this, &TestApp::OnButtonTouchEvent);
+
+ SetButtonLabel(button, label, TextView::Center);
+
+ return button;
+ }
+
+ void SetButtonLabel(PushButton button, const std::string& label, const TextView::LineJustification justification)
+ {
+ Font font = Font::New();
+ Vector3 textSize = font.MeasureText(label);
+
+ // Add a text label to the button
+ TextView textView = TextView::New( label );
+ textView.SetAnchorPoint( AnchorPoint::CENTER );
+ textView.SetParentOrigin( ParentOrigin::CENTER );
+ textView.SetMultilinePolicy(TextView::SplitByWord);
+ textView.SetWidthExceedPolicy(TextView::Original);
+ textView.SetTextAlignment(static_cast< Alignment::Type >( Alignment::HorizontalCenter | Alignment::VerticalCenter ));
+ textView.SetLineJustification(justification);
+ textView.SetSize(textSize);
+
+ Alignment align = Alignment::New();
+ align.Add(textView);
+ align.SetScaling( Alignment::ShrinkToFitKeepAspect );
+
+ button.SetLabelText(align);
+ }
+
+ /**
+ * Signal handler, called when the button is pressed
+ */
+ bool OnButtonTouchEvent(Button button)
+ {
+ if(button.GetName() == BUTTON_QUIT)
+ {
+ // quit the application
+ mApplication.Quit();
+ }
+
+ return true;
+ }
+
+ void AnimateGaussianBlurView()
+ {
+ if(mRotationAnimation)
+ {
+ mRotationAnimation.Stop();
+ }
+ if(mResizeAnimation)
+ {
+ mResizeAnimation.Stop();
+ }
+ if(mTranslationAnimation)
+ {
+ mTranslationAnimation.Stop();
+ }
+ if(mBlurAnimation)
+ {
+ mBlurAnimation.Stop();
+ }
+
+ // ROTATE
+ float animDuration = 10.0f;
+ mRotationAnimation = Animation::New(animDuration);
+ mRotationAnimation.RotateBy(mGaussianBlurView, Degree(720), Vector3::YAXIS, AlphaFunctions::EaseInOut);
+ mRotationAnimation.SetEndAction( Animation::Discard );
+ mRotationAnimation.SetLooping( true );
+ mRotationAnimation.Play();
+
+
+ // RESIZE
+ Stage stage = Stage::GetCurrent();
+ Vector3 stageSize(stage.GetSize().width, stage.GetSize().height, 1.0f);
+ mResizeAnimation = Animation::New( 7.5f );
+ mResizeAnimation.AnimateTo( Property(mGaussianBlurView, Actor::SIZE), stageSize * Vector3(0.5f, 0.5f, 1.0f), AlphaFunctions::Bounce, TimePeriod(2.5f) );
+ mResizeAnimation.SetEndAction( Animation::Discard );
+ mResizeAnimation.SetLooping( true );
+ mResizeAnimation.Play();
+
+
+ // TRANSLATE
+ mTranslationAnimation = Animation::New( 7.5f );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(100.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(2.5f) );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(300.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(2.5f, 2.5f) );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(0.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(5.0f, 2.5f) );
+ mTranslationAnimation.SetEndAction( Animation::Discard );
+ mTranslationAnimation.SetLooping( true );
+ mTranslationAnimation.Play();
+
+
+ // BLUR
+ mBlurAnimation = Animation::New( 4.0f );
+ mBlurAnimation.AnimateTo( Property( mGaussianBlurView, mGaussianBlurView.GetBlurStrengthPropertyIndex() ), 0.0f, AlphaFunctions::Linear, TimePeriod(0.0f, 0.5f) );
+ mBlurAnimation.AnimateTo( Property( mGaussianBlurView, mGaussianBlurView.GetBlurStrengthPropertyIndex() ), 1.0f, AlphaFunctions::Linear, TimePeriod(2.0f, 0.5f) );
+ mBlurAnimation.SetEndAction( Animation::Discard );
+ mBlurAnimation.SetLooping( true );
+ mBlurAnimation.Play();
+ }
+
+ void AnimateActorRoot()
+ {
+ if(mRotationAnimation)
+ {
+ mRotationAnimation.Stop();
+ }
+ if(mResizeAnimation)
+ {
+ mResizeAnimation.Stop();
+ }
+ if(mTranslationAnimation)
+ {
+ mTranslationAnimation.Stop();
+ }
+ if(mBlurAnimation)
+ {
+ mBlurAnimation.Stop();
+ }
+
+ // ROTATE
+ float animDuration = 10.0f;
+ mRotationAnimation = Animation::New(animDuration);
+ mRotationAnimation.RotateBy(mObjectRootActor, Degree(720), Vector3::YAXIS, AlphaFunctions::EaseInOut);
+ mRotationAnimation.SetEndAction( Animation::Discard );
+ mRotationAnimation.SetLooping( true );
+ mRotationAnimation.Play();
+
+
+ // RESIZE
+ Stage stage = Stage::GetCurrent();
+ Vector3 stageSize(stage.GetSize().width, stage.GetSize().height, 1.0f);
+ mResizeAnimation = Animation::New( 7.5f );
+ mResizeAnimation.AnimateTo( Property(mGaussianBlurView, Actor::SIZE), stageSize * Vector3(0.5f, 0.5f, 1.0f), AlphaFunctions::Bounce, TimePeriod(2.5f) );
+ mResizeAnimation.SetEndAction( Animation::Discard );
+ mResizeAnimation.SetLooping( true );
+ mResizeAnimation.Play();
+
+
+ // TRANSLATE
+ mTranslationAnimation = Animation::New( 7.5f );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(100.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(2.5f) );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(300.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(2.5f, 2.5f) );
+ mTranslationAnimation.AnimateBy( Property(mObjectRootActor, Actor::POSITION), Vector3(0.0f, 0.0f, 0.0f), AlphaFunctions::Bounce, TimePeriod(5.0f, 2.5f) );
+ mTranslationAnimation.SetEndAction( Animation::Discard );
+ mTranslationAnimation.SetLooping( true );
+ mTranslationAnimation.Play();
+
+
+ // BLUR
+ mBlurAnimation = Animation::New( 4.0f );
+ mBlurAnimation.AnimateTo( Property( mGaussianBlurView, mGaussianBlurView.GetBlurStrengthPropertyIndex() ), 0.0f, AlphaFunctions::Linear, TimePeriod(0.0f, 0.5f) );
+ mBlurAnimation.AnimateTo( Property( mGaussianBlurView, mGaussianBlurView.GetBlurStrengthPropertyIndex() ), 1.0f, AlphaFunctions::Linear, TimePeriod(2.0f, 0.5f) );
+ mBlurAnimation.SetEndAction( Animation::Discard );
+ mBlurAnimation.SetLooping( true );
+ mBlurAnimation.Play();
+ }
+
+ void ToggleAnimation()
+ {
+ mCurrentAnimation++;
+ if(mCurrentAnimation == NUM_MOVEMENT_ANIMATIONS)
+ {
+ mCurrentAnimation = 0;
+ }
+
+ switch(mCurrentAnimation)
+ {
+ case 0:
+ AnimateActorRoot();
+ break;
+
+ case 1:
+ AnimateGaussianBlurView();
+ break;
+ }
+ }
+#endif //#ifdef ADD_REMOVE_FROM_STAGE_TEST
+
+ void Terminate( Application& app )
+ {
+ }
+
+ void OnTap( Actor actor, const TapGesture& tapGesture )
+ {
+ Stage stage = Stage::GetCurrent();
+
+#ifdef ADD_REMOVE_FROM_STAGE_TEST
+ if(mGaussianBlurView.OnStage())
+ {
+ mStageRootActor.Remove(mGaussianBlurView);
+ mGaussianBlurView.Deactivate();
+ }
+ else
+ {
+ mStageRootActor.Add(mGaussianBlurView);
+ mGaussianBlurView.Activate();
+ }
+#else //#ifdef ADD_REMOVE_FROM_STAGE_TEST
+ ToggleAnimation();
+#endif //#ifdef ADD_REMOVE_FROM_STAGE_TEST
+ }
+
+private:
+
+ Application& mApplication;
+
+ TapGestureDetector mTapGestureDetector;
+
+ Actor mStageRootActor;
+
+ Actor mObjectRootActor;
+ Image mDiffuseImage;
+
+ unsigned int mCurrentAnimation;
+ Animation mRotationAnimation;
+ Animation mResizeAnimation;
+ Animation mTranslationAnimation;
+ Animation mBlurAnimation;
+ Animation mPulseBloomIntensityAnim;
+
+ // for rendering the blur / bloom
+ GaussianBlurView mGaussianBlurView;
+ BloomView mBloomView;
+};
+
+/*****************************************************************************/
+
+static void
+RunTest( Application& application )
+{
+ TestApp theApp(application);
+ application.MainLoop();
+}
+
+/*****************************************************************************/
+
+int
+main(int argc, char **argv)
+{
+ Application application = Application::New(&argc, &argv);
+
+ RunTest(application);
+
+ return 0;
+}
mMagnifier.SetSourceActor( mView.GetBackgroundLayer() );
mMagnifier.SetSize( MAGNIFIER_SIZE * mStageSize.width ); // Size of magnifier is in relation to stage width
mMagnifier.SetMagnificationFactor( MAGNIFICATION_FACTOR );
- mMagnifier.SetFrameVisibility(false);
+ mMagnifier.SetFrameVisibility(true);
mMagnifier.SetScale(Vector3::ZERO);
overlay.Add( mMagnifier );