Fix tests again on Windows.
[libdcp.git] / src / subtitle_asset.cc
index bd8bb993edb9874658418036c210324865622751..4baa7b06e8bf1a83ac5a89fd432315f23707c38d 100644 (file)
@@ -203,6 +203,10 @@ SubtitleAsset::position_align (SubtitleAsset::ParseState& ps, xmlpp::Element con
                ps.v_align = string_to_valign (va.get ());
        }
 
+       auto zp = optional_number_attribute<float>(node, "Zposition");
+       if (zp) {
+               ps.z_position = zp.get() / 100;
+       }
 }
 
 
@@ -320,7 +324,11 @@ SubtitleAsset::parse_subtitles (xmlpp::Element const * node, vector<ParseState>&
 void
 SubtitleAsset::maybe_add_subtitle (string text, vector<ParseState> const & parse_state, float space_before, Standard standard)
 {
-       if (empty_or_white_space (text)) {
+       auto wanted = [](ParseState const& ps) {
+               return ps.type && (ps.type.get() == ParseState::Type::TEXT || ps.type.get() == ParseState::Type::IMAGE);
+       };
+
+       if (find_if(parse_state.begin(), parse_state.end(), wanted) == parse_state.end()) {
                return;
        }
 
@@ -365,6 +373,9 @@ SubtitleAsset::maybe_add_subtitle (string text, vector<ParseState> const & parse
                if (i.v_align) {
                        ps.v_align = i.v_align.get();
                }
+               if (i.z_position) {
+                       ps.z_position = i.z_position.get();
+               }
                if (i.direction) {
                        ps.direction = i.direction.get();
                }
@@ -409,6 +420,7 @@ SubtitleAsset::maybe_add_subtitle (string text, vector<ParseState> const & parse
                                ps.h_align.get_value_or(HAlign::CENTER),
                                ps.v_position.get_value_or(0),
                                ps.v_align.get_value_or(VAlign::CENTER),
+                               ps.z_position.get_value_or(0),
                                ps.direction.get_value_or (Direction::LTR),
                                text,
                                ps.effect.get_value_or (Effect::NONE),
@@ -451,6 +463,7 @@ SubtitleAsset::maybe_add_subtitle (string text, vector<ParseState> const & parse
                                ps.h_align.get_value_or(HAlign::CENTER),
                                ps.v_position.get_value_or(0),
                                ps.v_align.get_value_or(VAlign::CENTER),
+                               ps.z_position.get_value_or(0),
                                ps.fade_up_time.get_value_or(Time()),
                                ps.fade_down_time.get_value_or(Time())
                                )
@@ -558,8 +571,7 @@ SubtitleAsset::equals (shared_ptr<const Asset> other_asset, EqualityOptions opti
                        return false;
                }
 
-               if (string_i && *string_i != *string_j) {
-                       note (NoteType::ERROR, String::compose("subtitles differ in text or metadata: %1 vs %2", string_i->text(), string_j->text()));
+               if (string_i && !string_i->equals(string_j, options, note)) {
                        return false;
                }
 
@@ -675,6 +687,7 @@ SubtitleAsset::subtitles_as_xml (xmlpp::Element* xml_root, int time_code_rate, S
        float last_h_position;
        VAlign last_v_align;
        float last_v_position;
+       float last_z_position;
        Direction last_direction;
 
        for (auto i: sorted) {
@@ -702,15 +715,17 @@ SubtitleAsset::subtitles_as_xml (xmlpp::Element* xml_root, int time_code_rate, S
                            fabs(last_h_position - is->h_position()) > ALIGN_EPSILON ||
                            last_v_align != is->v_align() ||
                            fabs(last_v_position - is->v_position()) > ALIGN_EPSILON ||
+                           fabs(last_z_position - is->z_position()) > ALIGN_EPSILON ||
                            last_direction != is->direction()
                                ) {
-                               text = make_shared<order::Text>(subtitle, is->h_align(), is->h_position(), is->v_align(), is->v_position(), is->direction());
+                               text = make_shared<order::Text>(subtitle, is->h_align(), is->h_position(), is->v_align(), is->v_position(), is->z_position(), is->direction());
                                subtitle->children.push_back (text);
 
                                last_h_align = is->h_align ();
                                last_h_position = is->h_position ();
                                last_v_align = is->v_align ();
                                last_v_position = is->v_position ();
+                               last_z_position = is->z_position();
                                last_direction = is->direction ();
                        }
 
@@ -721,7 +736,7 @@ SubtitleAsset::subtitles_as_xml (xmlpp::Element* xml_root, int time_code_rate, S
                if (ii) {
                        text.reset ();
                        subtitle->children.push_back (
-                               make_shared<order::Image>(subtitle, ii->id(), ii->png_image(), ii->h_align(), ii->h_position(), ii->v_align(), ii->v_position())
+                               make_shared<order::Image>(subtitle, ii->id(), ii->png_image(), ii->h_align(), ii->h_position(), ii->v_align(), ii->v_position(), ii->z_position())
                                );
                }
        }