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