forked from enlightenment/efl
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:
parent
0a77262524
commit
b35d2f9762
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue