/* * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include using namespace Dali; using namespace Toolkit; namespace { const std::string JPG_FILENAME = DEMO_IMAGE_DIR "gallery-medium-4.jpg"; } // This example shows how to create and use a NativeImageSource as the target of the render task. // class NativeImageSourceController : public ConnectionTracker { public: NativeImageSourceController( Application& application ) : mApplication( application ) { // Connect to the Application's Init signal mApplication.InitSignal().Connect( this, &NativeImageSourceController::Create ); } ~NativeImageSourceController() { // Nothing to do here; } // The Init signal is received once (only) during the Application lifetime void Create( Application& application ) { // Get a handle to the stage Stage stage = Stage::GetCurrent(); stage.SetBackgroundColor( Color::WHITE ); stage.KeyEventSignal().Connect(this, &NativeImageSourceController::OnKeyEvent); mButtonRefreshAlways = PushButton::New(); mButtonRefreshAlways.SetTogglableButton( true ); mButtonRefreshAlways.SetSelected( true ); mButtonRefreshAlways.SetLabelText( "Refresh ALWAYS" ); mButtonRefreshAlways.SetParentOrigin( ParentOrigin::TOP_LEFT ); mButtonRefreshAlways.SetAnchorPoint( AnchorPoint::TOP_LEFT ); mButtonRefreshAlways.StateChangedSignal().Connect( this, &NativeImageSourceController::OnButtonSelected ); stage.Add( mButtonRefreshAlways ); mButtonRefreshOnce = PushButton::New(); mButtonRefreshOnce.SetLabelText( "Refresh ONCE" ); mButtonRefreshOnce.SetParentOrigin( ParentOrigin::TOP_RIGHT ); mButtonRefreshOnce.SetAnchorPoint( AnchorPoint::TOP_RIGHT ); mButtonRefreshOnce.ClickedSignal().Connect( this, &NativeImageSourceController::OnButtonSelected ); stage.Add( mButtonRefreshOnce); CreateScene(); } bool CreateScene() { Stage stage = Stage::GetCurrent(); Vector2 stageSize = stage.GetSize(); float buttonHeight = 100.f; mButtonRefreshAlways.SetSize( stageSize.x / 2.f, buttonHeight ); mButtonRefreshOnce.SetSize( stageSize.x / 2.f, buttonHeight ); Vector2 imageSize( stageSize.x, (stageSize.y-buttonHeight)/2.f ); // Create the native image source NativeImageSourcePtr nativeImageSourcePtr = NativeImageSource::New( imageSize.width, imageSize.height, NativeImageSource::COLOR_DEPTH_DEFAULT ); // Create a image view as source actor to be renderer to the native image source Actor sourceActor = ImageView::New(JPG_FILENAME); sourceActor.SetParentOrigin( ParentOrigin::CENTER); sourceActor.SetAnchorPoint( AnchorPoint::CENTER ); sourceActor.SetY( - (imageSize.height-buttonHeight)/2.f ); stage.Add( sourceActor ); Animation animation = Animation::New(2.f); Degree relativeRotationDegrees(90.0f); Radian relativeRotationRadians(relativeRotationDegrees); animation.AnimateTo( Property( sourceActor, Actor::Property::ORIENTATION ), Quaternion( relativeRotationRadians, Vector3::ZAXIS ), AlphaFunction::LINEAR, TimePeriod(0.f, 0.5f)); animation.AnimateBy( Property( sourceActor, Actor::Property::ORIENTATION ), Quaternion( relativeRotationRadians, Vector3::ZAXIS ), AlphaFunction::LINEAR, TimePeriod(0.5f, 0.5f)); animation.AnimateBy( Property( sourceActor, Actor::Property::ORIENTATION ), Quaternion( relativeRotationRadians, Vector3::ZAXIS ), AlphaFunction::LINEAR, TimePeriod(1.f, 0.5f)); animation.AnimateBy( Property( sourceActor, Actor::Property::ORIENTATION ), Quaternion( relativeRotationRadians, Vector3::ZAXIS ), AlphaFunction::LINEAR, TimePeriod(1.5f, 0.5f)); animation.SetLooping(true); animation.Play(); // create a offscreen renderer task to render content into the native image source FrameBufferImage targetBuffer = FrameBufferImage::New( *nativeImageSourcePtr ); CameraActor cameraActor = CameraActor::New(imageSize); cameraActor.SetParentOrigin(ParentOrigin::TOP_CENTER); cameraActor.SetParentOrigin( AnchorPoint::TOP_CENTER ); cameraActor.SetY( buttonHeight + imageSize.height/2.f ); stage.Add(cameraActor); RenderTaskList taskList = stage.GetRenderTaskList(); mOffscreenRenderTask = taskList.CreateTask(); mOffscreenRenderTask.SetSourceActor( sourceActor ); mOffscreenRenderTask.SetClearColor( Color::WHITE ); mOffscreenRenderTask.SetClearEnabled(true); mOffscreenRenderTask.SetCameraActor(cameraActor); mOffscreenRenderTask.GetCameraActor().SetInvertYAxis(true); mOffscreenRenderTask.SetTargetFrameBuffer( targetBuffer ); mOffscreenRenderTask.SetRefreshRate( RenderTask::REFRESH_ALWAYS ); // Display the native image on the screen NativeImage nativeImage = NativeImage::New( *nativeImageSourcePtr ); ImageView nativeImageView = ImageView::New( nativeImage ); nativeImageView.SetParentOrigin( ParentOrigin::BOTTOM_CENTER ); nativeImageView.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER ); stage.Add( nativeImageView ); TextLabel textLabel1 = TextLabel::New( "Resource Image" ); textLabel1.SetParentOrigin( ParentOrigin::TOP_CENTER ); textLabel1.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER ); nativeImageView.Add( textLabel1 ); TextLabel textLabel2 = TextLabel::New( "Native Image" ); textLabel2.SetParentOrigin( ParentOrigin::BOTTOM_CENTER ); textLabel2.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER ); nativeImageView.Add( textLabel2 ); return false; } bool OnButtonSelected( Toolkit::Button button ) { Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( button ); if( pushButton == mButtonRefreshAlways ) { if( mButtonRefreshAlways.IsSelected() ) { mOffscreenRenderTask.SetRefreshRate( RenderTask::REFRESH_ALWAYS ); } else { mOffscreenRenderTask.SetRefreshRate( RenderTask::REFRESH_ONCE ); } } else if( pushButton == mButtonRefreshOnce ) { if( mButtonRefreshAlways.IsSelected() ) { mButtonRefreshAlways.SetSelected( false ); } mOffscreenRenderTask.SetRefreshRate( RenderTask::REFRESH_ONCE ); } return true; } void OnKeyEvent(const KeyEvent& event) { if(event.state == KeyEvent::Down) { if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) ) { mApplication.Quit(); } } } private: Application& mApplication; RenderTask mOffscreenRenderTask; PushButton mButtonRefreshAlways; PushButton mButtonRefreshOnce; }; void RunTest( Application& application ) { NativeImageSourceController test( application ); application.MainLoop(); } // Entry point for Linux & Tizen applications // int main( int argc, char **argv ) { Application application = Application::New( &argc, &argv ); RunTest( application ); return 0; }