Merge "TextController - Update the text model." into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / filters / emboss-filter.cpp
1 /*
2  * Copyright (c) 2014 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/rendering/renderer.h>
28 #include <dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h>
29
30 // INTERNAL INCLUDES
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   mImageForEmboss1 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED );
91   mImageForEmboss2 = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Image::UNUSED );
92
93   Property::Map customShader;
94   customShader[ "fragmentShader" ] = EMBOSS_FRAGMENT_SOURCE;
95   Property::Map rendererMap;
96   rendererMap.Insert( "shader", customShader );
97
98   // create actor to render input with applied emboss effect
99   mActorForInput1 = Toolkit::ImageView::New( mInputImage );
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   mActorForInput1.SetProperty( Toolkit::ImageView::Property::IMAGE, rendererMap );
107   mRootActor.Add( mActorForInput1 );
108
109   mActorForInput2 = Toolkit::ImageView::New( mInputImage );
110   mActorForInput2.SetParentOrigin( ParentOrigin::CENTER );
111   mActorForInput2.SetSize(mTargetSize);
112   mActorForInput2.RegisterProperty( TEX_SCALE_UNIFORM_NAME, textureScale );
113   mActorForInput2.RegisterProperty( COEFFICIENT_UNIFORM_NAME, Vector3( -1.f, -1.f, 2.f ) );
114   // set EMBOSS custom shader
115   mActorForInput2.SetProperty( Toolkit::ImageView::Property::IMAGE, rendererMap );
116   mRootActor.Add( mActorForInput2 );
117
118   mActorForComposite = Actor::New();
119   mActorForComposite.SetParentOrigin( ParentOrigin::CENTER );
120   mActorForComposite.SetSize(mTargetSize);
121   mActorForComposite.SetColor( Color::BLACK );
122
123   customShader[ "fragmentShader" ] = COMPOSITE_FRAGMENT_SOURCE;
124   rendererMap[ "shader"] = customShader;
125   Toolkit::RendererFactory rendererFactory = Toolkit::RendererFactory::Get();
126   mRendererForEmboss1 = rendererFactory.GetControlRenderer( mImageForEmboss1 );
127   mRendererForEmboss2 = rendererFactory.GetControlRenderer( mImageForEmboss2 );
128   // set COMPOSITE custom shader to both renderers
129   rendererFactory.ResetRenderer( mRendererForEmboss1, mActorForComposite, rendererMap);
130   rendererFactory.ResetRenderer( mRendererForEmboss2, mActorForComposite, rendererMap);
131   // apply renderers to the actor
132   mRendererForEmboss1.SetOnStage( mActorForComposite );
133   mRendererForEmboss2.SetOnStage( mActorForComposite );
134   mActorForComposite.GetRendererAt(0).RegisterProperty( COLOR_UNIFORM_NAME, Color::BLACK );
135   mActorForComposite.GetRendererAt(1).RegisterProperty( COLOR_UNIFORM_NAME, Color::WHITE );
136   mRootActor.Add( mActorForComposite );
137
138   SetupCamera();
139   CreateRenderTasks();
140 }
141
142 void EmbossFilter::Disable()
143 {
144   if( mRootActor )
145   {
146     if( mCameraActor )
147     {
148       mRootActor.Remove( mCameraActor );
149       mCameraActor.Reset();
150     }
151
152     if( mActorForInput1 )
153     {
154       mRootActor.Remove( mActorForInput1 );
155       mActorForInput1.Reset();
156     }
157
158     if( mActorForInput2 )
159     {
160       mRootActor.Remove( mActorForInput2 );
161       mActorForInput2.Reset();
162     }
163
164     if( mActorForComposite )
165     {
166       mRendererForEmboss1.SetOffStage( mActorForComposite );
167       mRendererForEmboss2.SetOffStage( mActorForComposite );
168       mRendererForEmboss1.Reset();
169       mRendererForEmboss2.Reset();
170       mRootActor.Remove( mActorForComposite );
171       mActorForComposite.Reset();
172     }
173
174     RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
175     if( mRenderTaskForEmboss1 )
176     {
177       taskList.RemoveTask(mRenderTaskForEmboss1);
178     }
179
180     if( mRenderTaskForEmboss2 )
181     {
182       taskList.RemoveTask(mRenderTaskForEmboss2);
183     }
184
185     mRootActor.Reset();
186   }
187 }
188
189 void EmbossFilter::Refresh()
190 {
191   if( mRenderTaskForEmboss1 )
192   {
193     mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
194   }
195   if( mRenderTaskForEmboss2 )
196   {
197     mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
198   }
199 }
200
201 void EmbossFilter::SetSize( const Vector2& size )
202 {
203   mTargetSize = size;
204   if( mActorForInput1 )
205   {
206     mActorForInput1.SetSize(mTargetSize);
207   }
208   if( mActorForInput2 )
209   {
210     mActorForInput2.SetSize(mTargetSize);
211   }
212   if( mActorForComposite )
213   {
214     mActorForComposite.SetSize(mTargetSize);
215   }
216 }
217
218 void EmbossFilter::CreateRenderTasks()
219 {
220   RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
221
222   mRenderTaskForEmboss1 = taskList.CreateTask();
223   mRenderTaskForEmboss1.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
224   mRenderTaskForEmboss1.SetSourceActor( mActorForInput1 );
225   mRenderTaskForEmboss1.SetExclusive(true);
226   mRenderTaskForEmboss1.SetInputEnabled( false );
227   mRenderTaskForEmboss1.SetClearColor( Vector4( 0.0f, 0.0f, 0.0f, 0.0f ) );
228   mRenderTaskForEmboss1.SetClearEnabled( true );
229   mRenderTaskForEmboss1.SetTargetFrameBuffer( mImageForEmboss1 );
230   mRenderTaskForEmboss1.SetCameraActor( mCameraActor );
231
232   mRenderTaskForEmboss2 = taskList.CreateTask();
233   mRenderTaskForEmboss2.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
234   mRenderTaskForEmboss2.SetSourceActor( mActorForInput2 );
235   mRenderTaskForEmboss2.SetExclusive(true);
236   mRenderTaskForEmboss2.SetInputEnabled( false );
237   mRenderTaskForEmboss2.SetClearColor( Vector4( 1.0f, 1.0f, 1.0f, 0.0f ) );
238   mRenderTaskForEmboss2.SetClearEnabled( true );
239   mRenderTaskForEmboss2.SetTargetFrameBuffer( mImageForEmboss2 );
240   mRenderTaskForEmboss2.SetCameraActor( mCameraActor );
241
242   mRenderTaskForOutput = taskList.CreateTask();
243   mRenderTaskForOutput.SetRefreshRate( mRefreshOnDemand ? RenderTask::REFRESH_ONCE : RenderTask::REFRESH_ALWAYS );
244   mRenderTaskForOutput.SetSourceActor( mActorForComposite );
245   mRenderTaskForOutput.SetExclusive(true);
246   mRenderTaskForOutput.SetInputEnabled( false );
247   mRenderTaskForOutput.SetClearColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0f ) );
248   mRenderTaskForOutput.SetClearEnabled( true );
249   mRenderTaskForOutput.SetTargetFrameBuffer( mOutputImage );
250   mRenderTaskForOutput.SetCameraActor( mCameraActor );
251 }
252
253 } // namespace Internal
254
255 } // namespace Toolkit
256
257 } // namespace Dali