summaryrefslogtreecommitdiff
path: root/src/lib/subtitle_content.h
blob: b64e4787b536b1d7fec96519027155ab9312e736 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/*
    Copyright (C) 2013-2018 Carl Hetherington <cth@carlh.net>

    This file is part of DCP-o-matic.

    DCP-o-matic is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    DCP-o-matic is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.

*/

#ifndef DCPOMATIC_SUBTITLE_CONTENT_H
#define DCPOMATIC_SUBTITLE_CONTENT_H

#include "content_part.h"
#include <libcxml/cxml.h>
#include <dcp/types.h>
#include <boost/signals2.hpp>

class Font;

class SubtitleContentProperty
{
public:
	static int const X_OFFSET;
	static int const Y_OFFSET;
	static int const X_SCALE;
	static int const Y_SCALE;
	static int const USE;
	static int const BURN;
	static int const LANGUAGE;
	static int const FONTS;
	static int const COLOUR;
	static int const EFFECT;
	static int const EFFECT_COLOUR;
	static int const LINE_SPACING;
	static int const FADE_IN;
	static int const FADE_OUT;
	static int const OUTLINE_WIDTH;
};

/** @class SubtitleContent
 *  @brief Description of how some subtitle content should be presented.
 *
 *  There are `image' subtitles (bitmaps) and `text' subtitles (plain text),
 *  and not all of the settings in this class correspond to both types.
 */
class SubtitleContent : public ContentPart
{
public:
	explicit SubtitleContent (Content* parent);
	SubtitleContent (Content* parent, std::vector<boost::shared_ptr<Content> >);

	void as_xml (xmlpp::Node *) const;
	std::string identifier () const;
	void take_settings_from (boost::shared_ptr<const SubtitleContent> c);

	void add_font (boost::shared_ptr<Font> font);

	void set_use (bool);
	void set_burn (bool);
	void set_x_offset (double);
	void set_y_offset (double);
	void set_x_scale (double);
	void set_y_scale (double);
	void set_language (std::string language);
	void set_colour (dcp::Colour);
	void unset_colour ();
	void set_effect (dcp::Effect);
	void unset_effect ();
	void set_effect_colour (dcp::Colour);
	void unset_effect_colour ();
	void set_line_spacing (double s);
	void set_fade_in (ContentTime);
	void unset_fade_in ();
	void set_fade_out (ContentTime);
	void set_outline_width (int);
	void unset_fade_out ();

	bool use () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _use;
	}

	bool burn () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _burn;
	}

	double x_offset () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _x_offset;
	}

	double y_offset () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _y_offset;
	}

	double x_scale () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _x_scale;
	}

	double y_scale () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _y_scale;
	}

	std::list<boost::shared_ptr<Font> > fonts () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _fonts;
	}

	std::string language () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _language;
	}

	boost::optional<dcp::Colour> colour () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _colour;
	}

	boost::optional<dcp::Effect> effect () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _effect;
	}

	boost::optional<dcp::Colour> effect_colour () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _effect_colour;
	}

	double line_spacing () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _line_spacing;
	}

	boost::optional<ContentTime> fade_in () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _fade_in;
	}

	boost::optional<ContentTime> fade_out () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _fade_out;
	}

	int outline_width () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _outline_width;
	}

	static boost::shared_ptr<SubtitleContent> from_xml (Content* parent, cxml::ConstNodePtr, int version);

protected:
	/** subtitle language (e.g. "German") or empty if it is not known */
	std::string _language;

private:
	friend struct ffmpeg_pts_offset_test;

	SubtitleContent (Content* parent, cxml::ConstNodePtr, int version);
	void font_changed ();
	void connect_to_fonts ();

	std::list<boost::signals2::connection> _font_connections;

	bool _use;
	bool _burn;
	/** x offset for placing subtitles, as a proportion of the container width;
	 * +ve is further right, -ve is further left.
	 */
	double _x_offset;
	/** y offset for placing subtitles, as a proportion of the container height;
	 *  +ve is further down the frame, -ve is further up.
	 */
	double _y_offset;
	/** x scale factor to apply to subtitles */
	double _x_scale;
	/** y scale factor to apply to subtitles */
	double _y_scale;
	std::list<boost::shared_ptr<Font> > _fonts;
	boost::optional<dcp::Colour> _colour;
	boost::optional<dcp::Effect> _effect;
	boost::optional<dcp::Colour> _effect_colour;
	/** scaling factor for line spacing; 1 is "standard", < 1 is closer together, > 1 is further apart */
	double _line_spacing;
	boost::optional<ContentTime> _fade_in;
	boost::optional<ContentTime> _fade_out;
	int _outline_width;
};

#endif