diff options
author | Stefano Gottardo <gottardo.stefano.83@gmail.com> | 2022-05-01 09:11:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-01 09:11:42 +0200 |
commit | 8d56f2d38579ad9db5c7be88f9fb19f77098ce09 (patch) | |
tree | 435e884be10ebaa296d55e44b4a02f32d500cdb1 | |
parent | cf8c74b2e2222b1b78c419e6d95dd1f4592e23b6 (diff) | |
parent | 43623b09719dc274f687cecbcb9338f1fb4d96e3 (diff) |
Merge pull request #21313 from CastagnaIT/verticalMargin
[Subtitles] Improvements vertical margin and manual position
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; } |