Fix build on Centos 7 (which gives a suggested parantheses warning)
[libdcp.git] / src / subtitle_asset_internal.cc
index 7a10f472faeff47a88b42e87cb498107970b6a8e..39f68624f3e4fd9091ab6ede7f64e226c9e034fd 100644 (file)
@@ -77,7 +77,7 @@ order::Font::Font (shared_ptr<SubtitleString> s, Standard standard)
 xmlpp::Element*
 order::Font::as_xml (xmlpp::Element* parent, Context&) const
 {
-       auto e = parent->add_child("Font");
+       auto e = cxml::add_child(parent, "Font");
        for (const auto& i: _values) {
                e->set_attribute (i.first, i.second);
        }
@@ -137,7 +137,7 @@ xmlpp::Element*
 order::String::as_xml (xmlpp::Element* parent, Context& context) const
 {
        if (fabs(_space_before) > SPACE_BEFORE_EPSILON) {
-               auto space = parent->add_child("Space");
+               auto space = cxml::add_child(parent, "Space");
                auto size = raw_convert<string>(_space_before, 2);
                if (context.standard == Standard::INTEROP) {
                        size += "em";
@@ -165,7 +165,7 @@ order::Part::write_xml (xmlpp::Element* parent, order::Context& context) const
 
 
 static void
-position_align (xmlpp::Element* e, order::Context& context, HAlign h_align, float h_position, VAlign v_align, float v_position)
+position_align (xmlpp::Element* e, order::Context& context, HAlign h_align, float h_position, VAlign v_align, float v_position, float z_position)
 {
        if (h_align != HAlign::CENTER) {
                if (context.standard == Standard::SMPTE) {
@@ -202,15 +202,19 @@ position_align (xmlpp::Element* e, order::Context& context, HAlign h_align, floa
                        e->set_attribute ("VPosition", "0");
                }
        }
+
+       if (fabs(z_position) > ALIGN_EPSILON && context.standard == Standard::SMPTE) {
+               e->set_attribute("Zposition", raw_convert<string>(z_position * 100, 6));
+       }
 }
 
 
 xmlpp::Element*
 order::Text::as_xml (xmlpp::Element* parent, Context& context) const
 {
-       auto e = parent->add_child ("Text");
+       auto e = cxml::add_child(parent, "Text");
 
-       position_align (e, context, _h_align, _h_position, _v_align, _v_position);
+       position_align(e, context, _h_align, _h_position, _v_align, _v_position, _z_position);
 
        /* Interop only supports "horizontal" or "vertical" for direction, so only write this
           for SMPTE.
@@ -219,6 +223,18 @@ order::Text::as_xml (xmlpp::Element* parent, Context& context) const
                e->set_attribute ("Direction", direction_to_string (_direction));
        }
 
+       for (auto const& ruby: _rubies) {
+               auto xml = cxml::add_child(e, "Ruby");
+               cxml::add_child(xml, "Rb")->add_child_text(ruby.base);
+               auto rt = cxml::add_child(xml, "Rt");
+               rt->add_child_text(ruby.annotation);
+               rt->set_attribute("Size", dcp::raw_convert<string>(ruby.size, 6));
+               rt->set_attribute("Position", ruby.position == RubyPosition::BEFORE ? "before" : "after");
+               rt->set_attribute("Offset", dcp::raw_convert<string>(ruby.offset, 6));
+               rt->set_attribute("Spacing", dcp::raw_convert<string>(ruby.spacing, 6));
+               rt->set_attribute("AspectAdjust", dcp::raw_convert<string>(ruby.aspect_adjust, 6));
+       }
+
        return e;
 }
 
@@ -226,7 +242,7 @@ order::Text::as_xml (xmlpp::Element* parent, Context& context) const
 xmlpp::Element*
 order::Subtitle::as_xml (xmlpp::Element* parent, Context& context) const
 {
-       auto e = parent->add_child ("Subtitle");
+       auto e = cxml::add_child(parent, "Subtitle");
        e->set_attribute ("SpotNumber", raw_convert<string> (context.spot_number++));
        e->set_attribute ("TimeIn", _in.rebase(context.time_code_rate).as_string(context.standard));
        e->set_attribute ("TimeOut", _out.rebase(context.time_code_rate).as_string(context.standard));
@@ -258,9 +274,9 @@ order::Font::clear ()
 xmlpp::Element *
 order::Image::as_xml (xmlpp::Element* parent, Context& context) const
 {
-       auto e = parent->add_child ("Image");
+       auto e = cxml::add_child(parent, "Image");
 
-       position_align (e, context, _h_align, _h_position, _v_align, _v_position);
+       position_align(e, context, _h_align, _h_position, _v_align, _v_position, _z_position);
        if (context.standard == Standard::SMPTE) {
                e->add_child_text ("urn:uuid:" + _id);
        } else {