gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog libgeometry/Range2d.h testsuite...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog libgeometry/Range2d.h testsuite...
Date: Sun, 03 Dec 2006 21:43:11 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  06/12/03 21:43:11

Modified files:
        .              : ChangeLog 
        libgeometry    : Range2d.h 
        testsuite/libgeometry: Range2dTest.cpp 

Log message:
                * testsuite/libgeometry/Range2dTest.cpp: add tests for
                  growBy().
                * libgeometry/Range2d.h: fix growBy() to properly handle
                  numerical overflows ( see relative tests ).

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.1849&r2=1.1850
http://cvs.savannah.gnu.org/viewcvs/gnash/libgeometry/Range2d.h?cvsroot=gnash&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/libgeometry/Range2dTest.cpp?cvsroot=gnash&r1=1.1&r2=1.2

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.1849
retrieving revision 1.1850
diff -u -b -r1.1849 -r1.1850
--- ChangeLog   2 Dec 2006 23:13:38 -0000       1.1849
+++ ChangeLog   3 Dec 2006 21:43:11 -0000       1.1850
@@ -1,3 +1,10 @@
+2006-12-03 Sandro Santilli <address@hidden>
+
+       * testsuite/libgeometry/Range2dTest.cpp: add tests for
+         growBy().
+       * libgeometry/Range2d.h: fix growBy() to properly handle
+         numerical overflows ( see relative tests ).
+
 2006-12-02 Sandro Santilli <address@hidden>
 
        * libgeometry/Range2d.h: Add growBy() and shrinkBy() methods.

Index: libgeometry/Range2d.h
===================================================================
RCS file: /sources/gnash/gnash/libgeometry/Range2d.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- libgeometry/Range2d.h       2 Dec 2006 23:13:38 -0000       1.2
+++ libgeometry/Range2d.h       3 Dec 2006 21:43:11 -0000       1.3
@@ -19,7 +19,7 @@
 //
 
 
-/* $Id: Range2d.h,v 1.2 2006/12/02 23:13:38 strk Exp $ */
+/* $Id: Range2d.h,v 1.3 2006/12/03 21:43:11 strk Exp $ */
 
 #ifndef GNASH_RANGE2D_H
 #define GNASH_RANGE2D_H
@@ -32,6 +32,7 @@
 #include <limits>
 #include <algorithm>
 #include <cassert> // for inlines
