canvas engine: ++safety code

added null checking, no logical changes.
This commit is contained in:
Hermet Park 2020-07-27 14:27:52 +09:00
parent 29a72e9c6c
commit fb33fcb370
1 changed files with 46 additions and 44 deletions

View File

@ -3975,58 +3975,60 @@ _smart_merge(Tilebuf *tb, Tilebuf_Rect *rects)
box = region_rects(region); box = region_rects(region);
n = region_rects_num(region); n = region_rects_num(region);
merged = calloc(1, n * sizeof(Tilebuf_Rect)); merged = calloc(1, n * sizeof(Tilebuf_Rect));
j = 0; if (merged) {
j = 0;
#if 1 #if 1
// regions sometimes produce box sets like: // regions sometimes produce box sets like:
// +---+ // +---+
// | | // | |
// +---+ +-------+ // +---+ +-------+
// | | | | // | | | |
// +---+ +-------+---------+ // +---+ +-------+---------+
// | | // | |
// | | // | |
// +-----------------+ // +-----------------+
// so the upper-left 2 boxes can be merged into 1 and they have the same // so the upper-left 2 boxes can be merged into 1 and they have the same
// x coords and are flush-aligned one above the other. that is what // x coords and are flush-aligned one above the other. that is what
// this does - find these and merge them to have fewer rects // this does - find these and merge them to have fewer rects
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{
// skip empty boxes
if (box[i].x1 == box[i].x2) continue;
// walk all following boxes after this and see if they can be merged
// into box i
for (k = i + 1; k < n; k++)
{ {
// skip empty boxes after i // skip empty boxes
if (box[k].x1 == box[k].x2) continue; if (box[i].x1 == box[i].x2) continue;
// match x coords // walk all following boxes after this and see if they can be merged
if ((box[i].x1 == box[k].x1) && // if aligned vertically // into box i
(box[i].x2 == box[k].x2)) // exactly above/below for (k = i + 1; k < n; k++)
{ {
// right below, or right above // skip empty boxes after i
if (box[i].y2 == box[k].y1) // this box flush below if (box[k].x1 == box[k].x2) continue;
// match x coords
if ((box[i].x1 == box[k].x1) && // if aligned vertically
(box[i].x2 == box[k].x2)) // exactly above/below
{ {
box[i].y2 = box[k].y2; // merge below i // right below, or right above
box[k].x2 = box[k].x1; // empty this box - merged if (box[i].y2 == box[k].y1) // this box flush below
} {
else if (box[i].y1 == box[k].y2) // this box flush above box[i].y2 = box[k].y2; // merge below i
{ box[k].x2 = box[k].x1; // empty this box - merged
box[i].y2 = box[k].y2; // merge above i }
box[k].x2 = box[k].x1; // empty this box - merged else if (box[i].y1 == box[k].y2) // this box flush above
{
box[i].y2 = box[k].y2; // merge above i
box[k].x2 = box[k].x1; // empty this box - merged
}
} }
} }
// i may have expanded but will not be empty. future boxes after
// this may be empty though but handled at top of loop
merged[j].x = box[i].x1;
merged[j].y = box[i].y1;
merged[j].w = box[i].x2 - box[i].x1;
merged[j].h = box[i].y2 - box[i].y1;
mergelist = (Tilebuf_Rect *)eina_inlist_append
(EINA_INLIST_GET(mergelist), EINA_INLIST_GET(&(merged[j])));
j++;
} }
// i may have expanded but will not be empty. future boxes after
// this may be empty though but handled at top of loop
merged[j].x = box[i].x1;
merged[j].y = box[i].y1;
merged[j].w = box[i].x2 - box[i].x1;
merged[j].h = box[i].y2 - box[i].y1;
mergelist = (Tilebuf_Rect *)eina_inlist_append
(EINA_INLIST_GET(mergelist), EINA_INLIST_GET(&(merged[j])));
j++;
}
#endif #endif
}
region_free(region); region_free(region);
rects = mergelist; rects = mergelist;