summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2015-09-24 20:40:38 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2015-09-24 20:45:14 +0900
commit974e82c5e51d5c5049c13818843fb78464dd6be2 (patch)
treef314da421007988b6d0db1660c12412f90b2246f
parent08ee7d4b8c708eac2f94e2792df69867d47f0a32 (diff)
downloadefl-974e82c5e51d5c5049c13818843fb78464dd6be2.tar.gz
evas - make new exact regions round up to 16x16 to keep count sane
make region count sane by rounding to 16x16
-rw-r--r--src/lib/evas/canvas/render2/evas_render2_th_main.c13
-rw-r--r--src/lib/evas/common/evas_tiler.c45
2 files changed, 48 insertions, 10 deletions
diff --git a/src/lib/evas/canvas/render2/evas_render2_th_main.c b/src/lib/evas/canvas/render2/evas_render2_th_main.c
index 8f164f0135..72146b4629 100644
--- a/src/lib/evas/canvas/render2/evas_render2_th_main.c
+++ b/src/lib/evas/canvas/render2/evas_render2_th_main.c
@@ -181,12 +181,13 @@ _evas_render2_regions_merge(Region *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);
+ int x1, y1, x2, y2;
+
+ x1 = (rects[i].x1 / tsize) * tsize;
+ y1 = (rects[i].y1 / tsize) * tsize;
+ x2 = ((rects[i].x2 + tsize - 1) / tsize) * tsize;
+ y2 = ((rects[i].y2 + tsize - 1) / tsize) * tsize;
+ region_rect_add(region2, x1, y1, x2 - x1, y2 - y1);
}
region_free(region);
return region2;
diff --git a/src/lib/evas/common/evas_tiler.c b/src/lib/evas/common/evas_tiler.c
index 74f5d18788..91d8fd2ba4 100644
--- a/src/lib/evas/common/evas_tiler.c
+++ b/src/lib/evas/common/evas_tiler.c
@@ -67,20 +67,56 @@ evas_common_tilebuf_clear(Tilebuf *tb)
tb->region = region_new(tb->outbuf_w, tb->outbuf_h);
}
+static Region *
+_region_round(Region *region, int tsize)
+{
+ Region *region2;
+ Box *rects;
+ int num, i, w, h;
+
+ region_size_get(region, &w, &h);
+ region2 = region_new(w, h);
+ rects = region_rects(region);
+ num = region_rects_num(region);
+ for (i = 0; i < num; i++)
+ {
+ int x1, y1, x2, y2;
+
+ x1 = (rects[i].x1 / tsize) * tsize;
+ y1 = (rects[i].y1 / tsize) * tsize;
+ x2 = ((rects[i].x2 + tsize - 1) / tsize) * tsize;
+ y2 = ((rects[i].y2 + tsize - 1) / tsize) * tsize;
+ region_rect_add(region2, x1, y1, x2 - x1, y2 - y1);
+ }
+ return region2;
+}
+
EAPI Tilebuf_Rect *
evas_common_tilebuf_get_render_rects(Tilebuf *tb)
{
Tilebuf_Rect *rects = NULL, *r, *rend, *rbuf;
+ Region *region2;
Box *rects2, *rs;
int n;
- rects2 = region_rects(tb->region);
- if (!rects2) return NULL;
- n = region_rects_num(tb->region);
+ region2 = _region_round(tb->region, 16);
+ if (!region2) return NULL;
+
+ rects2 = region_rects(region2);
+ if (!rects2)
+ {
+ region_free(region2);
+ return NULL;
+ }
+ n = region_rects_num(region2);
if (n <= 0) return NULL;
rbuf = malloc(n * sizeof(Tilebuf_Rect));
- if (!rbuf) return NULL;
+ if (!rbuf)
+ {
+ region_free(region2);
+ return NULL;
+ }
rend = rbuf + n;
rs = rects2;
@@ -98,6 +134,7 @@ evas_common_tilebuf_get_render_rects(Tilebuf *tb)
eina_inlist_append(EINA_INLIST_GET(rects),
EINA_INLIST_GET(r));
}
+ region_free(region2);
return rects;
}