X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fsuper-blur-view%2Fsuper-blur-view-impl.cpp;h=ad90105187feeb8d87b3ecac4580c7050826a6a2;hp=769a7fc7daa9f672b5643215856cdd425bde9a21;hb=1d71a8f7d7abd7729aa645ad062e530958097214;hpb=a4fa71ebecb9ed103fa3e64004e99b728f9190c2 diff --git a/dali-toolkit/internal/controls/super-blur-view/super-blur-view-impl.cpp b/dali-toolkit/internal/controls/super-blur-view/super-blur-view-impl.cpp index 769a7fc..ad90105 100644 --- a/dali-toolkit/internal/controls/super-blur-view/super-blur-view-impl.cpp +++ b/dali-toolkit/internal/controls/super-blur-view/super-blur-view-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -19,51 +19,39 @@ #include "super-blur-view-impl.h" // EXTERNAL INCLUDES -#include -#include #include +#include +#include +#include #include -#include #include +#include #include -#include -#include +#include // INTERNAL_INCLUDES -#include #include +#include #include +#include #include #include -#include +#include namespace //Unnamed namespace { - using namespace Dali; //Todo: make these properties instead of constants -const unsigned int GAUSSIAN_BLUR_DEFAULT_NUM_SAMPLES = 11; -const unsigned int GAUSSIAN_BLUR_NUM_SAMPLES_INCREMENTATION = 10; -const float GAUSSIAN_BLUR_BELL_CURVE_WIDTH = 4.5f; -const float GAUSSIAN_BLUR_BELL_CURVE_WIDTH_INCREMENTATION = 5.f; -const Pixel::Format GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT = Pixel::RGBA8888; -const float GAUSSIAN_BLUR_DOWNSAMPLE_WIDTH_SCALE = 0.5f; -const float GAUSSIAN_BLUR_DOWNSAMPLE_HEIGHT_SCALE = 0.5f; - -const char* ALPHA_UNIFORM_NAME( "uAlpha" ); -const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER( - varying mediump vec2 vTexCoord;\n - uniform sampler2D sTexture;\n - uniform lowp vec4 uColor;\n - uniform lowp float uAlpha;\n - \n - void main()\n - {\n - gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n - gl_FragColor.a *= uAlpha; - }\n -); +const unsigned int GAUSSIAN_BLUR_DEFAULT_NUM_SAMPLES = 11; +const unsigned int GAUSSIAN_BLUR_NUM_SAMPLES_INCREMENTATION = 10; +const float GAUSSIAN_BLUR_BELL_CURVE_WIDTH = 4.5f; +const float GAUSSIAN_BLUR_BELL_CURVE_WIDTH_INCREMENTATION = 5.f; +const Pixel::Format GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT = Pixel::RGBA8888; +const float GAUSSIAN_BLUR_DOWNSAMPLE_WIDTH_SCALE = 0.5f; +const float GAUSSIAN_BLUR_DOWNSAMPLE_HEIGHT_SCALE = 0.5f; + +const char* ALPHA_UNIFORM_NAME("uAlpha"); /** * The constraint is used to blend the group of blurred images continuously with a unified blur strength property value which ranges from zero to one. @@ -72,12 +60,12 @@ struct ActorOpacityConstraint { ActorOpacityConstraint(int totalImageNum, int currentImageIdx) { - float rangeLength = 1.f / static_cast( totalImageNum ); - float index = static_cast( currentImageIdx ); - mRange = Vector2( index*rangeLength, (index+1.f)*rangeLength ); + float rangeLength = 1.f / static_cast(totalImageNum); + float index = static_cast(currentImageIdx); + mRange = Vector2(index * rangeLength, (index + 1.f) * rangeLength); } - void operator()( float& current, const PropertyInputContainer& inputs ) + void operator()(float& current, const PropertyInputContainer& inputs) { float blurStrength = inputs[0]->GetFloat(); if(blurStrength < mRange.x) @@ -90,7 +78,7 @@ struct ActorOpacityConstraint } else { - current = ( blurStrength - mRange.x) / ( mRange.y - mRange.x ); + current = (blurStrength - mRange.x) / (mRange.y - mRange.x); } } @@ -101,56 +89,52 @@ struct ActorOpacityConstraint namespace Dali { - namespace Toolkit { - namespace Internal { - namespace { - const unsigned int DEFAULT_BLUR_LEVEL(5u); ///< The default blur level when creating SuperBlurView from the type registry BaseHandle Create() { - return Toolkit::SuperBlurView::New( DEFAULT_BLUR_LEVEL ); + return Toolkit::SuperBlurView::New(DEFAULT_BLUR_LEVEL); } // Setup properties, signals and actions using the type-registry. -DALI_TYPE_REGISTRATION_BEGIN( Toolkit::SuperBlurView, Toolkit::Control, Create ) +DALI_TYPE_REGISTRATION_BEGIN(Toolkit::SuperBlurView, Toolkit::Control, Create) -DALI_PROPERTY_REGISTRATION( Toolkit, SuperBlurView, "imageUrl", STRING, IMAGE_URL ) +DALI_PROPERTY_REGISTRATION(Toolkit, SuperBlurView, "imageUrl", STRING, IMAGE_URL) DALI_TYPE_REGISTRATION_END() } // unnamed namespace -SuperBlurView::SuperBlurView( unsigned int blurLevels ) -: Control( ControlBehaviour( DISABLE_SIZE_NEGOTIATION | DISABLE_STYLE_CHANGE_SIGNALS ) ), - mTargetSize( Vector2::ZERO ), +SuperBlurView::SuperBlurView(unsigned int blurLevels) +: Control(ControlBehaviour(DISABLE_SIZE_NEGOTIATION | DISABLE_STYLE_CHANGE_SIGNALS)), + mTargetSize(Vector2::ZERO), mBlurStrengthPropertyIndex(Property::INVALID_INDEX), - mBlurLevels( blurLevels ), - mResourcesCleared( true ) + mBlurLevels(blurLevels), + mResourcesCleared(true) { - DALI_ASSERT_ALWAYS( mBlurLevels > 0 && " Minimal blur level is one, otherwise no blur is needed" ); - mGaussianBlurView.assign( blurLevels, Toolkit::GaussianBlurView() ); - mBlurredImage.assign( blurLevels, FrameBuffer() ); - mRenderers.assign( blurLevels+1, Dali::Renderer() ); + DALI_ASSERT_ALWAYS(mBlurLevels > 0 && " Minimal blur level is one, otherwise no blur is needed"); + mGaussianBlurView.assign(blurLevels, Toolkit::GaussianBlurView()); + mBlurredImage.assign(blurLevels, FrameBuffer()); + mRenderers.assign(blurLevels + 1, Dali::Renderer()); } SuperBlurView::~SuperBlurView() { } -Toolkit::SuperBlurView SuperBlurView::New( unsigned int blurLevels ) +Toolkit::SuperBlurView SuperBlurView::New(unsigned int blurLevels) { //Create the implementation - IntrusivePtr superBlurView( new SuperBlurView( blurLevels ) ); + IntrusivePtr superBlurView(new SuperBlurView(blurLevels)); //Pass ownership to CustomActor via derived handle - Toolkit::SuperBlurView handle( *superBlurView ); + Toolkit::SuperBlurView handle(*superBlurView); // Second-phase init of the implementation // This can only be done after the CustomActor connection has been made... @@ -161,40 +145,40 @@ Toolkit::SuperBlurView SuperBlurView::New( unsigned int blurLevels ) void SuperBlurView::OnInitialize() { - Actor self( Self() ); + Actor self(Self()); - mBlurStrengthPropertyIndex = self.RegisterProperty( "blurStrength", 0.f ); + mBlurStrengthPropertyIndex = self.RegisterUniqueProperty("blurStrength", 0.f); - DevelControl::SetAccessibilityConstructor( self, []( Dali::Actor actor ) { - return std::unique_ptr< Dali::Accessibility::Accessible >( - new Control::Impl::AccessibleImpl( actor, Dali::Accessibility::Role::FILLER ) ); - } ); + DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) { + return std::unique_ptr( + new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER)); + }); } -void SuperBlurView::SetTexture( Texture texture ) +void SuperBlurView::SetTexture(Texture texture) { mInputTexture = texture; - if( mTargetSize == Vector2::ZERO ) + if(mTargetSize == Vector2::ZERO) { return; } ClearBlurResource(); - Actor self( Self() ); + Actor self(Self()); - BlurTexture( 0, mInputTexture ); - SetRendererTexture( mRenderers[0], texture ); + BlurTexture(0, mInputTexture); + SetRendererTexture(mRenderers[0], texture); unsigned int i = 1; - for(; i0 && level<=mBlurLevels ); + DALI_ASSERT_ALWAYS(level > 0 && level <= mBlurLevels); - FrameBuffer frameBuffer = mBlurredImage[level-1]; + FrameBuffer frameBuffer = mBlurredImage[level - 1]; return frameBuffer.GetColorTexture(); } -void SuperBlurView::BlurTexture( unsigned int idx, Texture texture ) +void SuperBlurView::BlurTexture(unsigned int idx, Texture texture) { - DALI_ASSERT_ALWAYS( mGaussianBlurView.size()>idx ); - mGaussianBlurView[idx] = Toolkit::GaussianBlurView::New( GAUSSIAN_BLUR_DEFAULT_NUM_SAMPLES+GAUSSIAN_BLUR_NUM_SAMPLES_INCREMENTATION*idx, - GAUSSIAN_BLUR_BELL_CURVE_WIDTH + GAUSSIAN_BLUR_BELL_CURVE_WIDTH_INCREMENTATION*static_cast(idx), - GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT, - GAUSSIAN_BLUR_DOWNSAMPLE_WIDTH_SCALE, GAUSSIAN_BLUR_DOWNSAMPLE_HEIGHT_SCALE, true ); - mGaussianBlurView[idx].SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER ); - mGaussianBlurView[idx].SetProperty( Actor::Property::SIZE, mTargetSize ); - Stage::GetCurrent().Add( mGaussianBlurView[idx] ); - - mGaussianBlurView[idx].SetUserImageAndOutputRenderTarget( texture, mBlurredImage[idx] ); + DALI_ASSERT_ALWAYS(mGaussianBlurView.size() > idx); + mGaussianBlurView[idx] = Toolkit::GaussianBlurView::New(GAUSSIAN_BLUR_DEFAULT_NUM_SAMPLES + GAUSSIAN_BLUR_NUM_SAMPLES_INCREMENTATION * idx, + GAUSSIAN_BLUR_BELL_CURVE_WIDTH + GAUSSIAN_BLUR_BELL_CURVE_WIDTH_INCREMENTATION * static_cast(idx), + GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT, + GAUSSIAN_BLUR_DOWNSAMPLE_WIDTH_SCALE, + GAUSSIAN_BLUR_DOWNSAMPLE_HEIGHT_SCALE, + true); + mGaussianBlurView[idx].SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mGaussianBlurView[idx].SetProperty(Actor::Property::SIZE, mTargetSize); + Stage::GetCurrent().Add(mGaussianBlurView[idx]); + + mGaussianBlurView[idx].SetUserImageAndOutputRenderTarget(texture, mBlurredImage[idx]); mGaussianBlurView[idx].ActivateOnce(); - if( idx == mBlurLevels-1 ) + if(idx == mBlurLevels - 1) { - mGaussianBlurView[idx].FinishedSignal().Connect( this, &SuperBlurView::OnBlurViewFinished ); + mGaussianBlurView[idx].FinishedSignal().Connect(this, &SuperBlurView::OnBlurViewFinished); } } -void SuperBlurView::OnBlurViewFinished( Toolkit::GaussianBlurView blurView ) +void SuperBlurView::OnBlurViewFinished(Toolkit::GaussianBlurView blurView) { ClearBlurResource(); - Toolkit::SuperBlurView handle( GetOwner() ); - mBlurFinishedSignal.Emit( handle ); + Toolkit::SuperBlurView handle(GetOwner()); + mBlurFinishedSignal.Emit(handle); } void SuperBlurView::ClearBlurResource() { - if( !mResourcesCleared ) + if(!mResourcesCleared) { - DALI_ASSERT_ALWAYS( mGaussianBlurView.size() == mBlurLevels && "must synchronize the GaussianBlurView group if blur levels got changed " ); - for(unsigned int i=0; i(i); - unsigned int width = mTargetSize.width/std::pow(2.f,exponent); - unsigned int height = mTargetSize.height/std::pow(2.f,exponent); + unsigned int width = mTargetSize.width / std::pow(2.f, exponent); + unsigned int height = mTargetSize.height / std::pow(2.f, exponent); - mBlurredImage[i-1] = FrameBuffer::New( width, height, FrameBuffer::Attachment::NONE ); - Texture texture = Texture::New( TextureType::TEXTURE_2D, GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT, unsigned(width), unsigned(height) ); - mBlurredImage[i-1].AttachColorTexture( texture ); + mBlurredImage[i - 1] = FrameBuffer::New(width, height, FrameBuffer::Attachment::NONE); + Texture texture = Texture::New(TextureType::TEXTURE_2D, GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT, unsigned(width), unsigned(height)); + mBlurredImage[i - 1].AttachColorTexture(texture); } - if( mInputTexture ) + if(mInputTexture) { - SetTexture( mInputTexture ); + SetTexture(mInputTexture); } } - Control::OnSizeSet( targetSize ); + Control::OnSizeSet(targetSize); } -void SuperBlurView::OnSceneConnection( int depth ) +void SuperBlurView::OnSceneConnection(int depth) { - if( mTargetSize == Vector2::ZERO ) + if(mTargetSize == Vector2::ZERO) { return; } // Exception to the rule, chaining up first ensures visuals have SetOnScene called to create their renderers - Control::OnSceneConnection( depth ); + Control::OnSceneConnection(depth); Actor self = Self(); - for(unsigned int i=0; i 0 ) + if(i > 0) { - Renderer renderer = mRenderers[i]; - Property::Index index = renderer.RegisterProperty( ALPHA_UNIFORM_NAME, 0.f ); - Constraint constraint = Constraint::New( renderer, index, ActorOpacityConstraint(mBlurLevels, i-1) ); - constraint.AddSource( Source( self, mBlurStrengthPropertyIndex ) ); + Renderer renderer = mRenderers[i]; + Property::Index index = renderer.RegisterUniqueProperty(ALPHA_UNIFORM_NAME, 0.f); + Constraint constraint = Constraint::New(renderer, index, ActorOpacityConstraint(mBlurLevels, i - 1)); + constraint.AddSource(Source(self, mBlurStrengthPropertyIndex)); constraint.Apply(); } } - if( mInputTexture ) + if(mInputTexture) { - SetRendererTexture( mRenderers[0], mInputTexture ); + SetRendererTexture(mRenderers[0], mInputTexture); unsigned int i = 1; - for(; i