Remove ReelEncryptableAsset and tidy up a bit.
[libdcp.git] / test / write_subtitle_test.cc
1 /*
2     Copyright (C) 2015-2021 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_interop_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::string;
48 using std::shared_ptr;
49 using std::vector;
50 using std::make_shared;
51 using boost::optional;
52
53 /** Test dcp::order::Font::take_intersection */
54 BOOST_AUTO_TEST_CASE (take_intersection_test)
55 {
56         dcp::order::Font A;
57         A._values["foo"] = "bar";
58         A._values["fred"] = "jim";
59
60         dcp::order::Font B;
61         B._values["foo"] = "bar";
62         B._values["sheila"] = "baz";
63
64         A.take_intersection (B);
65         BOOST_REQUIRE_EQUAL (A._values.size(), 1);
66         BOOST_CHECK_EQUAL (A._values["foo"], "bar");
67
68         A._values.clear ();
69         B._values.clear ();
70
71         A._values["foo"] = "bar";
72         A._values["fred"] = "jim";
73
74         B._values["foo"] = "hello";
75         B._values["sheila"] = "baz";
76
77         A.take_intersection (B);
78         BOOST_CHECK_EQUAL (A._values.size(), 0);
79 }
80
81 /** Test dcp::order::Font::take_difference */
82 BOOST_AUTO_TEST_CASE (take_difference_test)
83 {
84         dcp::order::Font A;
85         A._values["foo"] = "bar";
86         A._values["fred"] = "jim";
87
88         dcp::order::Font B;
89         B._values["foo"] = "bar";
90         B._values["sheila"] = "baz";
91
92         A.take_difference (B);
93         BOOST_REQUIRE_EQUAL (A._values.size(), 1);
94         BOOST_CHECK_EQUAL (A._values["fred"], "jim");
95 }
96
97 /** Test dcp::order::Subtitle::pull_fonts */
98 BOOST_AUTO_TEST_CASE (pull_fonts_test1)
99 {
100         auto root = make_shared<dcp::order::Part>(shared_ptr<dcp::order::Part>());
101         auto sub1 = make_shared<dcp::order::Subtitle>(root, dcp::Time(), dcp::Time(), dcp::Time(), dcp::Time());
102         root->children.push_back (sub1);
103         auto text1 = make_shared<dcp::order::Text>(sub1, dcp::HAlign::CENTER, 0, dcp::VAlign::TOP, 0, dcp::Direction::LTR);
104         sub1->children.push_back (text1);
105         text1->font._values["font"] = "Inconsolata";
106         text1->font._values["size"] = "42";
107
108         dcp::SubtitleAsset::pull_fonts (root);
109
110         BOOST_REQUIRE_EQUAL (sub1->font._values.size(), 2);
111         BOOST_CHECK_EQUAL (sub1->font._values["font"], "Inconsolata");
112         BOOST_CHECK_EQUAL (sub1->font._values["size"], "42");
113         BOOST_CHECK_EQUAL (text1->font._values.size(), 0);
114 }
115
116 /** Test dcp::order::Subtitle::pull_fonts */
117 BOOST_AUTO_TEST_CASE (pull_fonts_test2)
118 {
119         shared_ptr<dcp::order::Part> root (new dcp::order::Part (shared_ptr<dcp::order::Part> ()));
120         shared_ptr<dcp::order::Subtitle> sub1 (new dcp::order::Subtitle (root, dcp::Time(), dcp::Time(), dcp::Time(), dcp::Time()));
121         root->children.push_back (sub1);
122         shared_ptr<dcp::order::Text> text1 (new dcp::order::Text (sub1, dcp::HAlign::CENTER, 0, dcp::VAlign::TOP, 0, dcp::Direction::LTR));
123         sub1->children.push_back (text1);
124         text1->font._values["font"] = "Inconsolata";
125         text1->font._values["size"] = "42";
126         shared_ptr<dcp::order::Text> text2 (new dcp::order::Text (sub1, dcp::HAlign::CENTER, 0, dcp::VAlign::TOP, 0, dcp::Direction::LTR));
127         sub1->children.push_back (text2);
128         text2->font._values["font"] = "Inconsolata";
129         text2->font._values["size"] = "48";
130
131         dcp::SubtitleAsset::pull_fonts (root);
132
133         BOOST_REQUIRE_EQUAL (sub1->font._values.size(), 1);
134         BOOST_CHECK_EQUAL (sub1->font._values["font"], "Inconsolata");
135         BOOST_REQUIRE_EQUAL (text1->font._values.size(), 1);
136         BOOST_CHECK_EQUAL (text1->font._values["size"], "42");
137         BOOST_REQUIRE_EQUAL (text2->font._values.size(), 1);
138         BOOST_CHECK_EQUAL (text2->font._values["size"], "48");
139 }
140
141 /** Test dcp::order::Subtitle::pull_fonts */
142 BOOST_AUTO_TEST_CASE (pull_fonts_test3)
143 {
144         shared_ptr<dcp::order::Part> root (new dcp::order::Part (shared_ptr<dcp::order::Part> ()));
145         shared_ptr<dcp::order::Subtitle> sub1 (new dcp::order::Subtitle (root, dcp::Time(), dcp::Time(), dcp::Time(), dcp::Time()));
146         root->children.push_back (sub1);
147         shared_ptr<dcp::order::Text> text1 (new dcp::order::Text (sub1, dcp::HAlign::CENTER, 0, dcp::VAlign::TOP, 0, dcp::Direction::LTR));
148         sub1->children.push_back (text1);
149         dcp::order::Font font;
150         font._values["font"] = "Inconsolata";
151         font._values["size"] = "42";
152         shared_ptr<dcp::order::String> string1 (new dcp::order::String (text1, font, "Hello world"));
153         text1->children.push_back (string1);
154
155         dcp::SubtitleAsset::pull_fonts (root);
156
157         BOOST_REQUIRE_EQUAL (sub1->font._values.size(), 2);
158         BOOST_CHECK_EQUAL (sub1->font._values["font"], "Inconsolata");
159         BOOST_CHECK_EQUAL (sub1->font._values["size"], "42");
160 }
161
162 /** Write some subtitle content as Interop XML and check that it is right */
163 BOOST_AUTO_TEST_CASE (write_interop_subtitle_test)
164 {
165         dcp::InteropSubtitleAsset c;
166         c.set_reel_number ("1");
167         c.set_language ("EN");
168         c.set_movie_title ("Test");
169
170         c.add (
171                 shared_ptr<dcp::Subtitle> (
172                         new dcp::SubtitleString (
173                                 string ("Frutiger"),
174                                 false,
175                                 false,
176                                 false,
177                                 dcp::Colour (255, 255, 255),
178                                 48,
179                                 1.0,
180                                 dcp::Time (0, 4,  9, 22, 24),
181                                 dcp::Time (0, 4, 11, 22, 24),
182                                 0,
183                                 dcp::HAlign::CENTER,
184                                 0.8,
185                                 dcp::VAlign::TOP,
186                                 dcp::Direction::LTR,
187                                 "Hello world",
188                                 dcp::Effect::NONE,
189                                 dcp::Colour (0, 0, 0),
190                                 dcp::Time (0, 0, 0, 0, 24),
191                                 dcp::Time (0, 0, 0, 0, 24)
192                                 )
193                         )
194                 );
195
196         c.add (
197                 shared_ptr<dcp::Subtitle> (
198                         new dcp::SubtitleString (
199                                 boost::optional<string> (),
200                                 true,
201                                 true,
202                                 true,
203                                 dcp::Colour (128, 0, 64),
204                                 91,
205                                 1.0,
206                                 dcp::Time (5, 41,  0, 21, 24),
207                                 dcp::Time (6, 12, 15, 21, 24),
208                                 0,
209                                 dcp::HAlign::CENTER,
210                                 0.4,
211                                 dcp::VAlign::BOTTOM,
212                                 dcp::Direction::LTR,
213                                 "What's going on",
214                                 dcp::Effect::BORDER,
215                                 dcp::Colour (1, 2, 3),
216                                 dcp::Time (1, 2, 3, 4, 24),
217                                 dcp::Time (5, 6, 7, 8, 24)
218                                 )
219                         )
220                 );
221
222         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
223
224         check_xml (
225                 "<DCSubtitle Version=\"1.0\">"
226                   "<SubtitleID>a6c58cff-3e1e-4b38-acec-a42224475ef6</SubtitleID>"
227                   "<MovieTitle>Test</MovieTitle>"
228                   "<ReelNumber>1</ReelNumber>"
229                   "<Language>EN</Language>"
230                   "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" Id=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underlined=\"no\" Weight=\"normal\">"
231                     "<Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:229\" TimeOut=\"00:04:11:229\" FadeUpTime=\"0\" FadeDownTime=\"0\">"
232                       "<Text VAlign=\"top\" VPosition=\"80\">Hello world</Text>"
233                     "</Subtitle>"
234                   "</Font>"
235                   "<Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underlined=\"yes\" Weight=\"bold\">"
236                     "<Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:219\" TimeOut=\"06:12:15:219\" FadeUpTime=\"930792\" FadeDownTime=\"4591834\">"
237                       "<Text VAlign=\"bottom\" VPosition=\"40\">What's going on</Text>"
238                     "</Subtitle>"
239                   "</Font>"
240                 "</DCSubtitle>",
241                 c.xml_as_string (),
242                 vector<string>()
243                 );
244 }
245
246 /** Write some subtitle content as Interop XML and check that it is right.
247  *  This test includes some horizontal alignment.
248  */
249 BOOST_AUTO_TEST_CASE (write_interop_subtitle_test2)
250 {
251         dcp::InteropSubtitleAsset c;
252         c.set_reel_number ("1");
253         c.set_language ("EN");
254         c.set_movie_title ("Test");
255
256         c.add (
257                 shared_ptr<dcp::Subtitle> (
258                         new dcp::SubtitleString (
259                                 string ("Frutiger"),
260                                 false,
261                                 false,
262                                 false,
263                                 dcp::Colour (255, 255, 255),
264                                 48,
265                                 1.0,
266                                 dcp::Time (0, 4,  9, 22, 24),
267                                 dcp::Time (0, 4, 11, 22, 24),
268                                 -0.2,
269                                 dcp::HAlign::CENTER,
270                                 0.8,
271                                 dcp::VAlign::TOP,
272                                 dcp::Direction::LTR,
273                                 "Hello world",
274                                 dcp::Effect::NONE,
275                                 dcp::Colour (0, 0, 0),
276                                 dcp::Time (0, 0, 0, 0, 24),
277                                 dcp::Time (0, 0, 0, 0, 24)
278                                 )
279                         )
280                 );
281
282         c.add (
283                 shared_ptr<dcp::Subtitle> (
284                         new dcp::SubtitleString (
285                                 boost::optional<string> (),
286                                 true,
287                                 true,
288                                 true,
289                                 dcp::Colour (128, 0, 64),
290                                 91,
291                                 1.0,
292                                 dcp::Time (5, 41,  0, 21, 24),
293                                 dcp::Time (6, 12, 15, 21, 24),
294                                 -0.2,
295                                 dcp::HAlign::CENTER,
296                                 0.4,
297                                 dcp::VAlign::BOTTOM,
298                                 dcp::Direction::LTR,
299                                 "What's going on",
300                                 dcp::Effect::BORDER,
301                                 dcp::Colour (1, 2, 3),
302                                 dcp::Time (1, 2, 3, 4, 24),
303                                 dcp::Time (5, 6, 7, 8, 24)
304                                 )
305                         )
306                 );
307
308         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
309
310         check_xml (
311                 "<DCSubtitle Version=\"1.0\">"
312                   "<SubtitleID>a6c58cff-3e1e-4b38-acec-a42224475ef6</SubtitleID>"
313                   "<MovieTitle>Test</MovieTitle>"
314                   "<ReelNumber>1</ReelNumber>"
315                   "<Language>EN</Language>"
316                   "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" Id=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underlined=\"no\" Weight=\"normal\">"
317                     "<Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:229\" TimeOut=\"00:04:11:229\" FadeUpTime=\"0\" FadeDownTime=\"0\">"
318                       "<Text HPosition=\"-20\" VAlign=\"top\" VPosition=\"80\">Hello world</Text>"
319                     "</Subtitle>"
320                   "</Font>"
321                   "<Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underlined=\"yes\" Weight=\"bold\">"
322                     "<Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:219\" TimeOut=\"06:12:15:219\" FadeUpTime=\"930792\" FadeDownTime=\"4591834\">"
323                       "<Text HPosition=\"-20\" VAlign=\"bottom\" VPosition=\"40\">What's going on</Text>"
324                     "</Subtitle>"
325                   "</Font>"
326                 "</DCSubtitle>",
327                 c.xml_as_string (),
328                 vector<string>()
329                 );
330 }
331
332 /* Write some subtitle content as Interop XML using bitmaps and check that it is right */
333 BOOST_AUTO_TEST_CASE (write_interop_subtitle_test3)
334 {
335         RNGFixer fix;
336
337         auto c = make_shared<dcp::InteropSubtitleAsset>();
338         c->set_reel_number ("1");
339         c->set_language ("EN");
340         c->set_movie_title ("Test");
341
342         c->add (
343                 make_shared<dcp::SubtitleImage>(
344                         dcp::ArrayData ("test/data/sub.png"),
345                         dcp::Time (0, 4,  9, 22, 24),
346                         dcp::Time (0, 4, 11, 22, 24),
347                         0,
348                         dcp::HAlign::CENTER,
349                         0.8,
350                         dcp::VAlign::TOP,
351                         dcp::Time (0, 0, 0, 0, 24),
352                         dcp::Time (0, 0, 0, 0, 24)
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         auto reel = make_shared<dcp::Reel>();
362         reel->add(make_shared<dcp::ReelInteropSubtitleAsset>(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         auto cpl = make_shared<dcp::CPL>("My film", dcp::ContentKind::FEATURE, dcp::Standard::INTEROP);
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         auto cv = cpl->content_version();
376         BOOST_REQUIRE (cv);
377         cv->label_text = "foo";
378         cpl->set_content_version (*cv);
379
380         dcp::DCP dcp ("build/test/write_interop_subtitle_test3");
381         dcp.add (cpl);
382         dcp.write_xml (issuer, creator, issue_date, annotation_text);
383
384         check_xml (
385                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/subs.xml"),
386                 dcp::file_to_string("build/test/write_interop_subtitle_test3/subs.xml"),
387                 vector<string>()
388                 );
389         check_file ("build/test/write_interop_subtitle_test3/d36f4bb3-c4fa-4a95-9915-6fec3110cd71.png", "test/data/sub.png");
390
391         check_xml (
392                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/ASSETMAP"),
393                 dcp::file_to_string("build/test/write_interop_subtitle_test3/ASSETMAP"),
394                 vector<string>()
395                 );
396
397         check_xml (
398                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/pkl.xml"),
399                 dcp::file_to_string("build/test/write_interop_subtitle_test3/pkl_6a9e31a6-50a4-4ecb-8683-fa667848470a.xml"),
400                 vector<string>()
401                 );
402 }
403
404 /* Write some subtitle content as SMPTE XML and check that it is right */
405 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
406 {
407         dcp::SMPTESubtitleAsset c;
408         c.set_reel_number (1);
409         c.set_language (dcp::LanguageTag("en"));
410         c.set_content_title_text ("Test");
411         c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
412
413         c.add (
414                 make_shared<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::Effect::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         c.add (
438                 make_shared<dcp::SubtitleString>(
439                         boost::optional<string> (),
440                         true,
441                         true,
442                         true,
443                         dcp::Colour (128, 0, 64),
444                         91,
445                         1.0,
446                         dcp::Time (5, 41,  0, 21, 24),
447                         dcp::Time (6, 12, 15, 21, 24),
448                         0,
449                         dcp::HAlign::CENTER,
450                         0.4,
451                         dcp::VAlign::BOTTOM,
452                         dcp::Direction::RTL,
453                         "What's going on",
454                         dcp::Effect::BORDER,
455                         dcp::Colour (1, 2, 3),
456                         dcp::Time (1, 2, 3, 4, 24),
457                         dcp::Time (5, 6, 7, 8, 24)
458                         )
459                 );
460
461         c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
462
463         check_xml (
464                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
465                 "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
466                   "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
467                   "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
468                   "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
469                   "<dcst:ReelNumber>1</dcst:ReelNumber>"
470                   "<dcst:Language>en</dcst:Language>"
471                   "<dcst:EditRate>24 1</dcst:EditRate>"
472                   "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
473                   "<dcst:SubtitleList>"
474                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
475                       "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:22\" TimeOut=\"00:04:11:22\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
476                         "<dcst:Text Valign=\"top\" Vposition=\"80\">Hello world</dcst:Text>"
477                       "</dcst:Subtitle>"
478                     "</dcst:Font>"
479                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underline=\"yes\" Weight=\"bold\">"
480                       "<dcst:Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:21\" TimeOut=\"06:12:15:21\" FadeUpTime=\"01:02:03:04\" FadeDownTime=\"05:06:07:08\">"
481                         "<dcst:Text Valign=\"bottom\" Vposition=\"40\" Direction=\"rtl\">What's going on</dcst:Text>"
482                       "</dcst:Subtitle>"
483                     "</dcst:Font>"
484                   "</dcst:SubtitleList>"
485                 "</dcst:SubtitleReel>",
486                 c.xml_as_string (),
487                 vector<string>()
488                 );
489 }
490
491 /* Write some subtitle content as SMPTE XML and check that it is right.
492    This includes in-line font changes.
493 */
494 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
495 {
496         dcp::SMPTESubtitleAsset c;
497         c.set_reel_number (1);
498         c.set_language (dcp::LanguageTag("en"));
499         c.set_content_title_text ("Test");
500         c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
501
502         c.add (
503                 make_shared<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::Effect::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         c.add (
527                 make_shared<dcp::SubtitleString>(
528                         string ("Arial"),
529                         true,
530                         false,
531                         false,
532                         dcp::Colour (255, 255, 255),
533                         48,
534                         1.0,
535                         dcp::Time (0, 0, 1, 0, 24),
536                         dcp::Time (0, 0, 9, 0, 24),
537                         0,
538                         dcp::HAlign::CENTER,
539                         0.8,
540                         dcp::VAlign::TOP,
541                         dcp::Direction::LTR,
542                         "really",
543                         dcp::Effect::NONE,
544                         dcp::Colour (0, 0, 0),
545                         dcp::Time (0, 0, 0, 0, 24),
546                         dcp::Time (0, 0, 0, 0, 24)
547                         )
548                 );
549
550         c.add (
551                 make_shared<dcp::SubtitleString>(
552                         string ("Arial"),
553                         false,
554                         false,
555                         false,
556                         dcp::Colour (255, 255, 255),
557                         48,
558                         1.0,
559                         dcp::Time (0, 0, 1, 0, 24),
560                         dcp::Time (0, 0, 9, 0, 24),
561                         0,
562                         dcp::HAlign::CENTER,
563                         0.8,
564                         dcp::VAlign::TOP,
565                         dcp::Direction::LTR,
566                         " fun",
567                         dcp::Effect::NONE,
568                         dcp::Colour (0, 0, 0),
569                         dcp::Time (0, 0, 0, 0, 24),
570                         dcp::Time (0, 0, 0, 0, 24)
571                         )
572                 );
573
574         c.add (
575                 make_shared<dcp::SubtitleString>(
576                         string ("Arial"),
577                         false,
578                         false,
579                         false,
580                         dcp::Colour (255, 255, 255),
581                         48,
582                         1.0,
583                         dcp::Time (0, 0, 1, 0, 24),
584                         dcp::Time (0, 0, 9, 0, 24),
585                         0,
586                         dcp::HAlign::CENTER,
587                         0.9,
588                         dcp::VAlign::TOP,
589                         dcp::Direction::LTR,
590                         "This is the ",
591                         dcp::Effect::NONE,
592                         dcp::Colour (0, 0, 0),
593                         dcp::Time (0, 0, 0, 0, 24),
594                         dcp::Time (0, 0, 0, 0, 24)
595                         )
596                 );
597
598         c.add (
599                 make_shared<dcp::SubtitleString>(
600                         string ("Arial"),
601                         true,
602                         false,
603                         false,
604                         dcp::Colour (255, 255, 255),
605                         48,
606                         1.0,
607                         dcp::Time (0, 0, 1, 0, 24),
608                         dcp::Time (0, 0, 9, 0, 24),
609                         0,
610                         dcp::HAlign::CENTER,
611                         0.9,
612                         dcp::VAlign::TOP,
613                         dcp::Direction::LTR,
614                         "second",
615                         dcp::Effect::NONE,
616                         dcp::Colour (0, 0, 0),
617                         dcp::Time (0, 0, 0, 0, 24),
618                         dcp::Time (0, 0, 0, 0, 24)
619                         )
620                 );
621
622         c.add (
623                 make_shared<dcp::SubtitleString>(
624                         string ("Arial"),
625                         false,
626                         false,
627                         false,
628                         dcp::Colour (255, 255, 255),
629                         48,
630                         1.0,
631                         dcp::Time (0, 0, 1, 0, 24),
632                         dcp::Time (0, 0, 9, 0, 24),
633                         0,
634                         dcp::HAlign::CENTER,
635                         0.9,
636                         dcp::VAlign::TOP,
637                         dcp::Direction::LTR,
638                         " line",
639                         dcp::Effect::NONE,
640                         dcp::Colour (0, 0, 0),
641                         dcp::Time (0, 0, 0, 0, 24),
642                         dcp::Time (0, 0, 0, 0, 24)
643                         )
644                 );
645
646         c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
647
648         check_xml (
649                 c.xml_as_string(),
650                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
651                 "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
652                   "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
653                   "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
654                   "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
655                   "<dcst:ReelNumber>1</dcst:ReelNumber>"
656                   "<dcst:Language>en</dcst:Language>"
657                   "<dcst:EditRate>24 1</dcst:EditRate>"
658                   "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
659                   "<dcst:SubtitleList>"
660                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
661                       "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
662                         "<dcst:Text Valign=\"top\" Vposition=\"80\">"
663                           "<dcst:Font Italic=\"no\">Testing is </dcst:Font>"
664                           "<dcst:Font Italic=\"yes\">really</dcst:Font>"
665                           "<dcst:Font Italic=\"no\"> fun</dcst:Font>"
666                         "</dcst:Text>"
667                         "<dcst:Text Valign=\"top\" Vposition=\"90\">"
668                           "<dcst:Font Italic=\"no\">This is the </dcst:Font>"
669                           "<dcst:Font Italic=\"yes\">second</dcst:Font>"
670                           "<dcst:Font Italic=\"no\"> line</dcst:Font>"
671                         "</dcst:Text>"
672                       "</dcst:Subtitle>"
673                     "</dcst:Font>"
674                   "</dcst:SubtitleList>"
675                 "</dcst:SubtitleReel>",
676                 vector<string>()
677                 );
678 }
679
680 /* Write some subtitle content as SMPTE using bitmaps and check that it is right */
681 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
682 {
683         dcp::SMPTESubtitleAsset c;
684         c.set_reel_number (1);
685         c.set_language (dcp::LanguageTag("en"));
686         c.set_content_title_text ("Test");
687
688         c.add (
689                 make_shared<dcp::SubtitleImage>(
690                         dcp::ArrayData ("test/data/sub.png"),
691                         dcp::Time (0, 4,  9, 22, 24),
692                         dcp::Time (0, 4, 11, 22, 24),
693                         0,
694                         dcp::HAlign::CENTER,
695                         0.8,
696                         dcp::VAlign::TOP,
697                         dcp::Time (0, 0, 0, 0, 24),
698                         dcp::Time (0, 0, 0, 0, 24)
699                         )
700               );
701
702         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
703
704         boost::filesystem::create_directories ("build/test/write_smpte_subtitle_test3");
705         c.write ("build/test/write_smpte_subtitle_test3/subs.mxf");
706
707         /* XXX: check this result when we can read them back in again */
708 }