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=cb70e60acd5ca4e52d78b2640aaba945d208af97;hb=1d71a8f7d7abd7729aa645ad062e530958097214;hpb=1acdb36279de888dcef999e0e0e1460babdd983a 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 cb70e60..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) 2014 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,43 +19,39 @@ #include "super-blur-view-impl.h" // EXTERNAL INCLUDES -#include -#include -#include -#include -#include -#include -#include +#include #include #include +#include +#include +#include +#include +#include +#include + +// INTERNAL_INCLUDES +#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. @@ -64,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) @@ -82,7 +78,7 @@ struct ActorOpacityConstraint } else { - current = ( blurStrength - mRange.x) / ( mRange.y - mRange.x ); + current = (blurStrength - mRange.x) / (mRange.y - mRange.x); } } @@ -93,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, "image", MAP, IMAGE ) +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 ) ), - 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, FrameBufferImage() ); - mRenderers.assign( blurLevels+1, Toolkit::ControlRenderer() ); + 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... @@ -153,49 +145,42 @@ Toolkit::SuperBlurView SuperBlurView::New( unsigned int blurLevels ) void SuperBlurView::OnInitialize() { - mBlurStrengthPropertyIndex = Self().RegisterProperty( "blurStrength", 0.f ); + Actor self(Self()); - Property::Map rendererMap; - rendererMap.Insert( "rendererType", "image"); + mBlurStrengthPropertyIndex = self.RegisterUniqueProperty("blurStrength", 0.f); - Property::Map shaderMap; - std::stringstream verterShaderString; - shaderMap[ "fragmentShader" ] = FRAGMENT_SHADER; - rendererMap.Insert( "shader", shaderMap ); - - Toolkit::RendererFactory rendererFactory = Toolkit::RendererFactory::Get(); - for(unsigned int i=0; i<=mBlurLevels; i++) - { - mRenderers[i] = rendererFactory.GetControlRenderer( rendererMap ); - mRenderers[i].SetDepthIndex(i); - } + DevelControl::SetAccessibilityConstructor(self, [](Dali::Actor actor) { + return std::unique_ptr( + new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER)); + }); } -void SuperBlurView::SetImage(Image inputImage) +void SuperBlurView::SetTexture(Texture texture) { - if( mTargetSize == Vector2::ZERO || mInputImage == inputImage) + mInputTexture = texture; + + if(mTargetSize == Vector2::ZERO) { return; } ClearBlurResource(); - mInputImage = inputImage; - Actor self = Self(); - Toolkit::RendererFactory::Get().ResetRenderer( mRenderers[0], self, mInputImage ); + Actor self(Self()); - BlurImage( 0, inputImage); - for(unsigned int i=1; i0 && level<=mBlurLevels ); - return mBlurredImage[level-1]; + DALI_ASSERT_ALWAYS(level > 0 && level <= mBlurLevels); + + FrameBuffer frameBuffer = mBlurredImage[level - 1]; + + return frameBuffer.GetColorTexture(); } -void SuperBlurView::BlurImage( unsigned int idx, Image image ) +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].SetParentOrigin(ParentOrigin::CENTER); - mGaussianBlurView[idx].SetSize(mTargetSize); - Stage::GetCurrent().Add( mGaussianBlurView[idx] ); - mGaussianBlurView[idx].SetUserImageAndOutputRenderTarget( image, 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); - mBlurredImage[i-1] = FrameBufferImage::New( mTargetSize.width/std::pow(2.f,exponent) , mTargetSize.height/std::pow(2.f,exponent), - GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT, Dali::Image::NEVER ); - rendererFactory.ResetRenderer( mRenderers[i], self, mBlurredImage[i-1] ); - } - if( mInputImage ) - { - SetImage( mInputImage ); + 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); } - if( self.OnStage() ) + if(mInputTexture) { - for(unsigned int i=0; i<=mBlurLevels;i++) - { - mRenderers[i].SetOnStage( self ); - } + SetTexture(mInputTexture); } } + + Control::OnSizeSet(targetSize); } -void SuperBlurView::OnStageConnection( int depth ) +void SuperBlurView::OnSceneConnection(int depth) { - Control::OnStageConnection( 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); + Actor self = Self(); - mRenderers[0].SetOnStage( self ); - for(unsigned int i=1; i<=mBlurLevels;i++) + + for(unsigned int i = 0; i < mBlurLevels + 1; i++) { - mRenderers[i].SetOnStage( self ); + mRenderers[i] = CreateRenderer(BASIC_VERTEX_SOURCE, SHADER_SUPER_BLUR_VIEW_FRAG); + mRenderers[i].SetProperty(Dali::Renderer::Property::DEPTH_INDEX, (int)i); + self.AddRenderer(mRenderers[i]); - Renderer renderer = self.GetRendererAt( 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 ) ); - constraint.Apply(); + if(i > 0) + { + 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(); + } } -} -void SuperBlurView::OnStageDisconnection( ) -{ - if( mTargetSize == Vector2::ZERO ) + if(mInputTexture) { - return; + SetRendererTexture(mRenderers[0], mInputTexture); + unsigned int i = 1; + for(; i < mBlurLevels; i++) + { + SetRendererTexture(mRenderers[i], mBlurredImage[i - 1]); + } + SetRendererTexture(mRenderers[i], mBlurredImage[i - 1]); } +} - Actor self = Self(); - for(unsigned int i=0; i