Move VideoContentScale to its own file.
authorCarl Hetherington <cth@carlh.net>
Sun, 7 Sep 2014 23:28:03 +0000 (00:28 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 7 Sep 2014 23:28:03 +0000 (00:28 +0100)
src/lib/video_content.cc
src/lib/video_content.h
src/lib/video_content_scale.cc [new file with mode: 0644]
src/lib/video_content_scale.h [new file with mode: 0644]
src/lib/wscript

index 5a80dba7455cab235aaa34f1d7855b681a9f4620..13f2cf51676a9d10bb3b6acce245457d1dd2db66 100644 (file)
@@ -53,8 +53,6 @@ using boost::optional;
 using boost::dynamic_pointer_cast;
 using libdcp::raw_convert;
 
 using boost::dynamic_pointer_cast;
 using libdcp::raw_convert;
 
-vector<VideoContentScale> VideoContentScale::_scales;
-
 VideoContent::VideoContent (shared_ptr<const Film> f)
        : Content (f)
        , _video_length (0)
 VideoContent::VideoContent (shared_ptr<const Film> f)
        : Content (f)
        , _video_length (0)
@@ -427,138 +425,3 @@ VideoContent::set_video_frame_rate (float r)
        signal_changed (VideoContentProperty::VIDEO_FRAME_RATE);
 }
 
        signal_changed (VideoContentProperty::VIDEO_FRAME_RATE);
 }
 
-VideoContentScale::VideoContentScale (Ratio const * r)
-       : _ratio (r)
-       , _scale (true)
-{
-
-}
-
-VideoContentScale::VideoContentScale ()
-       : _ratio (0)
-       , _scale (false)
-{
-
-}
-
-VideoContentScale::VideoContentScale (bool scale)
-       : _ratio (0)
-       , _scale (scale)
-{
-
-}
-
-VideoContentScale::VideoContentScale (shared_ptr<cxml::Node> node)
-       : _ratio (0)
-       , _scale (true)
-{
-       optional<string> r = node->optional_string_child ("Ratio");
-       if (r) {
-               _ratio = Ratio::from_id (r.get ());
-       } else {
-               _scale = node->bool_child ("Scale");
-       }
-}
-
-void
-VideoContentScale::as_xml (xmlpp::Node* node) const
-{
-       if (_ratio) {
-               node->add_child("Ratio")->add_child_text (_ratio->id ());
-       } else {
-               node->add_child("Scale")->add_child_text (_scale ? "1" : "0");
-       }
-}
-
-string
-VideoContentScale::id () const
-{
-       SafeStringStream s;
-       
-       if (_ratio) {
-               s << _ratio->id ();
-       } else {
-               s << (_scale ? "S1" : "S0");
-       }
-       
-       return s.str ();
-}
-
-string
-VideoContentScale::name () const
-{
-       if (_ratio) {
-               return _ratio->nickname ();
-       }
-
-       if (_scale) {
-               return _("No stretch");
-       }
-
-       return _("No scale");
-}
-
-VideoContentScale
-VideoContentScale::from_id (string id)
-{
-       Ratio const * r = Ratio::from_id (id);
-       if (r) {
-               return VideoContentScale (r);
-       }
-
-       if (id == "S0") {
-               return VideoContentScale (false);
-       }
-
-       return VideoContentScale (true);
-}
-               
-/** @param display_container Size of the container that we are displaying this content in.
- *  @param film_container The size of the film's image.
- */
-libdcp::Size
-VideoContentScale::size (shared_ptr<const VideoContent> c, libdcp::Size display_container, libdcp::Size film_container) const
-{
-       if (_ratio) {
-               return fit_ratio_within (_ratio->ratio (), display_container);
-       }
-
-       libdcp::Size const ac = c->video_size_after_crop ();
-
-       /* Force scale if the film_container is smaller than the content's image */
-       if (_scale || film_container.width < ac.width || film_container.height < ac.height) {
-               return fit_ratio_within (ac.ratio (), display_container);
-       }
-
-       /* Scale the image so that it will be in the right place in film_container, even if display_container is a
-          different size.
-       */
-       return libdcp::Size (
-               c->video_size().width  * float(display_container.width)  / film_container.width,
-               c->video_size().height * float(display_container.height) / film_container.height
-               );
-}
-
-void
-VideoContentScale::setup_scales ()
-{
-       vector<Ratio const *> ratios = Ratio::all ();
-       for (vector<Ratio const *>::const_iterator i = ratios.begin(); i != ratios.end(); ++i) {
-               _scales.push_back (VideoContentScale (*i));
-       }
-
-       _scales.push_back (VideoContentScale (true));
-       _scales.push_back (VideoContentScale (false));
-}
-
-bool
-operator== (VideoContentScale const & a, VideoContentScale const & b)
-{
-       return (a.ratio() == b.ratio() && a.scale() == b.scale());
-}
-
-bool
-operator!= (VideoContentScale const & a, VideoContentScale const & b)
-{
-       return (a.ratio() != b.ratio() || a.scale() != b.scale());
-}
index 9404676808504d912814e70673d9d28e348826bb..3a7b44306ca80890b10deca55c496127860ff352 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "content.h"
 #include "colour_conversion.h"
 
 #include "content.h"
 #include "colour_conversion.h"
