summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2024-05-22 23:04:40 +0200
committerCarl Hetherington <cth@carlh.net>2024-05-22 23:30:01 +0200
commitaffaca1e5bc1c4dfdd7f2bd0f0dbbd9ec825b157 (patch)
tree8c4e41da0df0cde983a3c85a8312c61c31e560cb /src
parent607ba59181708568c23295aa1069ebbfc78f2e9c (diff)
Add a Context class to manage some state.
Diffstat (limited to 'src')
-rw-r--r--src/ssa_reader.cc21
-rw-r--r--src/ssa_reader.h18
-rw-r--r--src/subrip_reader.cc2
3 files changed, 28 insertions, 13 deletions
diff --git a/src/ssa_reader.cc b/src/ssa_reader.cc
index ffbbc99..262bba7 100644
--- a/src/ssa_reader.cc
+++ b/src/ssa_reader.cc
@@ -199,8 +199,9 @@ SSAReader::parse_time (string t) const
);
}
+
void
-SSAReader::parse_tag(RawSubtitle& sub, string tag, int play_res_x, int play_res_y, Colour primary_colour)
+SSAReader::parse_tag(RawSubtitle& sub, string tag, Context const& context)
{
if (tag == "\\i1") {
sub.italic = true;
@@ -246,18 +247,18 @@ SSAReader::parse_tag(RawSubtitle& sub, string tag, int play_res_x, int play_res_
boost::algorithm::split (bits, tag, boost::is_any_of("(,"));
SUB_ASSERT (bits.size() == 3);
sub.horizontal_position.reference = sub::LEFT_OF_SCREEN;
- sub.horizontal_position.proportional = raw_convert<float>(bits[1]) / play_res_x;
+ sub.horizontal_position.proportional = raw_convert<float>(bits[1]) / context.play_res_x;
sub.vertical_position.reference = sub::TOP_OF_SCREEN;
- sub.vertical_position.proportional = raw_convert<float>(bits[2]) / play_res_y;
+ sub.vertical_position.proportional = raw_convert<float>(bits[2]) / context.play_res_y;
} else if (boost::starts_with(tag, "\\fs")) {
SUB_ASSERT (tag.length() > 3);
- sub.font_size.set_proportional(raw_convert<float>(tag.substr(3)) / play_res_y);
+ sub.font_size.set_proportional(raw_convert<float>(tag.substr(3)) / context.play_res_y);
} else if (boost::starts_with(tag, "\\c")) {
/* \c&Hbbggrr& */
if (tag.length() > 2) {
sub.colour = h_colour(tag.substr(2, tag.length() - 3));
} else if (tag.length() == 2) {
- sub.colour = primary_colour;
+ sub.colour = context.primary_colour;
} else {
throw SSAError(String::compose("Badly formatted colour tag %1", tag));
}
@@ -269,7 +270,7 @@ SSAReader::parse_tag(RawSubtitle& sub, string tag, int play_res_x, int play_res_
* @return List of RawSubtitles to represent line with vertical reference TOP_OF_SUBTITLE.
*/
vector<RawSubtitle>
-SSAReader::parse_line(RawSubtitle base, string line, int play_res_x, int play_res_y, Colour primary_colour)
+SSAReader::parse_line(RawSubtitle base, string line, Context const& context)
{
enum {
TEXT,
@@ -297,7 +298,7 @@ SSAReader::parse_line(RawSubtitle base, string line, int play_res_x, int play_re
lines are to work out the position on screen.
*/
if (!current.font_size.proportional()) {
- current.font_size.set_proportional(72.0 / play_res_y);
+ current.font_size.set_proportional(72.0 / context.play_res_y);
}
/* Count the number of line breaks */
@@ -311,7 +312,7 @@ SSAReader::parse_line(RawSubtitle base, string line, int play_res_x, int play_re
}
/* There are vague indications that with ASS 1 point should equal 1 pixel */
- double const line_size = current.font_size.proportional(play_res_y) * 1.2;
+ double const line_size = current.font_size.proportional(context.play_res_y) * 1.2;
for (size_t i = 0; i < line.length(); ++i) {
char const c = line[i];
@@ -331,7 +332,7 @@ SSAReader::parse_line(RawSubtitle base, string line, int play_res_x, int play_re
subs.push_back (current);
current.text = "";
}
- parse_tag(current, tag, play_res_x, play_res_y, primary_colour);
+ parse_tag(current, tag, context);
tag = "";
}
@@ -517,7 +518,7 @@ SSAReader::read (function<optional<string> ()> get_line)
sub.vertical_position.proportional = raw_convert<float>(event[i]) / play_res_y;
}
} else if (event_format[i] == "Text") {
- for (auto j: parse_line(sub, event[i], play_res_x, play_res_y, style ? style->primary_colour : Colour(1, 1, 1))) {
+ for (auto j: parse_line(sub, event[i], Context(play_res_x, play_res_y, style ? style->primary_colour : Colour(1, 1, 1)))) {
_subs.push_back (j);
}
}
diff --git a/src/ssa_reader.h b/src/ssa_reader.h
index d47d8cb..5de660c 100644
--- a/src/ssa_reader.h
+++ b/src/ssa_reader.h
@@ -41,8 +41,22 @@ public:
SSAReader (FILE* f);
SSAReader (std::string subs);
- static std::vector<RawSubtitle> parse_line(RawSubtitle base, std::string line, int play_res_x, int play_res_y, Colour primary_colour);
- static void parse_tag(RawSubtitle& sub, std::string style, int play_res_x, int play_res_y, Colour primary_colour);
+ class Context
+ {
+ public:
+ Context(int play_res_x_, int play_res_y_, Colour primary_colour_)
+ : play_res_x(play_res_x_)
+ , play_res_y(play_res_y_)
+ , primary_colour(primary_colour_)
+ {}
+
+ int play_res_x;
+ int play_res_y;
+ Colour primary_colour;
+ };
+
+ static std::vector<RawSubtitle> parse_line(RawSubtitle base, std::string line, Context const& context);
+ static void parse_tag(RawSubtitle& sub, std::string style, Context const& context);
private:
void read (boost::function<boost::optional<std::string> ()> get_line);
diff --git a/src/subrip_reader.cc b/src/subrip_reader.cc
index e059db4..3f68025 100644
--- a/src/subrip_reader.cc
+++ b/src/subrip_reader.cc
@@ -309,7 +309,7 @@ SubripReader::convert_line (string t, RawSubtitle& p)
++i;
}
++i;
- SSAReader::parse_tag(p, ssa, 288, 288, Colour(1, 1, 1));
+ SSAReader::parse_tag(p, ssa, SSAReader::Context{288, 288, Colour(1, 1, 1)});
} else {
p.text += t[i];
++i;