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