X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fratio.cc;h=ea6d122bf1c6760b9889824e2fa6452ddc708a64;hb=c423bc90054e13eea2fc16bae9b6d30afdd361be;hp=5988b34188375eade8e2c8eac218de93b90bf141;hpb=373f010a7f04add1f49169cbaa60cb7ae5f508d4;p=dcpomatic.git diff --git a/src/lib/ratio.cc b/src/lib/ratio.cc index 5988b3418..ea6d122bf 100644 --- a/src/lib/ratio.cc +++ b/src/lib/ratio.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Carl Hetherington + Copyright (C) 2013-2015 Carl Hetherington 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 @@ -17,40 +17,28 @@ */ -#include #include "ratio.h" +#include "util.h" +#include +#include #include "i18n.h" using std::string; -using std::stringstream; using std::vector; vector Ratio::_ratios; -libdcp::Size -Ratio::size (libdcp::Size full_frame) const -{ - if (_ratio < static_cast(full_frame.width) / full_frame.height) { - return libdcp::Size (full_frame.height * _ratio, full_frame.height); - } else { - return libdcp::Size (full_frame.width, full_frame.width / _ratio); - } - - return libdcp::Size (); -} - - void Ratio::setup_ratios () { - _ratios.push_back (new Ratio (float(1285) / 1080, "119", _("1.19"), "F")); - _ratios.push_back (new Ratio (float(1436) / 1080, "133", _("4:3"), "F")); - _ratios.push_back (new Ratio (float(1480) / 1080, "137", _("Academy"), "F")); - _ratios.push_back (new Ratio (float(1485) / 1080, "138", _("1.375"), "F")); - _ratios.push_back (new Ratio (float(1793) / 1080, "166", _("1.66"), "F")); - _ratios.push_back (new Ratio (float(1920) / 1080, "178", _("16:9"), "F")); + _ratios.push_back (new Ratio (float(1290) / 1080, "119", _("1.19"), "119")); + _ratios.push_back (new Ratio (float(1440) / 1080, "133", _("4:3"), "133")); + _ratios.push_back (new Ratio (float(1485) / 1080, "138", _("Academy"), "137")); + _ratios.push_back (new Ratio (float(1800) / 1080, "166", _("1.66"), "166")); + _ratios.push_back (new Ratio (float(1920) / 1080, "178", _("16:9"), "178")); _ratios.push_back (new Ratio (float(1998) / 1080, "185", _("Flat"), "F")); + _ratios.push_back (new Ratio (float(2048) / 872, "235", _("2.35"), "S")); _ratios.push_back (new Ratio (float(2048) / 858, "239", _("Scope"), "S")); _ratios.push_back (new Ratio (float(2048) / 1080, "full-frame", _("Full frame"), "C")); } @@ -58,6 +46,11 @@ Ratio::setup_ratios () Ratio const * Ratio::from_id (string i) { + /* We removed the ratio with id 137; replace it with 138 */ + if (i == "137") { + i = "138"; + } + vector::iterator j = _ratios.begin (); while (j != _ratios.end() && (*j)->id() != i) { ++j; @@ -69,3 +62,36 @@ Ratio::from_id (string i) return *j; } + +/** @return Ratio corresponding to a given fractional ratio (+/- 0.01), or 0 */ +Ratio const * +Ratio::from_ratio (float r) +{ + vector::iterator j = _ratios.begin (); + while (j != _ratios.end() && fabs ((*j)->ratio() - r) > 0.01) { + ++j; + } + + if (j == _ratios.end ()) { + return 0; + } + + return *j; +} + +Ratio const * +Ratio::nearest_from_ratio (float r) +{ + Ratio const * nearest = 0; + float distance = FLT_MAX; + + for (vector::iterator i = _ratios.begin (); i != _ratios.end(); ++i) { + float const d = fabs ((*i)->ratio() - r); + if (d < distance) { + distance = d; + nearest = *i; + } + } + + return nearest; +}