summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubodh Kumar <s7158.kumar@samsung.com>2015-08-28 16:27:21 +0900
committerChunEon Park <hermet@hermet.pe.kr>2015-08-28 16:30:29 +0900
commitb35d2f976267b3b03124108aafb1d56219930ab2 (patch)
treef13fb60bbf7a1797f2d92d0f96f99ae6b10ef941
parent0a7726252427029ee8506d33ce2d4447bd5e17c4 (diff)
downloadefl-b35d2f976267b3b03124108aafb1d56219930ab2.tar.gz
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
-rw-r--r--src/lib/eina/eina_inline_rectangle.x22
-rw-r--r--src/tests/eina/eina_test_rectangle.c14
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