Add equality option for vertical subtitle position.
[libdcp.git] / src / subtitle.cc
index 6e3a29112fa2235aae3dbcea50c29c1c6c5a2d86..de3fe03f82cccdffebdc8d8455af2669321df096 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
     files in the program, then also delete it here.
 */
 
+
+/** @file  src/subtitle.cc
+ *  @brief Subtitle class
+ */
+
+
+#include "compose.hpp"
 #include "subtitle.h"
 #include "dcp_time.h"
 
+
+using std::shared_ptr;
 using namespace dcp;
 
+
 /** @param v_position Vertical position as a fraction of the screen height (between 0 and 1) from v_align */
 Subtitle::Subtitle (
        Time in,
@@ -44,6 +54,7 @@ Subtitle::Subtitle (
        HAlign h_align,
        float v_position,
        VAlign v_align,
+       float z_position,
        Time fade_up_time,
        Time fade_down_time
        )
@@ -53,8 +64,67 @@ Subtitle::Subtitle (
        , _h_align (h_align)
        , _v_position (v_position)
        , _v_align (v_align)
+       , _z_position(z_position)
        , _fade_up_time (fade_up_time)
        , _fade_down_time (fade_down_time)
 {
 
 }
+
+
+bool
+Subtitle::equals(shared_ptr<const Subtitle> other, EqualityOptions options, NoteHandler note) const
+{
+       bool same = true;
+
+       if (in() != other->in()) {
+               note(NoteType::ERROR, "subtitle in times differ");
+               same = false;
+       }
+
+       if (out() != other->out()) {
+               note(NoteType::ERROR, "subtitle out times differ");
+               same = false;
+       }
+
+       if (h_position() != other->h_position()) {
+               note(NoteType::ERROR, "subtitle horizontal positions differ");
+               same = false;
+       }
+
+       if (h_align() != other->h_align()) {
+               note(NoteType::ERROR, "subtitle horizontal alignments differ");
+               same = false;
+       }
+
+       auto const vpos = std::abs(v_position() - other->v_position());
+       if (vpos > options.max_subtitle_vertical_position_error)  {
+               note(
+                       NoteType::ERROR,
+                       String::compose("subtitle vertical positions differ by %1 (more than the allowed difference of %2)", vpos, options.max_subtitle_vertical_position_error)
+                   );
+               same = false;
+       }
+
+       if (v_align() != other->v_align()) {
+               note(NoteType::ERROR, "subtitle vertical alignments differ");
+               same = false;
+       }
+
+       if (z_position() != other->z_position()) {
+               note(NoteType::ERROR, "subtitle Z positions differ");
+               same = false;
+       }
+
+       if (fade_up_time() != other->fade_up_time()) {
+               note(NoteType::ERROR, "subtitle fade-up times differ");
+               same = false;
+       }
+
+       if (fade_down_time() != other->fade_down_time()) {
+               note(NoteType::ERROR, "subtitle fade-down times differ");
+               same = false;
+       }
+
+       return same;
+}