Move some tests from write_subtitle_test to smpte_subtitle_test.
[libdcp.git] / test / read_interop_subtitle_test.cc
1 /*
2     Copyright (C) 2012-2018 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
20 #include "interop_subtitle_asset.h"
21 #include "interop_load_font_node.h"
22 #include "subtitle_string.h"
23 #include "subtitle_image.h"
24 #include <boost/test/unit_test.hpp>
25 #include <iostream>
26
27 using std::list;
28 using std::string;
29 using boost::shared_ptr;
30 using boost::dynamic_pointer_cast;
31
32 /** Load some subtitle content from Interop XML and check that it is read correctly */
33 BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1)
34 {
35         dcp::InteropSubtitleAsset subs ("test/data/subs1.xml");
36
37         BOOST_CHECK_EQUAL (subs.id(), "cab5c268-222b-41d2-88ae-6d6999441b17");
38         BOOST_CHECK_EQUAL (subs.movie_title(), "Movie Title");
39         BOOST_CHECK_EQUAL (subs.reel_number(), "1");
40         BOOST_CHECK_EQUAL (subs.language(), "French");
41
42         list<shared_ptr<dcp::LoadFontNode> > lfn = subs.load_font_nodes ();
43         BOOST_REQUIRE_EQUAL (lfn.size(), 1);
44         shared_ptr<dcp::InteropLoadFontNode> interop_lfn = dynamic_pointer_cast<dcp::InteropLoadFontNode> (lfn.front ());
45         BOOST_REQUIRE (interop_lfn);
46         BOOST_CHECK_EQUAL (interop_lfn->id, "theFontId");
47         BOOST_CHECK_EQUAL (interop_lfn->uri, "arial.ttf");
48
49         list<shared_ptr<dcp::Subtitle> > s = subs.subtitles_during (dcp::Time (0, 0, 6, 1, 250), dcp::Time (0, 0, 6, 2, 250), false);
50         BOOST_REQUIRE_EQUAL (s.size(), 1);
51         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
52         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
53                                    string ("theFontId"),
54                                    false,
55                                    false,
56                                    false,
57                                    dcp::Colour (255, 255, 255),
58                                    39,
59                                    1.0,
60                                    dcp::Time (0, 0, 5, 198, 250),
61                                    dcp::Time (0, 0, 7, 115, 250),
62                                    0,
63                                    dcp::HALIGN_CENTER,
64                                    0.15,
65                                    dcp::VALIGN_BOTTOM,
66                                    dcp::DIRECTION_LTR,
67                                    "My jacket was Idi Amin's",
68                                    dcp::BORDER,
69                                    dcp::Colour (0, 0, 0),
70                                    dcp::Time (0, 0, 0, 1, 250),
71                                    dcp::Time (0, 0, 0, 1, 250)
72                                    ));
73
74         s = subs.subtitles_during (dcp::Time (0, 0, 7, 190, 250), dcp::Time (0, 0, 7, 191, 250), false);
75         BOOST_REQUIRE_EQUAL (s.size(), 2);
76         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
77         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
78                                    string ("theFontId"),
79                                    true,
80                                    false,
81                                    false,
82                                    dcp::Colour (255, 255, 255),
83                                    39,
84                                    1.0,
85                                    dcp::Time (0, 0, 7, 177, 250),
86                                    dcp::Time (0, 0, 11, 31, 250),
87                                    0,
88                                    dcp::HALIGN_CENTER,
89                                    0.21,
90                                    dcp::VALIGN_BOTTOM,
91                                    dcp::DIRECTION_LTR,
92                                    "My corset was H.M. The Queen's",
93                                    dcp::BORDER,
94                                    dcp::Colour (0, 0, 0),
95                                    dcp::Time (0, 0, 0, 1, 250),
96                                    dcp::Time (0, 0, 0, 1, 250)
97                                    ));
98         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
99         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
100                                    string ("theFontId"),
101                                    false,
102                                    false,
103                                    false,
104                                    dcp::Colour (255, 255, 255),
105                                    39,
106                                    1.0,
107                                    dcp::Time (0, 0, 7, 177, 250),
108                                    dcp::Time (0, 0, 11, 31, 250),
109                                    0,
110                                    dcp::HALIGN_CENTER,
111                                    0.15,
112                                    dcp::VALIGN_BOTTOM,
113                                    dcp::DIRECTION_LTR,
114                                    "My large wonderbra",
115                                    dcp::BORDER,
116                                    dcp::Colour (0, 0, 0),
117                                    dcp::Time (0, 0, 0, 1, 250),
118                                    dcp::Time (0, 0, 0, 1, 250)
119                                    ));
120
121         s = subs.subtitles_during (dcp::Time (0, 0, 11, 95, 250), dcp::Time (0, 0, 11, 96, 250), false);
122         BOOST_REQUIRE_EQUAL (s.size(), 1);
123         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
124         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
125                                    string ("theFontId"),
126                                    false,
127                                    false,
128                                    false,
129                                    dcp::Colour (255, 255, 255),
130                                    39,
131                                    1.0,
132                                    dcp::Time (0, 0, 11, 94, 250),
133                                    dcp::Time (0, 0, 13, 63, 250),
134                                    0,
135                                    dcp::HALIGN_CENTER,
136                                    0.15,
137                                    dcp::VALIGN_BOTTOM,
138                                    dcp::DIRECTION_LTR,
139                                    "Once belonged to the Shah",
140                                    dcp::BORDER,
141                                    dcp::Colour (0, 0, 0),
142                                    dcp::Time (0, 0, 0, 1, 250),
143                                    dcp::Time (0, 0, 0, 1, 250)
144                                    ));
145
146         s = subs.subtitles_during (dcp::Time (0, 0, 14, 42, 250), dcp::Time (0, 0, 14, 43, 250), false);
147         BOOST_REQUIRE_EQUAL (s.size(), 1);
148         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
149         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
150                                    string ("theFontId"),
151                                    false,
152                                    true,
153                                    true,
154                                    dcp::Colour (255, 255, 255),
155                                    39,
156                                    1.0,
157                                    dcp::Time (0, 0, 13, 104, 250),
158                                    dcp::Time (0, 0, 15, 177, 250),
159                                    0,
160                                    dcp::HALIGN_CENTER,
161                                    0.15,
162                                    dcp::VALIGN_BOTTOM,
163                                    dcp::DIRECTION_LTR,
164                                    "And these are Roy Hattersley's jeans",
165                                    dcp::BORDER,
166                                    dcp::Colour (0, 0, 0),
167                                    dcp::Time (0, 0, 0, 1, 250),
168                                    dcp::Time (0, 0, 0, 1, 250)
169                                    ));
170 }
171
172 /** And similarly for another one */
173 BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
174 {
175         dcp::InteropSubtitleAsset subs ("test/data/subs2.xml");
176
177         list<shared_ptr<dcp::Subtitle> > s = subs.subtitles_during (dcp::Time (0, 0, 42, 100, 250), dcp::Time (0, 0, 42, 101, 250), false);
178         BOOST_REQUIRE_EQUAL (s.size(), 2);
179         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
180         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
181                                    string ("theFont"),
182                                    true,
183                                    false,
184                                    false,
185                                    dcp::Colour (255, 255, 255),
186                                    42,
187                                    1.0,
188                                    dcp::Time (0, 0, 41, 62, 250),
189                                    dcp::Time (0, 0, 43, 52, 250),
190                                    0,
191                                    dcp::HALIGN_CENTER,
192                                    0.89,
193                                    dcp::VALIGN_TOP,
194                                    dcp::DIRECTION_LTR,
195                                    "At afternoon tea with John Peel",
196                                    dcp::BORDER,
197                                    dcp::Colour (0, 0, 0),
198                                    dcp::Time (0, 0, 0, 0, 250),
199                                    dcp::Time (0, 0, 0, 0, 250)
200                                    ));
201         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
202         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
203                                    string ("theFont"),
204                                    true,
205                                    false,
206                                    false,
207                                    dcp::Colour (255, 255, 255),
208                                    42,
209                                    1.0,
210                                    dcp::Time (0, 0, 41, 62, 250),
211                                    dcp::Time (0, 0, 43, 52, 250),
212                                    0,
213                                    dcp::HALIGN_CENTER,
214                                    0.95,
215                                    dcp::VALIGN_TOP,
216                                    dcp::DIRECTION_LTR,
217                                    "I enquired if his accent was real",
218                                    dcp::BORDER,
219                                    dcp::Colour (0, 0, 0),
220                                    dcp::Time (0, 0, 0, 0, 250),
221                                    dcp::Time (0, 0, 0, 0, 250)
222                                    ));
223
224         s = subs.subtitles_during (dcp::Time (0, 0, 50, 50, 250), dcp::Time (0, 0, 50, 51, 250), false);
225         BOOST_REQUIRE_EQUAL (s.size(), 2);
226         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
227         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
228                                    string ("theFont"),
229                                    true,
230                                    false,
231                                    false,
232                                    dcp::Colour (255, 255, 255),
233                                    42,
234                                    1.0,
235                                    dcp::Time (0, 0, 50, 42, 250),
236                                    dcp::Time (0, 0, 52, 21, 250),
237                                    0,
238                                    dcp::HALIGN_CENTER,
239                                    0.89,
240                                    dcp::VALIGN_TOP,
241                                    dcp::DIRECTION_LTR,
242                                    "He said \"out of the house",
243                                    dcp::BORDER,
244                                    dcp::Colour (0, 0, 0),
245                                    dcp::Time (0, 0, 0, 0, 250),
246                                    dcp::Time (0, 0, 0, 0, 250)
247                                    ));
248         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
249         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
250                                    string ("theFont"),
251                                    true,
252                                    false,
253                                    false,
254                                    dcp::Colour (255, 255, 255),
255                                    42,
256                                    1.0,
257                                    dcp::Time (0, 0, 50, 42, 250),
258                                    dcp::Time (0, 0, 52, 21, 250),
259                                    0,
260                                    dcp::HALIGN_CENTER,
261                                    0.95,
262                                    dcp::VALIGN_TOP,
263                                    dcp::DIRECTION_LTR,
264                                    "I'm incredibly scouse",
265                                    dcp::BORDER,
266                                    dcp::Colour (0, 0, 0),
267                                    dcp::Time (0, 0, 0, 0, 250),
268                                    dcp::Time (0, 0, 0, 0, 250)
269                                    ));
270
271         s = subs.subtitles_during (dcp::Time (0, 1, 2, 300, 250), dcp::Time (0, 1, 2, 301, 250), false);
272         BOOST_REQUIRE_EQUAL (s.size(), 2);
273         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
274         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
275                                    string ("theFont"),
276                                    true,
277                                    false,
278                                    false,
279                                    dcp::Colour (255, 255, 255),
280                                    42,
281                                    1.0,
282                                    dcp::Time (0, 1, 2, 208, 250),
283                                    dcp::Time (0, 1, 4, 10, 250),
284                                    0,
285                                    dcp::HALIGN_CENTER,
286                                    0.89,
287                                    dcp::VALIGN_TOP,
288                                    dcp::DIRECTION_LTR,
289                                    "At home it depends how I feel.\"",
290                                    dcp::BORDER,
291                                    dcp::Colour (0, 0, 0),
292                                    dcp::Time (0, 0, 0, 0, 250),
293                                    dcp::Time (0, 0, 0, 0, 250)
294                                    ));
295         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
296         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
297                                    string ("theFont"),
298                                    true,
299                                    false,
300                                    false,
301                                    dcp::Colour (255, 255, 255),
302                                    42,
303                                    1.0,
304                                    dcp::Time (0, 1, 2, 208, 250),
305                                    dcp::Time (0, 1, 4, 10, 250),
306                                    0,
307                                    dcp::HALIGN_CENTER,
308                                    0.95,
309                                    dcp::VALIGN_TOP,
310                                    dcp::DIRECTION_LTR,
311                                    "I spent a long weekend in Brighton",
312                                    dcp::BORDER,
313                                    dcp::Colour (0, 0, 0),
314                                    dcp::Time (0, 0, 0, 0, 250),
315                                    dcp::Time (0, 0, 0, 0, 250)
316                                    ));
317
318         s = subs.subtitles_during (dcp::Time (0, 1, 15, 50, 250), dcp::Time (0, 1, 15, 51, 250), false);
319         BOOST_REQUIRE_EQUAL (s.size(), 2);
320         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
321         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
322                                    string ("theFont"),
323                                    true,
324                                    false,
325                                    false,
326                                    dcp::Colour (255, 255, 255),
327                                    42,
328                                    1.0,
329                                    dcp::Time (0, 1, 15, 42, 250),
330                                    dcp::Time (0, 1, 16, 42, 250),
331                                    0,
332                                    dcp::HALIGN_CENTER,
333                                    0.89,
334                                    dcp::VALIGN_TOP,
335                                    dcp::DIRECTION_RTL,
336                                    "With the legendary Miss Enid Blyton",
337                                    dcp::BORDER,
338                                    dcp::Colour (0, 0, 0),
339                                    dcp::Time (0, 0, 0, 0, 250),
340                                    dcp::Time (0, 0, 0, 0, 250)
341                                    ));
342         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
343         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
344                                    string ("theFont"),
345                                    true,
346                                    false,
347                                    false,
348                                    dcp::Colour (255, 255, 255),
349                                    42,
350                                    1.0,
351                                    dcp::Time (0, 1, 15, 42, 250),
352                                    dcp::Time (0, 1, 16, 42, 250),
353                                    0,
354                                    dcp::HALIGN_CENTER,
355                                    0.95,
356                                    dcp::VALIGN_TOP,
357                                    dcp::DIRECTION_TTB,
358                                    "She said \"you be Noddy",
359                                    dcp::BORDER,
360                                    dcp::Colour (0, 0, 0),
361                                    dcp::Time (0, 0, 0, 0, 250),
362                                    dcp::Time (0, 0, 0, 0, 250)
363                                    ));
364
365         s = subs.subtitles_during (dcp::Time (0, 1, 27, 200, 250), dcp::Time (0, 1, 27, 201, 250), false);
366         BOOST_REQUIRE_EQUAL (s.size(), 2);
367         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
368         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
369                                    string ("theFont"),
370                                    true,
371                                    false,
372                                    false,
373                                    dcp::Colour (255, 255, 255),
374                                    42,
375                                    1.0,
376                                    dcp::Time (0, 1, 27, 115, 250),
377                                    dcp::Time (0, 1, 28, 208, 250),
378                                    0,
379                                    dcp::HALIGN_CENTER,
380                                    0.89,
381                                    dcp::VALIGN_TOP,
382                                    dcp::DIRECTION_BTT,
383                                    "That curious creature the Sphinx",
384                                    dcp::BORDER,
385                                    dcp::Colour (0, 0, 0),
386                                    dcp::Time (0, 0, 0, 0, 250),
387                                    dcp::Time (0, 0, 0, 0, 250)
388                                    ));
389         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
390         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
391                                    string ("theFont"),
392                                    true,
393                                    false,
394                                    false,
395                                    dcp::Colour (255, 255, 255),
396                                    42,
397                                    1.0,
398                                    dcp::Time (0, 1, 27, 115, 250),
399                                    dcp::Time (0, 1, 28, 208, 250),
400                                    0,
401                                    dcp::HALIGN_CENTER,
402                                    0.95,
403                                    dcp::VALIGN_TOP,
404                                    dcp::DIRECTION_LTR,
405                                    "Is smarter than anyone thinks",
406                                    dcp::BORDER,
407                                    dcp::Colour (0, 0, 0),
408                                    dcp::Time (0, 0, 0, 0, 250),
409                                    dcp::Time (0, 0, 0, 0, 250)
410                                    ));
411
412         s = subs.subtitles_during (dcp::Time (0, 1, 42, 300, 250), dcp::Time (0, 1, 42, 301, 250), false);
413         BOOST_REQUIRE_EQUAL (s.size(), 2);
414         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
415         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
416                                    string ("theFont"),
417                                    false,
418                                    false,
419                                    false,
420                                    dcp::Colour (255, 255, 255),
421                                    42,
422                                    1.0,
423                                    dcp::Time (0, 1, 42, 229, 250),
424                                    dcp::Time (0, 1, 45, 62, 250),
425                                    0,
426                                    dcp::HALIGN_CENTER,
427                                    0.89,
428                                    dcp::VALIGN_TOP,
429                                    dcp::DIRECTION_LTR,
430                                    "It sits there and smirks",
431                                    dcp::BORDER,
432                                    dcp::Colour (0, 0, 0),
433                                    dcp::Time (0, 0, 0, 0, 250),
434                                    dcp::Time (0, 0, 0, 0, 250)
435                                    ));
436         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
437         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
438                                    string ("theFont"),
439                                    false,
440                                    false,
441                                    false,
442                                    dcp::Colour (255, 255, 255),
443                                    42,
444                                    1.0,
445                                    dcp::Time (0, 1, 42, 229, 250),
446                                    dcp::Time (0, 1, 45, 62, 250),
447                                    0,
448                                    dcp::HALIGN_CENTER,
449                                    0.95,
450                                    dcp::VALIGN_TOP,
451                                    dcp::DIRECTION_LTR,
452                                    "And you don't think it works",
453                                    dcp::BORDER,
454                                    dcp::Colour (0, 0, 0),
455                                    dcp::Time (0, 0, 0, 0, 250),
456                                    dcp::Time (0, 0, 0, 0, 250)
457                                    ));
458
459         s = subs.subtitles_during (dcp::Time (0, 1, 45, 200, 250), dcp::Time (0, 1, 45, 201, 250), false);
460         BOOST_REQUIRE_EQUAL (s.size(), 2);
461         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
462         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
463                                    string ("theFont"),
464                                    false,
465                                    false,
466                                    false,
467                                    dcp::Colour (255, 255, 255),
468                                    42,
469                                    1.0,
470                                    dcp::Time (0, 1, 45, 146, 250),
471                                    dcp::Time (0, 1, 47, 94, 250),
472                                    0,
473                                    dcp::HALIGN_CENTER,
474                                    0.89,
475                                    dcp::VALIGN_TOP,
476                                    dcp::DIRECTION_LTR,
477                                    "Then when you're not looking, it winks.",
478                                    dcp::BORDER,
479                                    dcp::Colour (0, 0, 0),
480                                    dcp::Time (0, 0, 0, 0, 250),
481                                    dcp::Time (0, 0, 0, 0, 250)
482                                    ));
483         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
484         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
485                                    string ("theFont"),
486                                    false,
487                                    false,
488                                    false,
489                                    dcp::Colour (255, 255, 255),
490                                    42,
491                                    1.0,
492                                    dcp::Time (0, 1, 45, 146, 250),
493                                    dcp::Time (0, 1, 47, 94, 250),
494                                    0,
495                                    dcp::HALIGN_CENTER,
496                                    0.95,
497                                    dcp::VALIGN_TOP,
498                                    dcp::DIRECTION_LTR,
499                                    "When it snows you will find Sister Sledge",
500                                    dcp::BORDER,
501                                    dcp::Colour (0, 0, 0),
502                                    dcp::Time (0, 0, 0, 0, 250),
503                                    dcp::Time (0, 0, 0, 0, 250)
504                                    ));
505
506         s = subs.subtitles_during (dcp::Time (0, 1, 47, 249, 250), dcp::Time (0, 1, 47, 250, 250), false);
507         BOOST_REQUIRE_EQUAL (s.size(), 2);
508         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
509         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
510                                    string ("theFont"),
511                                    false,
512                                    false,
513                                    false,
514                                    dcp::Colour (255, 255, 255),
515                                    42,
516                                    1.0,
517                                    dcp::Time (0, 1, 47, 146, 250),
518                                    dcp::Time (0, 1, 48, 167, 250),
519                                    0,
520                                    dcp::HALIGN_CENTER,
521                                    0.89,
522                                    dcp::VALIGN_TOP,
523                                    dcp::DIRECTION_LTR,
524                                    "Out mooning, at night, on the ledge",
525                                    dcp::BORDER,
526                                    dcp::Colour (0, 0, 0),
527                                    dcp::Time (0, 0, 0, 0, 250),
528                                    dcp::Time (0, 0, 0, 0, 250)
529                                    ));
530         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
531         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
532                                    string ("theFont"),
533                                    false,
534                                    false,
535                                    false,
536                                    dcp::Colour (255, 255, 255),
537                                    42,
538                                    1.0,
539                                    dcp::Time (0, 1, 47, 146, 250),
540                                    dcp::Time (0, 1, 48, 167, 250),
541                                    0,
542                                    dcp::HALIGN_CENTER,
543                                    0.95,
544                                    dcp::VALIGN_TOP,
545                                    dcp::DIRECTION_LTR,
546                                    "One storey down",
547                                    dcp::BORDER,
548                                    dcp::Colour (0, 0, 0),
549                                    dcp::Time (0, 0, 0, 0, 250),
550                                    dcp::Time (0, 0, 0, 0, 250)
551                                    ));
552
553         s = subs.subtitles_during (dcp::Time (0, 2, 6, 210, 250), dcp::Time (0, 2, 6, 211, 250), false);
554         BOOST_REQUIRE_EQUAL (s.size(), 2);
555         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front()));
556         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString (
557                                    string ("theFont"),
558                                    true,
559                                    false,
560                                    false,
561                                    dcp::Colour (255, 255, 255),
562                                    42,
563                                    1.0,
564                                    dcp::Time (0, 2, 5, 208, 250),
565                                    dcp::Time (0, 2, 7, 31, 250),
566                                    0,
567                                    dcp::HALIGN_CENTER,
568                                    0.89,
569                                    dcp::VALIGN_TOP,
570                                    dcp::DIRECTION_LTR,
571                                    "HELLO",
572                                    dcp::BORDER,
573                                    dcp::Colour (0, 0, 0),
574                                    dcp::Time (0, 0, 0, 0, 250),
575                                    dcp::Time (0, 0, 0, 0, 250)
576                                    ));
577         BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back()));
578         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString (
579                                    string ("theFont"),
580                                    true,
581                                    false,
582                                    false,
583                                    dcp::Colour (255, 255, 255),
584                                    42,
585                                    1.0,
586                                    dcp::Time (0, 2, 5, 208, 250),
587                                    dcp::Time (0, 2, 7, 31, 250),
588                                    0,
589                                    dcp::HALIGN_CENTER,
590                                    0.95,
591                                    dcp::VALIGN_TOP,
592                                    dcp::DIRECTION_LTR,
593                                    "WORLD",
594                                    dcp::BORDER,
595                                    dcp::Colour (0, 0, 0),
596                                    dcp::Time (0, 0, 0, 0, 250),
597                                    dcp::Time (0, 0, 0, 0, 250)
598                                    ));
599 }
600
601 /** And one with bitmap subtitles */
602 BOOST_AUTO_TEST_CASE (read_interop_subtitle_test3)
603 {
604         dcp::InteropSubtitleAsset subs ("test/data/subs3.xml");
605
606         BOOST_REQUIRE_EQUAL (subs.subtitles().size(), 1);
607         shared_ptr<dcp::SubtitleImage> si = dynamic_pointer_cast<dcp::SubtitleImage>(subs.subtitles().front());
608         BOOST_REQUIRE (si);
609         BOOST_CHECK (si->png_image() == dcp::Data("test/data/sub.png"));
610 }