X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fgaussian-blur-view%2Fgaussian-blur-view-impl.cpp;h=e3e54364761d28f7d4af49eff2312b418f181d19;hb=9b0e2a7f8d06fde846298592837afa5ccf1d5880;hp=6081c0b1762d0218ddeadf2f1d9da6b47349f6de;hpb=e5ca10134c73ca0588f893adde82694ad907dd8d;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/controls/gaussian-blur-view/gaussian-blur-view-impl.cpp b/dali-toolkit/internal/controls/gaussian-blur-view/gaussian-blur-view-impl.cpp index 6081c0b..e3e5436 100644 --- a/dali-toolkit/internal/controls/gaussian-blur-view/gaussian-blur-view-impl.cpp +++ b/dali-toolkit/internal/controls/gaussian-blur-view/gaussian-blur-view-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 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. @@ -24,14 +24,13 @@ #include #include #include -#include #include -#include +#include #include #include // INTERNAL INCLUDES -#include +#include // TODO: // pixel format / size - set from JSON @@ -55,13 +54,13 @@ // 2 modes: // 1st mode, this control has a tree of actors (use Add() to add children) that are rendered and blurred. // mRenderChildrenTask renders children to FB mRenderTargetForRenderingChildren -// mHorizBlurTask renders mImageActorHorizBlur Actor showing FB mRenderTargetForRenderingChildren into FB mRenderTarget2 -// mVertBlurTask renders mImageActorVertBlur Actor showing FB mRenderTarget2 into FB mRenderTarget1 -// mCompositeTask renders mImageActorComposite Actor showing FB mRenderTarget1 into FB mRenderTargetForRenderingChildren +// mHorizBlurTask renders mImageViewHorizBlur Actor showing FB mRenderTargetForRenderingChildren into FB mRenderTarget2 +// mVertBlurTask renders mImageViewVertBlur Actor showing FB mRenderTarget2 into FB mRenderTarget1 +// mCompositeTask renders mImageViewComposite Actor showing FB mRenderTarget1 into FB mRenderTargetForRenderingChildren // // 2nd mode, an image is blurred and rendered to a supplied target framebuffer -// mHorizBlurTask renders mImageActorHorizBlur Actor showing mUserInputImage into FB mRenderTarget2 -// mVertBlurTask renders mImageActorVertBlur Actor showing mRenderTarget2 into FB mUserOutputRenderTarget +// mHorizBlurTask renders mImageViewHorizBlur Actor showing mUserInputImage into FB mRenderTarget2 +// mVertBlurTask renders mImageViewVertBlur Actor showing mRenderTarget2 into FB mUserOutputRenderTarget // // Only this 2nd mode handles ActivateOnce @@ -118,47 +117,50 @@ const char* const GAUSSIAN_BLUR_FRAGMENT_SOURCE = GaussianBlurView::GaussianBlurView() - : Control( ControlBehaviour( DISABLE_SIZE_NEGOTIATION ) ) - , mNumSamples(GAUSSIAN_BLUR_VIEW_DEFAULT_NUM_SAMPLES) - , mBlurBellCurveWidth( 0.001f ) - , mPixelFormat(GAUSSIAN_BLUR_VIEW_DEFAULT_RENDER_TARGET_PIXEL_FORMAT) - , mDownsampleWidthScale(GAUSSIAN_BLUR_VIEW_DEFAULT_DOWNSAMPLE_WIDTH_SCALE) - , mDownsampleHeightScale(GAUSSIAN_BLUR_VIEW_DEFAULT_DOWNSAMPLE_HEIGHT_SCALE) - , mDownsampledWidth( 0.0f ) - , mDownsampledHeight( 0.0f ) - , mBlurUserImage( false ) - , mRenderOnce( false ) - , mBackgroundColor( Color::BLACK ) - , mTargetSize(Vector2::ZERO) - , mLastSize(Vector2::ZERO) - , mChildrenRoot(Actor::New()) - , mInternalRoot(Actor::New()) - , mBlurStrengthPropertyIndex(Property::INVALID_INDEX) - , mActivated( false ) +: Control( ControlBehaviour( DISABLE_SIZE_NEGOTIATION | DISABLE_STYLE_CHANGE_SIGNALS ) ), + mNumSamples(GAUSSIAN_BLUR_VIEW_DEFAULT_NUM_SAMPLES), + mBlurBellCurveWidth( 0.001f ), + mPixelFormat(GAUSSIAN_BLUR_VIEW_DEFAULT_RENDER_TARGET_PIXEL_FORMAT), + mDownsampleWidthScale(GAUSSIAN_BLUR_VIEW_DEFAULT_DOWNSAMPLE_WIDTH_SCALE), + mDownsampleHeightScale(GAUSSIAN_BLUR_VIEW_DEFAULT_DOWNSAMPLE_HEIGHT_SCALE), + mDownsampledWidth( 0.0f ), + mDownsampledHeight( 0.0f ), + mBlurUserImage( false ), + mRenderOnce( false ), + mBackgroundColor( Color::BLACK ), + mTargetSize(Vector2::ZERO), + mLastSize(Vector2::ZERO), + mChildrenRoot(Actor::New()), + mInternalRoot(Actor::New()), + mBlurStrengthPropertyIndex(Property::INVALID_INDEX), + mActivated( false ) { SetBlurBellCurveWidth(GAUSSIAN_BLUR_VIEW_DEFAULT_BLUR_BELL_CURVE_WIDTH); } -GaussianBlurView::GaussianBlurView( const unsigned int numSamples, const float blurBellCurveWidth, const Pixel::Format renderTargetPixelFormat, - const float downsampleWidthScale, const float downsampleHeightScale, +GaussianBlurView::GaussianBlurView( const unsigned int numSamples, + const float blurBellCurveWidth, + const Pixel::Format renderTargetPixelFormat, + const float downsampleWidthScale, + const float downsampleHeightScale, bool blurUserImage) - : Control( ControlBehaviour( DISABLE_SIZE_NEGOTIATION ) ) - , mNumSamples(numSamples) - , mBlurBellCurveWidth( 0.001f ) - , mPixelFormat(renderTargetPixelFormat) - , mDownsampleWidthScale(downsampleWidthScale) - , mDownsampleHeightScale(downsampleHeightScale) - , mDownsampledWidth( 0.0f ) - , mDownsampledHeight( 0.0f ) - , mBlurUserImage( blurUserImage ) - , mRenderOnce( false ) - , mBackgroundColor( Color::BLACK ) - , mTargetSize(Vector2::ZERO) - , mLastSize(Vector2::ZERO) - , mChildrenRoot(Actor::New()) - , mInternalRoot(Actor::New()) - , mBlurStrengthPropertyIndex(Property::INVALID_INDEX) - , mActivated( false ) +: Control( ControlBehaviour( DISABLE_SIZE_NEGOTIATION | DISABLE_STYLE_CHANGE_SIGNALS ) ), + mNumSamples(numSamples), + mBlurBellCurveWidth( 0.001f ), + mPixelFormat(renderTargetPixelFormat), + mDownsampleWidthScale(downsampleWidthScale), + mDownsampleHeightScale(downsampleHeightScale), + mDownsampledWidth( 0.0f ), + mDownsampledHeight( 0.0f ), + mBlurUserImage( blurUserImage ), + mRenderOnce( false ), + mBackgroundColor( Color::BLACK ), + mTargetSize(Vector2::ZERO), + mLastSize(Vector2::ZERO), + mChildrenRoot(Actor::New()), + mInternalRoot(Actor::New()), + mBlurStrengthPropertyIndex(Property::INVALID_INDEX), + mActivated( false ) { SetBlurBellCurveWidth(blurBellCurveWidth); } @@ -217,7 +219,8 @@ void GaussianBlurView::SetUserImageAndOutputRenderTarget(Image inputImage, Frame DALI_ASSERT_ALWAYS(mBlurUserImage); mUserInputImage = inputImage; - mImageActorHorizBlur.SetImage( mUserInputImage ); + mImageViewHorizBlur.SetImage( mUserInputImage ); + mImageViewHorizBlur.SetProperty( Toolkit::ImageView::Property::IMAGE, mCustomShader ); mUserOutputRenderTarget = outputRenderTarget; } @@ -259,41 +262,37 @@ void GaussianBlurView::OnInitialize() std::ostringstream horizFragmentShaderStringStream; horizFragmentShaderStringStream << "#define NUM_SAMPLES " << mNumSamples << "\n"; horizFragmentShaderStringStream << GAUSSIAN_BLUR_FRAGMENT_SOURCE; - Property::Map customShader; - customShader[ "fragmentShader" ] = horizFragmentShaderStringStream.str(); - Property::Map rendererMap; - rendererMap.Insert( "rendererType", "image" ); - rendererMap.Insert( "shader", customShader ); + Property::Map source; + source[ Toolkit::Visual::Shader::Property::FRAGMENT_SHADER ] = horizFragmentShaderStringStream.str(); + mCustomShader[ Toolkit::Visual::Property::SHADER ] = source; ////////////////////////////////////////////////////// // Create actors - // Create an ImageActor for performing a horizontal blur on the texture - mImageActorHorizBlur = Toolkit::ImageView::New(); - mImageActorHorizBlur.SetParentOrigin(ParentOrigin::CENTER); - mImageActorHorizBlur.SetProperty( Toolkit::ImageView::Property::IMAGE, rendererMap ); + // Create an image view for performing a horizontal blur on the texture + mImageViewHorizBlur = Toolkit::ImageView::New(); + mImageViewHorizBlur.SetParentOrigin(ParentOrigin::CENTER); - // Create an ImageActor for performing a vertical blur on the texture - mImageActorVertBlur = Toolkit::ImageView::New(); - mImageActorVertBlur.SetParentOrigin(ParentOrigin::CENTER); - mImageActorVertBlur.SetProperty( Toolkit::ImageView::Property::IMAGE, rendererMap ); + // Create an image view for performing a vertical blur on the texture + mImageViewVertBlur = Toolkit::ImageView::New(); + mImageViewVertBlur.SetParentOrigin(ParentOrigin::CENTER); // Register a property that the user can control to fade the blur in / out via the GaussianBlurView object Actor self = Self(); mBlurStrengthPropertyIndex = self.RegisterProperty(GAUSSIAN_BLUR_VIEW_STRENGTH_PROPERTY_NAME, GAUSSIAN_BLUR_VIEW_DEFAULT_BLUR_STRENGTH); - // Create an ImageActor for compositing the blur and the original child actors render + // Create an image view for compositing the blur and the original child actors render if(!mBlurUserImage) { - mImageActorComposite = Toolkit::ImageView::New(); - mImageActorComposite.SetParentOrigin(ParentOrigin::CENTER); - mImageActorComposite.SetOpacity(GAUSSIAN_BLUR_VIEW_DEFAULT_BLUR_STRENGTH); // ensure alpha is enabled for this object and set default value + mImageViewComposite = Toolkit::ImageView::New(); + mImageViewComposite.SetParentOrigin(ParentOrigin::CENTER); + mImageViewComposite.SetOpacity(GAUSSIAN_BLUR_VIEW_DEFAULT_BLUR_STRENGTH); // ensure alpha is enabled for this object and set default value - Constraint blurStrengthConstraint = Constraint::New( mImageActorComposite, Actor::Property::COLOR_ALPHA, EqualToConstraint()); + Constraint blurStrengthConstraint = Constraint::New( mImageViewComposite, Actor::Property::COLOR_ALPHA, EqualToConstraint()); blurStrengthConstraint.AddSource( Source( self, mBlurStrengthPropertyIndex) ); blurStrengthConstraint.Apply(); - // Create an ImageActor for holding final result, i.e. the blurred image. This will get rendered to screen later, via default / user render task + // Create an image view for holding final result, i.e. the blurred image. This will get rendered to screen later, via default / user render task mTargetActor = Toolkit::ImageView::New(); mTargetActor.SetParentOrigin(ParentOrigin::CENTER); @@ -306,7 +305,7 @@ void GaussianBlurView::OnInitialize() ////////////////////////////////////////////////////// // Connect to actor tree - mInternalRoot.Add( mImageActorComposite ); + mInternalRoot.Add( mImageViewComposite ); mInternalRoot.Add( mTargetActor ); mInternalRoot.Add( mRenderFullSizeCamera ); } @@ -323,23 +322,21 @@ void GaussianBlurView::OnInitialize() // Connect to actor tree Self().Add( mChildrenRoot ); Self().Add( mInternalRoot ); - mInternalRoot.Add( mImageActorHorizBlur ); - mInternalRoot.Add( mImageActorVertBlur ); + mInternalRoot.Add( mImageViewHorizBlur ); + mInternalRoot.Add( mImageViewVertBlur ); mInternalRoot.Add( mRenderDownsampledCamera ); } void GaussianBlurView::OnSizeSet(const Vector3& targetSize) { - Control::OnSizeSet( targetSize ); - mTargetSize = Vector2(targetSize); mChildrenRoot.SetSize(targetSize); if( !mBlurUserImage ) { - mImageActorComposite.SetSize(targetSize); + mImageViewComposite.SetSize(targetSize); mTargetActor.SetSize(targetSize); // Children render camera must move when GaussianBlurView object is resized. This is since we cannot change render target size - so we need to remap the child actors' rendering @@ -357,16 +354,18 @@ void GaussianBlurView::OnSizeSet(const Vector3& targetSize) Deactivate(); Activate(); } + + Control::OnSizeSet( targetSize ); } void GaussianBlurView::OnChildAdd( Actor& child ) { - Control::OnChildAdd( child ); - if( child != mChildrenRoot && child != mInternalRoot) { mChildrenRoot.Add( child ); } + + Control::OnChildAdd( child ); } void GaussianBlurView::OnChildRemove( Actor& child ) @@ -412,14 +411,15 @@ void GaussianBlurView::AllocateResources() // create offscreen buffer of new size to render our child actors to mRenderTargetForRenderingChildren = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat ); - // Set ImageActor for performing a horizontal blur on the texture - mImageActorHorizBlur.SetImage( mRenderTargetForRenderingChildren ); + // Set image view for performing a horizontal blur on the texture + mImageViewHorizBlur.SetImage( mRenderTargetForRenderingChildren ); + mImageViewHorizBlur.SetProperty( Toolkit::ImageView::Property::IMAGE, mCustomShader ); // Create offscreen buffer for vert blur pass mRenderTarget1 = FrameBufferImage::New( mDownsampledWidth, mDownsampledHeight, mPixelFormat ); // use the completed blur in the first buffer and composite with the original child actors render - mImageActorComposite.SetImage( mRenderTarget1 ); + mImageViewComposite.SetImage( mRenderTarget1 ); // set up target actor for rendering result, i.e. the blurred image mTargetActor.SetImage(mRenderTargetForRenderingChildren); @@ -429,11 +429,12 @@ void GaussianBlurView::AllocateResources() mRenderTarget2 = FrameBufferImage::New( mDownsampledWidth, mDownsampledHeight, mPixelFormat ); // size needs to match render target - mImageActorHorizBlur.SetSize(mDownsampledWidth, mDownsampledHeight); + mImageViewHorizBlur.SetSize(mDownsampledWidth, mDownsampledHeight); // size needs to match render target - mImageActorVertBlur.SetImage( mRenderTarget2 ); - mImageActorVertBlur.SetSize(mDownsampledWidth, mDownsampledHeight); + mImageViewVertBlur.SetImage( mRenderTarget2 ); + mImageViewVertBlur.SetProperty( Toolkit::ImageView::Property::IMAGE, mCustomShader ); + mImageViewVertBlur.SetSize(mDownsampledWidth, mDownsampledHeight); // set gaussian blur up for new sized render targets SetShaderConstants(); @@ -460,7 +461,7 @@ void GaussianBlurView::CreateRenderTasks() // perform a horizontal blur targeting the second buffer mHorizBlurTask = taskList.CreateTask(); - mHorizBlurTask.SetSourceActor( mImageActorHorizBlur ); + mHorizBlurTask.SetSourceActor( mImageViewHorizBlur ); mHorizBlurTask.SetExclusive(true); mHorizBlurTask.SetInputEnabled( false ); mHorizBlurTask.SetClearEnabled( true ); @@ -474,7 +475,7 @@ void GaussianBlurView::CreateRenderTasks() // use the second buffer and perform a horizontal blur targeting the first buffer mVertBlurTask = taskList.CreateTask(); - mVertBlurTask.SetSourceActor( mImageActorVertBlur ); + mVertBlurTask.SetSourceActor( mImageViewVertBlur ); mVertBlurTask.SetExclusive(true); mVertBlurTask.SetInputEnabled( false ); mVertBlurTask.SetClearEnabled( true ); @@ -498,7 +499,7 @@ void GaussianBlurView::CreateRenderTasks() if(!mBlurUserImage) { mCompositeTask = taskList.CreateTask(); - mCompositeTask.SetSourceActor( mImageActorComposite ); + mCompositeTask.SetSourceActor( mImageViewComposite ); mCompositeTask.SetExclusive(true); mCompositeTask.SetInputEnabled( false ); @@ -600,11 +601,11 @@ void GaussianBlurView::SetShaderConstants() Vector2 yAxis(0.0f, 1.0f); for (i = 0; i < mNumSamples; ++i ) { - mImageActorHorizBlur.RegisterProperty( GetSampleOffsetsPropertyName( i ), uvOffsets[ i ] * xAxis ); - mImageActorHorizBlur.RegisterProperty( GetSampleWeightsPropertyName( i ), weights[ i ] ); + mImageViewHorizBlur.RegisterProperty( GetSampleOffsetsPropertyName( i ), uvOffsets[ i ] * xAxis ); + mImageViewHorizBlur.RegisterProperty( GetSampleWeightsPropertyName( i ), weights[ i ] ); - mImageActorVertBlur.RegisterProperty( GetSampleOffsetsPropertyName( i ), uvOffsets[ i ] * yAxis ); - mImageActorVertBlur.RegisterProperty( GetSampleWeightsPropertyName( i ), weights[ i ] ); + mImageViewVertBlur.RegisterProperty( GetSampleOffsetsPropertyName( i ), uvOffsets[ i ] * yAxis ); + mImageViewVertBlur.RegisterProperty( GetSampleWeightsPropertyName( i ), weights[ i ] ); } delete[] uvOffsets;