2 * Copyright (c) 2014 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/internal/event/actor-attachments/image-attachment-impl.h>
22 #include <dali/internal/update/node-attachments/scene-graph-image-attachment.h>
23 #include <dali/internal/event/common/stage-impl.h>
24 #include <dali/public-api/common/dali-common.h>
30 static Dali::Internal::SceneGraph::ImageAttachment::PixelArea EMPTY_PIXEL_AREA(0,0,0,0);
39 ImageAttachmentPtr ImageAttachment::New( const SceneGraph::Node& parentNode, Image* image )
41 StagePtr stage = Stage::GetCurrent();
43 ImageAttachmentPtr attachment( new ImageAttachment( *stage, image ) );
45 // Transfer object ownership of scene-object to message
46 SceneGraph::ImageAttachment* sceneObject = CreateSceneObject( image );
47 AttachToNodeMessage( stage->GetUpdateManager(), parentNode, sceneObject );
49 // Keep raw pointer for message passing
50 attachment->mSceneObject = sceneObject;
55 ImageAttachment::ImageAttachment(Stage& stage, Image* image)
56 : RenderableAttachment(stage),
58 mPixelArea(EMPTY_PIXEL_AREA),
59 mStyle(Dali::ImageActor::STYLE_QUAD),
60 mBorder(0.45,0.45,0.1,0.1),
61 mIsPixelAreaSet(false),
62 mBorderInPixels(false)
64 mImageConnectable.Set( image, false );
67 ImageAttachment::~ImageAttachment()
71 void ImageAttachment::SetImage(Image* image)
73 bool onStage = OnStage();
74 // keep a reference to Image object
75 mImageConnectable.Set( image, onStage );
77 // Wait until the scene-graph attachment is connected, before providing resource ID
80 unsigned int resourceId = (NULL != image) ? image->GetResourceId() : 0u;
82 // sceneObject is being used in a separate thread; queue a message to set
83 SetTextureIdMessage( mStage->GetUpdateInterface(), *mSceneObject, resourceId );
87 Dali::Image ImageAttachment::GetImage()
90 Image* current = mImageConnectable.Get();
93 image = Dali::Image( current );
97 // returning uninitialized image (empty image)
102 void ImageAttachment::SetPixelArea(const PixelArea& pixelArea)
104 // check to see if pixel area is actually different, using rect::operator==
105 if( pixelArea != mPixelArea )
107 // Cache for public getters
108 mPixelArea = pixelArea;
109 mIsPixelAreaSet = true;
111 // sceneObject is being used in a separate thread; queue a message to set
112 SetPixelAreaMessage( mStage->GetUpdateInterface(), *mSceneObject, mPixelArea );
116 void ImageAttachment::ClearPixelArea()
118 // Cache for public getters
119 mIsPixelAreaSet = false;
121 // sceneObject is being used in a separate thread; queue a message to set
122 ClearPixelAreaMessage( mStage->GetUpdateInterface(), *mSceneObject );
125 void ImageAttachment::SetStyle(Style style)
127 // Cache for public getters
130 // sceneObject is being used in a separate thread; queue a message to set
131 SetStyleMessage( mStage->GetUpdateInterface(), *mSceneObject, style );
134 void ImageAttachment::SetNinePatchBorder(const Vector4& border, bool inPixels)
136 // Cache for public getters
138 mBorderInPixels = inPixels;
140 // sceneObject is being used in a separate thread; queue a message to set
141 SetNinePatchBorderMessage( mStage->GetUpdateInterface(), *mSceneObject, border, inPixels );
144 SceneGraph::ImageAttachment* ImageAttachment::CreateSceneObject( const Image* current )
148 return SceneGraph::ImageAttachment::New( current->GetResourceId() );
151 return SceneGraph::ImageAttachment::New( 0u );
154 void ImageAttachment::OnStageConnection2()
156 mImageConnectable.OnStageConnect();
158 // Provide resource ID when scene-graph attachment is connected
159 Image* image = mImageConnectable.Get();
160 unsigned int resourceId = (NULL != image) ? image->GetResourceId() : 0u;
161 if ( 0u != resourceId )
163 SetTextureIdMessage( mStage->GetUpdateInterface(), *mSceneObject, resourceId );
167 void ImageAttachment::OnStageDisconnection2()
169 // Remove resource ID when scene-graph attachment is disconnected
170 SetTextureIdMessage( mStage->GetUpdateInterface(), *mSceneObject, 0u );
172 mImageConnectable.OnStageDisconnect();
175 const SceneGraph::RenderableAttachment& ImageAttachment::GetSceneObject() const
177 DALI_ASSERT_DEBUG( mSceneObject != NULL );
178 return *mSceneObject;
181 } // namespace Internal