12 #include "Ecore_Buffer.h"
13 #include "ecore_buffer_private.h"
15 typedef struct _Ecore_Buffer_Module Ecore_Buffer_Module;
16 typedef struct _Ecore_Buffer_Cb_Data Ecore_Buffer_Cb_Data;
18 struct _Ecore_Buffer_Module
20 Ecore_Buffer_Backend *be;
21 Ecore_Buffer_Module_Data data;
28 Ecore_Buffer_Info info;
29 Ecore_Buffer_Data buffer_data;
30 Ecore_Buffer_Module *bm;
33 Eina_Inlist *free_callbacks;
36 struct _Ecore_Buffer_Cb_Data
43 static Eina_Hash *_backends;
44 static Eina_Array *_modules;
45 static int _ecore_buffer_init_count = 0;
46 static int _ecore_buffer_log_dom = -1;
51 #define ERR(...) EINA_LOG_DOM_ERR(_ecore_buffer_log_dom, __VA_ARGS__)
56 #define DBG(...) EINA_LOG_DOM_DBG(_ecore_buffer_log_dom, __VA_ARGS__)
58 #ifndef PACKAGE_LIB_DIR
59 #define PACKAGE_LIB_DIR ""
62 #define MODULE_ARCH ""
65 static Ecore_Buffer_Module *
66 _ecore_buffer_get_backend(const char *name)
68 Ecore_Buffer_Module *bm = NULL;
69 Eina_Iterator *backend_name_itr;
70 const char *backend_name = NULL;
74 if (backend_name == NULL)
76 backend_name = (const char*)getenv("ECORE_BUFFER_ENGINE");
79 backend_name_itr = eina_hash_iterator_data_new(_backends);
81 (eina_iterator_next(backend_name_itr, (void **)&bm)));
82 eina_iterator_free(backend_name_itr);
86 bm = eina_hash_find(_backends, backend_name);
88 if ((!bm) || (!bm->be) || (!bm->be->init))
92 bm->data = bm->be->init(NULL, NULL);
98 _ecore_buffer_backends_free(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, void *data, void *fdata EINA_UNUSED)
100 Ecore_Buffer_Module *bm = data;
106 bm->be->shutdown(bm->data);
112 ecore_buffer_register(Ecore_Buffer_Backend *be)
114 Ecore_Buffer_Module *bm;
116 EINA_SAFETY_ON_NULL_RETURN_VAL(be, 0);
118 bm = calloc(1, sizeof(Ecore_Buffer_Module));
125 return eina_hash_add(_backends, be->name, bm);
129 ecore_buffer_unregister(Ecore_Buffer_Backend *be)
131 Ecore_Buffer_Module *bm;
133 EINA_SAFETY_ON_NULL_RETURN(be);
135 bm = eina_hash_find(_backends, be->name);
139 eina_hash_del(_backends, be->name, bm);
144 ecore_buffer_init(void)
148 if (++_ecore_buffer_init_count > 1)
151 _ecore_buffer_log_dom = eina_log_domain_register("ecore_buffer", EINA_COLOR_BLUE);
152 if (_ecore_buffer_log_dom < 0)
154 EINA_LOG_ERR("Could not register log domain: ecore_buffer");
158 _backends = eina_hash_string_superfast_new(NULL);
160 /* dynamic backends */
161 _modules = eina_module_arch_list_get(NULL,
162 PACKAGE_LIB_DIR "/ecore_buffer/modules",
165 path = eina_module_symbol_path_get((const void *)ecore_buffer_init,
166 "/ecore_buffer/modules");
168 _modules = eina_module_arch_list_get(_modules, path, MODULE_ARCH);
172 /* fallback using module where in build directory */
174 (eina_array_count(_modules) == 0))
176 ERR("No available module in library directy: %s",
177 PACKAGE_LIB_DIR "/ecore_buffer/modules");
178 ERR("Fallback to load module where in build directory :%s",
179 PACKAGE_BUILD_DIR "/src/modules/");
180 _modules = eina_module_list_get(NULL,
181 PACKAGE_BUILD_DIR "/src/modules/",
182 EINA_TRUE, NULL, NULL);
186 (eina_array_count(_modules) == 0))
188 ERR("no ecore_buffer modules able to be loaded.");
189 eina_hash_free(_backends);
190 eina_log_domain_unregister(_ecore_buffer_log_dom);
191 _ecore_buffer_log_dom = -1;
195 // XXX: MODFIX: do not list ALL modules and load them ALL! this is
196 // wrong. load the module we need WHEN we need it (by name etc. etc.
198 eina_module_list_load(_modules);
203 _ecore_buffer_init_count--;
208 ecore_buffer_shutdown(void)
210 if (_ecore_buffer_init_count < 1)
212 WARN("Ecore_Buffer shut down called without init");
216 if (--_ecore_buffer_init_count != 0)
219 /* dynamic backends */
220 eina_hash_foreach(_backends, _ecore_buffer_backends_free, NULL);
222 eina_module_list_free(_modules);
224 eina_array_free(_modules);
227 eina_hash_free(_backends);
229 eina_log_domain_unregister(_ecore_buffer_log_dom);
230 _ecore_buffer_log_dom = -1;
236 ecore_buffer_new(const char *engine, unsigned int width, unsigned int height, Ecore_Buffer_Format format, unsigned int flags)
238 Ecore_Buffer_Module *bm;
242 bm = _ecore_buffer_get_backend(engine);
245 ERR("Failed to get backend: %s", engine);
249 EINA_SAFETY_ON_NULL_RETURN_VAL(bm->be, NULL);
251 if (!bm->be->buffer_alloc)
253 ERR("Not supported create buffer");
257 bo = calloc(1, sizeof(Ecore_Buffer));
261 bo_data = bm->be->buffer_alloc(bm->data, width, height, format, flags);
268 if (bm->be->buffer_info_get)
269 bm->be->buffer_info_get(bm->data, bo_data, &bo->info);
272 bo->info.width = width;
273 bo->info.height = height;
274 bo->info.format = format;
279 bo->buffer_data = bo_data;
285 ecore_buffer_new_with_tbm_surface(const char *engine, void *tbm_surface, unsigned int flags)
287 Ecore_Buffer_Module *bm;
290 Ecore_Buffer_Format format = 0;
293 bm = _ecore_buffer_get_backend(engine);
296 ERR("Failed to get Backend: %s", engine);
300 EINA_SAFETY_ON_NULL_RETURN_VAL(bm->be, NULL);
302 if (!bm->be->buffer_alloc_with_tbm_surface)
304 ERR("Not supported create buffer with tbm_surface");
308 bo = calloc(1, sizeof(Ecore_Buffer));
312 bo_data = bm->be->buffer_alloc_with_tbm_surface(bm->data, tbm_surface,
313 &w, &h, &format, flags);
320 if (bm->be->buffer_info_get)
321 bm->be->buffer_info_get(bm->data, bo_data, &bo->info);
326 bo->info.format = format;
331 bo->buffer_data = bo_data;
337 ecore_buffer_free(Ecore_Buffer *buf)
339 Ecore_Buffer_Cb_Data *free_cb;
341 EINA_SAFETY_ON_NULL_RETURN(buf);
344 while (buf->free_callbacks)
346 free_cb = EINA_INLIST_CONTAINER_GET(buf->free_callbacks, Ecore_Buffer_Cb_Data);
347 buf->free_callbacks = eina_inlist_remove(buf->free_callbacks, buf->free_callbacks);
349 free_cb->cb(buf, free_cb->data);
353 EINA_SAFETY_ON_NULL_RETURN(buf->bm);
354 EINA_SAFETY_ON_NULL_RETURN(buf->bm->be);
355 EINA_SAFETY_ON_NULL_RETURN(buf->bm->be->buffer_free);
357 buf->bm->be->buffer_free(buf->bm->data, buf->buffer_data);
361 eina_hash_free(buf->data);
367 ecore_buffer_pixmap_get(Ecore_Buffer *buf)
369 EINA_SAFETY_ON_NULL_RETURN_VAL(buf, 0);
370 EINA_SAFETY_ON_NULL_RETURN_VAL(buf->bm, 0);
371 EINA_SAFETY_ON_NULL_RETURN_VAL(buf->bm->be, 0);
373 if (!buf->bm->be->pixmap_get)
376 return buf->bm->be->pixmap_get(buf->bm->data, buf->buffer_data);
380 ecore_buffer_tbm_surface_get(Ecore_Buffer *buf)
382 EINA_SAFETY_ON_NULL_RETURN_VAL(buf, NULL);
383 EINA_SAFETY_ON_NULL_RETURN_VAL(buf->bm, NULL);
384 EINA_SAFETY_ON_NULL_RETURN_VAL(buf->bm->be, NULL);
386 if (!buf->bm->be->tbm_surface_get)
388 ERR("TBM is not supported\n");
392 return buf->bm->be->tbm_surface_get(buf->bm->data, buf->buffer_data);
396 ecore_buffer_size_get(Ecore_Buffer *buf, unsigned int *width, unsigned int *height)
398 EINA_SAFETY_ON_NULL_RETURN_VAL(buf, EINA_FALSE);
400 if (width) *width = buf->info.width;
401 if (height) *height = buf->info.height;
407 ecore_buffer_format_get(Ecore_Buffer *buf)
409 EINA_SAFETY_ON_NULL_RETURN_VAL(buf, 0);
411 return buf->info.format;
415 ecore_buffer_flags_get(Ecore_Buffer *buf)
417 EINA_SAFETY_ON_NULL_RETURN_VAL(buf, 0);
423 ecore_buffer_free_callback_add(Ecore_Buffer *buf, Ecore_Buffer_Cb func, void *data)
425 EINA_SAFETY_ON_NULL_RETURN(buf);
426 EINA_SAFETY_ON_NULL_RETURN(func);
428 Ecore_Buffer_Cb_Data *free_cb;
430 free_cb = calloc(sizeof(Ecore_Buffer_Cb_Data), 1);
435 free_cb->data = data;
436 buf->free_callbacks = eina_inlist_append(buf->free_callbacks, EINA_INLIST_GET(free_cb));
440 ecore_buffer_free_callback_remove(Ecore_Buffer *buf, Ecore_Buffer_Cb func, void *data)
442 Ecore_Buffer_Cb_Data *free_cb;
444 EINA_SAFETY_ON_NULL_RETURN(buf);
445 EINA_SAFETY_ON_NULL_RETURN(func);
447 if (buf->free_callbacks)
450 EINA_INLIST_FOREACH_SAFE(buf->free_callbacks, itrn, free_cb)
452 if (free_cb->cb == func && free_cb->data == data)
454 buf->free_callbacks =
455 eina_inlist_remove(buf->free_callbacks,
456 EINA_INLIST_GET(free_cb));
464 _ecore_buffer_engine_name_get(Ecore_Buffer *buf)
466 EINA_SAFETY_ON_NULL_RETURN_VAL(buf, 0);
467 EINA_SAFETY_ON_NULL_RETURN_VAL(buf->bm, 0);
468 EINA_SAFETY_ON_NULL_RETURN_VAL(buf->bm->be, 0);
470 return buf->bm->be->name;
474 _ecore_buffer_export(Ecore_Buffer *buf, int *id)
476 Ecore_Export_Type type = EXPORT_TYPE_INVALID;
479 EINA_SAFETY_ON_NULL_RETURN_VAL(buf, type);
480 EINA_SAFETY_ON_NULL_RETURN_VAL(buf->bm, type);
481 EINA_SAFETY_ON_NULL_RETURN_VAL(buf->bm->be, type);
483 if (!buf->bm->be->buffer_export)
486 type = buf->bm->be->buffer_export(buf->bm->data, buf->buffer_data, &ret_id);
488 if (id) *id = ret_id;
494 _ecore_buffer_import(const char *engine, Ecore_Buffer_Info *info, Ecore_Export_Type type, int export_id, unsigned int flags)
496 Ecore_Buffer_Module *bm;
500 bm = _ecore_buffer_get_backend(engine);
503 ERR("Filed to get Backend: %s", engine);
507 EINA_SAFETY_ON_NULL_RETURN_VAL(bm->be, NULL);
509 if (!bm->be->buffer_import)
511 ERR("Not supported import buffer");
515 bo = calloc(1, sizeof(Ecore_Buffer));
519 bo_data = bm->be->buffer_import(bm->data, info, type, export_id, flags);
526 memcpy(&bo->info, info, sizeof(*info));
530 bo->buffer_data = bo_data;
536 _ecore_buffer_info_get(Ecore_Buffer *buf, Ecore_Buffer_Info *info)
538 EINA_SAFETY_ON_NULL_RETURN_VAL(buf, EINA_FALSE);
541 memcpy(info, &buf->info, sizeof(*info));