Eina rectangle: Check for valid rectangle before taking intersection

Summary:
Check for valid rectangle

If any dst or src rectangle has zero width or height,
intersection should not return true.

@fix

Test Plan: Added test cases

Reviewers: cedric, herdsman, Hermet

Reviewed By: Hermet

Subscribers: shilpasingh, cedric

Differential Revision: https://phab.enlightenment.org/D2990
This commit is contained in:
Subodh Kumar 2015-08-28 16:27:21 +09:00 committed by ChunEon Park
parent 0a77262524
commit b35d2f9762
2 changed files with 27 additions and 9 deletions

View File

@ -19,6 +19,14 @@
#ifndef EINA_INLINE_RECTANGLE_H__ #ifndef EINA_INLINE_RECTANGLE_H__
#define EINA_INLINE_RECTANGLE_H__ #define EINA_INLINE_RECTANGLE_H__
static inline Eina_Bool
eina_rectangle_is_valid(const Eina_Rectangle *r)
{
if (r->w <= 0 || r->h <= 0)
return EINA_FALSE;
return EINA_TRUE;
}
static inline int static inline int
eina_spans_intersect(int c1, int l1, int c2, int l2) eina_spans_intersect(int c1, int l1, int c2, int l2)
{ {
@ -90,6 +98,9 @@ eina_rectangle_union(Eina_Rectangle *dst, const Eina_Rectangle *src)
static inline Eina_Bool static inline Eina_Bool
eina_rectangle_intersection(Eina_Rectangle *dst, const Eina_Rectangle *src) eina_rectangle_intersection(Eina_Rectangle *dst, const Eina_Rectangle *src)
{ {
if (!(eina_rectangle_is_valid(dst)) || !(eina_rectangle_is_valid(src)))
return EINA_FALSE;
if (!(eina_rectangles_intersect(dst, src))) if (!(eina_rectangles_intersect(dst, src)))
return EINA_FALSE; return EINA_FALSE;
@ -116,6 +127,9 @@ eina_rectangle_intersection(Eina_Rectangle *dst, const Eina_Rectangle *src)
if ((dst->y + dst->h) > (src->y + src->h)) if ((dst->y + dst->h) > (src->y + src->h))
dst->h = src->y + src->h - dst->y; dst->h = src->y + src->h - dst->y;
if (dst->w == 0 || dst->h == 0)
return EINA_FALSE;
return EINA_TRUE; return EINA_TRUE;
} }
@ -137,14 +151,6 @@ eina_rectangle_rescale_out(const Eina_Rectangle *out, const Eina_Rectangle *in,
res->h = out->h; res->h = out->h;
} }
static inline Eina_Bool
eina_rectangle_is_valid(const Eina_Rectangle *r)
{
if (r->w <= 0 || r->h <= 0)
return EINA_FALSE;
return EINA_TRUE;
}
static inline int static inline int
eina_rectangle_max_x(Eina_Rectangle *thiz) eina_rectangle_max_x(Eina_Rectangle *thiz)
{ {

View File

@ -74,7 +74,7 @@ END_TEST
START_TEST(eina_rectangle_union_intersect) START_TEST(eina_rectangle_union_intersect)
{ {
Eina_Rectangle r1, r2, r3, r4, r5, r6, rd; Eina_Rectangle r1, r2, r3, r4, r5, r6, r7, r8, rd;
fail_if(!eina_init()); fail_if(!eina_init());
@ -84,6 +84,9 @@ START_TEST(eina_rectangle_union_intersect)
EINA_RECTANGLE_SET(&r4, 30, 30, 50, 50); EINA_RECTANGLE_SET(&r4, 30, 30, 50, 50);
EINA_RECTANGLE_SET(&r5, 10, 10, 0, 0); EINA_RECTANGLE_SET(&r5, 10, 10, 0, 0);
EINA_RECTANGLE_SET(&r6, 30, 30, 0, 0); EINA_RECTANGLE_SET(&r6, 30, 30, 0, 0);
EINA_RECTANGLE_SET(&r7, 10, 10, 5, 0);
EINA_RECTANGLE_SET(&r8, 10, 10, 0, 5);
rd = r1; rd = r1;
@ -111,6 +114,15 @@ START_TEST(eina_rectangle_union_intersect)
|| rd.w != r1.w || rd.w != r1.w
|| rd.h != r1.h); || rd.h != r1.h);
rd = r6;
fail_if(eina_rectangle_intersection(&rd, &r5));
rd = r7;
fail_if(eina_rectangle_intersection(&rd, &r3));
rd = r8;
fail_if(eina_rectangle_intersection(&rd, &r3));
rd = r1; rd = r1;
eina_rectangle_union(&rd, &r3); eina_rectangle_union(&rd, &r3);
fail_if(rd.x != 0 fail_if(rd.x != 0