aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Gottardo <gottardo.stefano.83@gmail.com>2022-05-01 09:11:42 +0200
committerGitHub <noreply@github.com>2022-05-01 09:11:42 +0200
commit8d56f2d38579ad9db5c7be88f9fb19f77098ce09 (patch)
tree435e884be10ebaa296d55e44b4a02f32d500cdb1
parentcf8c74b2e2222b1b78c419e6d95dd1f4592e23b6 (diff)
parent43623b09719dc274f687cecbcb9338f1fb4d96e3 (diff)
Merge pull request #21313 from CastagnaIT/verticalMargin
[Subtitles] Improvements vertical margin and manual position
-rw-r--r--addons/resource.language.en_gb/resources/strings.po18
-rwxr-xr-xsystem/settings/settings.xml53
-rw-r--r--xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecSSA.cpp14
-rw-r--r--xbmc/cores/VideoPlayer/DVDCodecs/Overlay/OverlayCodecWebVTT.cpp4
-rw-r--r--xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitleParserSSA.cpp14
-rw-r--r--xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.cpp75
-rw-r--r--xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.h12
-rw-r--r--xbmc/cores/VideoPlayer/DVDSubtitles/SubtitleParserWebVTT.cpp4
-rw-r--r--xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.cpp2
-rw-r--r--xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.h2
-rw-r--r--xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesStyle.h18
-rw-r--r--xbmc/cores/VideoPlayer/DVDSubtitles/webvtt/WebVTTHandler.cpp16
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.cpp2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.h2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.cpp193
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.h56
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp4
-rw-r--r--xbmc/settings/AdvancedSettings.cpp3
-rw-r--r--xbmc/settings/AdvancedSettings.h5
-rw-r--r--xbmc/settings/DisplaySettings.cpp4
-rw-r--r--xbmc/settings/Settings.h1
-rw-r--r--xbmc/settings/SubtitlesSettings.cpp162
-rw-r--r--xbmc/settings/SubtitlesSettings.h166
-rw-r--r--xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp15
-rw-r--r--xbmc/video/PlayerController.cpp25
25 files changed, 581 insertions, 289 deletions
diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po
index 4683e87b95..27c69f852d 100644
--- a/addons/resource.language.en_gb/resources/strings.po
+++ b/addons/resource.language.en_gb/resources/strings.po
@@ -23070,3 +23070,21 @@ msgstr ""
msgctxt "#39176"
msgid "Relative volume for gui sounds"
msgstr ""
+
+#. Subtitle vertical margin setting
+#: system/settings/settings.xml
+msgctxt "#39182"
+msgid "Vertical margin"
+msgstr ""
+
+#. Help text for setting "Vertical margin" of label #39182
+#: system/settings/settings.xml
+msgctxt "#39183"
+msgid "Allows you to add a margin in top and bottom aligned text. Changing this setting will affect also subtitle position set with the Video calibration."
+msgstr ""
+
+#. Window screen calibration: the current subtitle calibration value with vertical margin
+#: xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp
+msgctxt "#39184"
+msgid "Current value: {0:d} (with vertical margin: {1:d})"
+msgstr ""
diff --git a/system/settings/settings.xml b/system/settings/settings.xml
index a498c81a15..3aeb0192b7 100755
--- a/system/settings/settings.xml
+++ b/system/settings/settings.xml
@@ -480,12 +480,12 @@
</setting>
<setting id="subtitles.captionsalign" parent="subtitles.parsecaptions" type="integer" label="39161">
<level>2</level>
- <default>0</default> <!-- SUBTITLE_HORIZONTAL_ALIGN_LEFT -->
+ <default>0</default> <!-- HorizontalAlign::LEFT -->
<constraints>
<options>
- <option label="39162">0</option> <!-- SUBTITLE_HORIZONTAL_ALIGN_LEFT -->
- <option label="39163">1</option> <!-- SUBTITLE_HORIZONTAL_ALIGN_CENTER -->
- <option label="39164">2</option> <!-- SUBTITLE_HORIZONTAL_ALIGN_RIGHT -->
+ <option label="39162">0</option> <!-- HorizontalAlign::LEFT -->
+ <option label="39163">1</option> <!-- HorizontalAlign::CENTER -->
+ <option label="39164">2</option> <!-- HorizontalAlign::RIGHT -->
</options>
</constraints>
<dependencies>
@@ -495,14 +495,14 @@
</setting>
<setting id="subtitles.align" type="integer" label="21460" help="36192">
<level>2</level>
- <default>1</default> <!-- SUBTITLE_ALIGN_BOTTOM_INSIDE -->
+ <default>1</default> <!-- Align::BOTTOM_INSIDE -->
<constraints>
<options>
- <option label="21461">0</option> <!-- SUBTITLE_ALIGN_MANUAL -->
- <option label="21462">1</option> <!-- SUBTITLE_ALIGN_BOTTOM_INSIDE -->
- <option label="21463">2</option> <!-- SUBTITLE_ALIGN_BOTTOM_OUTSIDE -->
- <option label="21464">3</option> <!-- SUBTITLE_ALIGN_TOP_INSIDE -->
- <option label="21465">4</option> <!-- SUBTITLE_ALIGN_TOP_OUTSIDE -->
+ <option label="21461">0</option> <!-- Align::MANUAL -->
+ <option label="21462">1</option> <!-- Align::BOTTOM_INSIDE -->
+ <option label="21463">2</option> <!-- Align::BOTTOM_OUTSIDE -->
+ <option label="21464">3</option> <!-- Align::TOP_INSIDE -->
+ <option label="21465">4</option> <!-- Align::TOP_OUTSIDE -->
</options>
</constraints>
<control type="list" format="string" />
@@ -548,13 +548,13 @@
</setting>
<setting id="subtitles.style" type="integer" parent="subtitles.fontname" label="736" help="36187">
<level>3</level>
- <default>0</default> <!-- FONT_STYLE_NORMAL -->
+ <default>0</default> <!-- FontStyle::NORMAL -->
<constraints>
<options>
- <option label="738">0</option> <!-- FONT_STYLE_NORMAL -->
- <option label="739">1</option> <!-- FONT_STYLE_BOLD -->
- <option label="740">2</option> <!-- FONT_STYLE_ITALICS -->
- <option label="741">3</option> <!-- FONT_STYLE_BOLD | FONT_STYLE_ITALICS -->
+ <option label="738">0</option> <!-- FontStyle::NORMAL -->
+ <option label="739">1</option> <!-- FontStyle::BOLD -->
+ <option label="740">2</option> <!-- FontStyle::ITALIC -->
+ <option label="741">3</option> <!-- FontStyle::BOLD_ITALIC -->
</options>
</constraints>
<control type="list" format="string" />
@@ -592,13 +592,13 @@
</setting>
<setting id="subtitles.backgroundtype" type="integer" parent="subtitles.fontname" label="39165" help="39169">
<level>3</level>
- <default>0</default>
+ <default>0</default> <!-- BackgroundType::NONE -->
<constraints>
<options>
- <option label="231">0</option> <!-- SUBTITLE_BACKGROUNDTYPE_NONE -->
- <option label="39166">1</option> <!-- SUBTITLE_BACKGROUNDTYPE_SHADOW -->
- <option label="39167">2</option> <!-- SUBTITLE_BACKGROUNDTYPE_BOX -->
- <option label="39168">3</option> <!-- SUBTITLE_BACKGROUNDTYPE_SQUAREBOX -->
+ <option label="231">0</option> <!-- BackgroundType::NONE -->
+ <option label="39166">1</option> <!-- BackgroundType::SHADOW -->
+ <option label="39167">2</option> <!-- BackgroundType::BOX -->
+ <option label="39168">3</option> <!-- BackgroundType::SQUAREBOX -->
</options>
</constraints>
<control type="list" format="integer" />
@@ -668,6 +668,19 @@
</dependencies>
<control type="slider" format="percentage" range="0,100" />
</setting>
+ <setting id="subtitles.marginvertical" type="number" label="39182" help="39183">
+ <level>3</level>
+ <default>7.75</default>
+ <constraints>
+ <minimum>0</minimum>
+ <step>0.25</step>
+ <maximum>50</maximum>
+ </constraints>
+ <dependencies>
+ <dependency type="enable" on="property" operator="!is" name="isplaying" />
+ </dependencies>
+ <control type="slider" format="percentage"/>
+ </setting>
<setting id="subtitles.overridefonts" type="boolean" label="21368" help="36190">
<level>3</level>
<default>false</default>
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecSSA.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecSSA.cpp
index 03a03c036e..63bf3be3ef 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecSSA.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecSSA.cpp
@@ -15,12 +15,13 @@
#include "Util.h"
#include "cores/VideoPlayer/Interface/DemuxPacket.h"
#include "cores/VideoPlayer/Interface/TimingConstants.h"
-#include "settings/Settings.h"
-#include "settings/SettingsComponent.h"
+#include "settings/SubtitlesSettings.h"
#include "utils/StringUtils.h"
#include <memory>
+using namespace KODI;
+
CDVDOverlayCodecSSA::CDVDOverlayCodecSSA()
: CDVDOverlayCodec("SSA Subtitle Decoder"), m_libass(std::make_shared<CDVDSubtitlesLibass>())
{
@@ -132,11 +133,8 @@ CDVDOverlay* CDVDOverlayCodecSSA::GetOverlay()
m_pOverlay = new CDVDOverlaySSA(m_libass);
m_pOverlay->iPTSStartTime = 0;
m_pOverlay->iPTSStopTime = DVD_NOPTS_VALUE;
- //! @todo To move GetSettings into SubtitleSettings
- const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings();
- int overrideStyles = settings->GetInt(CSettings::SETTING_SUBTITLES_OVERRIDESTYLES);
- m_pOverlay->SetForcedMargins(
- overrideStyles != static_cast<int>(KODI::SUBTITLES::OverrideStyles::STYLES_POSITIONS) &&
- overrideStyles != static_cast<int>(KODI::SUBTITLES::OverrideStyles::POSITIONS));
+ auto overrideStyles{SUBTITLES::CSubtitlesSettings::GetInstance().GetOverrideStyles()};
+ m_pOverlay->SetForcedMargins(overrideStyles != SUBTITLES::OverrideStyles::STYLES_POSITIONS &&
+ overrideStyles != SUBTITLES::OverrideStyles::POSITIONS);
return m_pOverlay->Acquire();
}
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/OverlayCodecWebVTT.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/OverlayCodecWebVTT.cpp
index 24329655d3..466811d0c0 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/OverlayCodecWebVTT.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/OverlayCodecWebVTT.cpp
@@ -19,6 +19,8 @@
#include <memory>
#include <string>
+using namespace KODI;
+
COverlayCodecWebVTT::COverlayCodecWebVTT() : CDVDOverlayCodec("WebVTT Subtitle Decoder")
{
m_pOverlay = nullptr;
@@ -113,7 +115,7 @@ OverlayMessage COverlayCodecWebVTT::Decode(DemuxPacket* pPacket)
for (auto& subData : subtitleList)
{
- KODI::SUBTITLES::subtitleOpts opts;
+ SUBTITLES::STYLE::subtitleOpts opts;
opts.useMargins = subData.useMargins;
opts.marginLeft = subData.marginLeft;
opts.marginRight = subData.marginRight;
diff --git a/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitleParserSSA.cpp b/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitleParserSSA.cpp
index 8a405c740a..c085ff6410 100644
--- a/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitleParserSSA.cpp
+++ b/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitleParserSSA.cpp
@@ -11,8 +11,9 @@
#include "DVDCodecs/Overlay/DVDOverlaySSA.h"
#include "ServiceBroker.h"
#include "cores/VideoPlayer/Interface/TimingConstants.h"
-#include "settings/Settings.h"
-#include "settings/SettingsComponent.h"
+#include "settings/SubtitlesSettings.h"
+
+using namespace KODI;
CDVDSubtitleParserSSA::CDVDSubtitleParserSSA(std::unique_ptr<CDVDSubtitleStream>&& pStream,
const std::string& strFile)
@@ -40,12 +41,9 @@ bool CDVDSubtitleParserSSA::Open(CDVDStreamInfo& hints)
CDVDOverlaySSA* overlay = new CDVDOverlaySSA(m_libass);
overlay->iPTSStartTime = 0.0;
overlay->iPTSStopTime = DVD_NOPTS_VALUE;
- //! @todo To move GetSettings into SubtitleSettings
- const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings();
- int overrideStyles = settings->GetInt(CSettings::SETTING_SUBTITLES_OVERRIDESTYLES);
- overlay->SetForcedMargins(
- overrideStyles != static_cast<int>(KODI::SUBTITLES::OverrideStyles::STYLES_POSITIONS) &&
- overrideStyles != static_cast<int>(KODI::SUBTITLES::OverrideStyles::POSITIONS));
+ auto overrideStyles{SUBTITLES::CSubtitlesSettings::GetInstance().GetOverrideStyles()};
+ overlay->SetForcedMargins(overrideStyles != SUBTITLES::OverrideStyles::STYLES_POSITIONS &&
+ overrideStyles != SUBTITLES::OverrideStyles::POSITIONS);
m_collection.Add(overlay);
return true;
diff --git a/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.cpp b/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.cpp
index a4071dda10..919e923ffb 100644
--- a/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.cpp
+++ b/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.cpp
@@ -26,7 +26,7 @@
#include <cstring>
#include <mutex>
-using namespace KODI::SUBTITLES;
+using namespace KODI::SUBTITLES::STYLE;
using namespace UTILS;
namespace
@@ -253,12 +253,11 @@ bool CDVDSubtitlesLibass::CreateTrack(char* buf, size_t size)
return true;
}
-ASS_Image* CDVDSubtitlesLibass::RenderImage(
- double pts,
- renderOpts opts,
- bool updateStyle,
- const std::shared_ptr<struct KODI::SUBTITLES::style>& subStyle,
- int* changes)
+ASS_Image* CDVDSubtitlesLibass::RenderImage(double pts,
+ renderOpts opts,
+ bool updateStyle,
+ const std::shared_ptr<struct style>& subStyle,
+ int* changes)
{
std::unique_lock<CCriticalSection> lock(m_section);
if (!m_renderer || !m_track)
@@ -309,8 +308,7 @@ ASS_Image* CDVDSubtitlesLibass::RenderImage(
return ass_render_frame(m_renderer, m_track, DVD_TIME_TO_MSEC(pts), changes);
}
-void CDVDSubtitlesLibass::ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLES::style>& subStyle,
- renderOpts opts)
+void CDVDSubtitlesLibass::ApplyStyle(const std::shared_ptr<struct style>& subStyle, renderOpts opts)
{
CLog::Log(LOGDEBUG, "{} - Start setting up the LibAss style", __FUNCTION__);
@@ -361,7 +359,7 @@ void CDVDSubtitlesLibass::ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLE
// It is mandatory set the FontName, the text is case sensitive
free(style->FontName);
- if (subStyle->fontName == FONT_DEFAULT_FAMILYNAME)
+ if (subStyle->fontName == KODI::SUBTITLES::FONT_DEFAULT_FAMILYNAME)
style->FontName = strdup(m_defaultFontFamilyName.c_str());
else
style->FontName = strdup(subStyle->fontName.c_str());
@@ -396,13 +394,13 @@ void CDVDSubtitlesLibass::ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLE
// Configure the effects
double lineSpacing = 0.0;
- if (subStyle->borderStyle == BorderStyle::OUTLINE ||
- subStyle->borderStyle == BorderStyle::OUTLINE_NO_SHADOW)
+ if (subStyle->borderStyle == BorderType::OUTLINE ||
+ subStyle->borderStyle == BorderType::OUTLINE_NO_SHADOW)
{
style->BorderStyle = ASS_BORDER_STYLE_OUTLINE;
style->Outline = (10.00 / 100 * subStyle->fontBorderSize) * scale;
style->OutlineColour = ConvColor(subStyle->fontBorderColor, subStyle->fontOpacity);
- if (subStyle->borderStyle == BorderStyle::OUTLINE_NO_SHADOW)
+ if (subStyle->borderStyle == BorderType::OUTLINE_NO_SHADOW)
{
style->BackColour = ConvColor(COLOR::NONE, 0); // Set the shadow color
style->Shadow = 0; // Set the shadow size
@@ -414,7 +412,7 @@ void CDVDSubtitlesLibass::ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLE
style->Shadow = (10.00 / 100 * subStyle->shadowSize) * scale; // Set the shadow size
}
}
- else if (subStyle->borderStyle == BorderStyle::BOX)
+ else if (subStyle->borderStyle == BorderType::BOX)
{
// This BorderStyle not support outline color/size
style->BorderStyle = ASS_BORDER_STYLE_BOX;
@@ -428,7 +426,7 @@ void CDVDSubtitlesLibass::ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLE
// By default a box overlaps the other, then we increase a bit the line spacing
lineSpacing = 6.0;
}
- else if (subStyle->borderStyle == BorderStyle::SQUARE_BOX)
+ else if (subStyle->borderStyle == BorderType::SQUARE_BOX)
{
// This BorderStyle not support shadow color/size
style->BorderStyle = ASS_BORDER_STYLE_SQUARE_BOX;
@@ -443,7 +441,7 @@ void CDVDSubtitlesLibass::ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLE
style->Blur = (10.00 / 100 * subStyle->blur);
double marginLR = 20;
- if (opts.horizontalAlignment != HorizontalAlignment::DISABLED)
+ if (opts.horizontalAlignment != HorizontalAlign::DISABLED)
{
// If the subtitle text is aligned on the left or right
// of the screen, we set an extra left/right margin
@@ -459,37 +457,36 @@ void CDVDSubtitlesLibass::ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLE
style->MarginV = static_cast<int>(subStyle->marginVertical * scale);
// Set the vertical alignment
- if (subStyle->alignment == FontAlignment::TOP_LEFT ||
- subStyle->alignment == FontAlignment::TOP_CENTER ||
- subStyle->alignment == FontAlignment::TOP_RIGHT)
+ if (subStyle->alignment == FontAlign::TOP_LEFT ||
+ subStyle->alignment == FontAlign::TOP_CENTER || subStyle->alignment == FontAlign::TOP_RIGHT)
style->Alignment = VALIGN_TOP;
- else if (subStyle->alignment == FontAlignment::MIDDLE_LEFT ||
- subStyle->alignment == FontAlignment::MIDDLE_CENTER ||
- subStyle->alignment == FontAlignment::MIDDLE_RIGHT)
+ else if (subStyle->alignment == FontAlign::MIDDLE_LEFT ||
+ subStyle->alignment == FontAlign::MIDDLE_CENTER ||
+ subStyle->alignment == FontAlign::MIDDLE_RIGHT)
style->Alignment = VALIGN_CENTER;
- else if (subStyle->alignment == FontAlignment::SUB_LEFT ||
- subStyle->alignment == FontAlignment::SUB_CENTER ||
- subStyle->alignment == FontAlignment::SUB_RIGHT)
+ else if (subStyle->alignment == FontAlign::SUB_LEFT ||
+ subStyle->alignment == FontAlign::SUB_CENTER ||
+ subStyle->alignment == FontAlign::SUB_RIGHT)
style->Alignment = VALIGN_SUB;
// Set the horizontal alignment, giving priority to horizontalFontAlign property when set
- if (opts.horizontalAlignment == HorizontalAlignment::LEFT)
+ if (opts.horizontalAlignment == HorizontalAlign::LEFT)
style->Alignment |= HALIGN_LEFT;
- else if (opts.horizontalAlignment == HorizontalAlignment::CENTER)
+ else if (opts.horizontalAlignment == HorizontalAlign::CENTER)
style->Alignment |= HALIGN_CENTER;
- else if (opts.horizontalAlignment == HorizontalAlignment::RIGHT)
+ else if (opts.horizontalAlignment == HorizontalAlign::RIGHT)
style->Alignment |= HALIGN_RIGHT;
- else if (subStyle->alignment == FontAlignment::TOP_LEFT ||
- subStyle->alignment == FontAlignment::MIDDLE_LEFT ||
- subStyle->alignment == FontAlignment::SUB_LEFT)
+ else if (subStyle->alignment == FontAlign::TOP_LEFT ||
+ subStyle->alignment == FontAlign::MIDDLE_LEFT ||
+ subStyle->alignment == FontAlign::SUB_LEFT)
style->Alignment |= HALIGN_LEFT;
- else if (subStyle->alignment == FontAlignment::TOP_CENTER ||
- subStyle->alignment == FontAlignment::MIDDLE_CENTER ||
- subStyle->alignment == FontAlignment::SUB_CENTER)
+ else if (subStyle->alignment == FontAlign::TOP_CENTER ||
+ subStyle->alignment == FontAlign::MIDDLE_CENTER ||
+ subStyle->alignment == FontAlign::SUB_CENTER)
style->Alignment |= HALIGN_CENTER;
- else if (subStyle->alignment == FontAlignment::TOP_RIGHT ||
- subStyle->alignment == FontAlignment::MIDDLE_RIGHT ||
- subStyle->alignment == FontAlignment::SUB_RIGHT)
+ else if (subStyle->alignment == FontAlign::TOP_RIGHT ||
+ subStyle->alignment == FontAlign::MIDDLE_RIGHT ||
+ subStyle->alignment == FontAlign::SUB_RIGHT)
style->Alignment |= HALIGN_RIGHT;
}
@@ -500,8 +497,8 @@ void CDVDSubtitlesLibass::ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLE
}
}
-void CDVDSubtitlesLibass::ConfigureAssOverride(
- const std::shared_ptr<struct KODI::SUBTITLES::style>& subStyle, ASS_Style* style)
+void CDVDSubtitlesLibass::ConfigureAssOverride(const std::shared_ptr<struct style>& subStyle,
+ ASS_Style* style)
{
if (!subStyle)
{
diff --git a/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.h b/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.h
index 82efffc3c7..c4caaf68d7 100644
--- a/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.h
+++ b/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.h
@@ -40,9 +40,9 @@ public:
void Configure();
ASS_Image* RenderImage(double pts,
- KODI::SUBTITLES::renderOpts opts,
+ KODI::SUBTITLES::STYLE::renderOpts opts,
bool updateStyle,
- const std::shared_ptr<struct KODI::SUBTITLES::style>& subStyle,
+ const std::shared_ptr<struct KODI::SUBTITLES::STYLE::style>& subStyle,
int* changes = NULL);
ASS_Event* GetEvents();
@@ -117,7 +117,7 @@ protected:
int AddEvent(const char* text,
double startTime,
double stopTime,
- KODI::SUBTITLES::subtitleOpts* opts);
+ KODI::SUBTITLES::STYLE::subtitleOpts* opts);
/*!
* \brief Append text to the specified event
@@ -144,10 +144,10 @@ protected:
private:
- void ConfigureAssOverride(const std::shared_ptr<struct KODI::SUBTITLES::style>& subStyle,
+ void ConfigureAssOverride(const std::shared_ptr<struct KODI::SUBTITLES::STYLE::style>& subStyle,
ASS_Style* style);
- void ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLES::style>& subStyle,
- KODI::SUBTITLES::renderOpts opts);
+ void ApplyStyle(const std::shared_ptr<struct KODI::SUBTITLES::STYLE::style>& subStyle,
+ KODI::SUBTITLES::STYLE::renderOpts opts);
ASS_Library* m_library = nullptr;
ASS_Track* m_track = nullptr;
diff --git a/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitleParserWebVTT.cpp b/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitleParserWebVTT.cpp
index 5eaa81e949..84812401a2 100644
--- a/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitleParserWebVTT.cpp
+++ b/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitleParserWebVTT.cpp
@@ -16,6 +16,8 @@
#include <vector>
+using namespace KODI;
+
CSubtitleParserWebVTT::CSubtitleParserWebVTT(std::unique_ptr<CDVDSubtitleStream>&& pStream,
const std::string& strFile)
: CDVDSubtitleParserText(std::move(pStream), strFile, "WebVTT Subtitle Parser")
@@ -60,7 +62,7 @@ bool CSubtitleParserWebVTT::Open(CDVDStreamInfo& hints)
// Send decoded lines to the renderer
for (auto& subData : subtitleList)
{
- KODI::SUBTITLES::subtitleOpts opts;
+ SUBTITLES::STYLE::subtitleOpts opts;
opts.useMargins = subData.useMargins;
opts.marginLeft = subData.marginLeft;
opts.marginRight = subData.marginRight;
diff --git a/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.cpp b/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.cpp
index 0f8e6a7a47..6ceee88f17 100644
--- a/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.cpp
+++ b/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.cpp
@@ -38,7 +38,7 @@ int CSubtitlesAdapter::AddSubtitle(std::string& text, double startTime, double s
int CSubtitlesAdapter::AddSubtitle(std::string& text,
double startTime,
double stopTime,
- KODI::SUBTITLES::subtitleOpts* opts)
+ KODI::SUBTITLES::STYLE::subtitleOpts* opts)
{
PostProcess(text);
int ret = m_libass->AddEvent(text.c_str(), startTime, stopTime, opts);
diff --git a/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.h b/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.h
index ec9f687f58..14b2b89f96 100644
--- a/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.h
+++ b/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesAdapter.h
@@ -50,7 +50,7 @@ public:
int AddSubtitle(std::string& text,
double startTime,
double stopTime,
- KODI::SUBTITLES::subtitleOpts* opts);
+ KODI::SUBTITLES::STYLE::subtitleOpts* opts);
/*!
* \brief Append text to the specified subtitle ID
diff --git a/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesStyle.h b/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesStyle.h
index 4577dcc7fc..a84bd05390 100644
--- a/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesStyle.h
+++ b/xbmc/cores/VideoPlayer/DVDSubtitles/SubtitlesStyle.h
@@ -16,15 +16,14 @@ namespace KODI
{
namespace SUBTITLES
{
+namespace STYLE
+{
constexpr double VIEWPORT_HEIGHT = 1080.0;
constexpr double VIEWPORT_WIDTH = 1920.0;
constexpr int MARGIN_VERTICAL = 75;
-// Vertical margin used when is selected the alignment
-// to keep the text inside the black bars
-constexpr int MARGIN_VERTICAL_BLACKBARS = 30;
-enum class HorizontalAlignment
+enum class HorizontalAlign
{
DISABLED = 0,
LEFT,
@@ -32,7 +31,7 @@ enum class HorizontalAlignment
RIGHT
};
-enum class FontAlignment
+enum class FontAlign
{
TOP_LEFT = 0,
TOP_CENTER,
@@ -53,7 +52,7 @@ enum class FontStyle
BOLD_ITALIC
};
-enum class BorderStyle
+enum class BorderType
{
OUTLINE_NO_SHADOW,
OUTLINE,
@@ -78,13 +77,13 @@ struct style
int fontBorderSize = 15; // In %
UTILS::COLOR::Color fontBorderColor = UTILS::COLOR::BLACK;
int fontOpacity = 100; // In %
- BorderStyle borderStyle = BorderStyle::OUTLINE;
+ BorderType borderStyle = BorderType::OUTLINE;
UTILS::COLOR::Color backgroundColor = UTILS::COLOR::BLACK;
int backgroundOpacity = 0; // In %
int shadowSize = 0; // In %
UTILS::COLOR::Color shadowColor = UTILS::COLOR::BLACK;
int shadowOpacity = 100; // In %
- FontAlignment alignment = FontAlignment::TOP_LEFT;
+ FontAlign alignment = FontAlign::TOP_LEFT;
// Override styles to native ASS/SSA format type only
OverrideStyles assOverrideStyles = OverrideStyles::DISABLED;
// Override fonts to native ASS/SSA format type only
@@ -113,8 +112,9 @@ struct renderOpts
bool disableVerticalMargin = false;
// position: vertical line position of subtitles in percent. 0 = no change (bottom), 100 = on top.
double position = 0;
- HorizontalAlignment horizontalAlignment = HorizontalAlignment::DISABLED;
+ HorizontalAlign horizontalAlignment = HorizontalAlign::DISABLED;
};
+} // namespace STYLE
} // namespace SUBTITLES
} // namespace KODI
diff --git a/xbmc/cores/VideoPlayer/DVDSubtitles/webvtt/WebVTTHandler.cpp b/xbmc/cores/VideoPlayer/DVDSubtitles/webvtt/WebVTTHandler.cpp
index ba890392ee..024f2feacf 100644
--- a/xbmc/cores/VideoPlayer/DVDSubtitles/webvtt/WebVTTHandler.cpp
+++ b/xbmc/cores/VideoPlayer/DVDSubtitles/webvtt/WebVTTHandler.cpp
@@ -12,8 +12,7 @@
#include "cores/VideoPlayer/DVDSubtitles/SubtitlesStyle.h"
#include "cores/VideoPlayer/Interface/TimingConstants.h"
#include "filesystem/SpecialProtocol.h"
-#include "settings/Settings.h"
-#include "settings/SettingsComponent.h"
+#include "settings/SubtitlesSettings.h"
#include "utils/CSSUtils.h"
#include "utils/CharsetConverter.h"
#include "utils/HTMLUtil.h"
@@ -31,7 +30,7 @@
// - Cue "line" setting as number value
// - Vertical text (used for some specific asian languages only)
-using namespace KODI::SUBTITLES;
+using namespace KODI::SUBTITLES::STYLE;
namespace
{
@@ -211,12 +210,11 @@ bool CWebVTTHandler::Initialize()
m_cueCssStyleMapRegex.insert({item.first, reg});
}
- const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings();
- int overrideStyles = settings->GetInt(CSettings::SETTING_SUBTITLES_OVERRIDESTYLES);
- m_overridePositions = (overrideStyles == (int)KODI::SUBTITLES::OverrideStyles::STYLES_POSITIONS ||
- overrideStyles == (int)KODI::SUBTITLES::OverrideStyles::POSITIONS);
- m_overrideStyle = (overrideStyles == (int)KODI::SUBTITLES::OverrideStyles::STYLES_POSITIONS ||
- overrideStyles == (int)KODI::SUBTITLES::OverrideStyles::STYLES);
+ auto overrideStyles{KODI::SUBTITLES::CSubtitlesSettings::GetInstance().GetOverrideStyles()};
+ m_overridePositions = (overrideStyles == KODI::SUBTITLES::OverrideStyles::STYLES_POSITIONS ||
+ overrideStyles == KODI::SUBTITLES::OverrideStyles::POSITIONS);
+ m_overrideStyle = (overrideStyles == KODI::SUBTITLES::OverrideStyles::STYLES_POSITIONS ||
+ overrideStyles == KODI::SUBTITLES::OverrideStyles::STYLES);
return true;
}
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.cpp
index fd11e1fe78..eabb7c394d 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.cpp
@@ -145,7 +145,7 @@ void CDebugRenderer::CRenderer::Render(int idx)
void CDebugRenderer::CRenderer::CreateSubtitlesStyle()
{
- m_debugOverlayStyle = std::make_shared<KODI::SUBTITLES::style>();
+ m_debugOverlayStyle = std::make_shared<KODI::SUBTITLES::STYLE::style>();
m_debugOverlayStyle->fontName = KODI::SUBTITLES::FONT_DEFAULT_FAMILYNAME;
m_debugOverlayStyle->fontSize = 20.0;
m_debugOverlayStyle->marginVertical = 30;
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.h b/xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.h
index 00a350039c..718d1b49d7 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.h
@@ -41,7 +41,7 @@ protected:
// Implementation of Observer
void Notify(const Observable& obs, const ObservableMessage msg) override{};
- std::shared_ptr<struct KODI::SUBTITLES::style> m_debugOverlayStyle;
+ std::shared_ptr<struct KODI::SUBTITLES::STYLE::style> m_debugOverlayStyle;
};
CRenderer m_overlayRenderer;
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.cpp
index 9c9aee4749..7129d22632 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.cpp
@@ -19,13 +19,10 @@
#include "cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlaySpu.h"
#include "cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayText.h"
#include "cores/VideoPlayer/VideoRenderers/RenderManager.h"
-#include "guilib/GUIFont.h"
-#include "settings/AdvancedSettings.h"
+#include "settings/DisplaySettings.h"
#include "settings/Settings.h"
#include "settings/SettingsComponent.h"
-#include "settings/SubtitlesSettings.h"
#include "settings/lib/Setting.h"
-#include "utils/ColorUtils.h"
#include "windowing/GraphicContext.h"
#include <mutex>
@@ -37,6 +34,7 @@
#include <algorithm>
+using namespace KODI;
using namespace OVERLAY;
COverlay::COverlay()
@@ -56,12 +54,12 @@ unsigned int CRenderer::m_textureid = 1;
CRenderer::CRenderer()
{
- KODI::SUBTITLES::CSubtitlesSettings::GetInstance().RegisterObserver(this);
+ SUBTITLES::CSubtitlesSettings::GetInstance().RegisterObserver(this);
}
CRenderer::~CRenderer()
{
- KODI::SUBTITLES::CSubtitlesSettings::GetInstance().UnregisterObserver(this);
+ SUBTITLES::CSubtitlesSettings::GetInstance().UnregisterObserver(this);
Flush();
}
@@ -87,6 +85,18 @@ void CRenderer::Release(std::vector<SElement>& list)
}
}
+void CRenderer::UnInit()
+{
+ if (m_saveSubtitlePosition)
+ {
+ m_saveSubtitlePosition = false;
+ CDisplaySettings::GetInstance().UpdateCalibrations();
+ CServiceBroker::GetSettingsComponent()->GetSettings()->Save();
+ }
+
+ Flush();
+}
+
void CRenderer::Flush()
{
std::unique_lock<CCriticalSection> lock(m_section);
@@ -102,7 +112,6 @@ void CRenderer::Reset()
{
m_subtitlePosition = 0;
m_subtitlePosResInfo = -1;
- m_subtitleVerticalMargin = 0;
}
void CRenderer::Release(int idx)
@@ -277,11 +286,20 @@ bool CRenderer::HasOverlay(int idx)
void CRenderer::SetVideoRect(CRect &source, CRect &dest, CRect &view)
{
+ if (m_rv != view) // Screen resolution is changed
+ {
+ OnViewChange();
+ }
m_rs = source;
m_rd = dest;
m_rv = view;
}
+void CRenderer::OnViewChange()
+{
+ m_isSettingsChanged = true;
+}
+
void CRenderer::SetStereoMode(const std::string &stereomode)
{
m_stereomode = stereomode;
@@ -298,13 +316,18 @@ void CRenderer::SetSubtitleVerticalPosition(const int value, bool save)
CServiceBroker::GetWinSystem()->GetGfxContext().SetResInfo(
CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(), resInfo);
m_subtitlePosResInfo = m_subtitlePosition;
+ // We save the value only when playback is stopped
+ // to avoid saving to disk too many times
+ m_saveSubtitlePosition = true;
}
}
void CRenderer::ResetSubtitlePosition()
{
- m_subtitleVerticalMargin = GetSubtitleVerticalMargin();
+ m_saveSubtitlePosition = false;
RESOLUTION_INFO resInfo = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo();
+ m_subtitleVerticalMargin =
+ resInfo.iHeight / 100 * SUBTITLES::CSubtitlesSettings::GetInstance().GetVerticalMarginPerc();
m_subtitlePosResInfo = resInfo.iSubtitles;
// Update player value (and callback to CRenderer::SetSubtitleVerticalPosition)
g_application.GetAppPlayer().SetSubtitleVerticalPosition(
@@ -313,77 +336,78 @@ void CRenderer::ResetSubtitlePosition()
void CRenderer::CreateSubtitlesStyle()
{
- m_overlayStyle = std::make_shared<KODI::SUBTITLES::style>();
- const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings();
-
- m_overlayStyle->fontName = settings->GetString(CSettings::SETTING_SUBTITLES_FONTNAME);
- m_overlayStyle->fontSize = (double)settings->GetInt(CSettings::SETTING_SUBTITLES_FONTSIZE);
-
- uint32_t fontStyleMask = settings->GetInt(CSettings::SETTING_SUBTITLES_STYLE) & FONT_STYLE_MASK;
- if ((fontStyleMask & FONT_STYLE_BOLD) && (fontStyleMask & FONT_STYLE_ITALICS))
- m_overlayStyle->fontStyle = KODI::SUBTITLES::FontStyle::BOLD_ITALIC;
- else if (fontStyleMask & FONT_STYLE_BOLD)
- m_overlayStyle->fontStyle = KODI::SUBTITLES::FontStyle::BOLD;
- else if (fontStyleMask & FONT_STYLE_ITALICS)
- m_overlayStyle->fontStyle = KODI::SUBTITLES::FontStyle::ITALIC;
-
- m_overlayStyle->fontColor =
- UTILS::COLOR::ConvertHexToColor(settings->GetString(CSettings::SETTING_SUBTITLES_COLOR));
- m_overlayStyle->fontBorderSize = settings->GetInt(CSettings::SETTING_SUBTITLES_BORDERSIZE);
- m_overlayStyle->fontBorderColor = UTILS::COLOR::ConvertHexToColor(
- settings->GetString(CSettings::SETTING_SUBTITLES_BORDERCOLOR));
- m_overlayStyle->fontOpacity = settings->GetInt(CSettings::SETTING_SUBTITLES_OPACITY);
-
- int backgroundType = settings->GetInt(CSettings::SETTING_SUBTITLES_BACKGROUNDTYPE);
- if (backgroundType == SUBTITLE_BACKGROUNDTYPE_NONE)
- m_overlayStyle->borderStyle = KODI::SUBTITLES::BorderStyle::OUTLINE_NO_SHADOW;
- else if (backgroundType == SUBTITLE_BACKGROUNDTYPE_SHADOW)
- m_overlayStyle->borderStyle = KODI::SUBTITLES::BorderStyle::OUTLINE;
- else if (backgroundType == SUBTITLE_BACKGROUNDTYPE_BOX)
- m_overlayStyle->borderStyle = KODI::SUBTITLES::BorderStyle::BOX;
- else if (backgroundType == SUBTITLE_BACKGROUNDTYPE_SQUAREBOX)
- m_overlayStyle->borderStyle = KODI::SUBTITLES::BorderStyle::SQUARE_BOX;
-
- m_overlayStyle->backgroundColor =
- UTILS::COLOR::ConvertHexToColor(settings->GetString(CSettings::SETTING_SUBTITLES_BGCOLOR));
- m_overlayStyle->backgroundOpacity = settings->GetInt(CSettings::SETTING_SUBTITLES_BGOPACITY);
-
- m_overlayStyle->shadowColor = UTILS::COLOR::ConvertHexToColor(
- settings->GetString(CSettings::SETTING_SUBTITLES_SHADOWCOLOR));
- m_overlayStyle->shadowOpacity = settings->GetInt(CSettings::SETTING_SUBTITLES_SHADOWOPACITY);
- m_overlayStyle->shadowSize = settings->GetInt(CSettings::SETTING_SUBTITLES_SHADOWSIZE);
-
- int subAlign = settings->GetInt(CSettings::SETTING_SUBTITLES_ALIGN);
- if (subAlign == SUBTITLE_ALIGN_TOP_INSIDE || subAlign == SUBTITLE_ALIGN_TOP_OUTSIDE)
- m_overlayStyle->alignment = KODI::SUBTITLES::FontAlignment::TOP_CENTER;
+ m_overlayStyle = std::make_shared<SUBTITLES::STYLE::style>();
+ SUBTITLES::CSubtitlesSettings& settings{SUBTITLES::CSubtitlesSettings::GetInstance()};
+
+ m_overlayStyle->fontName = settings.GetFontName();
+ m_overlayStyle->fontSize = static_cast<double>(settings.GetFontSize());
+
+ SUBTITLES::FontStyle fontStyle = settings.GetFontStyle();
+ if (fontStyle == SUBTITLES::FontStyle::BOLD_ITALIC)
+ m_overlayStyle->fontStyle = SUBTITLES::STYLE::FontStyle::BOLD_ITALIC;
+ else if (fontStyle == SUBTITLES::FontStyle::BOLD)
+ m_overlayStyle->fontStyle = SUBTITLES::STYLE::FontStyle::BOLD;
+ else if (fontStyle == SUBTITLES::FontStyle::ITALIC)
+ m_overlayStyle->fontStyle = SUBTITLES::STYLE::FontStyle::ITALIC;
+
+ m_overlayStyle->fontColor = settings.GetFontColor();
+ m_overlayStyle->fontBorderSize = settings.GetBorderSize();
+ m_overlayStyle->fontBorderColor = settings.GetBorderColor();
+ m_overlayStyle->fontOpacity = settings.GetFontOpacity();
+
+ SUBTITLES::BackgroundType backgroundType = settings.GetBackgroundType();
+ if (backgroundType == SUBTITLES::BackgroundType::NONE)
+ m_overlayStyle->borderStyle = SUBTITLES::STYLE::BorderType::OUTLINE_NO_SHADOW;
+ else if (backgroundType == SUBTITLES::BackgroundType::SHADOW)
+ m_overlayStyle->borderStyle = SUBTITLES::STYLE::BorderType::OUTLINE;
+ else if (backgroundType == SUBTITLES::BackgroundType::BOX)
+ m_overlayStyle->borderStyle = SUBTITLES::STYLE::BorderType::BOX;
+ else if (backgroundType == SUBTITLES::BackgroundType::SQUAREBOX)
+ m_overlayStyle->borderStyle = SUBTITLES::STYLE::BorderType::SQUARE_BOX;
+
+ m_overlayStyle->backgroundColor = settings.GetBackgroundColor();
+ m_overlayStyle->backgroundOpacity = settings.GetBackgroundOpacity();
+
+ m_overlayStyle->shadowColor = settings.GetShadowColor();
+ m_overlayStyle->shadowOpacity = settings.GetShadowOpacity();
+ m_overlayStyle->shadowSize = settings.GetShadowSize();
+
+ SUBTITLES::Align subAlign = settings.GetAlignment();
+ if (subAlign == SUBTITLES::Align::TOP_INSIDE || subAlign == SUBTITLES::Align::TOP_OUTSIDE)
+ m_overlayStyle->alignment = SUBTITLES::STYLE::FontAlign::TOP_CENTER;
else
- m_overlayStyle->alignment = KODI::SUBTITLES::FontAlignment::SUB_CENTER;
+ m_overlayStyle->alignment = SUBTITLES::STYLE::FontAlign::SUB_CENTER;
- if (subAlign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE || subAlign == SUBTITLE_ALIGN_TOP_OUTSIDE)
+ if (subAlign == SUBTITLES::Align::BOTTOM_OUTSIDE || subAlign == SUBTITLES::Align::TOP_OUTSIDE)
m_overlayStyle->drawWithinBlackBars = true;
- m_overlayStyle->assOverrideFont = settings->GetBool(CSettings::SETTING_SUBTITLES_OVERRIDEFONTS);
+ m_overlayStyle->assOverrideFont = settings.IsOverrideFonts();
- int overrideStyles = settings->GetInt(CSettings::SETTING_SUBTITLES_OVERRIDESTYLES);
- if (overrideStyles == (int)KODI::SUBTITLES::OverrideStyles::POSITIONS ||
- overrideStyles == (int)KODI::SUBTITLES::OverrideStyles::STYLES ||
- overrideStyles == (int)KODI::SUBTITLES::OverrideStyles::STYLES_POSITIONS)
- m_overlayStyle->assOverrideStyles =
- static_cast<KODI::SUBTITLES::OverrideStyles>(overrideStyles);
+ SUBTITLES::OverrideStyles overrideStyles = settings.GetOverrideStyles();
+ if (overrideStyles == SUBTITLES::OverrideStyles::POSITIONS)
+ m_overlayStyle->assOverrideStyles = SUBTITLES::STYLE::OverrideStyles::POSITIONS;
+ else if (overrideStyles == SUBTITLES::OverrideStyles::STYLES)
+ m_overlayStyle->assOverrideStyles = SUBTITLES::STYLE::OverrideStyles::STYLES;
+ else if (overrideStyles == SUBTITLES::OverrideStyles::STYLES_POSITIONS)
+ m_overlayStyle->assOverrideStyles = SUBTITLES::STYLE::OverrideStyles::STYLES_POSITIONS;
else
- m_overlayStyle->assOverrideStyles = KODI::SUBTITLES::OverrideStyles::DISABLED;
+ m_overlayStyle->assOverrideStyles = SUBTITLES::STYLE::OverrideStyles::DISABLED;
+
+ // Changing vertical margin while in playback causes side effects when you
+ // rewind the video, displaying the previous text position (test Libass 15.2)
+ // for now vertical margin setting will be disabled during playback
+ m_overlayStyle->marginVertical = m_subtitleVerticalMargin;
- m_overlayStyle->marginVertical = GetSubtitleVerticalMargin();
- m_overlayStyle->blur = settings->GetInt(CSettings::SETTING_SUBTITLES_BLUR);
+ m_overlayStyle->blur = settings.GetBlurSize();
}
COverlay* CRenderer::ConvertLibass(
CDVDOverlayLibass* o,
double pts,
bool updateStyle,
- const std::shared_ptr<struct KODI::SUBTITLES::style>& overlayStyle)
+ const std::shared_ptr<struct SUBTITLES::STYLE::style>& overlayStyle)
{
- KODI::SUBTITLES::renderOpts rOpts;
+ SUBTITLES::STYLE::renderOpts rOpts;
// libass render in a target area which named as frame. the frame size may bigger than video size,
// and including margins between video to frame edge. libass allow to render subtitles into the margins.
@@ -438,7 +462,7 @@ COverlay* CRenderer::ConvertLibass(
// the scale difference, its not clear what formula could be used,
// the following calculation works quite well but not perfectly
double scaledMargin{static_cast<double>(m_subtitleVerticalMargin) /
- KODI::SUBTITLES::VIEWPORT_HEIGHT * (subPosPx - resInfo.Overscan.top)};
+ SUBTITLES::STYLE::VIEWPORT_HEIGHT * (subPosPx - resInfo.Overscan.top)};
subPosPx -= static_cast<double>(m_subtitleVerticalMargin) - scaledMargin;
// We need to scale the position to resolution based on overscan values
@@ -453,12 +477,12 @@ COverlay* CRenderer::ConvertLibass(
// This setting influence style->alignment property
if (o->IsTextAlignEnabled())
{
- if (m_subtitleHorizontalAlign == SubtitleHorizontalAlign::LEFT)
- rOpts.horizontalAlignment = KODI::SUBTITLES::HorizontalAlignment::LEFT;
- else if (m_subtitleHorizontalAlign == SubtitleHorizontalAlign::RIGHT)
- rOpts.horizontalAlignment = KODI::SUBTITLES::HorizontalAlignment::RIGHT;
+ if (m_subtitleHorizontalAlign == SUBTITLES::HorizontalAlign::LEFT)
+ rOpts.horizontalAlignment = SUBTITLES::STYLE::HorizontalAlign::LEFT;
+ else if (m_subtitleHorizontalAlign == SUBTITLES::HorizontalAlign::RIGHT)
+ rOpts.horizontalAlignment = SUBTITLES::STYLE::HorizontalAlign::RIGHT;
else
- rOpts.horizontalAlignment = KODI::SUBTITLES::HorizontalAlignment::CENTER;
+ rOpts.horizontalAlignment = SUBTITLES::STYLE::HorizontalAlign::CENTER;
}
// changes: Detect changes from previously rendered images, if > 0 they are changed
@@ -560,7 +584,6 @@ void CRenderer::Notify(const Observable& obs, const ObservableMessage msg)
{
case ObservableMessageSettingsChanged:
{
- std::unique_lock<CCriticalSection> lock(m_section);
m_isSettingsChanged = true;
break;
}
@@ -577,28 +600,6 @@ void CRenderer::Notify(const Observable& obs, const ObservableMessage msg)
void CRenderer::LoadSettings()
{
- m_subtitleHorizontalAlign = static_cast<SubtitleHorizontalAlign>(
- CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt(
- CSettings::SETTING_SUBTITLES_CAPTIONSALIGN));
-}
-
-int CRenderer::GetSubtitleVerticalMargin()
-{
- int subAlign = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt(
- CSettings::SETTING_SUBTITLES_ALIGN);
-
- // If the user has set the alignment type to keep the subtitle text
- // inside the black bars, we exclude custom vertical margin
- // and we force our fixed margin to try avoid go off the black bars
- if (subAlign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE || subAlign == SUBTITLE_ALIGN_TOP_OUTSIDE)
- return KODI::SUBTITLES::MARGIN_VERTICAL_BLACKBARS;
-
- // Try get the vertical margin customized by user
- int overrideMerginVertical =
- CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_videoSubtitleVerticalMargin;
-
- if (overrideMerginVertical >= 0)
- return overrideMerginVertical;
-
- return KODI::SUBTITLES::MARGIN_VERTICAL;
+ m_subtitleHorizontalAlign = SUBTITLES::CSubtitlesSettings::GetInstance().GetHorizontalAlignment();
+ ResetSubtitlePosition();
}
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.h b/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.h
index 370adb8d7a..aa0f85ff43 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.h
@@ -11,9 +11,11 @@
#include "BaseRenderer.h"
#include "cores/VideoPlayer/DVDSubtitles/SubtitlesStyle.h"
+#include "settings/SubtitlesSettings.h"
#include "threads/CriticalSection.h"
#include "utils/Observer.h"
+#include <atomic>
#include <map>
#include <memory>
#include <vector>
@@ -25,30 +27,6 @@ class CDVDOverlaySpu;
class CDVDOverlaySSA;
class CDVDOverlayText;
-enum SubtitleAlign
-{
- SUBTITLE_ALIGN_MANUAL = 0,
- SUBTITLE_ALIGN_BOTTOM_INSIDE,
- SUBTITLE_ALIGN_BOTTOM_OUTSIDE,
- SUBTITLE_ALIGN_TOP_INSIDE,
- SUBTITLE_ALIGN_TOP_OUTSIDE
-};
-
-enum class SubtitleHorizontalAlign
-{
- LEFT = 0,
- CENTER,
- RIGHT
-};
-
-enum subtitleBackgroundType
-{
- SUBTITLE_BACKGROUNDTYPE_NONE = 0,
- SUBTITLE_BACKGROUNDTYPE_SHADOW,
- SUBTITLE_BACKGROUNDTYPE_BOX,
- SUBTITLE_BACKGROUNDTYPE_SQUAREBOX
-};
-
namespace OVERLAY {
struct SRenderState
@@ -115,6 +93,12 @@ namespace OVERLAY {
void AddOverlay(CDVDOverlay* o, double pts, int index);
virtual void Render(int idx);
+
+ /*!
+ * \brief Release resources
+ */
+ void UnInit();
+
void Flush();
/*!
@@ -135,18 +119,17 @@ namespace OVERLAY {
*/
void SetSubtitleVerticalPosition(const int value, bool save);
+ protected:
/*!
* \brief Reset the subtitle position to default value
*/
void ResetSubtitlePosition();
/*!
- * \brief Get the subtitle vertical margin
- * \return The margin in pixel
+ * \brief Called when the screen resolution is changed
*/
- static int GetSubtitleVerticalMargin();
+ void OnViewChange();
- protected:
struct SElement
{
SElement()
@@ -167,10 +150,11 @@ namespace OVERLAY {
* \param subStyle The style to be used, MUST BE SET ONLY at the first call or when user change settings
* \return True if success, false if error
*/
- COverlay* ConvertLibass(CDVDOverlayLibass* o,
- double pts,
- bool updateStyle,
- const std::shared_ptr<struct KODI::SUBTITLES::style>& overlayStyle);
+ COverlay* ConvertLibass(
+ CDVDOverlayLibass* o,
+ double pts,
+ bool updateStyle,
+ const std::shared_ptr<struct KODI::SUBTITLES::STYLE::style>& overlayStyle);
void CreateSubtitlesStyle();
@@ -192,9 +176,11 @@ namespace OVERLAY {
int m_subtitlePosition{0}; // Current subtitle position
int m_subtitlePosResInfo{-1}; // Current subtitle position from resolution info
int m_subtitleVerticalMargin{0};
- SubtitleHorizontalAlign m_subtitleHorizontalAlign{SubtitleHorizontalAlign::CENTER};
+ bool m_saveSubtitlePosition{false}; // To save subtitle position permanently
+ KODI::SUBTITLES::HorizontalAlign m_subtitleHorizontalAlign{
+ KODI::SUBTITLES::HorizontalAlign::CENTER};
- std::shared_ptr<struct KODI::SUBTITLES::style> m_overlayStyle;
- bool m_isSettingsChanged{false};
+ std::shared_ptr<struct KODI::SUBTITLES::STYLE::style> m_overlayStyle;
+ std::atomic<bool> m_isSettingsChanged{false};
};
}
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
index 8e3d23c9c5..756fb3f5d2 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
@@ -229,8 +229,8 @@ bool CRenderManager::Configure()
m_renderDebug = false;
m_clockSync.Reset();
m_dvdClock.SetVsyncAdjust(0);
+ m_overlays.Reset();
m_overlays.SetStereoMode(m_stereomode);
- m_overlays.ResetSubtitlePosition();
m_renderState = STATE_CONFIGURED;
@@ -398,7 +398,7 @@ void CRenderManager::UnInit()
std::unique_lock<CCriticalSection> lock(m_statelock);
- m_overlays.Flush();
+ m_overlays.UnInit();
m_debugRenderer.Dispose();
DeleteRenderer();
diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp
index da1acdc7df..1bc0b5fd24 100644
--- a/xbmc/settings/AdvancedSettings.cpp
+++ b/xbmc/settings/AdvancedSettings.cpp
@@ -449,8 +449,6 @@ void CAdvancedSettings::Initialize()
m_stereoscopicregex_sbs = "[-. _]h?sbs[-. _]";
m_stereoscopicregex_tab = "[-. _]h?tab[-. _]";
- m_videoSubtitleVerticalMargin = -1;
-
m_logLevelHint = m_logLevel = LOG_LEVEL_NORMAL;
m_openGlDebugging = false;
@@ -607,7 +605,6 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file)
pElement = pRootElement->FirstChildElement("video");
if (pElement)
{
- XMLUtils::GetInt(pElement, "subtitleverticalmargin", m_videoSubtitleVerticalMargin);
XMLUtils::GetString(pElement, "stereoscopicregex3d", m_stereoscopicregex_3d);
XMLUtils::GetString(pElement, "stereoscopicregexsbs", m_stereoscopicregex_sbs);
XMLUtils::GetString(pElement, "stereoscopicregextab", m_stereoscopicregex_tab);
diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h
index bbea4be06b..03cc0bd090 100644
--- a/xbmc/settings/AdvancedSettings.h
+++ b/xbmc/settings/AdvancedSettings.h
@@ -375,11 +375,6 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler
std::string m_stereoscopicregex_sbs;
std::string m_stereoscopicregex_tab;
- /*! \brief Change the default vertical margin of the subtitle,
- in order to be applied to applied to all types of subtitle position.
- */
- int m_videoSubtitleVerticalMargin;
-
bool m_openGlDebugging;
std::string m_userAgent;
diff --git a/xbmc/settings/DisplaySettings.cpp b/xbmc/settings/DisplaySettings.cpp
index d7d9430481..25f230abda 100644
--- a/xbmc/settings/DisplaySettings.cpp
+++ b/xbmc/settings/DisplaySettings.cpp
@@ -548,8 +548,8 @@ void CDisplaySettings::ApplyCalibrations()
m_resolutions[res].iSubtitles = itCal->iSubtitles;
if (m_resolutions[res].iSubtitles < 0)
m_resolutions[res].iSubtitles = 0;
- if (m_resolutions[res].iSubtitles > m_resolutions[res].iHeight)
- m_resolutions[res].iSubtitles = m_resolutions[res].iHeight;
+ if (m_resolutions[res].iSubtitles > m_resolutions[res].iHeight * 3 / 2)
+ m_resolutions[res].iSubtitles = m_resolutions[res].iHeight * 3 / 2;
m_resolutions[res].fPixelRatio = itCal->fPixelRatio;
if (m_resolutions[res].fPixelRatio < 0.5f)
diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h
index d174fc385f..ddec9aeec7 100644
--- a/xbmc/settings/Settings.h
+++ b/xbmc/settings/Settings.h
@@ -155,6 +155,7 @@ public:
static constexpr auto SETTING_SUBTITLES_SHADOWSIZE = "subtitles.shadowsize";
static constexpr auto SETTING_SUBTITLES_BGCOLOR = "subtitles.bgcolorpick";
static constexpr auto SETTING_SUBTITLES_BGOPACITY = "subtitles.bgopacity";
+ static constexpr auto SETTING_SUBTITLES_MARGINVERTICAL = "subtitles.marginvertical";
static constexpr auto SETTING_SUBTITLES_CHARSET = "subtitles.charset";
static constexpr auto SETTING_SUBTITLES_OVERRIDEFONTS = "subtitles.overridefonts";
static constexpr auto SETTING_SUBTITLES_OVERRIDESTYLES = "subtitles.overridestyles";
diff --git a/xbmc/settings/SubtitlesSettings.cpp b/xbmc/settings/SubtitlesSettings.cpp
index f84c4256c8..94be7b635c 100644
--- a/xbmc/settings/SubtitlesSettings.cpp
+++ b/xbmc/settings/SubtitlesSettings.cpp
@@ -21,7 +21,6 @@
#include "utils/StringUtils.h"
#include "utils/URIUtils.h"
-
using namespace KODI;
using namespace SUBTITLES;
@@ -29,34 +28,23 @@ CSubtitlesSettings::CSubtitlesSettings()
{
m_settings = CServiceBroker::GetSettingsComponent()->GetSettings();
- m_settings->RegisterCallback(this, {CSettings::SETTING_LOCALE_SUBTITLELANGUAGE,
- CSettings::SETTING_SUBTITLES_PARSECAPTIONS,
- CSettings::SETTING_SUBTITLES_ALIGN,
- CSettings::SETTING_SUBTITLES_STEREOSCOPICDEPTH,
- CSettings::SETTING_SUBTITLES_FONTNAME,
- CSettings::SETTING_SUBTITLES_FONTSIZE,
- CSettings::SETTING_SUBTITLES_STYLE,
- CSettings::SETTING_SUBTITLES_COLOR,
- CSettings::SETTING_SUBTITLES_BORDERSIZE,
- CSettings::SETTING_SUBTITLES_BORDERCOLOR,
- CSettings::SETTING_SUBTITLES_OPACITY,
- CSettings::SETTING_SUBTITLES_BGCOLOR,
- CSettings::SETTING_SUBTITLES_BGOPACITY,
- CSettings::SETTING_SUBTITLES_BLUR,
- CSettings::SETTING_SUBTITLES_BACKGROUNDTYPE,
- CSettings::SETTING_SUBTITLES_SHADOWCOLOR,
- CSettings::SETTING_SUBTITLES_SHADOWOPACITY,
- CSettings::SETTING_SUBTITLES_SHADOWSIZE,
- CSettings::SETTING_SUBTITLES_CHARSET,
- CSettings::SETTING_SUBTITLES_OVERRIDEFONTS,
- CSettings::SETTING_SUBTITLES_OVERRIDESTYLES,
- CSettings::SETTING_SUBTITLES_LANGUAGES,
- CSettings::SETTING_SUBTITLES_STORAGEMODE,
- CSettings::SETTING_SUBTITLES_CUSTOMPATH,
- CSettings::SETTING_SUBTITLES_PAUSEONSEARCH,
- CSettings::SETTING_SUBTITLES_DOWNLOADFIRST,
- CSettings::SETTING_SUBTITLES_TV,
- CSettings::SETTING_SUBTITLES_MOVIE});
+ m_settings->RegisterCallback(
+ this,
+ {CSettings::SETTING_LOCALE_SUBTITLELANGUAGE, CSettings::SETTING_SUBTITLES_PARSECAPTIONS,
+ CSettings::SETTING_SUBTITLES_ALIGN, CSettings::SETTING_SUBTITLES_STEREOSCOPICDEPTH,
+ CSettings::SETTING_SUBTITLES_FONTNAME, CSettings::SETTING_SUBTITLES_FONTSIZE,
+ CSettings::SETTING_SUBTITLES_STYLE, CSettings::SETTING_SUBTITLES_COLOR,
+ CSettings::SETTING_SUBTITLES_BORDERSIZE, CSettings::SETTING_SUBTITLES_BORDERCOLOR,
+ CSettings::SETTING_SUBTITLES_OPACITY, CSettings::SETTING_SUBTITLES_BGCOLOR,
+ CSettings::SETTING_SUBTITLES_BGOPACITY, CSettings::SETTING_SUBTITLES_BLUR,
+ CSettings::SETTING_SUBTITLES_BACKGROUNDTYPE, CSettings::SETTING_SUBTITLES_SHADOWCOLOR,
+ CSettings::SETTING_SUBTITLES_SHADOWOPACITY, CSettings::SETTING_SUBTITLES_SHADOWSIZE,
+ CSettings::SETTING_SUBTITLES_MARGINVERTICAL, CSettings::SETTING_SUBTITLES_CHARSET,
+ CSettings::SETTING_SUBTITLES_OVERRIDEFONTS, CSettings::SETTING_SUBTITLES_OVERRIDESTYLES,
+ CSettings::SETTING_SUBTITLES_LANGUAGES, CSettings::SETTING_SUBTITLES_STORAGEMODE,
+ CSettings::SETTING_SUBTITLES_CUSTOMPATH, CSettings::SETTING_SUBTITLES_PAUSEONSEARCH,
+ CSettings::SETTING_SUBTITLES_DOWNLOADFIRST, CSettings::SETTING_SUBTITLES_TV,
+ CSettings::SETTING_SUBTITLES_MOVIE});
}
CSubtitlesSettings::~CSubtitlesSettings()
@@ -84,6 +72,122 @@ void CSubtitlesSettings::OnSettingChanged(const std::shared_ptr<const CSetting>&
}
}
+Align CSubtitlesSettings::GetAlignment()
+{
+ return static_cast<Align>(m_settings->GetInt(CSettings::SETTING_SUBTITLES_ALIGN));
+}
+
+void CSubtitlesSettings::SetAlignment(Align align)
+{
+ m_settings->SetInt(CSettings::SETTING_SUBTITLES_ALIGN, static_cast<int>(align));
+}
+
+HorizontalAlign CSubtitlesSettings::GetHorizontalAlignment()
+{
+ return static_cast<HorizontalAlign>(
+ m_settings->GetInt(CSettings::SETTING_SUBTITLES_CAPTIONSALIGN));
+}
+
+std::string CSubtitlesSettings::GetFontName()
+{
+ return m_settings->GetString(CSettings::SETTING_SUBTITLES_FONTNAME);
+}
+
+FontStyle CSubtitlesSettings::GetFontStyle()
+{
+ return static_cast<FontStyle>(m_settings->GetInt(CSettings::SETTING_SUBTITLES_STYLE));
+}
+
+int CSubtitlesSettings::GetFontSize()
+{
+ return m_settings->GetInt(CSettings::SETTING_SUBTITLES_FONTSIZE);
+}
+
+UTILS::COLOR::Color CSubtitlesSettings::GetFontColor()
+{
+ return UTILS::COLOR::ConvertHexToColor(m_settings->GetString(CSettings::SETTING_SUBTITLES_COLOR));
+}
+
+int CSubtitlesSettings::GetFontOpacity()
+{
+ return m_settings->GetInt(CSettings::SETTING_SUBTITLES_OPACITY);
+}
+
+int CSubtitlesSettings::GetBorderSize()
+{
+ return m_settings->GetInt(CSettings::SETTING_SUBTITLES_BORDERSIZE);
+}
+
+UTILS::COLOR::Color CSubtitlesSettings::GetBorderColor()
+{
+ return UTILS::COLOR::ConvertHexToColor(
+ m_settings->GetString(CSettings::SETTING_SUBTITLES_BORDERCOLOR));
+}
+
+int CSubtitlesSettings::GetShadowSize()
+{
+ return m_settings->GetInt(CSettings::SETTING_SUBTITLES_SHADOWSIZE);
+}
+
+UTILS::COLOR::Color CSubtitlesSettings::GetShadowColor()
+{
+ return UTILS::COLOR::ConvertHexToColor(
+ m_settings->GetString(CSettings::SETTING_SUBTITLES_SHADOWCOLOR));
+}
+
+int CSubtitlesSettings::GetShadowOpacity()
+{
+ return m_settings->GetInt(CSettings::SETTING_SUBTITLES_SHADOWOPACITY);
+}
+
+int CSubtitlesSettings::GetBlurSize()
+{
+ return m_settings->GetInt(CSettings::SETTING_SUBTITLES_BLUR);
+}
+
+BackgroundType CSubtitlesSettings::GetBackgroundType()
+{
+ return static_cast<BackgroundType>(
+ m_settings->GetInt(CSettings::SETTING_SUBTITLES_BACKGROUNDTYPE));
+}
+
+UTILS::COLOR::Color CSubtitlesSettings::GetBackgroundColor()
+{
+ return UTILS::COLOR::ConvertHexToColor(
+ m_settings->GetString(CSettings::SETTING_SUBTITLES_BGCOLOR));
+}
+
+int CSubtitlesSettings::GetBackgroundOpacity()
+{
+ return m_settings->GetInt(CSettings::SETTING_SUBTITLES_BGOPACITY);
+}
+
+bool CSubtitlesSettings::IsOverrideFonts()
+{
+ return m_settings->GetBool(CSettings::SETTING_SUBTITLES_OVERRIDEFONTS);
+}
+
+OverrideStyles CSubtitlesSettings::GetOverrideStyles()
+{
+ return static_cast<OverrideStyles>(
+ m_settings->GetInt(CSettings::SETTING_SUBTITLES_OVERRIDESTYLES));
+}
+
+float CSubtitlesSettings::GetVerticalMarginPerc()
+{
+ // We return the vertical margin as percentage
+ // to fit the current screen resolution
+ const Align subAlign{GetAlignment()};
+
+ // If the user has set the alignment type to keep the subtitle text
+ // inside the black bars, we override user vertical margin
+ // to try avoid go off the black bars
+ if (subAlign == Align::BOTTOM_OUTSIDE || subAlign == Align::TOP_OUTSIDE)
+ return MARGIN_VERTICAL_BLACKBARS;
+
+ return static_cast<float>(m_settings->GetNumber(CSettings::SETTING_SUBTITLES_MARGINVERTICAL));
+}
+
void CSubtitlesSettings::SettingOptionsSubtitleFontsFiller(const SettingConstPtr& setting,
std::vector<StringSettingOption>& list,
std::string& current,
diff --git a/xbmc/settings/SubtitlesSettings.h b/xbmc/settings/SubtitlesSettings.h
index 0940c589a7..85c7ad9193 100644
--- a/xbmc/settings/SubtitlesSettings.h
+++ b/xbmc/settings/SubtitlesSettings.h
@@ -9,9 +9,11 @@
#pragma once
#include "settings/lib/ISettingCallback.h"
+#include "utils/ColorUtils.h"
#include "utils/Observer.h"
#include <memory>
+#include <string>
class CSetting;
class CSettings;
@@ -25,6 +27,50 @@ namespace SUBTITLES
// even if the default app font could be changed
constexpr const char* FONT_DEFAULT_FAMILYNAME = "DEFAULT";
+// Default vertical margin used for the alignment
+// to keep the text inside the black bars
+constexpr float MARGIN_VERTICAL_BLACKBARS = 2.75f; // in %
+
+enum class Align
+{
+ MANUAL = 0,
+ BOTTOM_INSIDE,
+ BOTTOM_OUTSIDE,
+ TOP_INSIDE,
+ TOP_OUTSIDE
+};
+
+enum class HorizontalAlign
+{
+ LEFT = 0,
+ CENTER,
+ RIGHT
+};
+
+enum class BackgroundType
+{
+ NONE = 0,
+ SHADOW,
+ BOX,
+ SQUAREBOX
+};
+
+enum class FontStyle
+{
+ NORMAL = 0,
+ BOLD,
+ ITALIC,
+ BOLD_ITALIC
+};
+
+enum class OverrideStyles
+{
+ DISABLED = 0,
+ POSITIONS,
+ STYLES,
+ STYLES_POSITIONS
+};
+
class CSubtitlesSettings : public ISettingCallback, public Observable
{
public:
@@ -33,6 +79,126 @@ public:
// Inherited from ISettingCallback
void OnSettingChanged(const std::shared_ptr<const CSetting>& setting) override;
+ /*!
+ * \brief Get subtitle alignment
+ * \return The alignment
+ */
+ Align GetAlignment();
+
+ /*!
+ * \brief Set the subtitle alignment
+ * \param align The alignment
+ */
+ void SetAlignment(Align align);
+
+ /*!
+ * \brief Get horizontal text alignment
+ * \return The alignment
+ */
+ HorizontalAlign GetHorizontalAlignment();
+
+ /*!
+ * \brief Get font name
+ * \return The font name
+ */
+ std::string GetFontName();
+
+ /*!
+ * \brief Get font style
+ * \return The font style
+ */
+ FontStyle GetFontStyle();
+
+ /*!
+ * \brief Get font size
+ * \return The font size in PT
+ */
+ int GetFontSize();
+
+ /*!
+ * \brief Get font color
+ * \return The font color
+ */
+ UTILS::COLOR::Color GetFontColor();
+
+ /*!
+ * \brief Get font opacity
+ * \return The font opacity in %
+ */
+ int GetFontOpacity();
+
+ /*!
+ * \brief Get border size
+ * \return The border size in %
+ */
+ int GetBorderSize();
+
+ /*!
+ * \brief Get border color
+ * \return The border color
+ */
+ UTILS::COLOR::Color GetBorderColor();
+
+ /*!
+ * \brief Get shadow size
+ * \return The shadow size in %
+ */
+ int GetShadowSize();
+
+ /*!
+ * \brief Get shadow color
+ * \return The shadow color
+ */
+ UTILS::COLOR::Color GetShadowColor();
+
+ /*!
+ * \brief Get shadow opacity
+ * \return The shadow opacity in %
+ */
+ int GetShadowOpacity();
+
+ /*!
+ * \brief Get blur size
+ * \return The blur size in %
+ */
+ int GetBlurSize();
+
+ /*!
+ * \brief Get background type
+ * \return The background type
+ */
+ BackgroundType GetBackgroundType();
+
+ /*!
+ * \brief Get background color
+ * \return The background color
+ */
+ UTILS::COLOR::Color GetBackgroundColor();
+
+ /*!
+ * \brief Get background opacity
+ * \return The background opacity in %
+ */
+ int GetBackgroundOpacity();
+
+ /*!
+ * \brief Check if font override is enabled
+ * \return True if fonts must be overriden, otherwise false
+ */
+ bool IsOverrideFonts();
+
+ /*!
+ * \brief Get override styles
+ * \return The styles to be overriden
+ */
+ OverrideStyles GetOverrideStyles();
+
+ /*!
+ * \brief Get the subtitle vertical margin
+ * \return The vertical margin in %
+ */
+ float GetVerticalMarginPerc();
+
static void SettingOptionsSubtitleFontsFiller(const std::shared_ptr<const CSetting>& setting,
std::vector<StringSettingOption>& list,
std::string& current,
diff --git a/xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp b/xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp
index 3336c52dfd..cc0587b128 100644
--- a/xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp
+++ b/xbmc/settings/windows/GUIWindowSettingsScreenCalibration.cpp
@@ -10,7 +10,6 @@
#include "Application.h"
#include "ServiceBroker.h"
-#include "cores/VideoPlayer/VideoRenderers/OverlayRenderer.h"
#include "dialogs/GUIDialogYesNo.h"
#include "guilib/GUIComponent.h"
#include "guilib/GUIMoverControl.h"
@@ -21,6 +20,7 @@
#include "settings/DisplaySettings.h"
#include "settings/Settings.h"
#include "settings/SettingsComponent.h"
+#include "settings/SubtitlesSettings.h"
#include "utils/StringUtils.h"
#include "utils/Variant.h"
#include "utils/log.h"
@@ -29,6 +29,8 @@
#include <string>
#include <utility>
+using namespace KODI;
+
namespace
{
constexpr int CONTROL_LABEL_RES = 2;
@@ -212,7 +214,6 @@ bool CGUIWindowSettingsScreenCalibration::OnMessage(CGUIMessage& message)
// Setup the first control
m_iControl = CONTROL_TOP_LEFT;
- m_subtitleVerticalMargin = OVERLAY::CRenderer::GetSubtitleVerticalMargin();
ResetControls();
return true;
}
@@ -314,6 +315,10 @@ void CGUIWindowSettingsScreenCalibration::ResetControls()
CGUIMoverControl* pControl = dynamic_cast<CGUIMoverControl*>(GetControl(CONTROL_TOP_LEFT));
RESOLUTION_INFO info =
CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(m_Res[m_iCurRes]);
+
+ m_subtitleVerticalMargin =
+ info.iHeight / 100 * SUBTITLES::CSubtitlesSettings::GetInstance().GetVerticalMarginPerc();
+
if (pControl)
{
pControl->SetLimits(-info.iWidth / 4, -info.iHeight / 4, info.iWidth / 4, info.iHeight / 4);
@@ -350,6 +355,10 @@ void CGUIWindowSettingsScreenCalibration::ResetControls()
info.Overscan.bottom + m_subtitlesHalfSpace);
pControl->SetHeight(scaledHeight);
pControl->SetWidth(size.second / DEFAULT_GUI_WIDTH * info.iWidth);
+ // If the vertical margin has been changed from the previous calibration,
+ // the text bar could appear offscreen, then force move to visible area
+ if (info.iSubtitles - m_subtitleVerticalMargin > info.iHeight)
+ info.iSubtitles = info.Overscan.bottom;
// We want the text to be at the base of the bar,
// then we shift the position to include the vertical margin
pControl->SetPosition((info.iWidth - pControl->GetWidth()) * 0.5f,
@@ -469,7 +478,7 @@ bool CGUIWindowSettingsScreenCalibration::UpdateFromControl(int iControl)
pControl->GetYLocation() - m_subtitlesHalfSpace + m_subtitleVerticalMargin;
labelDescription = StringUtils::Format("[B]{}[/B][CR]{}", g_localizeStrings.Get(277),
g_localizeStrings.Get(278));
- labelValue = StringUtils::Format(g_localizeStrings.Get(20327),
+ labelValue = StringUtils::Format(g_localizeStrings.Get(39184), info.iSubtitles,
info.iSubtitles - m_subtitleVerticalMargin);
}
break;
diff --git a/xbmc/video/PlayerController.cpp b/xbmc/video/PlayerController.cpp
index 2d0b486902..9e4daecbbd 100644
--- a/xbmc/video/PlayerController.cpp
+++ b/xbmc/video/PlayerController.cpp
@@ -25,11 +25,13 @@
#include "settings/MediaSettings.h"
#include "settings/Settings.h"
#include "settings/SettingsComponent.h"
+#include "settings/SubtitlesSettings.h"
#include "utils/LangCodeExpander.h"
#include "utils/StringUtils.h"
#include "utils/Variant.h"
#include "video/dialogs/GUIDialogAudioSettings.h"
+using namespace KODI;
using namespace UTILS;
CPlayerController::CPlayerController()
@@ -375,17 +377,22 @@ bool CPlayerController::OnAction(const CAction &action)
case ACTION_SUBTITLE_ALIGN:
{
- int subalign = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt(CSettings::SETTING_SUBTITLES_ALIGN);
+ SUBTITLES::CSubtitlesSettings& settings{SUBTITLES::CSubtitlesSettings::GetInstance()};
+ SUBTITLES::Align align{settings.GetAlignment()};
- subalign++;
- if (subalign > SUBTITLE_ALIGN_TOP_OUTSIDE)
- subalign = SUBTITLE_ALIGN_MANUAL;
+ align = static_cast<SUBTITLES::Align>(static_cast<int>(align) + 1);
- CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(CSettings::SETTING_SUBTITLES_ALIGN, subalign);
- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info,
- g_localizeStrings.Get(21460),
- g_localizeStrings.Get(21461 + subalign),
- TOAST_DISPLAY_TIME, false);
+ if (align != SUBTITLES::Align::MANUAL && align != SUBTITLES::Align::BOTTOM_INSIDE &&
+ align != SUBTITLES::Align::BOTTOM_OUTSIDE && align != SUBTITLES::Align::TOP_INSIDE &&
+ align != SUBTITLES::Align::TOP_OUTSIDE)
+ {
+ align = SUBTITLES::Align::MANUAL;
+ }
+
+ settings.SetAlignment(align);
+ CGUIDialogKaiToast::QueueNotification(
+ CGUIDialogKaiToast::Info, g_localizeStrings.Get(21460),
+ g_localizeStrings.Get(21461 + static_cast<int>(align)), TOAST_DISPLAY_TIME, false);
return true;
}