From b35d2f976267b3b03124108aafb1d56219930ab2 Mon Sep 17 00:00:00 2001 From: Subodh Kumar Date: Fri, 28 Aug 2015 16:27:21 +0900 Subject: [PATCH] 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 --- src/lib/eina/eina_inline_rectangle.x | 22 ++++++++++++++-------- src/tests/eina/eina_test_rectangle.c | 14 +++++++++++++- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/lib/eina/eina_inline_rectangle.x b/src/lib/eina/eina_inline_rectangle.x index fafe1394a6..5956291dd3 100644 --- a/src/lib/eina/eina_inline_rectangle.x +++ b/src/lib/eina/eina_inline_rectangle.x @@ -19,6 +19,14 @@ #ifndef 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 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 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))) 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)) dst->h = src->y + src->h - dst->y; + if (dst->w == 0 || dst->h == 0) + return EINA_FALSE; + return EINA_TRUE; } @@ -137,14 +151,6 @@ eina_rectangle_rescale_out(const Eina_Rectangle *out, const Eina_Rectangle *in, 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 eina_rectangle_max_x(Eina_Rectangle *thiz) { diff --git a/src/tests/eina/eina_test_rectangle.c b/src/tests/eina/eina_test_rectangle.c index 089b68b1d7..08f8384dfa 100644 --- a/src/tests/eina/eina_test_rectangle.c +++ b/src/tests/eina/eina_test_rectangle.c @@ -74,7 +74,7 @@ END_TEST 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()); @@ -84,6 +84,9 @@ START_TEST(eina_rectangle_union_intersect) EINA_RECTANGLE_SET(&r4, 30, 30, 50, 50); EINA_RECTANGLE_SET(&r5, 10, 10, 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; @@ -111,6 +114,15 @@ START_TEST(eina_rectangle_union_intersect) || rd.w != r1.w || 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; eina_rectangle_union(&rd, &r3); fail_if(rd.x != 0