#ifndef LIBSUB_SUBTITLE_H
#define LIBSUB_SUBTITLE_H
-#include "frame_time.h"
-#include "metric_time.h"
#include "colour.h"
#include "vertical_reference.h"
#include "effect.h"
+#include "font_size.h"
+#include "vertical_position.h"
+#include "horizontal_position.h"
+#include "raw_subtitle.h"
#include <boost/optional.hpp>
#include <string>
-#include <list>
+#include <vector>
namespace sub {
-class Subtitle
+/** @class Block
+ * @brief A block of text within a subtitle's line
+ *
+ * This represents a block of text which has a particular style (font, size, effect, colour etc.)
+ */
+class Block
{
public:
- Subtitle ()
+ Block ()
: colour (1, 1, 1)
, bold (false)
, italic (false)
, underline (false)
- , line (0)
{}
+ /** Construct a Block taking any relevant information from a RawSubtitle */
+ Block (RawSubtitle s);
+
/** Subtitle text in UTF-8 */
std::string text;
- std::string font;
+ boost::optional<std::string> font;
/** font size */
- struct {
- /** as a proportion of screen height */
- boost::optional<float> proportional;
- /** in points */
- boost::optional<int> points;
- } font_size;
-
- float font_size_proportional (int screen_height_in_points) const;
- int font_size_points (int screen_height_in_points) const;
-
- /** vertical position of the baseline of the text */
- struct {
- /** as a proportion of screen height offset from some reference point */
- boost::optional<float> proportional;
- /** reference position for proportional */
- boost::optional<VerticalReference> reference;
- } vertical_position;
+ FontSize font_size;
boost::optional<Effect> effect;
boost::optional<Colour> effect_colour;
-
+
Colour colour;
bool bold; ///< true to use a bold version of font
bool italic; ///< true to use an italic version of font
bool underline; ///< true to underline
- int line; ///< line number, starting from 0
+};
- /** from time */
- struct {
- boost::optional<FrameTime> frame;
- boost::optional<MetricTime> metric;
- } from;
+extern bool operator== (Block const & a, Block const & b);
+
+/** @class Line
+ * @brief A line of text within a subtitle.
+ *
+ * This represents a line of text which has a particular vertical position.
+ */
+class Line
+{
+public:
+ Line ()
+ {
+ horizontal_position.reference = HORIZONTAL_CENTRE_OF_SCREEN;
+ }
+
+ /** Construct a Line taking any relevant information from a RawSubtitle */
+ Line (RawSubtitle s);
+
+ HorizontalPosition horizontal_position;
+
+ /** vertical position of the baseline of the text */
+ VerticalPosition vertical_position;
+
+ std::vector<Block> blocks;
+
+ bool same_metadata (RawSubtitle) const;
+};
- FrameTime from_frame (float frames_per_second) const;
- MetricTime from_metric (float frames_per_second) const;
+extern bool operator== (Line const & a, Line const & b);
+/** @class Subtitle
+ * @brief A subtitle which has been collected into lines and blocks.
+ *
+ * This represents a chunk of text which appears and disappears at some particular
+ * times.
+ */
+class Subtitle
+{
+public:
+ Subtitle ()
+ {}
+
+ /** Construct a Line taking any relevant information from a RawSubtitle */
+ Subtitle (RawSubtitle s);
+
+ /** from time */
+ Time from;
/** to time */
- struct {
- boost::optional<FrameTime> frame;
- boost::optional<MetricTime> metric;
- } to;
-
- FrameTime to_frame (float frames_per_second) const;
- MetricTime to_metric (float frames_per_second) const;
-
- boost::optional<MetricTime> fade_up;
- boost::optional<MetricTime> fade_down;
+ Time to;
+
+ boost::optional<Time> fade_up;
+ boost::optional<Time> fade_down;
+
+ std::vector<Line> lines;
+
+ bool same_metadata (RawSubtitle) const;
};
-bool operator< (Subtitle const & a, Subtitle const & b);
+extern bool operator== (Subtitle const & a, Subtitle const & b);
}