forked from enlightenment/efl
* evas: Add a mempool. More speedup to come, depend on timing with "break" freeze.
SVN revision: 40037
This commit is contained in:
parent
f285d6ad16
commit
d40e3ac01a
|
@ -4,12 +4,28 @@
|
|||
extern Eina_List *evas_modules;
|
||||
static int initcount = 0;
|
||||
|
||||
Eina_Mempool *_evas_rectangle_mp = NULL;
|
||||
|
||||
EAPI int
|
||||
evas_init(void)
|
||||
{
|
||||
if (initcount == 0)
|
||||
{
|
||||
const char *choice;
|
||||
|
||||
eina_init();
|
||||
|
||||
if (!(choice = getenv("EINA_MEMPOOL")))
|
||||
choice = "chained_mempool";
|
||||
|
||||
_evas_rectangle_mp = eina_mempool_new(choice, "evas_rectangle", NULL,
|
||||
sizeof (Evas_Rectangle), 42);
|
||||
if (!_evas_rectangle_mp)
|
||||
{
|
||||
EINA_ERROR_PERR("ERROR: Mempool for rectangle cannot be allocated in list init.\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
evas_module_init();
|
||||
evas_async_events_init();
|
||||
}
|
||||
|
|
|
@ -2070,6 +2070,7 @@ static void
|
|||
evas_object_image_free(Evas_Object *obj)
|
||||
{
|
||||
Evas_Object_Image *o;
|
||||
Evas_Rectangle *r;
|
||||
|
||||
/* frees private object data. very simple here */
|
||||
o = (Evas_Object_Image *)(obj->object_data);
|
||||
|
@ -2084,14 +2085,8 @@ evas_object_image_free(Evas_Object *obj)
|
|||
o->engine_data);
|
||||
o->engine_data = NULL;
|
||||
o->magic = 0;
|
||||
while (o->pixel_updates)
|
||||
{
|
||||
Evas_Rectangle *r;
|
||||
|
||||
r = (Evas_Rectangle *)o->pixel_updates->data;
|
||||
o->pixel_updates = eina_list_remove(o->pixel_updates, r);
|
||||
free(r);
|
||||
}
|
||||
EINA_LIST_FREE(o->pixel_updates, r)
|
||||
eina_mempool_free(_evas_rectangle_mp, r);
|
||||
free(o);
|
||||
}
|
||||
|
||||
|
@ -2457,16 +2452,15 @@ evas_object_image_render_pre(Evas_Object *obj)
|
|||
(o->cur.border.t == 0) &&
|
||||
(o->cur.border.b == 0))
|
||||
{
|
||||
while (o->pixel_updates)
|
||||
Evas_Rectangle *rr;
|
||||
|
||||
EINA_LIST_FREE(o->pixel_updates, rr)
|
||||
{
|
||||
Evas_Rectangle *rr;
|
||||
Evas_Coord idw, idh, idx, idy;
|
||||
int x, y, w, h;
|
||||
|
||||
rr = o->pixel_updates->data;
|
||||
o->pixel_updates = eina_list_remove(o->pixel_updates, rr);
|
||||
obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, rr->x, rr->y, rr->w, rr->h);
|
||||
|
||||
|
||||
idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw);
|
||||
idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh);
|
||||
|
||||
|
@ -2500,7 +2494,7 @@ evas_object_image_render_pre(Evas_Object *obj)
|
|||
idx += idw;
|
||||
idy = ydy;
|
||||
}
|
||||
free(rr);
|
||||
eina_mempool_free(_evas_rectangle_mp, rr);
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
@ -2508,14 +2502,10 @@ evas_object_image_render_pre(Evas_Object *obj)
|
|||
{
|
||||
if (o->pixel_updates)
|
||||
{
|
||||
while (o->pixel_updates)
|
||||
{
|
||||
Evas_Rectangle *r;
|
||||
Evas_Rectangle *r;
|
||||
|
||||
r = (Evas_Rectangle *)o->pixel_updates->data;
|
||||
o->pixel_updates = eina_list_remove(o->pixel_updates, r);
|
||||
free(r);
|
||||
}
|
||||
EINA_LIST_FREE(o->pixel_updates, r)
|
||||
eina_mempool_free(_evas_rectangle_mp, r);
|
||||
obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, 0, 0, o->cur.image.w, o->cur.image.h);
|
||||
evas_object_render_pre_prev_cur_add(&rects, obj);
|
||||
goto done;
|
||||
|
@ -2540,28 +2530,17 @@ static void
|
|||
evas_object_image_render_post(Evas_Object *obj)
|
||||
{
|
||||
Evas_Object_Image *o;
|
||||
Evas_Rectangle *r;
|
||||
|
||||
/* this moves the current data to the previous state parts of the object */
|
||||
/* in whatever way is safest for the object. also if we don't need object */
|
||||
/* data anymore we can free it if the object deems this is a good idea */
|
||||
o = (Evas_Object_Image *)(obj->object_data);
|
||||
/* remove those pesky changes */
|
||||
while (obj->clip.changes)
|
||||
{
|
||||
Evas_Rectangle *r;
|
||||
|
||||
r = (Evas_Rectangle *)obj->clip.changes->data;
|
||||
obj->clip.changes = eina_list_remove(obj->clip.changes, r);
|
||||
free(r);
|
||||
}
|
||||
while (o->pixel_updates)
|
||||
{
|
||||
Evas_Rectangle *r;
|
||||
|
||||
r = (Evas_Rectangle *)o->pixel_updates->data;
|
||||
o->pixel_updates = eina_list_remove(o->pixel_updates, r);
|
||||
free(r);
|
||||
}
|
||||
EINA_LIST_FREE(obj->clip.changes, r)
|
||||
eina_mempool_free(_evas_rectangle_mp, r);
|
||||
EINA_LIST_FREE(o->pixel_updates, r)
|
||||
eina_mempool_free(_evas_rectangle_mp, r);
|
||||
/* move cur to prev safely for object data */
|
||||
obj->prev = obj->cur;
|
||||
o->prev = o->cur;
|
||||
|
|
|
@ -5511,15 +5511,6 @@ evas_object_textblock_render_pre(Evas_Object *obj)
|
|||
}
|
||||
if (o->changed)
|
||||
{
|
||||
/*
|
||||
Evas_Rectangle *r;
|
||||
|
||||
r = malloc(sizeof(Evas_Rectangle));
|
||||
r->x = 0; r->y = 0;
|
||||
r->w = obj->cur.geometry.w;
|
||||
r->h = obj->cur.geometry.h;
|
||||
updates = eina_list_append(updates, r);
|
||||
*/
|
||||
evas_object_render_pre_prev_cur_add(&rects, obj);
|
||||
o->changed = 0;
|
||||
}
|
||||
|
@ -5531,20 +5522,15 @@ static void
|
|||
evas_object_textblock_render_post(Evas_Object *obj)
|
||||
{
|
||||
Evas_Object_Textblock *o;
|
||||
Evas_Rectangle *r;
|
||||
|
||||
/* this moves the current data to the previous state parts of the object */
|
||||
/* in whatever way is safest for the object. also if we don't need object */
|
||||
/* data anymore we can free it if the object deems this is a good idea */
|
||||
o = (Evas_Object_Textblock *)(obj->object_data);
|
||||
/* remove those pesky changes */
|
||||
while (obj->clip.changes)
|
||||
{
|
||||
Evas_Rectangle *r;
|
||||
|
||||
r = (Evas_Rectangle *)obj->clip.changes->data;
|
||||
obj->clip.changes = eina_list_remove(obj->clip.changes, r);
|
||||
free(r);
|
||||
}
|
||||
EINA_LIST_FREE(obj->clip.changes, r)
|
||||
eina_mempool_free(_evas_rectangle_mp, r);
|
||||
/* move cur to prev safely for object data */
|
||||
obj->prev = obj->cur;
|
||||
// o->prev = o->cur;
|
||||
|
|
|
@ -18,9 +18,8 @@ evas_damage_rectangle_add(Evas *e, int x, int y, int w, int h)
|
|||
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
|
||||
return;
|
||||
MAGIC_CHECK_END();
|
||||
r = malloc(sizeof(Evas_Rectangle));
|
||||
NEW_RECT(r, x, y, w, h);
|
||||
if (!r) return;
|
||||
r->x = x; r->y = y; r->w = w; r->h = h;
|
||||
e->damages = eina_list_append(e->damages, r);
|
||||
e->changed = 1;
|
||||
}
|
||||
|
@ -39,9 +38,8 @@ evas_obscured_rectangle_add(Evas *e, int x, int y, int w, int h)
|
|||
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
|
||||
return;
|
||||
MAGIC_CHECK_END();
|
||||
r = malloc(sizeof(Evas_Rectangle));
|
||||
NEW_RECT(r, x, y, w, h);
|
||||
if (!r) return;
|
||||
r->x = x; r->y = y; r->w = w; r->h = h;
|
||||
e->obscures = eina_list_append(e->obscures, r);
|
||||
}
|
||||
|
||||
|
@ -54,17 +52,13 @@ evas_obscured_rectangle_add(Evas *e, int x, int y, int w, int h)
|
|||
EAPI void
|
||||
evas_obscured_clear(Evas *e)
|
||||
{
|
||||
Evas_Rectangle *r;
|
||||
|
||||
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
|
||||
return;
|
||||
MAGIC_CHECK_END();
|
||||
while (e->obscures)
|
||||
{
|
||||
Evas_Rectangle *r;
|
||||
|
||||
r = (Evas_Rectangle *)e->obscures->data;
|
||||
e->obscures = eina_list_remove(e->obscures, r);
|
||||
free(r);
|
||||
}
|
||||
EINA_LIST_FREE(e->obscures, r)
|
||||
eina_mempool_free(_evas_rectangle_mp, r);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -363,13 +357,11 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char
|
|||
}
|
||||
eina_array_clean(&e->restack_objects);
|
||||
/* phase 3. add exposes */
|
||||
while (e->damages)
|
||||
EINA_LIST_FREE(e->damages, r)
|
||||
{
|
||||
r = e->damages->data;
|
||||
e->damages = eina_list_remove(e->damages, r);
|
||||
e->engine.func->output_redraws_rect_add(e->engine.data.output,
|
||||
r->x, r->y, r->w, r->h);
|
||||
free(r);
|
||||
eina_mempool_free(_evas_rectangle_mp, r);
|
||||
}
|
||||
/* phase 4. output & viewport changes */
|
||||
if (e->viewport.changed)
|
||||
|
|
|
@ -85,12 +85,12 @@ MAGIC_CHECK_FAILED(o, t, m)
|
|||
#endif
|
||||
|
||||
#define NEW_RECT(_r, _x, _y, _w, _h) \
|
||||
{(_r) = malloc(sizeof(Evas_Rectangle)); \
|
||||
if (_r) \
|
||||
{ \
|
||||
(_r)->x = (_x); (_r)->y = (_y); \
|
||||
(_r)->w = (_w); (_r)->h = (_h); \
|
||||
}}
|
||||
{(_r) = eina_mempool_alloc(_evas_rectangle_mp, sizeof(Evas_Rectangle)); \
|
||||
if (_r) \
|
||||
{ \
|
||||
(_r)->x = (_x); (_r)->y = (_y); \
|
||||
(_r)->w = (_w); (_r)->h = (_h); \
|
||||
}}
|
||||
|
||||
#define MERR_NONE() _evas_alloc_error = EVAS_ALLOC_ERROR_NONE
|
||||
#define MERR_FATAL() _evas_alloc_error = EVAS_ALLOC_ERROR_FATAL
|
||||
|
@ -783,6 +783,7 @@ void _evas_object_text_rehint(Evas_Object *obj);
|
|||
void _evas_object_textblock_rehint(Evas_Object *obj);
|
||||
|
||||
extern int _evas_alloc_error;
|
||||
extern Eina_Mempool *_evas_rectangle_mp;
|
||||
|
||||
struct _Evas_Imaging_Image
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue