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>
22 #include <dali/public-api/common/stage.h>
23 #include <dali/public-api/render-tasks/render-task-list.h>
24 #include <dali/devel-api/rendering/renderer.h>
29 // Currently on desktop machines 2k x 2k is the maximum frame buffer size, on target is 4k x 4k.
30 const float MAX_OFFSCREEN_RENDERING_SIZE = 2048.f;
44 ClipperPtr Clipper::New( const Vector2& size )
46 ClipperPtr clipper( new Clipper() );
49 clipper->Initialize( size );
54 Actor Clipper::GetRootActor() const
56 return mOffscreenRootActor;
59 Actor Clipper::GetImageActor() const
64 void Clipper::Refresh( const Vector2& size )
66 const Size offscreenSize( std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.width ),
67 std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.height ) );
69 const bool sizeChanged = offscreenSize != mCurrentOffscreenSize;
73 // Reconfigure camera for current size.
74 mOffscreenCameraActor.SetOrthographicProjection( offscreenSize );
76 // Recreate frame buffer for offscreen rendering when the size changes.
77 FrameBufferImage frameBufferImage = FrameBufferImage::New( offscreenSize.width,
81 mOffscreenRootActor.SetSize( size );
83 mImageActor.SetSize( offscreenSize );
84 mImageActor.SetImage( frameBufferImage );
85 mRenderTask.SetTargetFrameBuffer( frameBufferImage );
87 // Stores current sizPe to avoid create new Dali resources if text changes.
88 mCurrentOffscreenSize = offscreenSize;
91 mRenderTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
94 void Clipper::Initialize( const Vector2& size )
96 const Size offscreenSize( std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.width ),
97 std::min( MAX_OFFSCREEN_RENDERING_SIZE, size.height ) );
99 // Create a root actor and an image actor for offscreen rendering.
100 mOffscreenRootActor = Layer::New();
101 mOffscreenRootActor.SetColorMode( USE_OWN_COLOR );
102 mOffscreenRootActor.SetInheritPosition( false );
103 mOffscreenRootActor.SetInheritScale( false );
104 mOffscreenRootActor.SetDepthTestDisabled( true );
105 mOffscreenRootActor.SetSize( offscreenSize );
107 mImageActor = ImageView::New();
108 mImageActor.SetParentOrigin( ParentOrigin::CENTER );
109 mImageActor.SetScale( Vector3( 1.0f, -1.0f, 1.0f ) );
110 mImageActor.SetSize( offscreenSize );
112 // Creates a new camera actor.
113 mOffscreenCameraActor = CameraActor::New();
114 mOffscreenCameraActor.SetParentOrigin( ParentOrigin::CENTER );
115 mOffscreenCameraActor.SetOrthographicProjection( offscreenSize );
116 mOffscreenRootActor.Add( mOffscreenCameraActor ); // camera to shoot the offscreen text
118 // Creates a new render task.
119 mRenderTask = Stage::GetCurrent().GetRenderTaskList().CreateTask();
120 mRenderTask.SetSourceActor( mOffscreenRootActor );
121 mRenderTask.SetClearColor( Color::TRANSPARENT );
122 mRenderTask.SetClearEnabled( true );
123 mRenderTask.SetExclusive( true );
124 mRenderTask.SetCameraActor( mOffscreenCameraActor );
126 // Creates a frame buffer for offscreen rendering
127 FrameBufferImage frameBufferImage = FrameBufferImage::New( offscreenSize.width,
128 offscreenSize.height,
130 mImageActor.SetImage( frameBufferImage );
131 mRenderTask.SetTargetFrameBuffer( frameBufferImage );
132 mImageActor.OnStageSignal().Connect(this, &Clipper::OnStageConnect);
134 // Stores current size to avoid create new Dali resources if text changes.
135 mCurrentOffscreenSize = offscreenSize;
138 void Clipper::OnStageConnect( Dali::Actor actor )
140 Renderer renderer = mImageActor.GetRendererAt(0);
141 renderer.SetProperty( Renderer::Property::BLEND_FACTOR_SRC_RGB, BlendFactor::ONE );
142 renderer.SetProperty( Renderer::Property::BLEND_FACTOR_DEST_RGB, BlendFactor::ONE_MINUS_SRC_ALPHA );
143 renderer.SetProperty( Renderer::Property::BLEND_FACTOR_SRC_ALPHA, BlendFactor::ONE );
144 renderer.SetProperty( Renderer::Property::BLEND_FACTOR_DEST_ALPHA, BlendFactor::ONE );
153 if( Stage::IsInstalled() )
155 UnparentAndReset( mOffscreenRootActor );
156 UnparentAndReset( mImageActor );
158 Stage::GetCurrent().GetRenderTaskList().RemoveTask( mRenderTask );
164 } // namespace Toolkit