sub.from.set_frame (get_timecode (5));
sub.to.set_frame (get_timecode (9));
sub.vertical_position.line = get_int (13, 1) + i;
-
- /* XXX: justification, effects */
- /* 8Fh is unused space, so trim the string to the first instance of that */
- size_t unused = lines[i].find_first_of ('\x8f');
- if (unused != string::npos) {
- lines[i] = lines[i].substr (0, unused);
+ string text;
+ for (size_t j = 0; j < lines[i].size(); ++j) {
+
+ unsigned char const c = static_cast<unsigned char> (lines[i][j]);
+
+ if (c == 0x8f) {
+ /* Unused space i.e. end of line */
+ break;
+ }
+
+ if (c >= 0x80 && c <= 0x83) {
+ /* Italic or underline control code */
+ sub.text = utf_to_utf<char> (iso6937_to_utf16 (text.c_str()));
+ _subs.push_back (sub);
+ text.clear ();
+ }
+
+ switch (c) {
+ case 0x80:
+ sub.italic = true;
+ break;
+ case 0x81:
+ sub.italic = false;
+ break;
+ case 0x82:
+ sub.underline = true;
+ break;
+ case 0x83:
+ sub.underline = false;
+ break;
+ default:
+ text += lines[i][j];
+ break;
+ }
}
- sub.text = utf_to_utf<char> (iso6937_to_utf16 (lines[i].c_str()));
- _subs.push_back (sub);
+ if (!text.empty ()) {
+ sub.text = utf_to_utf<char> (iso6937_to_utf16 (text.c_str()));
+ _subs.push_back (sub);
+ }
+
+ /* XXX: justification */
}
}
}
using std::setw;
using std::setfill;
using std::max;
+using std::cout;
using namespace sub;
static void
}
static void
-put_int (char* p, int v, unsigned int n)
+put_int_as_string (char* p, int v, unsigned int n)
{
std::stringstream s;
/* Be careful to ensure we get no thousands separators */
put_string (p, s.str ());
}
+static void
+put_int_as_int (char* p, int v, unsigned int n)
+{
+ for (unsigned int i = 0; i < n; ++i) {
+ *p++ = (v & ((1 << ((i + 1) * 8)) - 1)) >> (i * 8);
+ }
+}
+
/** @param language ISO 3-character country code for the language of the subtitles */
void
sub::write_stl_binary (
put_string (buffer + 208, "0000000000000000");
put_string (buffer + 224, creation_date);
put_string (buffer + 230, revision_date);
- put_int (buffer + 236, revision_number, 2);
+ put_int_as_string (buffer + 236, revision_number, 2);
/* TTI blocks */
- put_int (buffer + 238, subtitles.size (), 5);
+ put_int_as_string (buffer + 238, subtitles.size (), 5);
/* Total number of subtitles */
- put_int (buffer + 243, subtitles.size (), 5);
+ put_int_as_string (buffer + 243, subtitles.size (), 5);
/* Total number of subtitle groups */
put_string (buffer + 248, "000");
/* Maximum number of displayable characters in any text row */
- put_int (buffer + 251, 2, longest);
+ put_int_as_string (buffer + 251, 2, longest);
/* Maximum number of displayable rows */
- put_int (buffer + 253, 2, rows);
+ put_int_as_string (buffer + 253, 2, rows);
/* Time code status */
put_string (buffer + 255, "1");
/* Start-of-programme time code */
output.write (buffer, 1024);
+ int N = 0;
for (list<Subtitle>::const_iterator i = subtitles.begin(); i != subtitles.end(); ++i) {
+
+ /* Subtitle group number */
+ put_int_as_int (buffer + 0, 0, 1);
+ /* Subtitle number */
+ put_int_as_int (buffer + 1, N, 2);
+ /* Extension block number */
+ put_int_as_int (buffer + 3, 0, 1);
+ /* Cumulative status */
+ put_int_as_int (buffer + 4, tables.cumulative_status_enum_to_file (CUMULATIVE_STATUS_NOT_CUMULATIVE), 1);
+ /* Time code in */
+ put_int_as_int (buffer + 5, i->from.frame(frames_per_second).hours (), 1);
+ put_int_as_int (buffer + 6, i->from.frame(frames_per_second).minutes (), 1);
+ put_int_as_int (buffer + 7, i->from.frame(frames_per_second).seconds (), 1);
+ put_int_as_int (buffer + 8, i->from.frame(frames_per_second).frames (), 1);
+ /* Time code out */
+ put_int_as_int (buffer + 9, i->to.frame(frames_per_second).hours (), 1);
+ put_int_as_int (buffer + 10, i->to.frame(frames_per_second).minutes (), 1);
+ put_int_as_int (buffer + 11, i->to.frame(frames_per_second).seconds (), 1);
+ put_int_as_int (buffer + 12, i->to.frame(frames_per_second).frames (), 1);
+ /* Vertical position */
+ /* XXX */
+ put_int_as_int (buffer + 13, 0, 1);
+ /* Justification code */
+ /* XXX */
+ put_int_as_int (buffer + 14, tables.justification_enum_to_file (JUSTIFICATION_NONE), 1);
+ /* Comment flag */
+ put_int_as_int (buffer + 15, tables.comment_enum_to_file (COMMENT_NO), 1);
+
+ /* Text */
+ string text;
+ bool italic = false;
+ bool underline = false;
+ for (list<Line>::const_iterator j = i->lines.begin(); j != i->lines.end(); ++j) {
+ for (list<Block>::const_iterator k = j->blocks.begin(); k != j->blocks.end(); ++k) {
+ if (k->underline && !underline) {
+ text += "\x82";
+ underline = true;
+ } else if (underline && !k->underline) {
+ text += "\x83";
+ underline = false;
+ }
+ if (k->italic && !italic) {
+ text += "\x80";
+ italic = true;
+ } else if (italic && !k->italic) {
+ text += "\x81";
+ italic = false;
+ }
+
+ text += k->text;
+ }
+
+ text += "\x8A";
+ }
+
+ if (text.length() > 111) {
+ text = text.substr (111);
+ }
+
+ while (text.length() < 112) {
+ text += "\x8F";
+ }
+
+ put_string (buffer + 16, text);
+ output.write (buffer, 128);
}
delete[] buffer;
s.from.set_frame (sub::FrameTime (0, 0, 41, 9));
s.to.set_frame (sub::FrameTime (0, 0, 42, 21));
- sub::Line l;
- l.vertical_position.line = 0;
-
- sub::Block b;
- b.text = "This is a subtitle ";
- b.font = "Arial";
- b.font_size.set_points (42);
- l.blocks.push_back (b);
-
- b.text = " and that's a line break";
- b.font = "Arial";
- b.font_size.set_points (42);
- l.blocks.push_back (b);
+ {
+ sub::Block b;
+ b.text = "This is a subtitle";
+ b.font = "Arial";
+ b.font_size.set_points (42);
+ sub::Line l;
+ l.vertical_position.line = 0;
+ l.blocks.push_back (b);
+ s.lines.push_back (l);
+ }
+
+ {
+ sub::Block b;
+ b.text = "and that's a line break";
+ b.font = "Arial";
+ b.font_size.set_points (42);
+ sub::Line l;
+ l.vertical_position.line = 1;
+ l.blocks.push_back (b);
+ s.lines.push_back (l);
+ }
- s.lines.push_back (l);
subs.push_back (s);
}
b.font_size.set_points (42);
l.blocks.push_back (b);
- b.text = "bold";
- b.bold = true;
+ b.text = "underline";
+ b.underline = true;
l.blocks.push_back (b);
b.text = " and some ";
- b.bold = false;
+ b.underline = false;
l.blocks.push_back (b);
- b.text = "bold italic";
- b.bold = true;
- b.italic = true;
- l.blocks.push_back (b);
-
- b.text = " and some ";
- b.bold = false;
- b.italic = false;
+ b.text = "underlined italic";
b.underline = true;
+ b.italic = true;
l.blocks.push_back (b);
s.lines.push_back (l);