summaryrefslogtreecommitdiff
path: root/src/ssa_reader.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-08-10 20:58:19 +0200
committerCarl Hetherington <cth@carlh.net>2022-08-10 20:58:36 +0200
commit540eae22a6b42a3985e36f0f1d068e0ba748a41a (patch)
treeaf562f074dedf3f2a4722b38c928fdf31b572f1d /src/ssa_reader.cc
parentfa12ed65527770e2adf300e39526dd0b36fce8c7 (diff)
Fix parsing of SSA colour tags which have their leading zeros omitted.v1.6.27
Diffstat (limited to 'src/ssa_reader.cc')
-rw-r--r--src/ssa_reader.cc24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/ssa_reader.cc b/src/ssa_reader.cc
index 8632251..07d592a 100644
--- a/src/ssa_reader.cc
+++ b/src/ssa_reader.cc
@@ -25,6 +25,7 @@
#include "compose.hpp"
#include <boost/algorithm/string.hpp>
#include <boost/bind/bind.hpp>
+#include <cstdlib>
#include <iostream>
#include <vector>
@@ -55,17 +56,24 @@ SSAReader::SSAReader (FILE* f)
Colour
h_colour (string s)
{
- /* There are both BGR and ABGR versions of these colours */
- if ((s.length() != 8 && s.length() != 10) || s[0] != '&' || s[1] != 'H') {
+ if (s.empty() || s[0] != '&' || s[1] != 'H') {
throw SSAError(String::compose("Badly formatted colour tag %1", s));
}
- int ir, ig, ib;
- /* XXX: ignoring alpha channel here; note that 00 is opaque and FF is transparent */
- int const off = s.length() == 10 ? 4 : 2;
- if (sscanf(s.c_str() + off, "%2x%2x%2x", &ib, &ig, &ir) < 3) {
- throw SSAError(String::compose("Badly formatted colour tag %1", s));
+
+ auto start = s.c_str();
+ auto const end = start + s.length();
+ while (start < end && (*start == '&' || *start == 'H')) {
+ ++start;
}
- return sub::Colour(ir / 255.0, ig / 255.0, ib / 255.0);
+
+ auto const colour = strtoll(start, nullptr, 16);
+
+ /* XXX: ignoring alpha channel here; note that 00 is opaque and FF is transparent */
+ return sub::Colour(
+ ((colour & 0x000000ff) >> 0) / 255.0,
+ ((colour & 0x0000ff00) >> 8) / 255.0,
+ ((colour & 0x00ff0000) >> 16) / 255.0
+ );
}
class Style