Fixed Image & Model problems with TypeRegistry
[platform/core/uifw/dali-core.git] / dali / internal / event / images / frame-buffer-image-impl.cpp
1 //
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 // CLASS HEADER
18 #include <dali/internal/event/images/frame-buffer-image-impl.h>
19
20 // INTERNAL INCLUDES
21 #include <dali/public-api/object/type-registry.h>
22 #include <dali/internal/event/common/thread-local-storage.h>
23 #include <dali/internal/event/resources/resource-client.h>
24
25 namespace Dali
26 {
27
28 namespace Internal
29 {
30
31 namespace
32 {
33 TypeRegistration mType( typeid( Dali::FrameBufferImage ), typeid( Dali::Image ), NULL );
34 } // unnamed namespace
35
36 FrameBufferImage::~FrameBufferImage()
37 {
38 }
39
40 FrameBufferImagePtr  FrameBufferImage::New(unsigned int width, unsigned int height, Pixel::Format pixelFormat, ReleasePolicy releasePolicy)
41 {
42   FrameBufferImagePtr image = new FrameBufferImage(width, height, pixelFormat, releasePolicy);
43   image->Initialize();
44   return image;
45 }
46
47 FrameBufferImagePtr  FrameBufferImage::New( NativeImage& nativeImage )
48 {
49   FrameBufferImagePtr image = new FrameBufferImage(nativeImage);
50   image->Initialize();
51   return image;
52 }
53
54 FrameBufferImagePtr  FrameBufferImage::New( NativeImage& nativeImage, ReleasePolicy releasePolicy )
55 {
56   FrameBufferImagePtr image = new FrameBufferImage(nativeImage, releasePolicy);
57   image->Initialize();
58   return image;
59 }
60
61 FrameBufferImage::FrameBufferImage(unsigned int width, unsigned int height, Pixel::Format pixelFormat, ReleasePolicy releasePolicy)
62 : Image(Dali::Image::Immediate, releasePolicy),
63   mPixelFormat(pixelFormat)
64 {
65   mWidth  = width;
66   mHeight = height;
67 }
68
69
70 FrameBufferImage::FrameBufferImage( NativeImage& nativeImage )
71 : Image(Dali::Image::Immediate),
72   mNativeImage(&nativeImage),
73   mPixelFormat(nativeImage.GetPixelFormat())
74 {
75   mWidth = nativeImage.GetWidth();
76   mHeight = nativeImage.GetHeight();
77 }
78
79
80 FrameBufferImage::FrameBufferImage( NativeImage& nativeImage, ReleasePolicy releasePolicy )
81 : Image(Dali::Image::Immediate, releasePolicy),
82   mNativeImage(&nativeImage),
83   mPixelFormat(nativeImage.GetPixelFormat())
84 {
85   mWidth = nativeImage.GetWidth();
86   mHeight = nativeImage.GetHeight();
87 }
88
89 void FrameBufferImage::Connect()
90 {
91   ++mConnectionCount;
92
93   if (mConnectionCount == 1)
94   {
95     // ticket was thrown away when related actors went offstage
96     if (!mTicket)
97     {
98       ResourceClient& resourceClient = ThreadLocalStorage::Get().GetResourceClient();
99       if (mNativeImage)
100       {
101         mTicket = resourceClient.AddFrameBufferImage(*mNativeImage);
102         mTicket->AddObserver(*this);
103       }
104       else
105       {
106         mTicket = resourceClient.AddFrameBufferImage(mWidth, mHeight, mPixelFormat);
107         mTicket->AddObserver(*this);
108       }
109     }
110   }
111 }
112
113 void FrameBufferImage::Disconnect()
114 {
115   if(!mTicket)
116   {
117     return;
118   }
119
120   DALI_ASSERT_DEBUG(mConnectionCount > 0);
121   --mConnectionCount;
122   if (mConnectionCount == 0 && mReleasePolicy == Dali::Image::Unused)
123   {
124     // release image memory when it's not visible anymore (decrease ref. count of texture)
125     mTicket->RemoveObserver(*this);
126     mTicket.Reset();
127   }
128 }
129
130 } // namespace Internal
131
132 } // namespace Dali