+#include <iostream> // temporary include for debugging
 
 namespace gnash {
 
@@ -433,44 +434,21 @@
                //       warning when T is an unsigned type
                if ( amount < 0 ) return shrinkBy(-amount);
 
-               if ( amount > 0 )
-               {
-                       T lowerbound = std::numeric_limits<T>::min();
-                       T upperbound = std::numeric_limits<T>::max();
-
-                       // Compute space remaining before hitting the 
-                       // numeric limits
-
-                       T spaceleft = _xmin - lowerbound;
-                       T spaceright = upperbound - _xmax;
-                       T spacebottom = _ymin - lowerbound;
-                       T spacetop = upperbound - _ymax;
-
-                       // Turn this range into the WORLD range
-                       // if any limit is reached.
-
-                       if ( spaceleft <= amount ) return setWorld();
-                       if ( spaceright <= amount ) return setWorld();
-                       if ( spacebottom <= amount ) return setWorld();
-                       if ( spacetop <= amount ) return setWorld();
-
-               }
-               else
-               {
-                       // Turn this range into the NULL range
-                       // if any dimension collapses.
-                       // Don't use width() and height() to 
-                       // avoid superflous checks.
-
-                       if ( _xmax - _xmin <= amount ) return setNull();
-                       if ( _ymax - _ymin <= amount ) return setNull();
-
-               }
-
-               _xmin -= amount;
-               _ymin -= amount;
-               _xmax += amount;
-               _ymax += amount;
+               T newxmin = _xmin - amount;
+               if (newxmin > _xmin ) return setWorld();
+               else _xmin = newxmin;
+
+               T newxmax = _xmax + amount;
+               if (newxmax < _xmax ) return setWorld();
+               else _xmax = newxmax;
+
+               T newymin = _ymin - amount;
+               if (newymin > _ymin ) return setWorld();
+               else _ymin = newymin;
+
+               T newymax = _ymax + amount;
+               if (newymax < _ymax ) return setWorld();
+               else _ymax = newymax;
 
                return *this;
 
@@ -496,6 +474,10 @@
        ///       an 'unsigned' Range2d will likely raise unexpected
        ///       results.
        ///
+       /// TODO: change the interface to never make the Range null,
+       ///       as we might always use the Range *center* point
+       ///       instead of forgetting about it!
+       ///
        Range2d<T>& shrinkBy(T amount)
        {
                if ( isNull() || isWorld() || amount==0 ) return *this;
@@ -512,10 +494,10 @@
                if ( _xmax - _xmin <= amount ) return setNull();
                if ( _ymax - _ymin <= amount ) return setNull();
 
-               _xmin -= amount;
-               _ymin -= amount;
-               _xmax += amount;
-               _ymax += amount;
+               _xmin += amount;
+               _ymin += amount;
+               _xmax -= amount;
+               _ymax -= amount;
 
                return *this;
 

Index: testsuite/libgeometry/Range2dTest.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/libgeometry/Range2dTest.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- testsuite/libgeometry/Range2dTest.cpp       1 Dec 2006 15:38:18 -0000       
1.1
+++ testsuite/libgeometry/Range2dTest.cpp       3 Dec 2006 21:43:11 -0000       
1.2
@@ -68,6 +68,56 @@
        check( fIntRange1 != nullIntRange1 );
 
        //
+       // Test growBy()
+       //
+
+       check_equals(
+               Range2d<int>(0, 0, 1, 2).growBy(2),
+               Range2d<int>(-2, -2, 3, 4) );
+
+       // hit the numeric limits on each side
+       unsigned uupbound = std::numeric_limits<unsigned>::max();
+       // overflow xmin
+       check_equals(
+               Range2d<unsigned>(0, 3, 1, 6).growBy(2),
+               Range2d<unsigned>(worldRange) );
+       // overflow ymin
+       check_equals(
+               Range2d<unsigned>(3, 1, 7, 8).growBy(2),
+               Range2d<unsigned int>(worldRange) );
+       // overflow xmax
+       check_equals(
+               Range2d<unsigned>(10, 10, uupbound-1, 20).growBy(2),
+               Range2d<unsigned int>(worldRange) );
+       // overflow ymax
+       check_equals(
+               Range2d<unsigned>(10, 10, 20, uupbound-1).growBy(2),
+               Range2d<unsigned int>(worldRange) );
+       // overflow both direction so that min is still < max as a result
+       // (this is tricky)
+       check_equals(
+               Range2d<unsigned>(1, 1,
+                       uupbound-1, uupbound-1).growBy(uupbound),
+               Range2d<unsigned int>(worldRange) );
+
+       //
+       // Test shinkBy()
+       //
+
+       check_equals(
+               Range2d<int>(0, 0, 10, 20).shrinkBy(2),
+               Range2d<int>(2, 2, 8, 18) );
+
+       // Collapse horizontally
+       check_equals(
+               Range2d<int>(0, 3, 1, 6).shrinkBy(2),
+               Range2d<int>(nullRange) );
+       // Collapse vertically
+       check_equals(
+               Range2d<int>(0, 3, 10, 6).shrinkBy(8),
+               Range2d<int>(nullRange) );
+
+       //
        // Test range Union 
        //
 
@@ -178,7 +228,7 @@
                true
        );
 
-       // incribed ranges
+       // inscribed ranges
        check_equals(
                Intersection( Range2d<unsigned short>(0, 0, 10, 10),
                        Range2d<unsigned short>(2, 2, 5, 5)),




reply via email to

[Prev in Thread] Current Thread [Next in Thread]