[Top][All Lists]
[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)),
- [Gnash-commit] gnash ChangeLog libgeometry/Range2d.h testsuite...,
Sandro Santilli <=