Changes following deprecation of position inheritance modes
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / clipping / text-clipper.cpp
1 /*
2  * Copyright (c) 2015 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 <dali-toolkit/internal/text/clipping/text-clipper.h>
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/common/stage.h>
23 #include <dali/public-api/render-tasks/render-task-list.h>
24
25 namespace
26 {
27
28 // Currently on desktop machines 2k x 2k is the maximum frame buffer size, on target is 4k x 4k.
29 const float MAX_OFFSCREEN_RENDERING_SIZE = 2048.f;
30
31 } // namespace
32
33
34 namespace Dali
35 {
36
37 namespace Toolkit
38 {
39
40 namespace Text
41 {
42
43 ClipperPtr Clipper::New( const Vector2& size )
44 {
45   ClipperPtr clipper( new Clipper() );
46
47   // Second-phase init
48   clipper->Initialize( size );
49
50   return clipper;
51 }
52
53 Actor Clipper::GetRootActor() const
54 {
55   return mOffscreenRootActor;
56 }
57
58 ImageActor Clipper::GetImageActor() const
59 {
60   return mImageActor;
61 }
62
63 void Clipper::Refresh( const Vector2& size )
64 {
65   const Size offscreenSize( std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.width ),
66                             std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.height ) );
67
68   const bool sizeChanged = offscreenSize != mCurrentOffscreenSize;
69
70   if( sizeChanged )
71   {
72     // Reconfigure camera for current size.
73     mOffscreenCameraActor.SetOrthographicProjection( offscreenSize );
74
75     // Recreate frame buffer for offscreen rendering when the size changes.
76     FrameBufferImage frameBufferImage = FrameBufferImage::New( offscreenSize.width,
77                                                                offscreenSize.height,
78                                                                Pixel::RGBA8888 );
79
80     mOffscreenRootActor.SetSize( size );
81
82     mImageActor.SetSize( offscreenSize );
83     mImageActor.SetImage( frameBufferImage );
84     mRenderTask.SetTargetFrameBuffer( frameBufferImage );
85
86     // Stores current sizPe to avoid create new Dali resources if text changes.
87     mCurrentOffscreenSize = offscreenSize;
88   }
89
90   mRenderTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
91 }
92
93 void Clipper::Initialize( const Vector2& size )
94 {
95   const Size offscreenSize( std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.width ),
96                             std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.height ) );
97
98   // Create a root actor and an image actor for offscreen rendering.
99   mOffscreenRootActor = Layer::New();
100   mOffscreenRootActor.SetColorMode( USE_OWN_COLOR );
101   mOffscreenRootActor.SetInheritPosition( false );
102   mOffscreenRootActor.SetInheritScale( false );
103   mOffscreenRootActor.SetDepthTestDisabled( true );
104   mOffscreenRootActor.SetSize( offscreenSize );
105
106   mImageActor = ImageActor::New();
107   mImageActor.SetParentOrigin( ParentOrigin::CENTER );
108   mImageActor.SetBlendFunc( BlendingFactor::ONE, BlendingFactor::ONE_MINUS_SRC_ALPHA,
109                             BlendingFactor::ONE, BlendingFactor::ONE );
110   mImageActor.SetScale( Vector3( 1.0f, -1.0f, 1.0f ) );
111   mImageActor.SetSize( offscreenSize );
112
113   // Creates a new camera actor.
114   mOffscreenCameraActor = CameraActor::New();
115   mOffscreenCameraActor.SetParentOrigin( ParentOrigin::CENTER );
116   mOffscreenCameraActor.SetOrthographicProjection( offscreenSize );
117   mOffscreenRootActor.Add( mOffscreenCameraActor ); // camera to shoot the offscreen text
118
119   // Creates a new render task.
120   mRenderTask = Stage::GetCurrent().GetRenderTaskList().CreateTask();
121   mRenderTask.SetSourceActor( mOffscreenRootActor );
122   mRenderTask.SetClearColor( Color::TRANSPARENT );
123   mRenderTask.SetClearEnabled( true );
124   mRenderTask.SetExclusive( true );
125   mRenderTask.SetCameraActor( mOffscreenCameraActor );
126
127   // Creates a frame buffer for offscreen rendering
128   FrameBufferImage frameBufferImage = FrameBufferImage::New( offscreenSize.width,
129                                                              offscreenSize.height,
130                                                              Pixel::RGBA8888 );
131   mImageActor.SetImage( frameBufferImage );
132   mRenderTask.SetTargetFrameBuffer( frameBufferImage );
133
134   // Stores current size to avoid create new Dali resources if text changes.
135   mCurrentOffscreenSize = offscreenSize;
136 }
137
138 Clipper::Clipper()
139 {
140 }
141
142 Clipper::~Clipper()
143 {
144   if( Stage::IsInstalled() )
145   {
146     UnparentAndReset( mOffscreenRootActor );
147     UnparentAndReset( mImageActor );
148
149     Stage::GetCurrent().GetRenderTaskList().RemoveTask( mRenderTask );
150   }
151 }
152
153 } // namespace Text
154
155 } // namespace Toolkit
156
157 } // namespace Dali