Fix pretty broken SSA alignment code.
authorCarl Hetherington <cth@carlh.net>
Tue, 5 Jul 2022 21:15:37 +0000 (23:15 +0200)
committerCarl Hetherington <cth@carlh.net>
Wed, 6 Jul 2022 00:10:33 +0000 (02:10 +0200)
src/ssa_reader.cc
test/data/test3.ssa [new file with mode: 0644]
test/ssa_reader_test.cc

index 39b99d2e53e6e99c23418f956cf2300c8ebbb938..03798034b3cdfe0435c7a54382d78bcea894d23e 100644 (file)
@@ -125,28 +125,19 @@ public:
                                        effect = SHADOW;
                                }
                        } else if (keys[i] == "Alignment") {
-                               /* These values from libass' source code */
-                               switch ((raw_convert<int> (style[i]) - 1) % 3) {
-                               case 0:
-                                       horizontal_reference = LEFT_OF_SCREEN;
-                                       break;
-                               case 1:
-                                       horizontal_reference = HORIZONTAL_CENTRE_OF_SCREEN;
-                                       break;
-                               case 2:
-                                       horizontal_reference = RIGHT_OF_SCREEN;
-                                       break;
-                               }
-                               switch (raw_convert<int> (style[i]) & 12) {
-                               case 4:
+                               if (style[i] == "7" || style[i] == "8" || style[i] == "9") {
                                        vertical_reference = TOP_OF_SCREEN;
-                                       break;
-                               case 8:
+                               } else if (style[i] == "4" || style[i] == "5" || style[i] == "6") {
                                        vertical_reference = VERTICAL_CENTRE_OF_SCREEN;
-                                       break;
-                               case 0:
+                               } else {
                                        vertical_reference = BOTTOM_OF_SCREEN;
-                                       break;
+                               }
+                               if (style[i] == "1" || style[i] == "4" || style[i] == "7") {
+                                       horizontal_reference = LEFT_OF_SCREEN;
+                               } else if (style[i] == "3" || style[i] == "6" || style[i] == "9") {
+                                       horizontal_reference = RIGHT_OF_SCREEN;
+                               } else {
+                                       horizontal_reference = HORIZONTAL_CENTRE_OF_SCREEN;
                                }
                        } else if (keys[i] == "MarginV") {
                                vertical_margin = raw_convert<int> (style[i]);
diff --git a/test/data/test3.ssa b/test/data/test3.ssa
new file mode 100644 (file)
index 0000000..75b2c27
--- /dev/null
@@ -0,0 +1,26 @@
+[Script Info]
+; Script generated by Aegisub 3.2.2
+; http://www.aegisub.org/
+Title: Default Aegisub file
+ScriptType: v4.00+
+WrapStyle: 0
+ScaledBorderAndShadow: yes
+PlayResX: 1920
+PlayResY: 1080
+YCbCr Matrix: TV.601
+
+[V4+ Styles]
+Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
+Style: Default,Helvetica Neue,60,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.5,2,2,0,0,100,1
+Style: Helvetica Neue 30,Helvetica Neue,30,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,100,1
+Style: Helvetica Neue 120pt,Helvetica Neue,120,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.5,2,2,10,10,100,1
+Style: Helvetica Neue 60 Top,Helvetica Neue,60,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.5,2,8,10,10,100,1
+Style: Helvetica Neue 60 Center,Helvetica Neue 60 Center,60,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.5,2,5,10,10,100,1
+
+[Events]
+Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
+Dialogue: 0,0:00:01.00,0:00:03.00,Default,,0,0,0,,Helvetica Neue 60pt - Default\NBottom 100 pt off edge
+Dialogue: 0,0:00:04.00,0:00:06.00,Helvetica Neue 30,,0,0,0,,Helvetica Neue 30pt\NBottom 100pt off edge
+Dialogue: 0,0:00:07.00,0:00:09.00,Helvetica Neue 120pt,,0,0,0,,Helvetica Neue 120pt\NBottom 100pt off edge
+Dialogue: 0,0:00:10.00,0:00:12.00,Helvetica Neue 60 Top,,0,0,0,,Helvetica Neue 60pt\NTop Alignment 100pt off edge
+Dialogue: 0,0:00:13.00,0:00:15.00,Helvetica Neue 60 Center,,0,0,0,,Helvetica Neue 60pt\N Vertical Center Alignment
index d3a34bfa69ab9d43e6ef3c2bc25ebf2e891acd12..d882718cc68be52e3a8dda9da84ea8d034d07fc1 100644 (file)
@@ -451,6 +451,59 @@ BOOST_AUTO_TEST_CASE (ssa_reader_test6)
        SUB_END ();
 }
 
+
+BOOST_AUTO_TEST_CASE (ssa_reader_test7)
+{
+       auto p = boost::filesystem::path("test") / "data" / "test3.ssa";
+       auto f = fopen(p.string().c_str(), "r");
+       BOOST_REQUIRE(f);
+       sub::SSAReader reader(f);
+       fclose(f);
+       auto subs = sub::collect<vector<sub::Subtitle>>(reader.subtitles());
+
+       auto i = subs.begin();
+       vector<sub::Line>::iterator j;
+       vector<sub::Block>::iterator k;
+
+       BOOST_REQUIRE (i != subs.end());
+
+       SUB_START(sub::Time::from_hms(0, 0, 1, 0), sub::Time::from_hms(0, 0, 3, 0));
+       LINE((60.0 * 1.2 / 792), sub::BOTTOM_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK("Helvetica Neue 60pt - Default", "Helvetica Neue", 60, false, false, false);
+       LINE(0, sub::BOTTOM_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK("Bottom 100 pt off edge", "Helvetica Neue", 60, false, false, false);
+       SUB_END();
+
+       SUB_START(sub::Time::from_hms(0, 0, 4, 0), sub::Time::from_hms(0, 0, 6, 0));
+       LINE((30.0 * 1.2 / 792), sub::BOTTOM_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK("Helvetica Neue 30pt", "Helvetica Neue", 30, false, false, false);
+       LINE(0, sub::BOTTOM_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK("Bottom 100pt off edge", "Helvetica Neue", 30, false, false, false);
+       SUB_END();
+
+       SUB_START(sub::Time::from_hms(0, 0, 7, 0), sub::Time::from_hms(0, 0, 9, 0));
+       LINE((120.0 * 1.2 / 792), sub::BOTTOM_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK("Helvetica Neue 120pt", "Helvetica Neue", 120, false, false, false);
+       LINE(0, sub::BOTTOM_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK("Bottom 100pt off edge", "Helvetica Neue", 120, false, false, false);
+       SUB_END();
+
+       SUB_START(sub::Time::from_hms(0, 0, 10, 0), sub::Time::from_hms(0, 0, 12, 0));
+       LINE(0, sub::TOP_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK("Helvetica Neue 60pt", "Helvetica Neue", 60, false, false, false);
+       LINE((60.0 * 1.2 / 792), sub::TOP_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK("Top Alignment 100pt off edge", "Helvetica Neue", 60, false, false, false);
+       SUB_END();
+
+       SUB_START(sub::Time::from_hms(0, 0, 13, 0), sub::Time::from_hms(0, 0, 15, 0));
+       LINE((-60.0 * 1.2 / 792), sub::VERTICAL_CENTRE_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK("Helvetica Neue 60pt", "Helvetica Neue 60 Center", 60, false, false, false);
+       LINE(0, sub::VERTICAL_CENTRE_OF_SCREEN, 0, sub::HORIZONTAL_CENTRE_OF_SCREEN);
+       BLOCK(" Vertical Center Alignment", "Helvetica Neue 60 Center", 60, false, false, false);
+       SUB_END();
+}
+
+
 /** Test \pos */
 BOOST_AUTO_TEST_CASE (ssa_reader_pos)
 {