2 * Copyright (c) 2015 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 <dali-toolkit/internal/text/clipping/text-clipper.h>
23 #include <dali/public-api/common/stage.h>
24 #include <dali/public-api/render-tasks/render-task-list.h>
25 #include <dali/integration-api/debug.h>
30 // Currently on desktop machines 2k x 2k is the maximum frame buffer size, on target is 4k x 4k.
31 const float MAX_OFFSCREEN_RENDERING_SIZE = 2048.f;
45 ClipperPtr Clipper::New( const Vector2& size )
47 ClipperPtr clipper( new Clipper() );
50 clipper->Initialize( size );
55 Actor Clipper::GetRootActor() const
57 return mOffscreenRootActor;
60 ImageActor Clipper::GetImageActor() const
65 void Clipper::Refresh( const Vector2& size )
67 const Size offscreenSize( std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.width ),
68 std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.height ) );
70 const bool sizeChanged = offscreenSize != mCurrentOffscreenSize;
74 // Reconfigure camera for current size.
75 mOffscreenCameraActor.SetOrthographicProjection( offscreenSize );
77 // Recreate frame buffer for offscreen rendering when the size changes.
78 FrameBufferImage frameBufferImage = FrameBufferImage::New( offscreenSize.width,
81 mImageActor.SetImage( frameBufferImage );
82 mRenderTask.SetTargetFrameBuffer( frameBufferImage );
84 // Stores current size to avoid create new Dali resources if text changes.
85 mCurrentOffscreenSize = offscreenSize;
88 mRenderTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
91 void Clipper::Initialize( const Vector2& size )
93 const Size offscreenSize( std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.width ),
94 std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.height ) );
96 // Create a root actor and an image actor for offscreen rendering.
97 mOffscreenRootActor = Layer::New();
98 mOffscreenRootActor.SetColorMode( USE_OWN_COLOR );
99 mOffscreenRootActor.SetPositionInheritanceMode( DONT_INHERIT_POSITION );
100 mOffscreenRootActor.SetInheritRotation( false );
101 mOffscreenRootActor.SetInheritScale( false );
102 mOffscreenRootActor.SetDepthTestDisabled( true );
103 mOffscreenRootActor.SetSize( offscreenSize );
104 mOffscreenRootActor.SetPosition( 0.0f, 0.0f, 0.0f );
106 mImageActor = ImageActor::New();
107 mImageActor.SetAnchorPoint( ParentOrigin::CENTER );
108 mImageActor.SetParentOrigin( ParentOrigin::CENTER );
109 mImageActor.SetBlendFunc( BlendingFactor::ONE, BlendingFactor::ONE_MINUS_SRC_ALPHA,
110 BlendingFactor::ONE, BlendingFactor::ONE );
111 mImageActor.SetScale( Vector3( 1.0f, -1.0f, 1.0f ) );
112 mImageActor.SetSize( offscreenSize );
114 // Creates a new camera actor.
115 mOffscreenCameraActor = CameraActor::New();
116 mOffscreenCameraActor.SetParentOrigin( ParentOrigin::CENTER );
117 mOffscreenCameraActor.SetAnchorPoint( AnchorPoint::CENTER );
118 mOffscreenCameraActor.SetRotation(Degree(180.f), Vector3::YAXIS);
119 mOffscreenCameraActor.SetType( Dali::Camera::FREE_LOOK ); // Inherits position from the offscreen root actor.
120 mOffscreenCameraActor.SetOrthographicProjection( offscreenSize );
121 mOffscreenRootActor.Add( mOffscreenCameraActor ); // camera to shoot the offscreen text
123 // Creates a new render task.
124 mRenderTask = Stage::GetCurrent().GetRenderTaskList().CreateTask();
125 mRenderTask.SetSourceActor( mOffscreenRootActor );
126 mRenderTask.SetInputEnabled( false );
127 mRenderTask.SetClearColor( Color::TRANSPARENT );
128 mRenderTask.SetClearEnabled( true );
129 mRenderTask.SetExclusive( true );
130 mRenderTask.SetCameraActor( mOffscreenCameraActor );
132 // Creates a frame buffer for offscreen rendering
133 FrameBufferImage frameBufferImage = FrameBufferImage::New( offscreenSize.width,
134 offscreenSize.height,
136 mImageActor.SetImage( frameBufferImage );
137 mRenderTask.SetTargetFrameBuffer( frameBufferImage );
139 // Stores current size to avoid create new Dali resources if text changes.
140 mCurrentOffscreenSize = offscreenSize;
149 if( Stage::IsInstalled() )
151 UnparentAndReset( mOffscreenRootActor );
152 UnparentAndReset( mImageActor );
154 Stage::GetCurrent().GetRenderTaskList().RemoveTask( mRenderTask );
160 } // namespace Toolkit