Merge "Fixed SizeMode not updating size on renderable in some cases" into tizen
[platform/core/uifw/dali-core.git] / dali / internal / event / images / image-impl.cpp
1 /*
2  * Copyright (c) 2014 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/internal/event/images/image-impl.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/common/dali-common.h>
23 #include <dali/public-api/object/type-registry.h>
24
25 #include <dali/integration-api/debug.h>
26 #include <dali/internal/event/resources/resource-ticket.h>
27 #include <dali/internal/event/common/thread-local-storage.h>
28 #include <dali/internal/event/resources/resource-client.h>
29 #include <dali/internal/event/common/stage-impl.h>
30
31 using namespace Dali::Integration;
32
33 namespace Dali
34 {
35
36 namespace Internal
37 {
38
39 namespace
40 {
41
42 // Signals
43
44 const char* const SIGNAL_IMAGE_UPLOADED = "uploaded";
45
46 TypeRegistration mType( typeid( Dali::Image ), typeid( Dali::BaseHandle ), NULL );
47
48 Dali::SignalConnectorType signalConnector1( mType, SIGNAL_IMAGE_UPLOADED, &Image::DoConnectSignal );
49
50 }
51
52 ImagePtr Image::New( NativeImage& nativeImg )
53 {
54   ImagePtr image = new Image;
55   image->Initialize();
56
57   ResourceClient &resourceClient = ThreadLocalStorage::Get().GetResourceClient();
58
59   image->mWidth  = nativeImg.GetWidth();
60   image->mHeight = nativeImg.GetHeight();
61
62   const ResourceTicketPtr& ticket = resourceClient.AddNativeImage( nativeImg );
63   DALI_ASSERT_DEBUG( dynamic_cast<ImageTicket*>( ticket.Get() ) && "Resource ticket not ImageTicket subclass for image resource.\n" );
64   image->mTicket = static_cast<ImageTicket*>(ticket.Get());
65   image->mTicket->AddObserver( *image );
66
67   return image;
68 }
69
70 bool Image::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
71 {
72   bool connected( true );
73   DALI_ASSERT_DEBUG( dynamic_cast<Image*>( object ) && "Resource ticket not ImageTicket subclass for image resource.\n" );
74   Image* image = static_cast<Image*>(object);
75
76   if( 0 == strcmp( signalName.c_str(), SIGNAL_IMAGE_UPLOADED ) )
77   {
78     image->UploadedSignal().Connect( tracker, functor );
79   }
80   else
81   {
82     // signalName does not match any signal
83     connected = false;
84   }
85
86   return connected;
87 }
88
89 ResourceId Image::GetResourceId() const
90 {
91   ResourceId ret = mTicket ? mTicket->GetId() : 0;
92
93   return ret;
94 }
95
96 void Image::ResourceLoadingFailed(const ResourceTicket& ticket)
97 {
98   // do nothing
99 }
100
101 void Image::ResourceLoadingSucceeded(const ResourceTicket& ticket)
102 {
103   // do nothing
104 }
105
106 void Image::ResourceUploaded(const ResourceTicket& ticket)
107 {
108   mUploaded.Emit( Dali::Image( this ) );
109 }
110
111 void Image::ResourceSavingSucceeded( const ResourceTicket& ticket )
112 {
113   // do nothing
114 }
115
116 void Image::ResourceSavingFailed( const ResourceTicket& ticket )
117 {
118   // do nothing
119 }
120
121 unsigned int Image::GetWidth() const
122 {
123   return mWidth;
124 }
125
126 unsigned int Image::GetHeight() const
127 {
128   return mHeight;
129 }
130
131 Vector2 Image::GetNaturalSize() const
132 {
133   return Vector2( mWidth, mHeight );
134 }
135
136 Image::Image( ReleasePolicy releasePol )
137 : mWidth( 0 ),
138   mHeight( 0 ),
139   mConnectionCount( 0 ),
140   mReleasePolicy( releasePol )
141 {
142 }
143
144 Image::~Image()
145 {
146   if( mTicket )
147   {
148     mTicket->RemoveObserver( *this );
149     mTicket.Reset();
150   }
151
152   if( Stage::IsInstalled() )
153   {
154     UnregisterObject();
155   }
156 }
157
158 void Image::Initialize()
159 {
160   RegisterObject();
161 }
162
163 } // namespace Internal
164
165 } // namespace Dali