Use the <Id> read in when the Reel was created from XML (if appropriate)
[libdcp.git] / test / write_subtitle_test.cc
1 /*
2     Copyright (C) 2015-2019 Carl Hetherington <cth@carlh.net>
3
4     This file is part of libdcp.
5
6     libdcp is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     libdcp is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with libdcp.  If not, see <http://www.gnu.org/licenses/>.
18
19     In addition, as a special exception, the copyright holders give
20     permission to link the code of portions of this program with the
21     OpenSSL library under certain conditions as described in each
22     individual source file, and distribute linked combinations
23     including the two.
24
25     You must obey the GNU General Public License in all respects
26     for all of the code used other than OpenSSL.  If you modify
27     file(s) with this exception, you may extend this exception to your
28     version of the file(s), but you are not obligated to do so.  If you
29     do not wish to do so, delete this exception statement from your
30     version.  If you delete this exception statement from all source
31     files in the program, then also delete it here.
32 */
33
34 #include "interop_subtitle_asset.h"
35 #include "smpte_subtitle_asset.h"
36 #include "subtitle_string.h"
37 #include "subtitle_image.h"
38 #include "subtitle_asset_internal.h"
39 #include "reel_subtitle_asset.h"
40 #include "reel.h"
41 #include "cpl.h"
42 #include "dcp.h"
43 #include "test.h"
44 #include "util.h"
45 #include <boost/test/unit_test.hpp>
46
47 using std::list;
48 using std::string;
49 using boost::shared_ptr;
50
51 /** Test dcp::order::Font::take_intersection */
52 BOOST_AUTO_TEST_CASE (take_intersection_test)
53 {
54         dcp::order::Font A;
55         A._values["foo"] = "bar";
56         A._values["fred"] = "jim";
57
58         dcp::order::Font B;
59         B._values["foo"] = "bar";
60         B._values["sheila"] = "baz";
61
62         A.take_intersection (B);
63         BOOST_REQUIRE_EQUAL (A._values.size(), 1);
64         BOOST_CHECK_EQUAL (A._values["foo"], "bar");
65
66         A._values.clear ();
67         B._values.clear ();
68
69         A._values["foo"] = "bar";
70         A._values["fred"] = "jim";
71
72         B._values["foo"] = "hello";
73         B._values["sheila"] = "baz";
74
75         A.take_intersection (B);
76         BOOST_CHECK_EQUAL (A._values.size(), 0);
77 }
78
79 /** Test dcp::order::Font::take_difference */
80 BOOST_AUTO_TEST_CASE (take_difference_test)
81 {
82         dcp::order::Font A;
83         A._values["foo"] = "bar";
84         A._values["fred"] = "jim";
85
86         dcp::order::Font B;
87         B._values["foo"] = "bar";
88         B._values["sheila"] = "baz";
89
90         A.take_difference (B);
91         BOOST_REQUIRE_EQUAL (A._values.size(), 1);
92         BOOST_CHECK_EQUAL (A._values["fred"], "jim");
93 }
94
95 /** Test dcp::order::Subtitle::pull_fonts */
96 BOOST_AUTO_TEST_CASE (pull_fonts_test1)
97 {
98         shared_ptr<dcp::order::Part> root (new dcp::order::Part (shared_ptr<dcp::order::Part> ()));
99         shared_ptr<dcp::order::Subtitle> sub1 (new dcp::order::Subtitle (root, dcp::Time(), dcp::Time(), dcp::Time(), dcp::Time()));
100         root->children.push_back (sub1);
101         shared_ptr<dcp::order::Text> text1 (new dcp::order::Text (sub1, dcp::HALIGN_CENTER, 0, dcp::VALIGN_TOP, 0, dcp::DIRECTION_LTR));
102         sub1->children.push_back (text1);
103         text1->font._values["font"] = "Inconsolata";
104         text1->font._values["size"] = "42";
105
106         dcp::SubtitleAsset::pull_fonts (root);
107
108         BOOST_REQUIRE_EQUAL (sub1->font._values.size(), 2);
109         BOOST_CHECK_EQUAL (sub1->font._values["font"], "Inconsolata");
110         BOOST_CHECK_EQUAL (sub1->font._values["size"], "42");
111         BOOST_CHECK_EQUAL (text1->font._values.size(), 0);
112 }
113
114 /** Test dcp::order::Subtitle::pull_fonts */
115 BOOST_AUTO_TEST_CASE (pull_fonts_test2)
116 {
117         shared_ptr<dcp::order::Part> root (new dcp::order::Part (shared_ptr<dcp::order::Part> ()));
118         shared_ptr<dcp::order::Subtitle> sub1 (new dcp::order::Subtitle (root, dcp::Time(), dcp::Time(), dcp::Time(), dcp::Time()));
119         root->children.push_back (sub1);
120         shared_ptr<dcp::order::Text> text1 (new dcp::order::Text (sub1, dcp::HALIGN_CENTER, 0, dcp::VALIGN_TOP, 0, dcp::DIRECTION_LTR));
121         sub1->children.push_back (text1);
122         text1->font._values["font"] = "Inconsolata";
123         text1->font._values["size"] = "42";
124         shared_ptr<dcp::order::Text> text2 (new dcp::order::Text (sub1, dcp::HALIGN_CENTER, 0, dcp::VALIGN_TOP, 0, dcp::DIRECTION_LTR));
125         sub1->children.push_back (text2);
126         text2->font._values["font"] = "Inconsolata";
127         text2->font._values["size"] = "48";
128
129         dcp::SubtitleAsset::pull_fonts (root);
130
131         BOOST_REQUIRE_EQUAL (sub1->font._values.size(), 1);
132         BOOST_CHECK_EQUAL (sub1->font._values["font"], "Inconsolata");
133         BOOST_REQUIRE_EQUAL (text1->font._values.size(), 1);
134         BOOST_CHECK_EQUAL (text1->font._values["size"], "42");
135         BOOST_REQUIRE_EQUAL (text2->font._values.size(), 1);
136         BOOST_CHECK_EQUAL (text2->font._values["size"], "48");
137 }
138
139 /** Test dcp::order::Subtitle::pull_fonts */
140 BOOST_AUTO_TEST_CASE (pull_fonts_test3)
141 {
142         shared_ptr<dcp::order::Part> root (new dcp::order::Part (shared_ptr<dcp::order::Part> ()));
143         shared_ptr<dcp::order::Subtitle> sub1 (new dcp::order::Subtitle (root, dcp::Time(), dcp::Time(), dcp::Time(), dcp::Time()));
144         root->children.push_back (sub1);
145         shared_ptr<dcp::order::Text> text1 (new dcp::order::Text (sub1, dcp::HALIGN_CENTER, 0, dcp::VALIGN_TOP, 0, dcp::DIRECTION_LTR));
146         sub1->children.push_back (text1);
147         dcp::order::Font font;
148         font._values["font"] = "Inconsolata";
149         font._values["size"] = "42";
150         shared_ptr<dcp::order::String> string1 (new dcp::order::String (text1, font, "Hello world"));
151         text1->children.push_back (string1);
152
153         dcp::SubtitleAsset::pull_fonts (root);
154
155         BOOST_REQUIRE_EQUAL (sub1->font._values.size(), 2);
156         BOOST_CHECK_EQUAL (sub1->font._values["font"], "Inconsolata");
157         BOOST_CHECK_EQUAL (sub1->font._values["size"], "42");
158 }
159
160 /** Write some subtitle content as Interop XML and check that it is right */
161 BOOST_AUTO_TEST_CASE (write_interop_subtitle_test)
162 {
163         dcp::InteropSubtitleAsset c;
164         c.set_reel_number ("1");
165         c.set_language ("EN");
166         c.set_movie_title ("Test");
167
168         c.add (
169                 shared_ptr<dcp::Subtitle> (
170                         new dcp::SubtitleString (
171                                 string ("Frutiger"),
172                                 false,
173                                 false,
174                                 false,
175                                 dcp::Colour (255, 255, 255),
176                                 48,
177                                 1.0,
178                                 dcp::Time (0, 4,  9, 22, 24),
179                                 dcp::Time (0, 4, 11, 22, 24),
180                                 0,
181                                 dcp::HALIGN_CENTER,
182                                 0.8,
183                                 dcp::VALIGN_TOP,
184                                 dcp::DIRECTION_LTR,
185                                 "Hello world",
186                                 dcp::NONE,
187                                 dcp::Colour (0, 0, 0),
188                                 dcp::Time (0, 0, 0, 0, 24),
189                                 dcp::Time (0, 0, 0, 0, 24)
190                                 )
191                         )
192                 );
193
194         c.add (
195                 shared_ptr<dcp::Subtitle> (
196                         new dcp::SubtitleString (
197                                 boost::optional<string> (),
198                                 true,
199                                 true,
200                                 true,
201                                 dcp::Colour (128, 0, 64),
202                                 91,
203                                 1.0,
204                                 dcp::Time (5, 41,  0, 21, 24),
205                                 dcp::Time (6, 12, 15, 21, 24),
206                                 0,
207                                 dcp::HALIGN_CENTER,
208                                 0.4,
209                                 dcp::VALIGN_BOTTOM,
210                                 dcp::DIRECTION_LTR,
211                                 "What's going on",
212                                 dcp::BORDER,
213                                 dcp::Colour (1, 2, 3),
214                                 dcp::Time (1, 2, 3, 4, 24),
215                                 dcp::Time (5, 6, 7, 8, 24)
216                                 )
217                         )
218                 );
219
220         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
221
222         check_xml (
223                 "<DCSubtitle Version=\"1.0\">"
224                   "<SubtitleID>a6c58cff-3e1e-4b38-acec-a42224475ef6</SubtitleID>"
225                   "<MovieTitle>Test</MovieTitle>"
226                   "<ReelNumber>1</ReelNumber>"
227                   "<Language>EN</Language>"
228                   "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" Id=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underlined=\"no\" Weight=\"normal\">"
229                     "<Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:229\" TimeOut=\"00:04:11:229\" FadeUpTime=\"0\" FadeDownTime=\"0\">"
230                       "<Text VAlign=\"top\" VPosition=\"80\">Hello world</Text>"
231                     "</Subtitle>"
232                   "</Font>"
233                   "<Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underlined=\"yes\" Weight=\"bold\">"
234                     "<Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:219\" TimeOut=\"06:12:15:219\" FadeUpTime=\"930792\" FadeDownTime=\"4591834\">"
235                       "<Text VAlign=\"bottom\" VPosition=\"40\">What's going on</Text>"
236                     "</Subtitle>"
237                   "</Font>"
238                 "</DCSubtitle>",
239                 c.xml_as_string (),
240                 list<string> ()
241                 );
242 }
243
244 /** Write some subtitle content as Interop XML and check that it is right.
245  *  This test includes some horizontal alignment.
246  */
247 BOOST_AUTO_TEST_CASE (write_interop_subtitle_test2)
248 {
249         dcp::InteropSubtitleAsset c;
250         c.set_reel_number ("1");
251         c.set_language ("EN");
252         c.set_movie_title ("Test");
253
254         c.add (
255                 shared_ptr<dcp::Subtitle> (
256                         new dcp::SubtitleString (
257                                 string ("Frutiger"),
258                                 false,
259                                 false,
260                                 false,
261                                 dcp::Colour (255, 255, 255),
262                                 48,
263                                 1.0,
264                                 dcp::Time (0, 4,  9, 22, 24),
265                                 dcp::Time (0, 4, 11, 22, 24),
266                                 -0.2,
267                                 dcp::HALIGN_CENTER,
268                                 0.8,
269                                 dcp::VALIGN_TOP,
270                                 dcp::DIRECTION_LTR,
271                                 "Hello world",
272                                 dcp::NONE,
273                                 dcp::Colour (0, 0, 0),
274                                 dcp::Time (0, 0, 0, 0, 24),
275                                 dcp::Time (0, 0, 0, 0, 24)
276                                 )
277                         )
278                 );
279
280         c.add (
281                 shared_ptr<dcp::Subtitle> (
282                         new dcp::SubtitleString (
283                                 boost::optional<string> (),
284                                 true,
285                                 true,
286                                 true,
287                                 dcp::Colour (128, 0, 64),
288                                 91,
289                                 1.0,
290                                 dcp::Time (5, 41,  0, 21, 24),
291                                 dcp::Time (6, 12, 15, 21, 24),
292                                 -0.2,
293                                 dcp::HALIGN_CENTER,
294                                 0.4,
295                                 dcp::VALIGN_BOTTOM,
296                                 dcp::DIRECTION_LTR,
297                                 "What's going on",
298                                 dcp::BORDER,
299                                 dcp::Colour (1, 2, 3),
300                                 dcp::Time (1, 2, 3, 4, 24),
301                                 dcp::Time (5, 6, 7, 8, 24)
302                                 )
303                         )
304                 );
305
306         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
307
308         check_xml (
309                 "<DCSubtitle Version=\"1.0\">"
310                   "<SubtitleID>a6c58cff-3e1e-4b38-acec-a42224475ef6</SubtitleID>"
311                   "<MovieTitle>Test</MovieTitle>"
312                   "<ReelNumber>1</ReelNumber>"
313                   "<Language>EN</Language>"
314                   "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" Id=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underlined=\"no\" Weight=\"normal\">"
315                     "<Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:229\" TimeOut=\"00:04:11:229\" FadeUpTime=\"0\" FadeDownTime=\"0\">"
316                       "<Text HPosition=\"-20\" VAlign=\"top\" VPosition=\"80\">Hello world</Text>"
317                     "</Subtitle>"
318                   "</Font>"
319                   "<Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underlined=\"yes\" Weight=\"bold\">"
320                     "<Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:219\" TimeOut=\"06:12:15:219\" FadeUpTime=\"930792\" FadeDownTime=\"4591834\">"
321                       "<Text HPosition=\"-20\" VAlign=\"bottom\" VPosition=\"40\">What's going on</Text>"
322                     "</Subtitle>"
323                   "</Font>"
324                 "</DCSubtitle>",
325                 c.xml_as_string (),
326                 list<string> ()
327                 );
328 }
329
330 /* Write some subtitle content as Interop XML using bitmaps and check that it is right */
331 BOOST_AUTO_TEST_CASE (write_interop_subtitle_test3)
332 {
333         RNGFixer fix;
334
335         shared_ptr<dcp::InteropSubtitleAsset> c (new dcp::InteropSubtitleAsset());
336         c->set_reel_number ("1");
337         c->set_language ("EN");
338         c->set_movie_title ("Test");
339
340         c->add (
341                 shared_ptr<dcp::Subtitle> (
342                         new dcp::SubtitleImage (
343                                 dcp::Data ("test/data/sub.png"),
344                                 dcp::Time (0, 4,  9, 22, 24),
345                                 dcp::Time (0, 4, 11, 22, 24),
346                                 0,
347                                 dcp::HALIGN_CENTER,
348                                 0.8,
349                                 dcp::VALIGN_TOP,
350                                 dcp::Time (0, 0, 0, 0, 24),
351                                 dcp::Time (0, 0, 0, 0, 24)
352                                 )
353                         )
354                 );
355
356         c->_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
357         boost::filesystem::remove_all ("build/test/write_interop_subtitle_test3");
358         boost::filesystem::create_directories ("build/test/write_interop_subtitle_test3");
359         c->write ("build/test/write_interop_subtitle_test3/subs.xml");
360
361         shared_ptr<dcp::Reel> reel (new dcp::Reel());
362         reel->add(shared_ptr<dcp::ReelSubtitleAsset>(new dcp::ReelSubtitleAsset(c, dcp::Fraction(24, 1), 6046, 0)));
363
364         dcp::XMLMetadata xml_meta;
365         xml_meta.issue_date = "2018-09-02T04:45:18+00:00";
366         xml_meta.issuer = "libdcp";
367         xml_meta.creator = "libdcp";
368         xml_meta.annotation_text = "Created by libdcp";
369
370         shared_ptr<dcp::CPL> cpl (new dcp::CPL ("My film", dcp::FEATURE));
371         cpl->add (reel);
372         cpl->set_metadata (xml_meta);
373         cpl->set_content_version_label_text ("foo");
374
375         dcp::DCP dcp ("build/test/write_interop_subtitle_test3");
376         dcp.add (cpl);
377         dcp.write_xml (dcp::INTEROP, xml_meta);
378
379         check_xml (
380                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/subs.xml"),
381                 dcp::file_to_string("build/test/write_interop_subtitle_test3/subs.xml"),
382                 list<string>()
383                 );
384         check_file ("build/test/write_interop_subtitle_test3/d36f4bb3-c4fa-4a95-9915-6fec3110cd71.png", "test/data/sub.png");
385
386         check_xml (
387                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/ASSETMAP"),
388                 dcp::file_to_string("build/test/write_interop_subtitle_test3/ASSETMAP"),
389                 list<string>()
390                 );
391
392         check_xml (
393                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/pkl.xml"),
394                 dcp::file_to_string("build/test/write_interop_subtitle_test3/pkl_6a9e31a6-50a4-4ecb-8683-fa667848470a.xml"),
395                 list<string>()
396                 );
397 }
398
399 /* Write some subtitle content as SMPTE XML and check that it is right */
400 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
401 {
402         dcp::SMPTESubtitleAsset c;
403         c.set_reel_number (1);
404         c.set_language ("EN");
405         c.set_content_title_text ("Test");
406         c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
407
408         c.add (
409                 shared_ptr<dcp::Subtitle> (
410                         new dcp::SubtitleString (
411                                 string ("Frutiger"),
412                                 false,
413                                 false,
414                                 false,
415                                 dcp::Colour (255, 255, 255),
416                                 48,
417                                 1.0,
418                                 dcp::Time (0, 4,  9, 22, 24),
419                                 dcp::Time (0, 4, 11, 22, 24),
420                                 0,
421                                 dcp::HALIGN_CENTER,
422                                 0.8,
423                                 dcp::VALIGN_TOP,
424                                 dcp::DIRECTION_LTR,
425                                 "Hello world",
426                                 dcp::NONE,
427                                 dcp::Colour (0, 0, 0),
428                                 dcp::Time (0, 0, 0, 0, 24),
429                                 dcp::Time (0, 0, 0, 0, 24)
430                                 )
431                         )
432                 );
433
434         c.add (
435                 shared_ptr<dcp::Subtitle> (
436                         new dcp::SubtitleString (
437                                 boost::optional<string> (),
438                                 true,
439                                 true,
440                                 true,
441                                 dcp::Colour (128, 0, 64),
442                                 91,
443                                 1.0,
444                                 dcp::Time (5, 41,  0, 21, 24),
445                                 dcp::Time (6, 12, 15, 21, 24),
446                                 0,
447                                 dcp::HALIGN_CENTER,
448                                 0.4,
449                                 dcp::VALIGN_BOTTOM,
450                                 dcp::DIRECTION_RTL,
451                                 "What's going on",
452                                 dcp::BORDER,
453                                 dcp::Colour (1, 2, 3),
454                                 dcp::Time (1, 2, 3, 4, 24),
455                                 dcp::Time (5, 6, 7, 8, 24)
456                                 )
457                         )
458                 );
459
460         c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
461
462         check_xml (
463                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
464                 "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
465                   "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
466                   "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
467                   "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
468                   "<dcst:ReelNumber>1</dcst:ReelNumber>"
469                   "<dcst:Language>EN</dcst:Language>"
470                   "<dcst:EditRate>24 1</dcst:EditRate>"
471                   "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
472                   "<dcst:SubtitleList>"
473                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
474                       "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:22\" TimeOut=\"00:04:11:22\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
475                         "<dcst:Text Valign=\"top\" Vposition=\"80\">Hello world</dcst:Text>"
476                       "</dcst:Subtitle>"
477                     "</dcst:Font>"
478                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underline=\"yes\" Weight=\"bold\">"
479                       "<dcst:Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:21\" TimeOut=\"06:12:15:21\" FadeUpTime=\"01:02:03:04\" FadeDownTime=\"05:06:07:08\">"
480                         "<dcst:Text Valign=\"bottom\" Vposition=\"40\" Direction=\"rtl\">What's going on</dcst:Text>"
481                       "</dcst:Subtitle>"
482                     "</dcst:Font>"
483                   "</dcst:SubtitleList>"
484                 "</dcst:SubtitleReel>",
485                 c.xml_as_string (),
486                 list<string> ()
487                 );
488 }
489
490 /* Write some subtitle content as SMPTE XML and check that it is right.
491    This includes in-line font changes.
492 */
493 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
494 {
495         dcp::SMPTESubtitleAsset c;
496         c.set_reel_number (1);
497         c.set_language ("EN");
498         c.set_content_title_text ("Test");
499         c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
500
501         c.add (
502                 shared_ptr<dcp::Subtitle> (
503                         new dcp::SubtitleString (
504                                 string ("Arial"),
505                                 false,
506                                 false,
507                                 false,
508                                 dcp::Colour (255, 255, 255),
509                                 48,
510                                 1.0,
511                                 dcp::Time (0, 0, 1, 0, 24),
512                                 dcp::Time (0, 0, 9, 0, 24),
513                                 0,
514                                 dcp::HALIGN_CENTER,
515                                 0.8,
516                                 dcp::VALIGN_TOP,
517                                 dcp::DIRECTION_LTR,
518                                 "Testing is ",
519                                 dcp::NONE,
520                                 dcp::Colour (0, 0, 0),
521                                 dcp::Time (0, 0, 0, 0, 24),
522                                 dcp::Time (0, 0, 0, 0, 24)
523                                 )
524                         )
525                 );
526
527         c.add (
528                 shared_ptr<dcp::Subtitle> (
529                         new dcp::SubtitleString (
530                                 string ("Arial"),
531                                 true,
532                                 false,
533                                 false,
534                                 dcp::Colour (255, 255, 255),
535                                 48,
536                                 1.0,
537                                 dcp::Time (0, 0, 1, 0, 24),
538                                 dcp::Time (0, 0, 9, 0, 24),
539                                 0,
540                                 dcp::HALIGN_CENTER,
541                                 0.8,
542                                 dcp::VALIGN_TOP,
543                                 dcp::DIRECTION_LTR,
544                                 "really",
545                                 dcp::NONE,
546                                 dcp::Colour (0, 0, 0),
547                                 dcp::Time (0, 0, 0, 0, 24),
548                                 dcp::Time (0, 0, 0, 0, 24)
549                                 )
550                         )
551                 );
552
553         c.add (
554                 shared_ptr<dcp::Subtitle> (
555                         new dcp::SubtitleString (
556                                 string ("Arial"),
557                                 false,
558                                 false,
559                                 false,
560                                 dcp::Colour (255, 255, 255),
561                                 48,
562                                 1.0,
563                                 dcp::Time (0, 0, 1, 0, 24),
564                                 dcp::Time (0, 0, 9, 0, 24),
565                                 0,
566                                 dcp::HALIGN_CENTER,
567                                 0.8,
568                                 dcp::VALIGN_TOP,
569                                 dcp::DIRECTION_LTR,
570                                 " fun",
571                                 dcp::NONE,
572                                 dcp::Colour (0, 0, 0),
573                                 dcp::Time (0, 0, 0, 0, 24),
574                                 dcp::Time (0, 0, 0, 0, 24)
575                                 )
576                         )
577                 );
578
579         c.add (
580                 shared_ptr<dcp::Subtitle> (
581                         new dcp::SubtitleString (
582                                 string ("Arial"),
583                                 false,
584                                 false,
585                                 false,
586                                 dcp::Colour (255, 255, 255),
587                                 48,
588                                 1.0,
589                                 dcp::Time (0, 0, 1, 0, 24),
590                                 dcp::Time (0, 0, 9, 0, 24),
591                                 0,
592                                 dcp::HALIGN_CENTER,
593                                 0.9,
594                                 dcp::VALIGN_TOP,
595                                 dcp::DIRECTION_LTR,
596                                 "This is the ",
597                                 dcp::NONE,
598                                 dcp::Colour (0, 0, 0),
599                                 dcp::Time (0, 0, 0, 0, 24),
600                                 dcp::Time (0, 0, 0, 0, 24)
601                                 )
602                         )
603                 );
604
605         c.add (
606                 shared_ptr<dcp::Subtitle> (
607                         new dcp::SubtitleString (
608                                 string ("Arial"),
609                                 true,
610                                 false,
611                                 false,
612                                 dcp::Colour (255, 255, 255),
613                                 48,
614                                 1.0,
615                                 dcp::Time (0, 0, 1, 0, 24),
616                                 dcp::Time (0, 0, 9, 0, 24),
617                                 0,
618                                 dcp::HALIGN_CENTER,
619                                 0.9,
620                                 dcp::VALIGN_TOP,
621                                 dcp::DIRECTION_LTR,
622                                 "second",
623                                 dcp::NONE,
624                                 dcp::Colour (0, 0, 0),
625                                 dcp::Time (0, 0, 0, 0, 24),
626                                 dcp::Time (0, 0, 0, 0, 24)
627                                 )
628                         )
629                 );
630
631         c.add (
632                 shared_ptr<dcp::Subtitle> (
633                         new dcp::SubtitleString (
634                                 string ("Arial"),
635                                 false,
636                                 false,
637                                 false,
638                                 dcp::Colour (255, 255, 255),
639                                 48,
640                                 1.0,
641                                 dcp::Time (0, 0, 1, 0, 24),
642                                 dcp::Time (0, 0, 9, 0, 24),
643                                 0,
644                                 dcp::HALIGN_CENTER,
645                                 0.9,
646                                 dcp::VALIGN_TOP,
647                                 dcp::DIRECTION_LTR,
648                                 " line",
649                                 dcp::NONE,
650                                 dcp::Colour (0, 0, 0),
651                                 dcp::Time (0, 0, 0, 0, 24),
652                                 dcp::Time (0, 0, 0, 0, 24)
653                                 )
654                         )
655                 );
656
657         c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
658
659         check_xml (
660                 c.xml_as_string (),
661                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
662                 "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
663                   "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
664                   "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
665                   "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
666                   "<dcst:ReelNumber>1</dcst:ReelNumber>"
667                   "<dcst:Language>EN</dcst:Language>"
668                   "<dcst:EditRate>24 1</dcst:EditRate>"
669                   "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
670                   "<dcst:SubtitleList>"
671                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
672                       "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
673                         "<dcst:Text Valign=\"top\" Vposition=\"80\">"
674                           "<dcst:Font Italic=\"no\">Testing is </dcst:Font>"
675                           "<dcst:Font Italic=\"yes\">really</dcst:Font>"
676                           "<dcst:Font Italic=\"no\"> fun</dcst:Font>"
677                         "</dcst:Text>"
678                         "<dcst:Text Valign=\"top\" Vposition=\"90\">"
679                           "<dcst:Font Italic=\"no\">This is the </dcst:Font>"
680                           "<dcst:Font Italic=\"yes\">second</dcst:Font>"
681                           "<dcst:Font Italic=\"no\"> line</dcst:Font>"
682                         "</dcst:Text>"
683                       "</dcst:Subtitle>"
684                     "</dcst:Font>"
685                   "</dcst:SubtitleList>"
686                 "</dcst:SubtitleReel>",
687                 list<string> ()
688                 );
689 }
690
691 /* Write some subtitle content as SMPTE using bitmaps and check that it is right */
692 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
693 {
694         dcp::SMPTESubtitleAsset c;
695         c.set_reel_number (1);
696         c.set_language ("EN");
697         c.set_content_title_text ("Test");
698
699         c.add (
700                 shared_ptr<dcp::Subtitle> (
701                         new dcp::SubtitleImage (
702                                 dcp::Data ("test/data/sub.png"),
703                                 dcp::Time (0, 4,  9, 22, 24),
704                                 dcp::Time (0, 4, 11, 22, 24),
705                                 0,
706                                 dcp::HALIGN_CENTER,
707                                 0.8,
708                                 dcp::VALIGN_TOP,
709                                 dcp::Time (0, 0, 0, 0, 24),
710                                 dcp::Time (0, 0, 0, 0, 24)
711                                 )
712                         )
713                 );
714
715         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
716
717         boost::filesystem::create_directories ("build/test/write_smpte_subtitle_test3");
718         c.write ("build/test/write_smpte_subtitle_test3/subs.mxf");
719
720         /* XXX: check this result when we can read them back in again */
721 }