From 23945f433d9cac2e8b8461a574baa70e1acaae1e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 5 Jul 2022 23:15:37 +0200 Subject: [PATCH] Fix pretty broken SSA alignment code. --- src/ssa_reader.cc | 29 ++++++++-------------- test/data/test3.ssa | 26 ++++++++++++++++++++ test/ssa_reader_test.cc | 53 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 19 deletions(-) create mode 100644 test/data/test3.ssa diff --git a/src/ssa_reader.cc b/src/ssa_reader.cc index 39b99d2..0379803 100644 --- a/src/ssa_reader.cc +++ b/src/ssa_reader.cc @@ -125,28 +125,19 @@ public: effect = SHADOW; } } else if (keys[i] == "Alignment") { - /* These values from libass' source code */ - switch ((raw_convert (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 (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 (style[i]); diff --git a/test/data/test3.ssa b/test/data/test3.ssa new file mode 100644 index 0000000..75b2c27 --- /dev/null +++ b/test/data/test3.ssa @@ -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 diff --git a/test/ssa_reader_test.cc b/test/ssa_reader_test.cc index d3a34bf..d882718 100644 --- a/test/ssa_reader_test.cc +++ b/test/ssa_reader_test.cc @@ -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>(reader.subtitles()); + + auto i = subs.begin(); + vector::iterator j; + vector::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) { -- 2.30.2