2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "emboss-filter.h"
23 #include <dali/public-api/animation/constraints.h>
24 #include <dali/public-api/common/stage.h>
25 #include <dali/public-api/object/property-map.h>
26 #include <dali/public-api/render-tasks/render-task-list.h>
27 #include <dali/public-api/rendering/renderer.h>
28 #include <dali/devel-api/images/texture-set-image.h>
31 #include <dali-toolkit/public-api/visuals/visual-properties.h>
32 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
33 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
47 const char* EMBOSS_FRAGMENT_SOURCE =
49 "precision highp float;\n"
50 "varying mediump vec2 vTexCoord;\n"
51 "uniform sampler2D sTexture;\n"
52 "uniform vec2 uTexScale;\n"
53 "uniform vec3 uCoefficient;\n"
57 " vec4 color = uCoefficient.x * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
58 " color += uCoefficient.y * texture2D( sTexture, vTexCoord );\n"
59 " color += uCoefficient.z * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
60 " gl_FragColor = color;\n"
64 const char* const COMPOSITE_FRAGMENT_SOURCE =
66 "varying mediump vec2 vTexCoord;\n"
67 "uniform sampler2D sTexture;\n"
68 "uniform lowp vec4 uEffectColor;\n"
71 " gl_FragColor = uEffectColor;\n"
72 " gl_FragColor.a *= texture2D( sTexture, vTexCoord).a;\n"
76 const char* const TEX_SCALE_UNIFORM_NAME( "uTexScale" );
77 const char* const COEFFICIENT_UNIFORM_NAME( "uCoefficient" );
78 const char* const COLOR_UNIFORM_NAME( "uEffectColor" );
82 EmbossFilter::EmbossFilter()
87 EmbossFilter::~EmbossFilter()
91 void EmbossFilter::Enable()
93 mImageForEmboss1 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat );
94 mImageForEmboss2 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat );
96 Property::Map customShader;
97 customShader[ Toolkit::Visual::Shader::Property::FRAGMENT_SHADER ] = EMBOSS_FRAGMENT_SOURCE;
98 Property::Map visualMap;
99 visualMap.Insert( Toolkit::Visual::Property::SHADER, customShader );
101 // create actor to render input with applied emboss effect
102 mActorForInput1 = Toolkit::ImageView::New(mInputImage);
103 mActorForInput1.SetParentOrigin( ParentOrigin::CENTER );
104 mActorForInput1.SetSize(mTargetSize);
105 Vector2 textureScale( 1.5f/mTargetSize.width, 1.5f/mTargetSize.height);
106 mActorForInput1.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
107 mActorForInput1.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( 2.f, -1.f, -1.f ) );
108 // set EMBOSS custom shader
109 mActorForInput1.SetProperty( Toolkit::ImageView::Property::IMAGE, visualMap );
110 mRootActor.Add( mActorForInput1 );
112 mActorForInput2 = Toolkit::ImageView::New(mInputImage);
113 mActorForInput2.SetParentOrigin( ParentOrigin::CENTER );
114 mActorForInput2.SetSize(mTargetSize);
115 mActorForInput2.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
116 mActorForInput2.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( -1.f, -1.f, 2.f ) );
117 // set EMBOSS custom shader
118 mActorForInput2.SetProperty( Toolkit::ImageView::Property::IMAGE, visualMap );
119 mRootActor.Add( mActorForInput2 );
121 mActorForComposite = Actor::New();
122 mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
123 mActorForComposite.SetSize(mTargetSize);
124 mActorForComposite.SetColor( Color::BLACK );
126 customShader[ Toolkit::Visual::Shader::Property::FRAGMENT_SHADER ] = COMPOSITE_FRAGMENT_SOURCE;
128 mRootActor.Add( mActorForComposite );
130 Image dummyImage; // Dummy image, force creation of an image visual
132 InitializeVisual( mActorForComposite, mVisualForEmboss1, dummyImage );
133 Toolkit::GetImplementation( mVisualForEmboss1 ).SetCustomShader( customShader );
135 InitializeVisual( mActorForComposite, mVisualForEmboss2, dummyImage );
136 Toolkit::GetImplementation( mVisualForEmboss2 ).SetCustomShader( customShader );
138 TextureSet textureSet1 = TextureSet::New();
139 TextureSetImage( textureSet1, 0, mImageForEmboss1 );
140 mActorForComposite.GetRendererAt(0).SetTextures( textureSet1 );
141 mActorForComposite.GetRendererAt(0).RegisterProperty( COLOR_UNIFORM_NAME, Color::BLACK );
143 TextureSet textureSet2 = TextureSet::New();
144 TextureSetImage( textureSet2, 0, mImageForEmboss2 );
145 mActorForComposite.GetRendererAt(1).SetTextures( textureSet2 );
146 mActorForComposite.GetRendererAt(1).RegisterProperty( COLOR_UNIFORM_NAME, Color::WHITE );
152 void EmbossFilter::Disable()
158 mRootActor.Remove( mCameraActor );
159 mCameraActor.Reset();
162 if( mActorForInput1 )
164 mRootActor.Remove( mActorForInput1 );
165 mActorForInput1.Reset();
168 if( mActorForInput2 )
170 mRootActor.Remove( mActorForInput2 );
171 mActorForInput2.Reset();
174 if( mActorForComposite )
176 mVisualForEmboss1.SetOffStage( mActorForComposite );
177 mVisualForEmboss2.SetOffStage( mActorForComposite );
178 mVisualForEmboss1.Reset();
179 mVisualForEmboss2.Reset();
180 mRootActor.Remove( mActorForComposite );
181 mActorForComposite.Reset();
184 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
185 if( mRenderTaskForEmboss1 )
187 taskList.RemoveTask(mRenderTaskForEmboss1);
190 if( mRenderTaskForEmboss2 )
192 taskList.RemoveTask(mRenderTaskForEmboss2);
199 void EmbossFilter::Refresh()
201 if( mRenderTaskForEmboss1 )
203 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
205 if( mRenderTaskForEmboss2 )
207 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
211 void EmbossFilter::SetSize( const Vector2& size )
214 if( mActorForInput1 )
216 mActorForInput1.SetSize(mTargetSize);
218 if( mActorForInput2 )
220 mActorForInput2.SetSize(mTargetSize);
222 if( mActorForComposite )
224 mActorForComposite.SetSize(mTargetSize);
228 void EmbossFilter::CreateRenderTasks()
230 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
232 mRenderTaskForEmboss1 = taskList.CreateTask();
233 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
234 mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
235 mRenderTaskForEmboss1.SetExclusive(true);
236 mRenderTaskForEmboss1.SetInputEnabled( false );
237 mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
238 mRenderTaskForEmboss1.SetClearEnabled( true );
239 mRenderTaskForEmboss1.SetTargetFrameBuffer( mImageForEmboss1 );
240 mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
242 mRenderTaskForEmboss2 = taskList.CreateTask();
243 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
244 mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
245 mRenderTaskForEmboss2.SetExclusive(true);
246 mRenderTaskForEmboss2.SetInputEnabled( false );
247 mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
248 mRenderTaskForEmboss2.SetClearEnabled( true );
249 mRenderTaskForEmboss2.SetTargetFrameBuffer( mImageForEmboss2 );
250 mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
252 mRenderTaskForOutput = taskList.CreateTask();
253 mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
254 mRenderTaskForOutput.SetSourceActor( mActorForComposite );
255 mRenderTaskForOutput.SetExclusive(true);
256 mRenderTaskForOutput.SetInputEnabled( false );
257 mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
258 mRenderTaskForOutput.SetClearEnabled( true );
259 mRenderTaskForOutput.SetTargetFrameBuffer( mOutputImage );
260 mRenderTaskForOutput.SetCameraActor( mCameraActor );
263 } // namespace Internal
265 } // namespace Toolkit