Add ContentVersion class.
[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         string const issue_date = "2018-09-02T04:45:18+00:00";
365         string const issuer = "libdcp";
366         string const creator = "libdcp";
367         string const annotation_text = "Created by libdcp";
368
369         shared_ptr<dcp::CPL> cpl (new dcp::CPL ("My film", dcp::FEATURE));
370         cpl->add (reel);
371         cpl->set_issuer (issuer);
372         cpl->set_creator (creator);
373         cpl->set_issue_date (issue_date);
374         cpl->set_annotation_text (annotation_text);
375         dcp::ContentVersion cv = cpl->content_version ();
376         cv.label_text = "foo";
377         cpl->set_content_version (cv);
378
379         dcp::DCP dcp ("build/test/write_interop_subtitle_test3");
380         dcp.add (cpl);
381         dcp.write_xml (dcp::INTEROP, issuer, creator, issue_date, annotation_text);
382
383         check_xml (
384                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/subs.xml"),
385                 dcp::file_to_string("build/test/write_interop_subtitle_test3/subs.xml"),
386                 list<string>()
387                 );
388         check_file ("build/test/write_interop_subtitle_test3/d36f4bb3-c4fa-4a95-9915-6fec3110cd71.png", "test/data/sub.png");
389
390         check_xml (
391                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/ASSETMAP"),
392                 dcp::file_to_string("build/test/write_interop_subtitle_test3/ASSETMAP"),
393                 list<string>()
394                 );
395
396         check_xml (
397                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/pkl.xml"),
398                 dcp::file_to_string("build/test/write_interop_subtitle_test3/pkl_6a9e31a6-50a4-4ecb-8683-fa667848470a.xml"),
399                 list<string>()
400                 );
401 }
402
403 /* Write some subtitle content as SMPTE XML and check that it is right */
404 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
405 {
406         dcp::SMPTESubtitleAsset c;
407         c.set_reel_number (1);
408         c.set_language ("EN");
409         c.set_content_title_text ("Test");
410         c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
411
412         c.add (
413                 shared_ptr<dcp::Subtitle> (
414                         new dcp::SubtitleString (
415                                 string ("Frutiger"),
416                                 false,
417                                 false,
418                                 false,
419                                 dcp::Colour (255, 255, 255),
420                                 48,
421                                 1.0,
422                                 dcp::Time (0, 4,  9, 22, 24),
423                                 dcp::Time (0, 4, 11, 22, 24),
424                                 0,
425                                 dcp::HALIGN_CENTER,
426                                 0.8,
427                                 dcp::VALIGN_TOP,
428                                 dcp::DIRECTION_LTR,
429                                 "Hello world",
430                                 dcp::NONE,
431                                 dcp::Colour (0, 0, 0),
432                                 dcp::Time (0, 0, 0, 0, 24),
433                                 dcp::Time (0, 0, 0, 0, 24)
434                                 )
435                         )
436                 );
437
438         c.add (
439                 shared_ptr<dcp::Subtitle> (
440                         new dcp::SubtitleString (
441                                 boost::optional<string> (),
442                                 true,
443                                 true,
444                                 true,
445                                 dcp::Colour (128, 0, 64),
446                                 91,
447                                 1.0,
448                                 dcp::Time (5, 41,  0, 21, 24),
449                                 dcp::Time (6, 12, 15, 21, 24),
450                                 0,
451                                 dcp::HALIGN_CENTER,
452                                 0.4,
453                                 dcp::VALIGN_BOTTOM,
454                                 dcp::DIRECTION_RTL,
455                                 "What's going on",
456                                 dcp::BORDER,
457                                 dcp::Colour (1, 2, 3),
458                                 dcp::Time (1, 2, 3, 4, 24),
459                                 dcp::Time (5, 6, 7, 8, 24)
460                                 )
461                         )
462                 );
463
464         c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
465
466         check_xml (
467                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
468                 "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
469                   "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
470                   "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
471                   "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
472                   "<dcst:ReelNumber>1</dcst:ReelNumber>"
473                   "<dcst:Language>EN</dcst:Language>"
474                   "<dcst:EditRate>24 1</dcst:EditRate>"
475                   "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
476                   "<dcst:SubtitleList>"
477                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
478                       "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:22\" TimeOut=\"00:04:11:22\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
479                         "<dcst:Text Valign=\"top\" Vposition=\"80\">Hello world</dcst:Text>"
480                       "</dcst:Subtitle>"
481                     "</dcst:Font>"
482                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underline=\"yes\" Weight=\"bold\">"
483                       "<dcst:Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:21\" TimeOut=\"06:12:15:21\" FadeUpTime=\"01:02:03:04\" FadeDownTime=\"05:06:07:08\">"
484                         "<dcst:Text Valign=\"bottom\" Vposition=\"40\" Direction=\"rtl\">What's going on</dcst:Text>"
485                       "</dcst:Subtitle>"
486                     "</dcst:Font>"
487                   "</dcst:SubtitleList>"
488                 "</dcst:SubtitleReel>",
489                 c.xml_as_string (),
490                 list<string> ()
491                 );
492 }
493
494 /* Write some subtitle content as SMPTE XML and check that it is right.
495    This includes in-line font changes.
496 */
497 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
498 {
499         dcp::SMPTESubtitleAsset c;
500         c.set_reel_number (1);
501         c.set_language ("EN");
502         c.set_content_title_text ("Test");
503         c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
504
505         c.add (
506                 shared_ptr<dcp::Subtitle> (
507                         new dcp::SubtitleString (
508                                 string ("Arial"),
509                                 false,
510                                 false,
511                                 false,
512                                 dcp::Colour (255, 255, 255),
513                                 48,
514                                 1.0,
515                                 dcp::Time (0, 0, 1, 0, 24),
516                                 dcp::Time (0, 0, 9, 0, 24),
517                                 0,
518                                 dcp::HALIGN_CENTER,
519                                 0.8,
520                                 dcp::VALIGN_TOP,
521                                 dcp::DIRECTION_LTR,
522                                 "Testing is ",
523                                 dcp::NONE,
524                                 dcp::Colour (0, 0, 0),
525                                 dcp::Time (0, 0, 0, 0, 24),
526                                 dcp::Time (0, 0, 0, 0, 24)
527                                 )
528                         )
529                 );
530
531         c.add (
532                 shared_ptr<dcp::Subtitle> (
533                         new dcp::SubtitleString (
534                                 string ("Arial"),
535                                 true,
536                                 false,
537                                 false,
538                                 dcp::Colour (255, 255, 255),
539                                 48,
540                                 1.0,
541                                 dcp::Time (0, 0, 1, 0, 24),
542                                 dcp::Time (0, 0, 9, 0, 24),
543                                 0,
544                                 dcp::HALIGN_CENTER,
545                                 0.8,
546                                 dcp::VALIGN_TOP,
547                                 dcp::DIRECTION_LTR,
548                                 "really",
549                                 dcp::NONE,
550                                 dcp::Colour (0, 0, 0),
551                                 dcp::Time (0, 0, 0, 0, 24),
552                                 dcp::Time (0, 0, 0, 0, 24)
553                                 )
554                         )
555                 );
556
557         c.add (
558                 shared_ptr<dcp::Subtitle> (
559                         new dcp::SubtitleString (
560                                 string ("Arial"),
561                                 false,
562                                 false,
563                                 false,
564                                 dcp::Colour (255, 255, 255),
565                                 48,
566                                 1.0,
567                                 dcp::Time (0, 0, 1, 0, 24),
568                                 dcp::Time (0, 0, 9, 0, 24),
569                                 0,
570                                 dcp::HALIGN_CENTER,
571                                 0.8,
572                                 dcp::VALIGN_TOP,
573                                 dcp::DIRECTION_LTR,
574                                 " fun",
575                                 dcp::NONE,
576                                 dcp::Colour (0, 0, 0),
577                                 dcp::Time (0, 0, 0, 0, 24),
578                                 dcp::Time (0, 0, 0, 0, 24)
579                                 )
580                         )
581                 );
582
583         c.add (
584                 shared_ptr<dcp::Subtitle> (
585                         new dcp::SubtitleString (
586                                 string ("Arial"),
587                                 false,
588                                 false,
589                                 false,
590                                 dcp::Colour (255, 255, 255),
591                                 48,
592                                 1.0,
593                                 dcp::Time (0, 0, 1, 0, 24),
594                                 dcp::Time (0, 0, 9, 0, 24),
595                                 0,
596                                 dcp::HALIGN_CENTER,
597                                 0.9,
598                                 dcp::VALIGN_TOP,
599                                 dcp::DIRECTION_LTR,
600                                 "This is the ",
601                                 dcp::NONE,
602                                 dcp::Colour (0, 0, 0),
603                                 dcp::Time (0, 0, 0, 0, 24),
604                                 dcp::Time (0, 0, 0, 0, 24)
605                                 )
606                         )
607                 );
608
609         c.add (
610                 shared_ptr<dcp::Subtitle> (
611                         new dcp::SubtitleString (
612                                 string ("Arial"),
613                                 true,
614                                 false,
615                                 false,
616                                 dcp::Colour (255, 255, 255),
617                                 48,
618                                 1.0,
619                                 dcp::Time (0, 0, 1, 0, 24),
620                                 dcp::Time (0, 0, 9, 0, 24),
621                                 0,
622                                 dcp::HALIGN_CENTER,
623                                 0.9,
624                                 dcp::VALIGN_TOP,
625                                 dcp::DIRECTION_LTR,
626                                 "second",
627                                 dcp::NONE,
628                                 dcp::Colour (0, 0, 0),
629                                 dcp::Time (0, 0, 0, 0, 24),
630                                 dcp::Time (0, 0, 0, 0, 24)
631                                 )
632                         )
633                 );
634
635         c.add (
636                 shared_ptr<dcp::Subtitle> (
637                         new dcp::SubtitleString (
638                                 string ("Arial"),
639                                 false,
640                                 false,
641                                 false,
642                                 dcp::Colour (255, 255, 255),
643                                 48,
644                                 1.0,
645                                 dcp::Time (0, 0, 1, 0, 24),
646                                 dcp::Time (0, 0, 9, 0, 24),
647                                 0,
648                                 dcp::HALIGN_CENTER,
649                                 0.9,
650                                 dcp::VALIGN_TOP,
651                                 dcp::DIRECTION_LTR,
652                                 " line",
653                                 dcp::NONE,
654                                 dcp::Colour (0, 0, 0),
655                                 dcp::Time (0, 0, 0, 0, 24),
656                                 dcp::Time (0, 0, 0, 0, 24)
657                                 )
658                         )
659                 );
660
661         c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
662
663         check_xml (
664                 c.xml_as_string (),
665                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
666                 "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
667                   "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
668                   "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
669                   "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
670                   "<dcst:ReelNumber>1</dcst:ReelNumber>"
671                   "<dcst:Language>EN</dcst:Language>"
672                   "<dcst:EditRate>24 1</dcst:EditRate>"
673                   "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
674                   "<dcst:SubtitleList>"
675                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
676                       "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
677                         "<dcst:Text Valign=\"top\" Vposition=\"80\">"
678                           "<dcst:Font Italic=\"no\">Testing is </dcst:Font>"
679                           "<dcst:Font Italic=\"yes\">really</dcst:Font>"
680                           "<dcst:Font Italic=\"no\"> fun</dcst:Font>"
681                         "</dcst:Text>"
682                         "<dcst:Text Valign=\"top\" Vposition=\"90\">"
683                           "<dcst:Font Italic=\"no\">This is the </dcst:Font>"
684                           "<dcst:Font Italic=\"yes\">second</dcst:Font>"
685                           "<dcst:Font Italic=\"no\"> line</dcst:Font>"
686                         "</dcst:Text>"
687                       "</dcst:Subtitle>"
688                     "</dcst:Font>"
689                   "</dcst:SubtitleList>"
690                 "</dcst:SubtitleReel>",
691                 list<string> ()
692                 );
693 }
694
695 /* Write some subtitle content as SMPTE using bitmaps and check that it is right */
696 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
697 {
698         dcp::SMPTESubtitleAsset c;
699         c.set_reel_number (1);
700         c.set_language ("EN");
701         c.set_content_title_text ("Test");
702
703         c.add (
704                 shared_ptr<dcp::Subtitle> (
705                         new dcp::SubtitleImage (
706                                 dcp::Data ("test/data/sub.png"),
707                                 dcp::Time (0, 4,  9, 22, 24),
708                                 dcp::Time (0, 4, 11, 22, 24),
709                                 0,
710                                 dcp::HALIGN_CENTER,
711                                 0.8,
712                                 dcp::VALIGN_TOP,
713                                 dcp::Time (0, 0, 0, 0, 24),
714                                 dcp::Time (0, 0, 0, 0, 24)
715                                 )
716                         )
717                 );
718
719         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
720
721         boost::filesystem::create_directories ("build/test/write_smpte_subtitle_test3");
722         c.write ("build/test/write_smpte_subtitle_test3/subs.mxf");
723
724         /* XXX: check this result when we can read them back in again */
725 }