offx, offy, l);
}
+static Region *
+_evas_render2_regions_merge(Region *region)
+{
+ Region *region2;
+ Box *rects;
+ int num, i;
+ int tsize = 16;
+
+ region2 = region_new();
+ rects = region_rects(region);
+ num = region_rects_num(region);
+ for (i = 0; i < num; i++)
+ {
+ region_rect_add
+ (region2,
+ (rects[i].x1 / tsize) * tsize,
+ (rects[i].y1 / tsize) * tsize,
+ (((rects[i].x2 - rects[i].x1) + tsize - 1) / tsize) * tsize,
+ (((rects[i].y2 - rects[i].y1) + tsize - 1) / tsize) * tsize);
+ }
+ region_free(region);
+ return region2;
+}
+
static void
_evas_render2_th_main_do(Eo *eo_e, Evas_Public_Data *e)
{
t = get_time() - t;
printf("T: update generation: "); out_time(t);
+ updates = _evas_render2_regions_merge(updates);
+
rects = region_rects(updates);
rects_num = region_rects_num(updates);
for (i = 0; i < rects_num; i++)
rect = malloc(sizeof(Eina_Rectangle));
if (rect)
{
+ if (rects[i].x2 > e->output.w) rects[i].x2 = e->output.w;
+ if (rects[i].y2 > e->output.h) rects[i].y2 = e->output.h;
rect->x = rects[i].x1;
rect->y = rects[i].y1;
rect->w = rects[i].x2 - rects[i].x1;
updates_list = eina_list_append(updates_list, rect);
}
}
+ t = get_time() - t;
+ printf("T: merge updates: "); out_time(t);
+
+ // ... now render every update region
region_free(updates);
e->changed = EINA_FALSE;
Eina_Bool
region_copy(Region *dest, Region *src)
{
- if (dest == src) return EINA_TRUE;
-
dest->last_del.w = 0;
dest->last_add.w = 0;
// Return EINA_TRUE if some overlap between dest, source
// checks all the simple cases
- // Region 1 and 2 are the same
- if (dest == source) return region_copy(dest, dest);
-
dest->last_del.w = 0;
dest->last_add.w = 0;
if ((!num) || (!INBOX(®ion->bound, x, y))) return EINA_FALSE;
if (num == 1)
{
- *box = region->bound;
+ if (box) *box = region->bound;
return EINA_TRUE;
}
for (bx = PIXREGION_BOXPTR(region), bxend = bx + num; bx != bxend; bx++)
if (y >= bx->y2) continue; // not there yet
if ((y < bx->y1) || (x < bx->x1)) break; // missed it
if (x >= bx->x2) continue; // not there yet
- *box = *bx;
+ if (box) *box = *bx;
return EINA_TRUE;
}
return EINA_FALSE;
region->bound.x2 = region->bound.x1;
region->bound.y2 = region->bound.y1;
region->data = &_region_emptydata;
+ region->last_del.w = 0;
+ region->last_add.w = 0;
}
Box *