X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2FPUI.c;h=463956e0bcd32f6c145e825f12209996399e0c44;hb=e7fc934961ae6fd073b3d9c27a7ceb20290f34ef;hp=cf0d35b09a6794276bddabc4301ee60172b94643;hpb=327629f902495237a867ff2d192815c868e753d8;p=platform%2Fcore%2Fuifw%2Flibpui.git diff --git a/src/PUI.c b/src/PUI.c index cf0d35b..463956e 100644 --- a/src/PUI.c +++ b/src/PUI.c @@ -36,6 +36,10 @@ #define PUI_MODULE_DIR "/usr/lib" #endif +extern EAPI void ecore_wl2_window_buffer_attach(Ecore_Wl2_Window *win, void *buffer, int x, int y, Eina_Bool implicit); +extern EAPI void ecore_wl2_window_damage(Ecore_Wl2_Window *window, Eina_Rectangle *rects, unsigned int count); + +int _pui_log_level; static int _pui_init_count = 0; static pui_module_data *pui_module = NULL; @@ -48,6 +52,57 @@ int PUI_EVENT_ANI_READY_TO_RESUME = 0; static int KEY_WL_BUFFER = 0xabcdbeaf; static int KEY_CLIENT = 0xdcbabeaf; +static const char * +_pui_magic_string_get(PUI_Magic m) +{ + switch (m) + { + case PUI_MAGIC_NONE: + return "None (Freed Object)"; + break; + + case PUI_MAGIC_PUI_M: + return "PUI MODULE (PUI_M)"; + break; + + case PUI_MAGIC_PUI_H: + return "PUI HANDLE (PUI_H)"; + break; + + case PUI_MAGIC_ANI_H: + return "PUI ANI HANDLE (ANI_H)"; + break; + + case PUI_MAGIC_ANI_T: + return "PUI ANI RUNTIME HANDLE (ANI_T)"; + break; + + default: + return ""; + } +} + +PUI_API void +_pui_magic_fail(const void *p, PUI_Magic m, PUI_Magic req_m, const char *fname) +{ + pui_err(" ### PUI ERROR : PUI Magic Check Failed !!! in %s().\n", fname); + + if (!p) + pui_err(" Given handle/pointer is NULL !\n"); + else if (m == PUI_MAGIC_NONE) + pui_err(" Given handle/pointer has been freed !\n"); + else if (m != req_m) + pui_err(" Given handle/pointer is wrong type\n" + " Expected: %08x - %s\n" + " Supplied: %08x - %s", + (unsigned int)req_m, _pui_magic_string_get(req_m), + (unsigned int)m, _pui_magic_string_get(m)); + + /* abort here as a failure of magic can be caused by a memory corruption */ + pui_err("### PUI MAGIC FAILED ! Abort ! ###\n"); + abort(); +} + pui_error_string pui_error_to_string(pui_error e) { @@ -103,26 +158,45 @@ static const struct wl_buffer_listener buffer_listener = { }; pui_ani_control_buffer * +pui_display_get_last_buffer(pui_h handle) +{ + if (!PUI_MAGIC_CHECK(handle, PUI_MAGIC_PUI_H)) + { + PUI_MAGIC_FAIL(handle, PUI_MAGIC_PUI_H, __FUNCTION__); + return NULL; + } + + if (handle->last_buffer.size <= 0) + { + pui_err("Failed to get last buffer\n"); + return NULL; + } + + return &handle->last_buffer; +} + + +pui_ani_control_buffer * pui_display_get_buffer(pui_h handle) { tbm_surface_error_e ret; tbm_surface_h surface; pui_ani_control_buffer *buffer = NULL; - if (!handle) + if (!PUI_MAGIC_CHECK(handle, PUI_MAGIC_PUI_H)) { - pui_err("Error : PUI_INT_ERROR_INVALID_HANDLE\n"); + PUI_MAGIC_FAIL(handle, PUI_MAGIC_PUI_H, __FUNCTION__); return NULL; } if (handle->current_surface) { - pui_warn("Current_surface is not used !\n"); + pui_debug("[GET BUFFER] Current_surface is not used !\n"); } if (!tbm_surface_queue_can_dequeue(handle->tbm_queue, 0)) { - pui_err("Failed to dequeue a tbm_surface !\n"); + pui_err("[GET BUFFER] Failed to dequeue a tbm_surface !\n"); return NULL; } @@ -130,7 +204,7 @@ pui_display_get_buffer(pui_h handle) if (ret != TBM_SURFACE_ERROR_NONE) { - pui_err("[UPDATE] dequeue err:%d\n", ret); + pui_err("[GET BUFFER] Dequeue err:%d\n", ret); return NULL; } @@ -145,9 +219,9 @@ pui_display_get_buffer(pui_h handle) pui_error pui_display_set_buffer(pui_h handle, pui_ani_control_buffer *buffer) { - if (!handle) + if (!PUI_MAGIC_CHECK(handle, PUI_MAGIC_PUI_H)) { - pui_err("Error : PUI_ERROR_INVALID_HANDLE\n"); + PUI_MAGIC_FAIL(handle, PUI_MAGIC_PUI_H, __FUNCTION__); return PUI_ERROR_INVALID_HANDLE; } @@ -172,9 +246,9 @@ pui_display_update(pui_h handle) tbm_surface_error_e ret; struct wl_buffer *wl_buffer = NULL; - if (!handle) + if (!PUI_MAGIC_CHECK(handle, PUI_MAGIC_PUI_H)) { - pui_err("Error : PUI_ERROR_INVALID_HANDLE\n"); + PUI_MAGIC_FAIL(handle, PUI_MAGIC_PUI_H, __FUNCTION__); return PUI_ERROR_INVALID_HANDLE; } @@ -183,7 +257,7 @@ pui_display_update(pui_h handle) if (!handle->is_buffer_set) { - pui_err("Buffer is not set !\n"); + pui_err("[UPDATE] Buffer is not set !\n"); return PUI_ERROR_INVALID_BUFFER; } @@ -239,6 +313,9 @@ pui_display_update(pui_h handle) handle->is_buffer_set = 0; + if (handle->last_buffer.size > 0) + memcpy(handle->last_buffer.ptr, handle->current_sinfo.planes[0].ptr, handle->last_buffer.size); + return PUI_ERROR_NONE; } @@ -247,9 +324,9 @@ pui_display_manual_render_set(pui_h handle, pui_bool set) { pui_ani_h ani_h = NULL; - if (!handle) + if (!PUI_MAGIC_CHECK(pui_module, PUI_MAGIC_PUI_M)) { - pui_err("Error : PUI_ERROR_INVALID_HANDLE\n"); + PUI_MAGIC_FAIL(pui_module, PUI_MAGIC_PUI_M, __FUNCTION__); return PUI_ERROR_INVALID_HANDLE; } @@ -273,9 +350,9 @@ pui_display_manual_render_set(pui_h handle, pui_bool set) pui_bool pui_display_manual_render_get(pui_h handle) { - if (!handle) + if (!PUI_MAGIC_CHECK(handle, PUI_MAGIC_PUI_H)) { - pui_err("Error : PUI_ERROR_INVALID_HANDLE\n"); + PUI_MAGIC_FAIL(handle, PUI_MAGIC_PUI_H, __FUNCTION__); return 0; } @@ -290,8 +367,15 @@ pui_display_geometry_get(pui_h handle, int *width, int *height) *width = 0; *height = 0; + (void) handle; + + if (!PUI_MAGIC_CHECK(pui_module, PUI_MAGIC_PUI_M)) + { + PUI_MAGIC_FAIL(pui_module, PUI_MAGIC_PUI_M, __FUNCTION__); + return 0; + } - if (!pui_module || !pui_module->backend_module_data) { + if (!pui_module->backend_module_data) { pui_err("pui module data is not loaded\n"); return 0; } @@ -311,6 +395,8 @@ pui_create(Ecore_Wl2_Window *win) pui_h handle = NULL; Ecore_Wl2_Display *ewd = ecore_wl2_window_display_get(win); struct wayland_tbm_client *wl_tbm_client = NULL; + int w = 0, h = 0; + pui_bool res; if (!win || !ewd) { @@ -318,6 +404,12 @@ pui_create(Ecore_Wl2_Window *win) return NULL; } + if (!PUI_MAGIC_CHECK(pui_module, PUI_MAGIC_PUI_M)) + { + PUI_MAGIC_FAIL(pui_module, PUI_MAGIC_PUI_M, __FUNCTION__); + return NULL; + } + wl_tbm_client = wayland_tbm_client_init(ecore_wl2_display_get(ewd)); if (!wl_tbm_client) @@ -340,9 +432,22 @@ pui_create(Ecore_Wl2_Window *win) handle->manual_render = 0; handle->backend_module_data = pui_module->backend_module_data; + res = pui_display_geometry_get(handle, &w, &h); + if (!res) + { + /* NOTE: This is a default value for tbm_queue. + * This value is set before this patch. + */ + w = h = 100; + } + + handle->last_buffer.ptr = (unsigned char *)calloc(w * h * 4, sizeof(unsigned char)); + if (handle->last_buffer.ptr) + handle->last_buffer.size = sizeof(unsigned char) * w * h * 4; + handle->tbm_queue = wayland_tbm_client_create_surface_queue(handle->wl_tbm_client, ecore_wl2_window_surface_get(handle->win), - 3, 100, 100, TBM_FORMAT_ABGR8888); + 3, w, h, TBM_FORMAT_ABGR8888); if (!handle->tbm_queue) { @@ -350,6 +455,7 @@ pui_create(Ecore_Wl2_Window *win) goto err; } + PUI_MAGIC_SET(handle, PUI_MAGIC_PUI_H); return handle; err: @@ -363,13 +469,15 @@ pui_destroy(pui_h handle) { pui_ani_h ani_h = NULL; - if (!handle) + if (!PUI_MAGIC_CHECK(handle, PUI_MAGIC_PUI_H)) + { + PUI_MAGIC_FAIL(handle, PUI_MAGIC_PUI_H, __FUNCTION__); return; + } EINA_LIST_FREE(handle->ani_handles, ani_h) { pui_ani_destroy(ani_h); - free(ani_h); } if (handle->tbm_queue) @@ -383,6 +491,14 @@ pui_destroy(pui_h handle) handle->wl_tbm_client = NULL; } + if (handle->last_buffer.ptr) + { + free(handle->last_buffer.ptr); + handle->last_buffer.ptr = NULL; + handle->last_buffer.size = 0; + } + + PUI_MAGIC_SET(handle, PUI_MAGIC_NONE); free(handle); } @@ -401,6 +517,11 @@ _pui_load_backend_module(void) pui_backend_module_data *backend_module_data = NULL; + if (!PUI_MAGIC_CHECK(pui_module, PUI_MAGIC_PUI_M)) + { + PUI_MAGIC_FAIL(pui_module, PUI_MAGIC_PUI_M, __FUNCTION__); + return; + } module_info = dlopen(DEFAULT_LIB, RTLD_LAZY); @@ -454,7 +575,7 @@ _pui_load_backend_module(void) return; err: - if (backend_module_info && backend_module_info->backend_init) + if (backend_module_info && backend_module_info->backend_deinit) backend_module_info->backend_deinit(backend_module_data); if (module_info) @@ -466,9 +587,9 @@ err: static void _pui_unload_backend_module(void) { - if (!pui_module) + if (!PUI_MAGIC_CHECK(pui_module, PUI_MAGIC_PUI_M)) { - pui_err("Invalid pui module !\n"); + PUI_MAGIC_FAIL(pui_module, PUI_MAGIC_PUI_M, __FUNCTION__); return; } @@ -488,7 +609,13 @@ _pui_load_backend_collect_animations(void) { pui_int_error ret; - if (!pui_module || !pui_module->backend_module_data) { + if (!PUI_MAGIC_CHECK(pui_module, PUI_MAGIC_PUI_M)) + { + PUI_MAGIC_FAIL(pui_module, PUI_MAGIC_PUI_M, __FUNCTION__); + return; + } + + if (!pui_module->backend_module_data) { pui_err("pui module data is not loaded\n"); return; } @@ -548,9 +675,20 @@ _pui_event_shutdown(void) int pui_init(void) { + const char *cp = NULL; + if (++_pui_init_count != 1) return _pui_init_count; + _pui_log_level = PUI_LOG_LEVEL_DEBUG; + + cp = getenv("LIBPUI_LOG_LEVEL"); + + if (cp) + { + _pui_log_level = atoi(cp); + } + if (pui_module) { pui_err("Invalid calling of pui_init() !\n"); @@ -565,6 +703,8 @@ pui_init(void) goto error; } + PUI_MAGIC_SET(pui_module, PUI_MAGIC_PUI_M); + ecore_wl2_init(); _pui_event_init(); @@ -587,9 +727,9 @@ pui_shutdown(void) return 0; } - if (!pui_module) + if (!PUI_MAGIC_CHECK(pui_module, PUI_MAGIC_PUI_M)) { - pui_err("Invalid pui module data !\n"); + PUI_MAGIC_FAIL(pui_module, PUI_MAGIC_PUI_M, __FUNCTION__); return _pui_init_count; } @@ -602,6 +742,7 @@ pui_shutdown(void) ecore_wl2_shutdown(); + PUI_MAGIC_SET(pui_module, PUI_MAGIC_NONE); free(pui_module); return _pui_init_count;