diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-01-07 23:16:41 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-01-07 23:16:41 +0000 |
| commit | 9361d68621cc45bc8a13c9eebe7fee1b405a3e0e (patch) | |
| tree | 1db488e441bf7e6c5968354081b5d83cf6af3205 | |
| parent | 74765c0660239f48702ebc6d149d522b85392b63 (diff) | |
Add operator< for VerticalPosition.
| -rw-r--r-- | src/vertical_position.cc | 31 | ||||
| -rw-r--r-- | src/vertical_position.h | 3 | ||||
| -rw-r--r-- | test/vertical_position_test.cc | 95 | ||||
| -rw-r--r-- | test/wscript | 1 |
4 files changed, 130 insertions, 0 deletions
diff --git a/src/vertical_position.cc b/src/vertical_position.cc index cdf0b6c..37930d0 100644 --- a/src/vertical_position.cc +++ b/src/vertical_position.cc @@ -21,6 +21,29 @@ using namespace sub; +float +VerticalPosition::fraction_from_screen_top () const +{ + if (!reference || (!proportional && !line)) { + return 0; + } + + float const prop = proportional ? proportional.get() : (float (line.get()) / lines.get ()); + + switch (reference.get ()) { + case TOP_OF_SCREEN: + return prop; + case CENTRE_OF_SCREEN: + return prop + 0.5; + case BOTTOM_OF_SCREEN: + return 1 - prop; + case TOP_OF_SUBTITLE: + return prop; + } + + return 0; +} + bool VerticalPosition::operator== (VerticalPosition const & other) const { @@ -32,3 +55,11 @@ VerticalPosition::operator== (VerticalPosition const & other) const return false; } + +bool +VerticalPosition::operator< (VerticalPosition const & other) const +{ + return fraction_from_screen_top() < other.fraction_from_screen_top(); +} + + diff --git a/src/vertical_position.h b/src/vertical_position.h index 77b0675..9f04056 100644 --- a/src/vertical_position.h +++ b/src/vertical_position.h @@ -41,6 +41,9 @@ public: boost::optional<VerticalReference> reference; bool operator== (VerticalPosition const & other) const; + bool operator< (VerticalPosition const & other) const; + + float fraction_from_screen_top () const; }; } diff --git a/test/vertical_position_test.cc b/test/vertical_position_test.cc new file mode 100644 index 0000000..3204113 --- /dev/null +++ b/test/vertical_position_test.cc @@ -0,0 +1,95 @@ +/* + Copyright (C) 2015 Carl Hetherington <cth@carlh.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "vertical_position.h" +#include <boost/test/unit_test.hpp> + +using boost::optional; + +/* Test operator< for VerticalPosition */ +BOOST_AUTO_TEST_CASE (vertical_position_test) +{ + sub::VerticalPosition a; + sub::VerticalPosition b; + + /* Simple */ + + a.proportional = 0.3; + a.reference = sub::TOP_OF_SCREEN; + b.proportional = 0.4; + b.reference = sub::TOP_OF_SCREEN; + BOOST_CHECK (a < b); + + a.proportional = 0.5; + a.reference = sub::TOP_OF_SCREEN; + b.proportional = 0.1; + b.reference = sub::TOP_OF_SCREEN; + BOOST_CHECK (b < a); + + a.proportional = optional<float> (); + b.proportional = optional<float> (); + + a.line = 4; + a.lines = 25; + a.reference = sub::TOP_OF_SCREEN; + b.line = 6; + b.lines = 25; + b.reference = sub::TOP_OF_SCREEN; + BOOST_CHECK (a < b); + + a.line = 17; + a.lines = 25; + a.reference = sub::TOP_OF_SCREEN; + b.line = 2; + b.lines = 25; + b.reference = sub::TOP_OF_SCREEN; + BOOST_CHECK (b < a); + + /* Different reference points with proportional */ + + a.line = optional<int> (); + a.lines = optional<int> (); + b.line = optional<int> (); + b.lines = optional<int> (); + + a.proportional = 0.7; + a.reference = sub::TOP_OF_SCREEN; + b.proportional = 0.3; + b.reference = sub::CENTRE_OF_SCREEN; + BOOST_CHECK (a < b); + + a.proportional = 0.9; + a.reference = sub::BOTTOM_OF_SCREEN; + b.proportional = 0.1; + b.reference = sub::TOP_OF_SCREEN; + BOOST_CHECK (b < a); + + /* Different line counts with lines */ + + a.proportional = optional<float> (); + b.proportional = optional<float> (); + + a.line = 12; + a.lines = 99; + a.reference = sub::TOP_OF_SCREEN; + b.line = 12; + b.lines = 25; + b.reference = sub::TOP_OF_SCREEN; + BOOST_CHECK (a < b); +} diff --git a/test/wscript b/test/wscript index 2c8c327..286f62f 100644 --- a/test/wscript +++ b/test/wscript @@ -29,6 +29,7 @@ def build(bld): subrip_reader_test.cc time_test.cc test.cc + vertical_position_test.cc """ obj.target = 'tests' obj.install_path = '' |
