diff options
Diffstat (limited to 'src/lib/evas/canvas/evas_main.c')
-rw-r--r-- | src/lib/evas/canvas/evas_main.c | 186 |
1 files changed, 112 insertions, 74 deletions
diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 86a7881473..4bdc7e36dd 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -19,24 +19,24 @@ #define MY_CLASS EVAS_CANVAS_CLASS #ifdef LKDEBUG -EAPI Eina_Bool lockdebug = EINA_FALSE; -EAPI int lockmax = 0; +EVAS_API Eina_Bool lockdebug = EINA_FALSE; +EVAS_API int lockmax = 0; #endif static int _evas_init_count = 0; int _evas_log_dom_global = -1; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_NONE = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_GENERIC = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_DOES_NOT_EXIST = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_PERMISSION_DENIED = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_CORRUPT_FILE = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_UNKNOWN_FORMAT = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_CANCELLED = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_INCOMPATIBLE_FILE = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_UNKNOWN_COLLECTION = 0; -EAPI Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_RECURSIVE_REFERENCE = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_NONE = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_GENERIC = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_DOES_NOT_EXIST = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_PERMISSION_DENIED = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_CORRUPT_FILE = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_UNKNOWN_FORMAT = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_CANCELLED = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_INCOMPATIBLE_FILE = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_UNKNOWN_COLLECTION = 0; +EVAS_API Eina_Error EFL_GFX_IMAGE_LOAD_ERROR_RECURSIVE_REFERENCE = 0; #define NUM_ERRORS 11 @@ -51,7 +51,7 @@ const char *efl_gfx_image_load_error_msgs[] = { "Reading operation has been cancelled during decoding" , "(Edje only) The file pointed to is incompatible, i.e., it doesn't match the library's current version's format." , "(Edje only) The group/collection set to load from was not found in the file" , - "(Edje only) The group/collection set to load from had recursive references on its components" + "(Edje only) The group/collection set to load from had recursive references on its components" }; static void @@ -120,8 +120,35 @@ _efl_gfx_image_load_error_to_evas_load_error(Eina_Error err) return EVAS_LOAD_ERROR_GENERIC; } +static Eina_Content* +_markup_to_utf8(Eina_Content *from, const char *to_type) +{ + Eina_Content *ret = NULL; + Eina_Slice slice = eina_content_data_get(from); + char *utf8 = evas_textblock_text_markup_to_utf8(NULL, slice.mem); + if (utf8) + { + ret = eina_content_new((Eina_Slice)EINA_SLICE_STR_FULL(utf8), to_type); + free(utf8); + } + return ret; +} -EAPI int +static Eina_Content* +_utf8_to_markup(Eina_Content *from, const char *to_type) +{ + Eina_Content *ret = NULL; + Eina_Slice slice = eina_content_data_get(from); + char *markup = evas_textblock_text_utf8_to_markup(NULL, slice.mem); + if (markup) + { + ret = eina_content_new((Eina_Slice)EINA_SLICE_STR_FULL(markup), to_type); + free(markup); + } + return ret; +} + +EVAS_API int evas_init(void) { if (++_evas_init_count != 1) @@ -179,6 +206,9 @@ evas_init(void) _efl_gfx_image_load_error_init(); + eina_content_converter_conversion_register("application/x-elementary-markup", "text/plain;charset=utf-8", _markup_to_utf8); + eina_content_converter_conversion_register("text/plain;charset=utf-8", "application/x-elementary-markup", _utf8_to_markup); + return _evas_init_count; shutdown_filter: @@ -205,7 +235,7 @@ shutdown_evil: return --_evas_init_count; } -EAPI int +EVAS_API int evas_shutdown(void) { if (_evas_init_count <= 0) @@ -222,6 +252,8 @@ evas_shutdown(void) evas_focus_shutdown(); + evas_fonts_zero_free(); + evas_cache_vg_shutdown(); evas_font_path_global_clear(); @@ -273,7 +305,7 @@ evas_shutdown(void) } -EAPI Evas * +EVAS_API Evas * evas_new(void) { Evas_Object *eo_obj = efl_add(EVAS_CANVAS_CLASS, efl_main_loop_get()); @@ -331,6 +363,9 @@ _evas_canvas_efl_object_constructor(Eo *eo_obj, Evas_Public_Data *e) EVAS_ARRAY_SET(e, glyph_unref_queue); EVAS_ARRAY_SET(e, texts_unref_queue); + eina_array_step_set(&e->render_post_change_objects, sizeof(e->render_post_change_objects), 10); + eina_array_step_set(&e->map_clip_objects, sizeof(e->map_clip_objects), 64); + e->active_objects.version = EINA_ARRAY_VERSION; eina_inarray_step_set(&e->active_objects, sizeof(Eina_Inarray), @@ -352,7 +387,7 @@ _evas_canvas_efl_object_constructor(Eo *eo_obj, Evas_Public_Data *e) return eo_obj; } -EAPI void +EVAS_API void evas_free(Evas *eo_e) { if (!eo_e) return; @@ -612,7 +647,9 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e) eina_array_flush(&e->image_unref_queue); eina_array_flush(&e->glyph_unref_queue); eina_array_flush(&e->texts_unref_queue); + eina_array_flush(&e->map_clip_objects); eina_hash_free(e->focused_objects); + eina_array_flush(&e->render_post_change_objects); SLKL(e->post_render.lock); EINA_INLIST_FREE(e->post_render.jobs, job) @@ -636,7 +673,7 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e) // It is now expected that the first output in the list is the default one // manipulated by this set of legacy API -EAPI Evas_Engine_Info * +EVAS_API Evas_Engine_Info * evas_engine_info_get(const Evas *obj) { if (!obj) return NULL; @@ -655,7 +692,7 @@ evas_engine_info_get(const Evas *obj) return efl_canvas_output_engine_info_get(output); } -EAPI Eina_Bool +EVAS_API Eina_Bool evas_engine_info_set(Evas *obj, Evas_Engine_Info *info) { if (!obj) return EINA_FALSE; @@ -713,7 +750,7 @@ _evas_canvas_default_device_get(const Eo *eo_e EINA_UNUSED, return NULL; } -EAPI int +EVAS_API int evas_render_method_lookup(const char *name) { Evas_Module *em; @@ -726,13 +763,13 @@ evas_render_method_lookup(const char *name) return em->id_engine; } -EAPI Eina_List * +EVAS_API Eina_List * evas_render_method_list(void) { return evas_module_engine_list(); } -EAPI void +EVAS_API void evas_render_method_list_free(Eina_List *list) { const char *s; @@ -740,7 +777,7 @@ evas_render_method_list_free(Eina_List *list) EINA_LIST_FREE(list, s) eina_stringshare_del(s); } -EAPI Eina_Bool +EVAS_API Eina_Bool evas_object_image_extension_can_load_get(const char *file) { const char *tmp; @@ -753,7 +790,7 @@ evas_object_image_extension_can_load_get(const char *file) return result; } -EAPI Eina_Bool +EVAS_API Eina_Bool evas_object_image_extension_can_load_fast_get(const char *file) { return evas_common_extension_can_load_get(file); @@ -933,7 +970,7 @@ _evas_unwalk(Evas_Public_Data *e) efl_unref(e->evas); } -EAPI const char * +EVAS_API const char * evas_load_error_str(Evas_Load_Error error) { switch (error) @@ -957,38 +994,38 @@ evas_load_error_str(Evas_Load_Error error) } } -EAPI void +EVAS_API void evas_color_hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b) { evas_common_convert_color_hsv_to_rgb(h, s, v, r, g, b); } -EAPI void +EVAS_API void evas_color_rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v) { evas_common_convert_color_rgb_to_hsv(r, g, b, h, s, v); } -EAPI void +EVAS_API void evas_color_argb_premul(int a, int *r, int *g, int *b) { evas_common_convert_color_argb_premul(a, r, g, b); } -EAPI void +EVAS_API void evas_color_argb_unpremul(int a, int *r, int *g, int *b) { evas_common_convert_color_argb_unpremul(a, r, g, b); } -EAPI void +EVAS_API void evas_data_argb_premul(unsigned int *data, unsigned int len) { if (!data || (len < 1)) return; evas_common_convert_argb_premul(data, len); } -EAPI void +EVAS_API void evas_data_argb_unpremul(unsigned int *data, unsigned int len) { if (!data || (len < 1)) return; @@ -1023,13 +1060,13 @@ evas_ector_get(Evas_Public_Data *e) return e->ector; } -EAPI Evas_BiDi_Direction +EVAS_API Evas_BiDi_Direction evas_language_direction_get(void) { return evas_common_language_direction_get(); } -EAPI void +EVAS_API void evas_language_reinit(void) { evas_common_language_reinit(); @@ -1059,16 +1096,13 @@ _image_data_unset(Evas_Object_Protected_Data *obj, Eina_List **list) data->engine_data = obj->layer->evas->engine.func->polygon_points_clear(ENC, data->engine_data)) - else CHECK(EVAS_CANVAS3D_TEXTURE_CLASS, Evas_Canvas3D_Texture_Data, - if (obj->layer->evas->engine.func->texture_free) - obj->layer->evas->engine.func->texture_free(ENC, data->engine_data)) else return; #undef CHECK evas_object_ref(obj->object); *list = eina_list_append(*list, obj->object); } -EAPI Eina_List * +EVAS_API Eina_List * _evas_canvas_image_data_unset(Evas *eo_e) { Evas_Public_Data *e = efl_data_scope_get(eo_e, MY_CLASS); @@ -1118,13 +1152,11 @@ _image_data_regenerate(Evas_Object *eo_obj) } CHECK(EFL_CANVAS_IMAGE_INTERNAL_CLASS, Evas_Image_Data, _image_image_data_regenerate(eo_obj, obj, data)) else CHECK(EFL_CANVAS_IMAGE_CLASS, Evas_Image_Data, _image_image_data_regenerate(eo_obj, obj, data)) - else CHECK(EFL_CANVAS_SCENE3D_CLASS, Evas_Image_Data, _image_image_data_regenerate(eo_obj, obj, data)) //else CHECK(EFL_CANVAS_VG_OBJECT_CLASS, Efl_Canvas_Vg_Object_Data,) //else CHECK(EFL_CANVAS_POLYGON_CLASS, Efl_Canvas_Polygon_Data,) - //else CHECK(EVAS_CANVAS3D_TEXTURE_CLASS, Evas_Canvas3D_Texture_Data, } -EAPI void +EVAS_API void _evas_canvas_image_data_regenerate(Eina_List *list) { Evas_Object *eo_obj; @@ -1224,7 +1256,7 @@ _evas_canvas_efl_canvas_scene_image_max_size_get(const Eo *eo_e EINA_UNUSED, Eva /* Legacy deprecated functions */ -EAPI void +EVAS_API void evas_output_framespace_set(Evas *eo_e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) { EVAS_TYPE_CHECK(eo_e); @@ -1243,7 +1275,7 @@ evas_output_framespace_set(Evas *eo_e, Evas_Coord x, Evas_Coord y, Evas_Coord w, e->changed = 1; } -EAPI void +EVAS_API void evas_output_framespace_get(const Evas *eo_e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) { EVAS_TYPE_CHECK(eo_e); @@ -1256,7 +1288,7 @@ evas_output_framespace_get(const Evas *eo_e, Evas_Coord *x, Evas_Coord *y, Evas_ if (h) *h = e->framespace.h; } -EAPI void +EVAS_API void evas_output_method_set(Evas *eo_e, int render_method) { EVAS_TYPE_CHECK(eo_e); @@ -1328,7 +1360,7 @@ evas_output_method_set(Evas *eo_e, int render_method) EVAS_DEVICE_SUBCLASS_NONE); } -EAPI int +EVAS_API int evas_output_method_get(const Evas *eo_e) { EVAS_TYPE_CHECK(eo_e, RENDER_METHOD_INVALID); @@ -1338,7 +1370,7 @@ evas_output_method_get(const Evas *eo_e) return e->output.render_method; } -EAPI void +EVAS_API void evas_output_size_set(Evas *eo_e, int w, int h) { EVAS_TYPE_CHECK(eo_e); @@ -1366,7 +1398,7 @@ evas_output_size_set(Evas *eo_e, int w, int h) evas_render_invalidate(eo_e); } -EAPI void +EVAS_API void evas_output_size_get(const Evas *eo_e, int *w, int *h) { EVAS_TYPE_CHECK(eo_e); @@ -1377,7 +1409,7 @@ evas_output_size_get(const Evas *eo_e, int *w, int *h) if (h) *h = e->output.h; } -EAPI void +EVAS_API void evas_output_viewport_set(Evas *eo_e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) { EVAS_TYPE_CHECK(eo_e); @@ -1405,7 +1437,7 @@ evas_output_viewport_set(Evas *eo_e, Evas_Coord x, Evas_Coord y, Evas_Coord w, E evas_event_callback_call(e->evas, EVAS_CALLBACK_CANVAS_VIEWPORT_RESIZE, NULL); } -EAPI void +EVAS_API void evas_output_viewport_get(const Evas *eo_e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) { EVAS_TYPE_CHECK(eo_e); @@ -1480,7 +1512,7 @@ _evas_pointer_data_add(Evas_Public_Data *edata, Evas_Device *pointer) } void -_evas_pointer_data_remove(Evas_Public_Data *edata, Evas_Device *pointer) +_evas_pointer_data_remove(Evas_Public_Data *edata, Evas_Device *pointer, Eina_Bool nofree) { Evas_Pointer_Data *pdata; Evas_Pointer_Seat *pseat; @@ -1491,17 +1523,23 @@ _evas_pointer_data_remove(Evas_Public_Data *edata, Evas_Device *pointer) EINA_INLIST_FOREACH(pseat->pointers, pdata) if (pdata->pointer == pointer) { - pseat->pointers = eina_inlist_remove(pseat->pointers, EINA_INLIST_GET(pdata)); - free(pdata); + if (!nofree) + { + pseat->pointers = eina_inlist_remove(pseat->pointers, EINA_INLIST_GET(pdata)); + free(pdata); + } hit = pseat; break; } } EINA_SAFETY_ON_NULL_RETURN(hit); if (hit->pointers) return; - eina_list_free(hit->object.in); - edata->seats = eina_inlist_remove(edata->seats, EINA_INLIST_GET(hit)); - free(hit); + hit->object.in = eina_list_free(hit->object.in); + if (!nofree) + { + edata->seats = eina_inlist_remove(edata->seats, EINA_INLIST_GET(hit)); + free(hit); + } } Eina_List * @@ -1568,7 +1606,7 @@ _efl_canvas_iterator_free(Efl_Canvas_Iterator *it) free(it); } -EAPI Eina_Iterator * +EVAS_API Eina_Iterator * efl_canvas_iterator_create(Eo *obj, Eina_Iterator *real_iterator, Eina_List *list) { Efl_Canvas_Iterator *it; @@ -1624,14 +1662,14 @@ _evas_canvas_efl_canvas_scene_object_top_at_xy_get(const Eo *eo_e EINA_UNUSED, E return NULL; } -EAPI Evas_Object* +EVAS_API Evas_Object* evas_object_top_at_xy_get(Eo *eo_e, Evas_Coord x, Evas_Coord y, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects) { Eina_Position2D pos = {x, y}; return efl_canvas_scene_object_top_at_xy_get(eo_e, pos, include_pass_events_objects, include_hidden_objects); } -EAPI Evas_Object * +EVAS_API Evas_Object * evas_object_top_at_pointer_get(const Evas *eo_e) { Evas_Public_Data *e = efl_isa(eo_e, EVAS_CANVAS_CLASS) ? @@ -1683,7 +1721,7 @@ _evas_canvas_efl_canvas_scene_object_top_in_rectangle_get(const Eo *eo_e EINA_UN return NULL; } -EAPI Evas_Object * +EVAS_API Evas_Object * evas_object_top_in_rectangle_get(const Eo *obj, int x, int y, int w, int h, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects) { return efl_canvas_scene_object_top_in_rectangle_get(obj, EINA_RECT(x, y, w, h), include_pass_events_objects, include_hidden_objects); @@ -1810,7 +1848,7 @@ _evas_canvas_efl_canvas_scene_objects_in_rectangle_get(Eo *eo_e EINA_UNUSED, Eva return efl_canvas_iterator_create(eo_e, eina_list_iterator_new(l), l); } -EAPI Eina_List * +EVAS_API Eina_List * evas_objects_in_rectangle_get(const Evas_Canvas *eo_e, int x, int y, int w, int h, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects) { EVAS_LEGACY_API(eo_e, e, NULL); @@ -1903,7 +1941,7 @@ evas_font_object_rehint(Evas_Object *eo_obj) } } -EAPI void +EVAS_API void evas_font_hinting_set(Eo *eo_e, Evas_Font_Hinting_Flags hinting) { Evas_Layer *lay; @@ -1922,14 +1960,14 @@ evas_font_hinting_set(Eo *eo_e, Evas_Font_Hinting_Flags hinting) } } -EAPI Evas_Font_Hinting_Flags +EVAS_API Evas_Font_Hinting_Flags evas_font_hinting_get(const Evas *eo_e) { EVAS_LEGACY_API(eo_e, e, EVAS_FONT_HINTING_NONE); return e->hinting; } -EAPI Eina_Bool +EVAS_API Eina_Bool evas_font_hinting_can_hint(const Evas *eo_e, Evas_Font_Hinting_Flags hinting) { EVAS_LEGACY_API(eo_e, e, EINA_FALSE); @@ -1939,7 +1977,7 @@ evas_font_hinting_can_hint(const Evas *eo_e, Evas_Font_Hinting_Flags hinting) else return EINA_FALSE; } -EAPI void +EVAS_API void evas_font_available_list_free(Evas *eo_e, Eina_List *available) { EVAS_TYPE_CHECK(eo_e); @@ -1954,7 +1992,7 @@ _evas_canvas_efl_canvas_scene_group_objects_calculate(Eo *eo_e, Evas_Public_Data evas_call_smarts_calculate(eo_e); } -EAPI void +EVAS_API void evas_smart_objects_calculate(Eo *eo_e) { EVAS_TYPE_CHECK(eo_e); @@ -1967,7 +2005,7 @@ _evas_canvas_efl_canvas_scene_group_objects_calculating_get(const Eo *eo_e EINA_ return !!e->in_smart_calc; } -EAPI Eina_Bool +EVAS_API Eina_Bool evas_smart_objects_calculating_get(const Eo *obj) { EVAS_TYPE_CHECK(obj, EINA_FALSE); @@ -1979,23 +2017,23 @@ _evas_canvas_smart_objects_calculate_count_get(const Eo *eo_e EINA_UNUSED, Evas_ { return e->smart_calc_count; } -/* Legacy EAPI */ +/* Legacy EVAS_API */ -EAPI Eina_Bool +EVAS_API Eina_Bool evas_pointer_inside_get(const Evas *obj) { EVAS_TYPE_CHECK(obj, EINA_FALSE); return efl_canvas_pointer_inside_get(obj, NULL); } -EAPI Eina_Bool +EVAS_API Eina_Bool evas_pointer_inside_by_device_get(const Evas *obj, Eo *dev) { EVAS_TYPE_CHECK(obj, EINA_FALSE); return efl_canvas_pointer_inside_get(obj, dev); } -EAPI Eina_List* +EVAS_API Eina_List* evas_objects_at_xy_get(Eo *eo_e, int x, int y, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects) { EVAS_TYPE_CHECK(eo_e, NULL); @@ -2003,13 +2041,13 @@ evas_objects_at_xy_get(Eo *eo_e, int x, int y, Eina_Bool include_pass_events_obj } /* Internal EO APIs */ -EWAPI const Efl_Event_Description _EVAS_CANVAS_EVENT_RENDER_FLUSH_PRE = +EVAS_API EVAS_API_WEAK const Efl_Event_Description _EVAS_CANVAS_EVENT_RENDER_FLUSH_PRE = EFL_EVENT_DESCRIPTION("render,flush,pre"); -EWAPI const Efl_Event_Description _EVAS_CANVAS_EVENT_RENDER_FLUSH_POST = +EVAS_API EVAS_API_WEAK const Efl_Event_Description _EVAS_CANVAS_EVENT_RENDER_FLUSH_POST = EFL_EVENT_DESCRIPTION("render,flush,post"); -EWAPI const Efl_Event_Description _EVAS_CANVAS_EVENT_AXIS_UPDATE = +EVAS_API EVAS_API_WEAK const Efl_Event_Description _EVAS_CANVAS_EVENT_AXIS_UPDATE = EFL_EVENT_DESCRIPTION("axis,update"); -EWAPI const Efl_Event_Description _EVAS_CANVAS_EVENT_VIEWPORT_RESIZE = +EVAS_API EVAS_API_WEAK const Efl_Event_Description _EVAS_CANVAS_EVENT_VIEWPORT_RESIZE = EFL_EVENT_DESCRIPTION("viewport,resize"); #define CHECK_ADD(var, ev, member) \ |