From 321c0ec533184db305828bca5a6450c8948a770f Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 1 Aug 2017 17:19:18 +0300 Subject: [PATCH] core: empty() for Rect/Size templates Check for empty objects via .area() is not a good practice due overflows --- modules/core/include/opencv2/core/types.hpp | 21 +++++++++++++++++-- .../core/misc/java/src/java/core+Rect.java | 4 ++++ .../core/misc/java/src/java/core+Rect2d.java | 4 ++++ .../core/misc/java/src/java/core+Size.java | 4 ++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/modules/core/include/opencv2/core/types.hpp b/modules/core/include/opencv2/core/types.hpp index ffac2eeaaa..61cedc34f6 100644 --- a/modules/core/include/opencv2/core/types.hpp +++ b/modules/core/include/opencv2/core/types.hpp @@ -301,6 +301,8 @@ public: Size_& operator = (const Size_& sz); //! the area (width*height) _Tp area() const; + //! true if empty + bool empty() const; //! conversion of another data type. template operator Size_<_Tp2>() const; @@ -400,6 +402,8 @@ public: Size_<_Tp> size() const; //! area (width*height) of the rectangle _Tp area() const; + //! true if empty + bool empty() const; //! conversion to another data type template operator Rect_<_Tp2>() const; @@ -1599,6 +1603,13 @@ _Tp Size_<_Tp>::area() const return result; } +template inline +bool Size_<_Tp>::empty() const +{ + return width <= 0 || height <= 0; +} + + template static inline Size_<_Tp>& operator *= (Size_<_Tp>& a, _Tp b) { @@ -1741,6 +1752,12 @@ _Tp Rect_<_Tp>::area() const return result; } +template inline +bool Rect_<_Tp>::empty() const +{ + return width <= 0 || height <= 0; +} + template template inline Rect_<_Tp>::operator Rect_<_Tp2>() const { @@ -1803,10 +1820,10 @@ Rect_<_Tp>& operator &= ( Rect_<_Tp>& a, const Rect_<_Tp>& b ) template static inline Rect_<_Tp>& operator |= ( Rect_<_Tp>& a, const Rect_<_Tp>& b ) { - if (!a.area()) { + if (a.empty()) { a = b; } - else if (b.area()) { + else if (!b.empty()) { _Tp x1 = std::min(a.x, b.x); _Tp y1 = std::min(a.y, b.y); a.width = std::max(a.x + a.width, b.x + b.width) - x1; diff --git a/modules/core/misc/java/src/java/core+Rect.java b/modules/core/misc/java/src/java/core+Rect.java index 8f3fad71ee..c68e818ea4 100644 --- a/modules/core/misc/java/src/java/core+Rect.java +++ b/modules/core/misc/java/src/java/core+Rect.java @@ -65,6 +65,10 @@ public class Rect { return width * height; } + public boolean empty() { + return width <= 0 || height <= 0; + } + public boolean contains(Point p) { return x <= p.x && p.x < x + width && y <= p.y && p.y < y + height; } diff --git a/modules/core/misc/java/src/java/core+Rect2d.java b/modules/core/misc/java/src/java/core+Rect2d.java index cb83a97727..4c27869635 100644 --- a/modules/core/misc/java/src/java/core+Rect2d.java +++ b/modules/core/misc/java/src/java/core+Rect2d.java @@ -65,6 +65,10 @@ public class Rect2d { return width * height; } + public boolean empty() { + return width <= 0 || height <= 0; + } + public boolean contains(Point p) { return x <= p.x && p.x < x + width && y <= p.y && p.y < y + height; } diff --git a/modules/core/misc/java/src/java/core+Size.java b/modules/core/misc/java/src/java/core+Size.java index dcc5742420..f7d69f37cd 100644 --- a/modules/core/misc/java/src/java/core+Size.java +++ b/modules/core/misc/java/src/java/core+Size.java @@ -37,6 +37,10 @@ public class Size { return width * height; } + public boolean empty() { + return width <= 0 || height <= 0; + } + public Size clone() { return new Size(width, height); }