Merge "Remove FrameBufferImage" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / filters / emboss-filter.cpp
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include "emboss-filter.h"
20
21 // EXTERNAL INCLUDES
22 #include <sstream>
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
29 // INTERNAL INCLUDES
30 #include <dali-toolkit/internal/controls/control/control-renderers.h>
31
32 namespace Dali
33 {
34
35 namespace Toolkit
36 {
37
38 namespace Internal
39 {
40
41 namespace
42 {
43
44 const char* EMBOSS_FRAGMENT_SOURCE =
45 {
46  "precision highp float;\n"
47  "varying mediump vec2 vTexCoord;\n"
48  "uniform sampler2D sTexture;\n"
49  "uniform vec2 uTexScale;\n"
50  "uniform vec3 uCoefficient;\n"
51  "\n"
52  "void main()\n"
53  "{\n"
54  "  vec4 color  = uCoefficient.x * texture2D( sTexture, vTexCoord + vec2(0.0, -uTexScale.y) );\n"
55  "  color += uCoefficient.y * texture2D( sTexture, vTexCoord );\n"
56  "  color += uCoefficient.z * texture2D( sTexture, vTexCoord + vec2(0.0, uTexScale.y) );\n"
57  "  gl_FragColor = color;\n"
58  "}\n"
59 };
60
61 const char* const COMPOSITE_FRAGMENT_SOURCE =
62 {
63   "varying mediump vec2 vTexCoord;\n"
64   "uniform sampler2D sTexture;\n"
65   "uniform lowp vec4 uEffectColor;\n"
66   "void main()\n"
67   "{\n"
68   "  gl_FragColor = uEffectColor;\n"
69   "  gl_FragColor.a *= texture2D( sTexture, vTexCoord).a;\n"
70   "}\n"
71 };
72
73 const char* const TEX_SCALE_UNIFORM_NAME( "uTexScale" );
74 const char* const COEFFICIENT_UNIFORM_NAME( "uCoefficient" );
75 const char* const COLOR_UNIFORM_NAME( "uEffectColor" );
76
77 } // namespace
78
79 EmbossFilter::EmbossFilter()
80 : ImageFilter()
81 {
82 }
83
84 EmbossFilter::~EmbossFilter()
85 {
86 }
87
88 void EmbossFilter::Enable()
89 {
90   mFrameBufferForEmboss1 = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
91   Texture texture1 = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
92   mFrameBufferForEmboss1.AttachColorTexture( texture1 );
93
94   mFrameBufferForEmboss2 = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
95   Texture texture2 = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
96   mFrameBufferForEmboss2.AttachColorTexture( texture2 );
97
98   // create actor to render input with applied emboss effect
99   mActorForInput1 = Actor::New();
100   mActorForInput1.SetParentOrigin( ParentOrigin::CENTER );
101   mActorForInput1.SetSize(mTargetSize);
102   Vector2 textureScale( 1.5f/mTargetSize.width, 1.5f/mTargetSize.height);
103   mActorForInput1.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
104   mActorForInput1.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( 2.f, -1.f, -1.f ) );
105   // set EMBOSS custom shader
106   Renderer renderer1 = CreateRenderer( BASIC_VERTEX_SOURCE, EMBOSS_FRAGMENT_SOURCE );
107   SetRendererTexture( renderer1, mInputTexture );
108   mActorForInput1.AddRenderer( renderer1 );
109   mRootActor.Add( mActorForInput1 );
110
111   mActorForInput2 = Actor::New();
112   mActorForInput2.SetParentOrigin( ParentOrigin::CENTER );
113   mActorForInput2.SetSize(mTargetSize);
114   mActorForInput2.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
115   mActorForInput2.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( -1.f, -1.f, 2.f ) );
116   // set EMBOSS custom shader
117   Renderer renderer2 = CreateRenderer( BASIC_VERTEX_SOURCE, EMBOSS_FRAGMENT_SOURCE );
118   SetRendererTexture( renderer2, mInputTexture );
119   mActorForInput2.AddRenderer( renderer2 );
120   mRootActor.Add( mActorForInput2 );
121
122   mActorForComposite = Actor::New();
123   mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
124   mActorForComposite.SetSize(mTargetSize);
125   mActorForComposite.SetColor( Color::BLACK );
126
127   mRootActor.Add( mActorForComposite );
128
129   mRendererForEmboss1 = CreateRenderer( BASIC_VERTEX_SOURCE, COMPOSITE_FRAGMENT_SOURCE );
130   SetRendererTexture( mRendererForEmboss1, mFrameBufferForEmboss1 );
131   mRendererForEmboss1.RegisterProperty( COLOR_UNIFORM_NAME, Color::BLACK );
132   mActorForComposite.AddRenderer( mRendererForEmboss1 );
133
134   mRendererForEmboss2 = CreateRenderer( BASIC_VERTEX_SOURCE, COMPOSITE_FRAGMENT_SOURCE );
135   SetRendererTexture( mRendererForEmboss2, mFrameBufferForEmboss2 );
136   mRendererForEmboss2.RegisterProperty( COLOR_UNIFORM_NAME, Color::WHITE );
137   mActorForComposite.AddRenderer( mRendererForEmboss2 );
138
139   SetupCamera();
140   CreateRenderTasks();
141 }
142
143 void EmbossFilter::Disable()
144 {
145   if( mRootActor )
146   {
147     if( mCameraActor )
148     {
149       mRootActor.Remove( mCameraActor );
150       mCameraActor.Reset();
151     }
152
153     if( mActorForInput1 )
154     {
155       mRootActor.Remove( mActorForInput1 );
156       mActorForInput1.Reset();
157     }
158
159     if( mActorForInput2 )
160     {
161       mRootActor.Remove( mActorForInput2 );
162       mActorForInput2.Reset();
163     }
164
165     if( mActorForComposite )
166     {
167       mActorForComposite.RemoveRenderer( mRendererForEmboss1 );
168       mRendererForEmboss1.Reset();
169
170       mActorForComposite.RemoveRenderer( mRendererForEmboss2 );
171       mRendererForEmboss2.Reset();
172
173       mRootActor.Remove( mActorForComposite );
174       mActorForComposite.Reset();
175     }
176
177     RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
178     if( mRenderTaskForEmboss1 )
179     {
180       taskList.RemoveTask(mRenderTaskForEmboss1);
181     }
182
183     if( mRenderTaskForEmboss2 )
184     {
185       taskList.RemoveTask(mRenderTaskForEmboss2);
186     }
187
188     if( mRenderTaskForOutput )
189     {
190       taskList.RemoveTask( mRenderTaskForOutput );
191     }
192
193     mRootActor.Reset();
194   }
195 }
196
197 void EmbossFilter::Refresh()
198 {
199   if( mRenderTaskForEmboss1 )
200   {
201     mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
202   }
203   if( mRenderTaskForEmboss2 )
204   {
205     mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
206   }
207 }
208
209 void EmbossFilter::SetSize( const Vector2& size )
210 {
211   mTargetSize = size;
212   if( mActorForInput1 )
213   {
214     mActorForInput1.SetSize(mTargetSize);
215   }
216   if( mActorForInput2 )
217   {
218     mActorForInput2.SetSize(mTargetSize);
219   }
220   if( mActorForComposite )
221   {
222     mActorForComposite.SetSize(mTargetSize);
223   }
224 }
225
226 void EmbossFilter::CreateRenderTasks()
227 {
228   RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
229
230   mRenderTaskForEmboss1 = taskList.CreateTask();
231   mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
232   mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
233   mRenderTaskForEmboss1.SetExclusive(true);
234   mRenderTaskForEmboss1.SetInputEnabled( false );
235   mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
236   mRenderTaskForEmboss1.SetClearEnabled( true );
237   mRenderTaskForEmboss1.SetFrameBuffer( mFrameBufferForEmboss1 );
238   mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
239
240   mRenderTaskForEmboss2 = taskList.CreateTask();
241   mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
242   mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
243   mRenderTaskForEmboss2.SetExclusive(true);
244   mRenderTaskForEmboss2.SetInputEnabled( false );
245   mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
246   mRenderTaskForEmboss2.SetClearEnabled( true );
247   mRenderTaskForEmboss2.SetFrameBuffer( mFrameBufferForEmboss2 );
248   mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
249
250   mRenderTaskForOutput = taskList.CreateTask();
251   mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
252   mRenderTaskForOutput.SetSourceActor( mActorForComposite );
253   mRenderTaskForOutput.SetExclusive(true);
254   mRenderTaskForOutput.SetInputEnabled( false );
255   mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
256   mRenderTaskForOutput.SetClearEnabled( true );
257   mRenderTaskForOutput.SetFrameBuffer( mOutputFrameBuffer );
258   mRenderTaskForOutput.SetCameraActor( mCameraActor );
259 }
260
261 } // namespace Internal
262
263 } // namespace Toolkit
264
265 } // namespace Dali