2 * Copyright (c) 2016 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 <pepper-dali/internal/object-impl.h>
22 #include <pepper-dali/internal/shell-client-impl.h>
23 #include <pepper-dali/internal/object-view-impl.h>
26 #include <dali/integration-api/debug.h>
27 #include <dali/public-api/images/buffer-image.h>
28 #include <dali/public-api/events/touch-event.h>
29 #include <dali/public-api/adaptor-framework/native-image-source.h>
30 #include <wayland-tbm-server.h>
44 #if defined(DEBUG_ENABLED)
45 Integration::Log::Filter* gPepperObjectLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_PEPPER_OBJECT" );
48 } // unnamed namespace
50 ObjectPtr Object::New( pepper_surface_t* surface, Pepper::Input input )
52 ObjectPtr impl = new Object();
54 // Second-phase init of the implementation
55 impl->Initialize( surface, input );
68 mSurfaceDestroyListener( NULL ),
69 mBufferDestroyListener( NULL ),
79 pepper_buffer_unreference( mBuffer );
80 pepper_event_listener_remove( mBufferDestroyListener );
83 if( mSurfaceDestroyListener )
85 pepper_event_listener_remove( mSurfaceDestroyListener );
89 void Object::Initialize( pepper_surface_t* surface, Pepper::Input input )
93 mPointer = input.GetPointer();
94 mKeyboard = input.GetKeyboard();
95 mTouch = input.GetTouch();
97 mSurfaceDestroyListener = pepper_object_add_event_listener( (pepper_object_t*)surface, PEPPER_EVENT_OBJECT_DESTROY, 0, Object::OnDestroySurface, this );
99 DALI_LOG_INFO( gPepperObjectLogging, Debug::Verbose, "Object::Initialize: success\n" );
102 bool Object::AttchBuffer( int* width, int* height )
104 pepper_buffer_t* buffer;
105 wl_resource* bufferResource;
106 wl_shm_buffer* shmBuffer = NULL;
107 tbm_surface_h tbmSurface = NULL;
108 int bufWidth, bufHeight;
110 buffer = pepper_surface_get_buffer( mSurface );
113 DALI_LOG_INFO( gPepperObjectLogging, Debug::General, "Object::AttchBuffer: pepper_surface_get_buffer is failed\n" );
119 pepper_buffer_unreference( mBuffer );
120 pepper_event_listener_remove( mBufferDestroyListener );
123 pepper_buffer_reference( buffer );
126 mBufferDestroyListener = pepper_object_add_event_listener( (pepper_object_t*)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0, Object::OnDestroyBuffer, this );
130 mObjectView = Pepper::ObjectView::New();
132 // Set surface and input modules
133 Pepper::GetImplementation( mObjectView ).SetSurface( mSurface );
134 Pepper::GetImplementation( mObjectView ).SetInput( mPointer, mKeyboard, mTouch );
136 Pepper::Object handle( this );
137 mObjectViewAddedSignal.Emit( handle, mObjectView );
140 bufferResource = pepper_buffer_get_resource( buffer );
142 shmBuffer = wl_shm_buffer_get( bufferResource );
145 bufWidth = wl_shm_buffer_get_width( shmBuffer );
146 bufHeight = wl_shm_buffer_get_height( shmBuffer );
148 if( shmBuffer != mShmBuffer )
150 // create a new image
151 PixelBuffer* pixelBuffer = static_cast< PixelBuffer* >( wl_shm_buffer_get_data( shmBuffer ) );
152 mBufferImage = BufferImage::New( pixelBuffer, bufWidth, bufHeight );
154 mObjectView.SetImage( mBufferImage );
156 mShmBuffer = shmBuffer;
161 tbmSurface = wayland_tbm_server_get_surface( NULL, bufferResource );
164 bufWidth = tbm_surface_get_width( tbmSurface );
165 bufHeight = tbm_surface_get_height( tbmSurface );
167 if ( tbmSurface != mTbmSurface )
169 // create a new image
170 NativeImageSourcePtr nativeImageSource = NativeImageSource::New( tbmSurface );
171 mNativeImage = NativeImage::New( *nativeImageSource );
173 mObjectView.SetImage( mNativeImage );
175 mTbmSurface = tbmSurface;
180 DALI_LOG_INFO( gPepperObjectLogging, Debug::General, "Object::AttchBuffer: Failed to get buffer\n" );
185 if( ( mWidth != bufWidth ) || ( mHeight != bufHeight ) )
191 mObjectView.SetSize( mWidth, mHeight );
204 DALI_LOG_INFO( gPepperObjectLogging, Debug::Verbose, "Object::AttchBuffer: this = %p, width = %d, height = %d", this, bufWidth, bufHeight );
209 Pepper::Object::ObjectSignalType& Object::ObjectViewAddedSignal()
211 return mObjectViewAddedSignal;
214 Pepper::Object::ObjectSignalType& Object::ObjectViewDeletedSignal()
216 return mObjectViewDeletedSignal;
219 void Object::OnDestroySurface( pepper_event_listener_t* listener, pepper_object_t* pepperObject, uint32_t id, void* info, void* data )
221 Object* object = static_cast< Object* >( data );
223 Pepper::Object handle( object );
224 object->mObjectViewDeletedSignal.Emit( handle, object->mObjectView );
226 object->mSurface = NULL;
227 object->mTbmSurface = NULL;
229 if( object->mSurfaceDestroyListener )
231 pepper_event_listener_remove( object->mSurfaceDestroyListener );
235 void Object::OnDestroyBuffer( pepper_event_listener_t* listener, pepper_object_t* pepperObject, uint32_t id, void* info, void* data )
237 Object* object = static_cast< Object* >( data );
239 if( object->mBuffer )
241 pepper_buffer_unreference( object->mBuffer );
242 pepper_event_listener_remove( object->mBufferDestroyListener );
246 if( object->mShmBuffer )
248 void* shmData = wl_shm_buffer_get_data( object->mShmBuffer );
250 object->mBufferImage = BufferImage::New( object->mWidth, object->mHeight );
252 PixelBuffer* buffer = object->mBufferImage.GetBuffer();
253 memcpy(buffer, shmData, object->mWidth * object->mHeight * 4);
255 object->mBufferImage.Update();
257 object->mObjectView.SetImage( object->mBufferImage );
259 else if( object->mTbmSurface )
265 } // namespace Internal
267 } // namespace Pepper