+#include "video_content_scale.h"
 
 class VideoExaminer;
 class Ratio;
 
 class VideoExaminer;
 class Ratio;
@@ -37,45 +38,6 @@ public:
        static int const COLOUR_CONVERSION;
 };
 
        static int const COLOUR_CONVERSION;
 };
 
-class VideoContentScale
-{
-public:
-       VideoContentScale ();
-       VideoContentScale (Ratio const *);
-       VideoContentScale (bool);
-       VideoContentScale (boost::shared_ptr<cxml::Node>);
-
-       libdcp::Size size (boost::shared_ptr<const VideoContent>, libdcp::Size, libdcp::Size) const;
-       std::string id () const;
-       std::string name () const;
-       void as_xml (xmlpp::Node *) const;
-
-       Ratio const * ratio () const {
-               return _ratio;
-       }
-
-       bool scale () const {
-               return _scale;
-       }
-
-       static void setup_scales ();
-       static std::vector<VideoContentScale> all () {
-               return _scales;
-       }
-       static VideoContentScale from_id (std::string id);
-
-private:
-       /** a ratio to stretch the content to, or 0 for no stretch */
-       Ratio const * _ratio;
-       /** true if we want to scale the content */
-       bool _scale;
-
-       static std::vector<VideoContentScale> _scales;
-};
-
-bool operator== (VideoContentScale const & a, VideoContentScale const & b);
-bool operator!= (VideoContentScale const & a, VideoContentScale const & b);
-
 class VideoContent : public virtual Content
 {
 public:
 class VideoContent : public virtual Content
 {
 public:
diff --git a/src/lib/video_content_scale.cc b/src/lib/video_content_scale.cc
new file mode 100644 (file)
index 0000000..e603582
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+    Copyright (C) 2013-2014 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 <boost/optional.hpp>
+#include <libxml++/libxml++.h>
+#include <libcxml/cxml.h>
+#include "video_content_scale.h"
+#include "ratio.h"
+#include "safe_stringstream.h"
+#include "util.h"
+
+#include "i18n.h"
+
+using std::vector;
+using std::string;
+using boost::shared_ptr;
+using boost::optional;
+
+vector<VideoContentScale> VideoContentScale::_scales;
+
+VideoContentScale::VideoContentScale (Ratio const * r)
+       : _ratio (r)
+       , _scale (true)
+{
+
+}
+
+VideoContentScale::VideoContentScale ()
+       : _ratio (0)
+       , _scale (false)
+{
+
+}
+
+VideoContentScale::VideoContentScale (bool scale)
+       : _ratio (0)
+       , _scale (scale)
+{
+
+}
+
+VideoContentScale::VideoContentScale (shared_ptr<cxml::Node> node)
+       : _ratio (0)
+       , _scale (true)
+{
+       optional<string> r = node->optional_string_child ("Ratio");
+       if (r) {
+               _ratio = Ratio::from_id (r.get ());
+       } else {
+               _scale = node->bool_child ("Scale");
+       }
+}
+
+void
+VideoContentScale::as_xml (xmlpp::Node* node) const
+{
+       if (_ratio) {
+               node->add_child("Ratio")->add_child_text (_ratio->id ());
+       } else {
+               node->add_child("Scale")->add_child_text (_scale ? "1" : "0");
+       }
+}
+
+string
+VideoContentScale::id () const
+{
+       SafeStringStream s;
+       
+       if (_ratio) {
+               s << _ratio->id ();
+       } else {
+               s << (_scale ? "S1" : "S0");
+       }
+       
+       return s.str ();
+}
+
+string
+VideoContentScale::name () const
+{
+       if (_ratio) {
+               return _ratio->nickname ();
+       }
+
+       if (_scale) {
+               return _("No stretch");
+       }
+
+       return _("No scale");
+}
+
+VideoContentScale
+VideoContentScale::from_id (string id)
+{
+       Ratio const * r = Ratio::from_id (id);
+       if (r) {
+               return VideoContentScale (r);
+       }
+
+       if (id == "S0") {
+               return VideoContentScale (false);
+       }
+
+       return VideoContentScale (true);
+}
+               
+/** @param display_container Size of the container that we are displaying this content in.
+ *  @param film_container The size of the film's image.
+ */
+libdcp::Size
+VideoContentScale::size (shared_ptr<const VideoContent> c, libdcp::Size display_container, libdcp::Size film_container) const
+{
+       if (_ratio) {
+               return fit_ratio_within (_ratio->ratio (), display_container);
+       }
+
+       libdcp::Size const ac = c->video_size_after_crop ();
+
+       /* Force scale if the film_container is smaller than the content's image */
+       if (_scale || film_container.width < ac.width || film_container.height < ac.height) {
+               return fit_ratio_within (ac.ratio (), display_container);
+       }
+
+       /* Scale the image so that it will be in the right place in film_container, even if display_container is a
+          different size.
+       */
+       return libdcp::Size (
+               c->video_size().width  * float(display_container.width)  / film_container.width,
+               c->video_size().height * float(display_container.height) / film_container.height
+               );
+}
+
+void
+VideoContentScale::setup_scales ()
+{
+       vector<Ratio const *> ratios = Ratio::all ();
+       for (vector<Ratio const *>::const_iterator i = ratios.begin(); i != ratios.end(); ++i) {
+               _scales.push_back (VideoContentScale (*i));
+       }
+
+       _scales.push_back (VideoContentScale (true));
+       _scales.push_back (VideoContentScale (false));
+}
+
+bool
+operator== (VideoContentScale const & a, VideoContentScale const & b)
+{
+       return (a.ratio() == b.ratio() && a.scale() == b.scale());
+}
+
+bool
+operator!= (VideoContentScale const & a, VideoContentScale const & b)
+{
+       return (a.ratio() != b.ratio() || a.scale() != b.scale());
+}
diff --git a/src/lib/video_content_scale.h b/src/lib/video_content_scale.h
new file mode 100644 (file)
index 0000000..87dd2f1
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+    Copyright (C) 2013-2014 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.
+
+*/
+
+#ifndef DCPOMATIC_VIDEO_CONTENT_SCALE_H
+#define DCPOMATIC_VIDEO_CONTENT_SCALE_H
+
+#include <vector>
+#include <boost/shared_ptr.hpp>
+#include <libdcp/util.h>
+
+namespace cxml {
+       class Node;
+}
+
+namespace xmlpp {
+       class Node;
+}
+
+class Ratio;
+class VideoContent;
+
+class VideoContentScale
+{
+public:
+       VideoContentScale ();
+       VideoContentScale (Ratio const *);
+       VideoContentScale (bool);
+       VideoContentScale (boost::shared_ptr<cxml::Node>);
+
+       libdcp::Size size (boost::shared_ptr<const VideoContent>, libdcp::Size, libdcp::Size) const;
+       std::string id () const;
+       std::string name () const;
+       void as_xml (xmlpp::Node *) const;
+
+       Ratio const * ratio () const {
+               return _ratio;
+       }
+
+       bool scale () const {
+               return _scale;
+       }
+
+       static void setup_scales ();
+       static std::vector<VideoContentScale> all () {
+               return _scales;
+       }
+       static VideoContentScale from_id (std::string id);
+
+private:
+       /** a ratio to stretch the content to, or 0 for no stretch */
+       Ratio const * _ratio;
+       /** true if we want to scale the content */
+       bool _scale;
+
+       static std::vector<VideoContentScale> _scales;
+};
+
+bool operator== (VideoContentScale const & a, VideoContentScale const & b);
+bool operator!= (VideoContentScale const & a, VideoContentScale const & b);
+
+#endif
index 1e4efddc4fbb2e49986265a2a877f44344ecd930..6c1da1772e696276161de2d0f9d7385bd68bf50d 100644 (file)
@@ -68,6 +68,7 @@ sources = """
           update.cc
           util.cc
           video_content.cc
           update.cc
           util.cc
           video_content.cc
+          video_content_scale.cc
           video_decoder.cc
           writer.cc
           """
           video_decoder.cc
           writer.cc
           """