raster, have u considered eina_tiler? it's basically what evas uses. On Thu, Jan 7, 2010 at 11:45 AM, Enlightenment SVN <no-re...@enlightenment.org> wrote: > Log: > lots of fixes. looking solid now. bugs gone. argb windows handled. proper > update queue with tile updates etc. > > > Author: raster > Date: 2010-01-07 05:45:51 -0800 (Thu, 07 Jan 2010) > New Revision: 44946 > > Modified: > trunk/e/src/modules/comp/e_mod_comp.c > > Modified: trunk/e/src/modules/comp/e_mod_comp.c > =================================================================== > --- trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 13:36:45 UTC (rev > 44945) > +++ trunk/e/src/modules/comp/e_mod_comp.c 2010-01-07 13:45:51 UTC (rev > 44946) > @@ -3,6 +3,24 @@ > #include "e_mod_comp.h" > #include "config.h" > > +typedef struct _Update Update; > +typedef struct _Update_Rect Update_Rect; > + > +struct _Update > +{ > + int w, h; > + int tw, th; > + int tsw, tsh; > + unsigned char *tiles; > +}; > + > +struct _Update_Rect > +{ > + EINA_INLIST; > + int x, y, w, h; > +}; > + > + > typedef struct _Comp Comp; > typedef struct _Comp_Win Comp_Win; > > @@ -34,11 +52,13 @@ > int depth; > Evas_Object *obj; // shadow object > Ecore_X_Image *xim; // x image - software fallback > - // fixme: evas object its mapped to > + Update *up; // update handler > // fixme: shape rects > + // fixme: argb windows > // ... > Eina_Bool visible : 1; // is visible > Eina_Bool input_only : 1; // is input_only > + Eina_Bool argb : 1; // is argb > Eina_Bool update : 1; // has updates to fetch > }; > > @@ -47,6 +67,174 @@ > static Eina_Hash *windows = NULL; > static Eina_Hash *damages = NULL; > > +////////////////////////////////////////////////////////////////////////// > + > +static Update * > +_e_mod_comp_update_new(void) > +{ > + Update *up; > + > + up = calloc(1, sizeof(Update)); > + up->tsw = 32; > + up->tsh = 32; > + return up; > +} > + > +static void > +_e_mod_comp_update_free(Update *up) > +{ > + if (up->tiles) free(up->tiles); > + free(up); > +} > + > +static void > +_e_mod_comp_update_resize(Update *up, int w, int h) > +{ > + if ((up->w == w) && (up->h == h)) return; > + up->w = w; > + up->h = h; > + up->tw = (up->w + up->tsw - 1) / up->tsw; > + up->th = (up->h + up->tsh - 1) / up->tsh; > + if (up->tiles) > + { > + free(up->tiles); > + up->tiles = NULL; > + } > +} > + > +static void > +_e_mod_comp_tiles_alloc(Update *up) > +{ > + if (up->tiles) return; > + up->tiles = calloc(up->tw * up->th, sizeof(unsigned char)); > +} > + > +static void > +_e_mod_comp_update_add(Update *up, int x, int y, int w, int h) > +{ > + int tx, ty, txx, tyy, xx, yy; > + unsigned char *t, *t2; > + > + _e_mod_comp_tiles_alloc(up); > + > + // fixme: adjust to allow for optimizations in grabbing of ximages > + if (1) > + { > + if (w > (up->w / 2)) > + { > + x = 0; > + w = up->w; > + } > + } > + > + tx = x / up->tsw; > + ty = y / up->tsh; > + txx = (x + w - 1) / up->tsw; > + tyy = (y + h - 1) / up->tsh; > + t = up->tiles + (ty * up->tw) + tx; > + for (yy = ty; yy <= tyy; yy++) > + { > + t2 = t; > + for (xx = tx; xx <= txx; xx++) > + { > + *t2 = 1; > + t2++; > + } > + t += up->tw; > + } > +} > + > +static Update_Rect * > +_e_mod_comp_update_rects_get(Update *up) > +{ > + Update_Rect *r; > + int ri = 0; > + int x, y; > + unsigned char *t, *t2, *t3; > + > + r = calloc((up->tw * up->th) + 1, sizeof(Update_Rect)); > + if (!r) return NULL; > + t = up->tiles; > + for (y = 0; y < up->th; y++) > + { > + for (x = 0; x < up->tw; x++) > + { > + if (*t) > + { > + int can_expand_x = 1, can_expand_y = 1; > + int xx = 0, yy = 0; > + > + t2 = t + 1; > + while (can_expand_x) > + { > + xx++; > + if ((x + xx) >= up->tw) can_expand_x = 0; > + else if (!*t2) can_expand_x = 0; > + if (can_expand_x) *t2 = 0; > + t2++; > + } > + t3 = t; > + while (can_expand_y) > + { > + int i; > + > + yy++; > + t3 += up->tw; > + if ((y + yy) >= up->th) can_expand_y = 0; > + if (can_expand_y) > + { > + t2 = t3; > + for (i = 0; i < xx; i++) > + { > + if (!*t2) > + { > + can_expand_y = 0; > + break; > + } > + t2++; > + } > + } > + if (can_expand_y) > + { > + t2 = t3; > + for (i = 0; i < xx; i++) > + { > + *t2 = 0; > + t2++; > + } > + } > + } > + *t = 0; > + r[ri].x = x * up->tsw; > + r[ri].y = y * up->tsh; > + r[ri].w = xx * up->tsw; > + r[ri].h = yy * up->tsh; > + if ((r[ri].x + r[ri].w) > up->w) r[ri].w = up->w - r[ri].x; > + if ((r[ri].y + r[ri].h) > up->h) r[ri].h = up->h - r[ri].y; > + if ((r[ri].w <= 0) || (r[ri].h <= 0)) r[ri].w = 0; > + else ri++; > + x += xx - 1; > + t += xx - 1; > + } > + t++; > + } > + } > + return r; > +} > + > +static void > +_e_mod_comp_update_clear(Update *up) > +{ > + if (up->tiles) > + { > + free(up->tiles); > + up->tiles = NULL; > + } > +} > + > +////////////////////////////////////////////////////////////////////////// > + > + > static void _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h); > > static int > @@ -58,8 +246,31 @@ > c->render_animator = NULL; > EINA_LIST_FREE(c->updates, cw) > { > + Update_Rect *r; > + int i; > + > cw->update = 0; > - // FIXME: accumulate updates and fetch them all here > + r = _e_mod_comp_update_rects_get(cw->up); > + _e_mod_comp_update_clear(cw->up); > + if (cw->xim) > + { > + for (i = 0; r[i].w > 0; i++) > + { > + unsigned int *pix; > + int x, y, w, h; > + > + x = r[i].x; > + y = r[i].y; > + w = r[i].w; > + h = r[i].h; > + ecore_x_image_get(cw->xim, cw->pixmap, x, y, x, y, w, h); > + pix = ecore_x_image_data_get(cw->xim, NULL, NULL, NULL); > + evas_object_image_size_set(cw->obj, cw->w, cw->h); > + evas_object_image_data_set(cw->obj, pix); > + evas_object_image_data_update_add(cw->obj, x, y, w, h); > + } > + } > + free(r); > } > ecore_evas_manual_render(c->ee); > return 0; > @@ -128,6 +339,7 @@ > cw->input_only = att.input_only; > cw->vis = att.visual; > cw->depth = att.depth; > + cw->argb = ecore_x_window_argb_get(cw->win); > eina_hash_add(windows, e_util_winid_str_get(cw->win), cw); > if (!cw->input_only) > { > @@ -135,21 +347,26 @@ > eina_hash_add(damages, e_util_winid_str_get(cw->damage), cw); > cw->obj = evas_object_image_filled_add(c->evas); > evas_object_image_colorspace_set(cw->obj, EVAS_COLORSPACE_ARGB8888); > - evas_object_image_alpha_set(cw->obj, 0); > + if (cw->argb) > + evas_object_image_alpha_set(cw->obj, 1); > + else > + evas_object_image_alpha_set(cw->obj, 0); > } > else > { > cw->obj = evas_object_rectangle_add(c->evas); > evas_object_color_set(cw->obj, 0, 0, 0, 64); > } > - printf(" [0x%x] add\n", cw->win); > + cw->up = _e_mod_comp_update_new(); > +// printf(" [0x%x] add\n", cw->win); > return cw; > } > > static void > _e_mod_comp_win_del(Comp_Win *cw) > { > - printf(" [0x%x] del\n", cw->win); > + _e_mod_comp_update_free(cw->up); > +// printf(" [0x%x] del\n", cw->win); > if (cw->update) > { > cw->update = 0; > @@ -181,7 +398,7 @@ > if (cw->visible) return; > cw->visible = 1; > if (cw->input_only) return; > - printf(" [0x%x] sho\n", cw->win); > +// printf(" [0x%x] sho\n", cw->win); > if (!cw->pixmap) > { > ecore_x_composite_redirect_window(cw->win, > ECORE_X_COMPOSITE_UPDATE_MANUAL); > @@ -197,7 +414,7 @@ > if (!cw->visible) return; > cw->visible = 0; > if (cw->input_only) return; > - printf(" [0x%x] hid\n", cw->win); > +// printf(" [0x%x] hid\n", cw->win); > if (cw->pixmap) > { > ecore_x_pixmap_free(cw->pixmap); > @@ -211,7 +428,7 @@ > static void > _e_mod_comp_win_raise_above(Comp_Win *cw, Comp_Win *cw2) > { > - printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); > +// printf(" [0x%x] abv [0x%x]\n", cw->win, cw2->win); > cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw)); > cw->c->wins = eina_inlist_append_relative(cw->c->wins, > EINA_INLIST_GET(cw), > @@ -224,7 +441,7 @@ > static void > _e_mod_comp_win_raise(Comp_Win *cw) > { > - printf(" [0x%x] rai\n", cw->win); > +// printf(" [0x%x] rai\n", cw->win); > cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw)); > cw->c->wins = eina_inlist_append(cw->c->wins, EINA_INLIST_GET(cw)); > evas_object_raise(cw->obj); > @@ -235,7 +452,7 @@ > static void > _e_mod_comp_win_lower(Comp_Win *cw) > { > - printf(" [0x%x] low\n", cw->win); > +// printf(" [0x%x] low\n", cw->win); > cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cw)); > cw->c->wins = eina_inlist_prepend(cw->c->wins, EINA_INLIST_GET(cw)); > evas_object_lower(cw->obj); > @@ -248,14 +465,14 @@ > { > if (!((x == cw->x) && (y == cw->y))) > { > - printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); > +// printf(" [0x%x] mov %4i %4i\n", cw->win, x, y); > cw->x = x; > cw->y = y; > evas_object_move(cw->obj, cw->x, cw->y); > } > if (!((w == cw->w) && (h == cw->h))) > { > - printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); > +// printf(" [0x%x] rsz %4ix%4i\n", cw->win, w, h); > // ecore_x_composite_unredirect_window(cw->win, > ECORE_X_COMPOSITE_UPDATE_MANUAL); > // ecore_x_composite_redirect_window(cw->win, > ECORE_X_COMPOSITE_UPDATE_MANUAL); > if (cw->pixmap) > @@ -272,6 +489,7 @@ > ecore_x_image_free(cw->xim); > cw->xim = NULL; > } > + _e_mod_comp_update_resize(cw->up, cw->w, cw->h); > } > cw->border = border; > if (cw->input_only) return; > @@ -284,11 +502,10 @@ > Ecore_X_Region parts; > > if (cw->input_only) return; > - printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); > +// printf(" [0x%x] dmg %4i %4i %4ix%4i\n", cw->win, x, y, w, h); > parts = ecore_x_region_new(NULL, 0); > ecore_x_damage_subtract(cw->damage, 0, parts); > ecore_x_region_free(parts); > - // FIXME: add rect to queue for this compwin > if (!cw->pixmap) > cw->pixmap = ecore_x_composite_name_window_pixmap_get(cw->win); > > @@ -302,6 +519,7 @@ > h = cw->h; > } > } > + /* > if (cw->xim) > { > unsigned int *pix; > @@ -312,12 +530,14 @@ > evas_object_image_size_set(cw->obj, cw->w, cw->h); > evas_object_image_data_update_add(cw->obj, x, y, w, h); > } > + */ > _e_mod_comp_win_render_queue(cw); > if (!cw->update) > { > cw->update = 1; > cw->c->updates = eina_list_append(cw->c->updates, cw); > } > + _e_mod_comp_update_add(cw->up, x, y, w, h); > } > > ////////////////////////////////////////////////////////////////////////// > @@ -404,14 +624,7 @@ > Comp_Win *cw3 = (Comp_Win *)(EINA_INLIST_GET(cw)->prev); > > if (cw3 != cw2) > - { > - if (cw3) > - printf("... currently above [0x%x]\n", cw3->win); > - else > - printf("... currently at bottom\n"); > - printf("... ... move above [0x%x]\n", cw2->win); > - _e_mod_comp_win_raise_above(cw, cw2); > - } > + _e_mod_comp_win_raise_above(cw, cw2); > } > } > > @@ -465,7 +678,9 @@ > Ecore_X_Event_Damage *ev = event; > Comp_Win *cw = _e_mod_comp_win_damage_find(ev->damage); > if (!cw) return 1; > - _e_mod_comp_win_damage(cw, ev->area.x, ev->area.y, ev->area.width, > ev->area.height); > + _e_mod_comp_win_damage(cw, > + ev->area.x, ev->area.y, > + ev->area.width, ev->area.height); > return 1; > } > > > > ------------------------------------------------------------------------------ > This SF.Net email is sponsored by the Verizon Developer Community > Take advantage of Verizon's best-in-class app development support > A streamlined, 14 day to market process makes app distribution fast and easy > Join now and get one step closer to millions of Verizon customers > http://p.sf.net/sfu/verizon-dev2dev > _______________________________________________ > enlightenment-svn mailing list > enlightenment-...@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn >
-- Gustavo Sverzut Barbieri http://profusion.mobi embedded systems -------------------------------------- MSN: barbi...@gmail.com Skype: gsbarbieri Mobile: +55 (19) 9225-2202 ------------------------------------------------------------------------------ This SF.Net email is sponsored by the Verizon Developer Community Take advantage of Verizon's best-in-class app development support A streamlined, 14 day to market process makes app distribution fast and easy Join now and get one step closer to millions of Verizon customers http://p.sf.net/sfu/verizon-dev2dev _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel