MythTV master
subtitlescreen.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2
3#ifndef SUBTITLESCREEN_H
4#define SUBTITLESCREEN_H
5
6#include "libmythbase/mythconfig.h"
7
8#include <utility>
9#if CONFIG_LIBASS
10extern "C" {
11#include <ass/ass.h>
12}
13#endif
14
15// Qt headers
16#include <QFont>
17#include <QHash>
18#include <QRect>
19#include <QSize>
20#include <QStringList>
21#include <QVector>
22
23// MythTV headers
30
31class SubtitleScreen;
32class TestSubtitleScreen;
33
35{
36public:
38 CC708CharacterAttribute formatting,
40 // NOLINTNEXTLINE(performance-move-const-arg)
41 : m_text(std::move(t)), m_format(std::move(formatting)), m_parent(p) {}
42 FormattedTextChunk(void) = default;
43
44 QSize CalcSize(float layoutSpacing = 0.0F) const;
45 void CalcPadding(bool isFirst, bool isLast, int &left, int &right) const;
46 bool Split(FormattedTextChunk &newChunk);
47 QString ToLogString(void) const;
48 bool PreRender(bool isFirst, bool isLast, int &x, int y, int height);
49
50 QString m_text;
52 const SubtitleScreen *m_parent {nullptr}; // where fonts and sizes are kept
53
54 // The following are calculated by PreRender().
58 QString m_textName;
60};
61
63{
64public:
65 explicit FormattedTextLine(int x = -1, int y = -1, int o_x = -1, int o_y = -1)
66 : m_xIndent(x), m_yIndent(y), m_origX(o_x), m_origY(o_y) {}
67
68 QSize CalcSize(float layoutSpacing = 0.0F) const;
69
70 QList<FormattedTextChunk> chunks;
71 int m_xIndent {-1}; // -1 means TBD i.e. centered
72 int m_yIndent {-1}; // -1 means TBD i.e. relative to bottom
73 int m_origX {-1}; // original, unscaled coordinates
74 int m_origY {-1}; // original, unscaled coordinates
75};
76
78{
79 friend class TestSubtitleScreen;
80
81protected:
82 FormattedTextSubtitle(QString base, QRect safearea,
83 std::chrono::milliseconds start,
84 std::chrono::milliseconds duration,
86 m_base(std::move(base)), m_safeArea(safearea),
87 m_start(start), m_duration(duration), m_subScreen(p) {}
88 FormattedTextSubtitle(void) = default;
89public:
90 virtual ~FormattedTextSubtitle() = default;
91 // These are the steps that can be done outside of the UI thread
92 // and the decoder thread.
93 virtual void WrapLongLines(void) {}
94 virtual void Layout(void);
95 virtual void PreRender(void);
96 // This is the step that can only be done in the UI thread.
97 virtual void Draw(void);
98 virtual int CacheNum(void) const { return -1; }
99 QStringList ToSRT(void) const;
100
101protected:
102 QString m_base;
103 QVector<FormattedTextLine> m_lines;
104 const QRect m_safeArea;
105 std::chrono::milliseconds m_start {0ms};
106 std::chrono::milliseconds m_duration {0ms};
107 SubtitleScreen *m_subScreen {nullptr}; // where fonts and sizes are kept
108 int m_xAnchorPoint {0}; // 0=left, 1=center, 2=right
109 int m_yAnchorPoint {0}; // 0=top, 1=center, 2=bottom
110 int m_xAnchor {0}; // pixels from left
111 int m_yAnchor {0}; // pixels from top
112 QRect m_bounds;
113};
114
116{
117public:
118 FormattedTextSubtitleSRT(const QString &base,
119 QRect safearea,
120 std::chrono::milliseconds start,
121 std::chrono::milliseconds duration,
123 const QStringList &subs) :
124 FormattedTextSubtitle(base, safearea, start, duration, p)
125 {
126 Init(subs);
127 }
128 void WrapLongLines(void) override; // FormattedTextSubtitle
129private:
130 void Init(const QStringList &subs);
131};
132
134{
135public:
136 explicit FormattedTextSubtitle608(const std::vector<CC608Text*> &buffers,
137 const QString &base = "",
138 QRect safearea = QRect(),
139 SubtitleScreen *p = nullptr) :
140 FormattedTextSubtitle(base, safearea, 0ms, 0ms, p)
141 {
142 Init(buffers);
143 }
144 void Layout(void) override; // FormattedTextSubtitle
145private:
146 void Init(const std::vector<CC608Text*> &buffers);
147};
148
150{
151public:
153 int num,
154 const std::vector<CC708String*> &list,
155 const QString &base = "",
156 QRect safearea = QRect(),
157 SubtitleScreen *p = nullptr,
158 float aspect = 1.77777F) :
159 FormattedTextSubtitle(base, safearea, 0ms, 0ms, p),
160 m_num(num),
161 m_bgFillAlpha(win.GetFillAlpha()),
162 m_bgFillColor(win.GetFillColor())
163 {
164 Init(win, list, aspect);
165 }
166 void Draw(void) override; // FormattedTextSubtitle
167 int CacheNum(void) const override // FormattedTextSubtitle
168 { return m_num; }
169private:
170 void Init(const CC708Window &win,
171 const std::vector<CC708String*> &list,
172 float aspect);
173 int m_num;
176};
177
179{
180 Q_OBJECT
181public:
182 SubtitleScreen(MythPlayer* Player, MythPainter* Painter, const QString& Name, int FontStretch);
183 ~SubtitleScreen() override;
184
185 void EnableSubtitles(int type, bool forced_only = false);
186 void DisableForcedSubtitles(void);
187 int EnabledSubtitleType(void) const { return m_subtitleType; }
188
189 void ClearAllSubtitles(void);
190 void ClearNonDisplayedSubtitles(void);
191 void ClearDisplayedSubtitles(void);
192 void DisplayDVDButton(AVSubtitle* dvdButton, QRect &buttonPos);
193
194 void SetZoom(int percent);
195 int GetZoom(void) const;
196 void SetDelay(std::chrono::milliseconds ms);
197 std::chrono::milliseconds GetDelay(void) const;
198
199 class SubtitleFormat *GetSubtitleFormat(void) { return m_format; }
200 void Clear708Cache(uint64_t mask);
201 void SetElementAdded(void);
202 void SetElementResized(void);
203 void SetElementDeleted(void);
204
205 QSize CalcTextSize(const QString &text,
206 const CC708CharacterAttribute &format,
207 float layoutSpacing) const;
208 void CalcPadding(const CC708CharacterAttribute &format,
209 bool isFirst, bool isLast,
210 int &left, int &right) const;
212 void SetFontSize(int pixelSize) { m_fontSize = pixelSize; }
213
214 // Temporary methods until teletextscreen.cpp is refactored into
215 // subtitlescreen.cpp
216 static QString GetTeletextFontName(void);
217 static int GetTeletextBackgroundAlpha(void);
218
219 // MythScreenType methods
220 bool Create(void) override; // MythScreenType
221 void Pulse(void) override; // MythUIType
222
223private:
224 void ResetElementState(void);
225 void OptimiseDisplayedArea(void);
226 void DisplayAVSubtitles(void);
227 int DisplayScaledAVSubtitles(const AVSubtitleRect *rect, QRect &bbox,
228 bool top, QRect &display, int forced,
229 const QString& imagename,
230 std::chrono::milliseconds displayuntil,
231 std::chrono::milliseconds late);
233 void DisplayRawTextSubtitles(void);
234 void DrawTextSubtitles(const QStringList &subs, std::chrono::milliseconds start,
235 std::chrono::milliseconds duration);
236 void DisplayCC608Subtitles(void);
237 void DisplayCC708Subtitles(void);
238 void AddScaledImage(QImage &img, QRect &pos);
239 void InitializeFonts(bool wasResized);
240
241 MythPlayer *m_player {nullptr};
242 SubtitleReader *m_subreader {nullptr};
243 CC608Reader *m_cc608reader {nullptr};
244 CC708Reader *m_cc708reader {nullptr};
246 int m_subtitleType {kDisplayNone};
247 int m_fontSize {0};
248 int m_textFontZoom {100}; // valid for 708 & text subs
249 int m_textFontZoomPrev {100};
250 std::chrono::milliseconds m_textFontDelayMs {0ms}; // valid for text subs
251 std::chrono::milliseconds m_textFontDelayMsPrev {0ms};
252 std::chrono::milliseconds m_textFontMinDurationMs {50ms};
253 std::chrono::milliseconds m_textFontMinDurationMsPrev {50ms};
254 std::chrono::milliseconds m_textFontDurationExtensionMs {0ms};
255 std::chrono::milliseconds m_textFontDurationExtensionMsPrev {0ms};
256 bool m_refreshModified {false};
257 bool m_refreshDeleted {false};
258 bool m_atEnd {false};
260 QString m_family; // 608, 708, text, teletext
261 // Subtitles initialized but still to be processed and drawn
262 QList<FormattedTextSubtitle *> m_qInited;
263 class SubtitleFormat *m_format {nullptr};
264
265#if CONFIG_LIBASS
266 bool InitialiseAssLibrary(void);
267 void LoadAssFonts(void);
268 void CleanupAssLibrary(void);
269 void InitialiseAssTrack(int tracknum);
270 void CleanupAssTrack(void);
271 void AddAssEvent(char *event, uint32_t starttime, uint32_t endtime);
272 void ResizeAssRenderer(void);
273 void RenderAssTrack(std::chrono::milliseconds timecode, bool force);
274
275 ASS_Library *m_assLibrary {nullptr};
276 ASS_Renderer *m_assRenderer {nullptr};
277 int m_assTrackNum {-1};
278 ASS_Track *m_assTrack {nullptr};
279 uint m_assFontCount {0};
280#endif // CONFIG_LIBASS
281};
282
283#endif // SUBTITLESCREEN_H
FormattedTextChunk(void)=default
MythFontProperties * m_textFont
FormattedTextChunk(QString t, CC708CharacterAttribute formatting, SubtitleScreen *p)
QSize CalcSize(float layoutSpacing=0.0F) const
CC708CharacterAttribute m_format
const SubtitleScreen * m_parent
void CalcPadding(bool isFirst, bool isLast, int &left, int &right) const
bool Split(FormattedTextChunk &newChunk)
bool PreRender(bool isFirst, bool isLast, int &x, int y, int height)
QString ToLogString(void) const
QSize CalcSize(float layoutSpacing=0.0F) const
QList< FormattedTextChunk > chunks
FormattedTextLine(int x=-1, int y=-1, int o_x=-1, int o_y=-1)
FormattedTextSubtitle608(const std::vector< CC608Text * > &buffers, const QString &base="", QRect safearea=QRect(), SubtitleScreen *p=nullptr)
int CacheNum(void) const override
FormattedTextSubtitle708(const CC708Window &win, int num, const std::vector< CC708String * > &list, const QString &base="", QRect safearea=QRect(), SubtitleScreen *p=nullptr, float aspect=1.77777F)
FormattedTextSubtitleSRT(const QString &base, QRect safearea, std::chrono::milliseconds start, std::chrono::milliseconds duration, SubtitleScreen *p, const QStringList &subs)
FormattedTextSubtitle(void)=default
virtual void WrapLongLines(void)
virtual int CacheNum(void) const
virtual ~FormattedTextSubtitle()=default
FormattedTextSubtitle(QString base, QRect safearea, std::chrono::milliseconds start, std::chrono::milliseconds duration, SubtitleScreen *p)
QVector< FormattedTextLine > m_lines
Screen in which all other widgets are contained and rendered.
MythFontProperties * GetFont(const QString &family, const CC708CharacterAttribute &attr, int pixelSize, int zoom, int stretch)
void InitializeFonts(bool wasResized)
void DisplayTextSubtitles(void)
class SubtitleFormat * GetSubtitleFormat(void)
int EnabledSubtitleType(void) const
void SetFontSize(int pixelSize)
QList< FormattedTextSubtitle * > m_qInited
unsigned int uint
Definition: freesurround.h:24
bool force
#define MTV_PUBLIC
Definition: mythtvexp.h:15
STL namespace.
@ kDisplayNone
Definition: videoouttypes.h:12