2 * Copyright (c) 2014 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/devel-api/rendering/renderer.h>
28 #include <dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h>
42 const char* EMBOSS_FRAGMENT_SOURCE =
44 "precision highp float;\n"
45 "varying mediump vec2 vTexCoord;\n"
46 "uniform sampler2D sTexture;\n"
47 "uniform vec2 uTexScale;\n"
48 "uniform vec3 uCoefficient;\n"
52 " vec4 color = uCoefficient.x * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
53 " color += uCoefficient.y * texture2D( sTexture, vTexCoord );\n"
54 " color += uCoefficient.z * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
55 " gl_FragColor = color;\n"
59 const char* const COMPOSITE_FRAGMENT_SOURCE =
61 "varying mediump vec2 vTexCoord;\n"
62 "uniform sampler2D sTexture;\n"
63 "uniform lowp vec4 uEffectColor;\n"
66 " gl_FragColor = uEffectColor;\n"
67 " gl_FragColor.a *= texture2D( sTexture, vTexCoord).a;\n"
71 const char* const TEX_SCALE_UNIFORM_NAME( "uTexScale" );
72 const char* const COEFFICIENT_UNIFORM_NAME( "uCoefficient" );
73 const char* const COLOR_UNIFORM_NAME( "uEffectColor" );
77 EmbossFilter::EmbossFilter()
82 EmbossFilter::~EmbossFilter()
86 void EmbossFilter::Enable()
88 mImageForEmboss1 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED );
89 mImageForEmboss2 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED );
91 Property::Map customShader;
92 customShader[ "fragmentShader" ] = EMBOSS_FRAGMENT_SOURCE;
93 Property::Map rendererMap;
94 rendererMap.Insert( "shader", customShader );
96 // create actor to render input with applied emboss effect
97 mActorForInput1 = Toolkit::ImageView::New(mInputImage);
98 mActorForInput1.SetParentOrigin( ParentOrigin::CENTER );
99 mActorForInput1.SetSize(mTargetSize);
100 Vector2 textureScale( 1.5f/mTargetSize.width, 1.5f/mTargetSize.height);
101 mActorForInput1.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
102 mActorForInput1.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( 2.f, -1.f, -1.f ) );
103 // set EMBOSS custom shader
104 mActorForInput1.SetProperty( Toolkit::ImageView::Property::IMAGE, rendererMap );
105 mRootActor.Add( mActorForInput1 );
107 mActorForInput2 = Toolkit::ImageView::New(mInputImage);
108 mActorForInput2.SetParentOrigin( ParentOrigin::CENTER );
109 mActorForInput2.SetSize(mTargetSize);
110 mActorForInput2.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
111 mActorForInput2.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( -1.f, -1.f, 2.f ) );
112 // set EMBOSS custom shader
113 mActorForInput2.SetProperty( Toolkit::ImageView::Property::IMAGE, rendererMap );
114 mRootActor.Add( mActorForInput2 );
116 mActorForComposite = Actor::New();
117 mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
118 mActorForComposite.SetSize(mTargetSize);
119 mActorForComposite.SetColor( Color::BLACK );
121 customShader[ "fragmentShader" ] = COMPOSITE_FRAGMENT_SOURCE;
122 rendererMap[ "shader"] = customShader;
123 rendererMap[ "rendererType"] = "image";
125 mRootActor.Add( mActorForComposite );
127 InitializeControlRenderer( mActorForComposite, mRendererForEmboss1, rendererMap );
128 InitializeControlRenderer( mActorForComposite, mRendererForEmboss2, rendererMap );
130 TextureSet textureSet1 = TextureSet::New();
131 textureSet1.SetImage( 0, mImageForEmboss1 );
132 mActorForComposite.GetRendererAt(0).SetTextures( textureSet1 );
133 mActorForComposite.GetRendererAt(0).RegisterProperty( COLOR_UNIFORM_NAME, Color::BLACK );
135 TextureSet textureSet2 = TextureSet::New();
136 textureSet2.SetImage( 0, mImageForEmboss2 );
137 mActorForComposite.GetRendererAt(1).SetTextures( textureSet2 );
138 mActorForComposite.GetRendererAt(1).RegisterProperty( COLOR_UNIFORM_NAME, Color::WHITE );
144 void EmbossFilter::Disable()
150 mRootActor.Remove( mCameraActor );
151 mCameraActor.Reset();
154 if( mActorForInput1 )
156 mRootActor.Remove( mActorForInput1 );
157 mActorForInput1.Reset();
160 if( mActorForInput2 )
162 mRootActor.Remove( mActorForInput2 );
163 mActorForInput2.Reset();
166 if( mActorForComposite )
168 mRendererForEmboss1.SetOffStage( mActorForComposite );
169 mRendererForEmboss2.SetOffStage( mActorForComposite );
170 mRendererForEmboss1.Reset();
171 mRendererForEmboss2.Reset();
172 mRootActor.Remove( mActorForComposite );
173 mActorForComposite.Reset();
176 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
177 if( mRenderTaskForEmboss1 )
179 taskList.RemoveTask(mRenderTaskForEmboss1);
182 if( mRenderTaskForEmboss2 )
184 taskList.RemoveTask(mRenderTaskForEmboss2);
191 void EmbossFilter::Refresh()
193 if( mRenderTaskForEmboss1 )
195 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
197 if( mRenderTaskForEmboss2 )
199 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
203 void EmbossFilter::SetSize( const Vector2& size )
206 if( mActorForInput1 )
208 mActorForInput1.SetSize(mTargetSize);
210 if( mActorForInput2 )
212 mActorForInput2.SetSize(mTargetSize);
214 if( mActorForComposite )
216 mActorForComposite.SetSize(mTargetSize);
220 void EmbossFilter::CreateRenderTasks()
222 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
224 mRenderTaskForEmboss1 = taskList.CreateTask();
225 mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
226 mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
227 mRenderTaskForEmboss1.SetExclusive(true);
228 mRenderTaskForEmboss1.SetInputEnabled( false );
229 mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
230 mRenderTaskForEmboss1.SetClearEnabled( true );
231 mRenderTaskForEmboss1.SetTargetFrameBuffer( mImageForEmboss1 );
232 mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
234 mRenderTaskForEmboss2 = taskList.CreateTask();
235 mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
236 mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
237 mRenderTaskForEmboss2.SetExclusive(true);
238 mRenderTaskForEmboss2.SetInputEnabled( false );
239 mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
240 mRenderTaskForEmboss2.SetClearEnabled( true );
241 mRenderTaskForEmboss2.SetTargetFrameBuffer( mImageForEmboss2 );
242 mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
244 mRenderTaskForOutput = taskList.CreateTask();
245 mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
246 mRenderTaskForOutput.SetSourceActor( mActorForComposite );
247 mRenderTaskForOutput.SetExclusive(true);
248 mRenderTaskForOutput.SetInputEnabled( false );
249 mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
250 mRenderTaskForOutput.SetClearEnabled( true );
251 mRenderTaskForOutput.SetTargetFrameBuffer( mOutputImage );
252 mRenderTaskForOutput.SetCameraActor( mCameraActor );
255 } // namespace Internal
257 } // namespace Toolkit