To start with I really like the new handling of subtitles in v20, nicely done! Since my development environment recently started working, I've just started looking around at how vertical subtitle adjustment works in v20. Below some initial thoughts.
1. V20 seems to handle vertical adjustment of subtitle position like previous versions ie it only works with SUBTITLE_ALIGN_MANUAL thus opts.usePosition = true. Se below:
github.com/master/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.cpp#L388-L396
cpp:
// Set position of subtitles based on video calibration settings
if (subAlign == SUBTITLE_ALIGN_MANUAL)
{
rOpts.usePosition = true;
RESOLUTION_INFO res;
res = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(
CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution());
rOpts.position = 100.0 - (double)(res.iSubtitles - res.Overscan.top) * 100 / res.iHeight;
}
github.com/master/xbmc/cores/VideoPlayer/DVDSubtitles/DVDSubtitlesLibass.cpp#L399-L402cpp:
// Vertical margin (direction depends on alignment)
// to be set only when the video calibration position setting is not used
if (opts.usePosition)
style->MarginV = 0;
else
style->MarginV = static_cast<int>(subStyle.marginVertical * scale);
}
2. However, it seems that PlayerController has already been prepared to handle vertical alignment adjustments for all modes. I'l try a qick 'n dirty fix to implement vertical alignment accordingly. For example, see "res_info.iSubtitles" with ACTION_SUBTITLE_VSHIFT_UP, se below:
github.com/master/xbmc/video/PlayerController.cpp#L331-L356 cpp:
case ACTION_SUBTITLE_VSHIFT_UP:
{
RESOLUTION_INFO res_info = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo();
int subalign = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt(CSettings::SETTING_SUBTITLES_ALIGN);
if ((subalign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE) || (subalign == SUBTITLE_ALIGN_TOP_INSIDE))
{
res_info.iSubtitles ++;
if (res_info.iSubtitles >= res_info.iHeight)
res_info.iSubtitles = res_info.iHeight - 1;
ShowSlider(action.GetID(), 274, (float) res_info.iHeight - res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight);
}
else
{
res_info.iSubtitles --;
if (res_info.iSubtitles < 0)
res_info.iSubtitles = 0;
if (subalign == SUBTITLE_ALIGN_MANUAL)
ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles, 0.0f, 1.0f, (float) res_info.iHeight);
else
ShowSlider(action.GetID(), 274, (float) res_info.iSubtitles - res_info.iHeight, (float) -res_info.iHeight, -1.0f, 0.0f);
}
CServiceBroker::GetWinSystem()->GetGfxContext().SetResInfo(CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(), res_info);
return true;
}
3. During my peek around in "OverlayRenderer.cpp" I found a possible typo but maybe I'm misunderstanding the logic behind "SUBTITLE_ALIGN_TOP_OUTSIDE" used on both lines. Or is it intentional that drawWithinBlackBars only is allowed in "OUTSIDE" mode?
github.com/master/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRenderer.cpp#L325-L330
cpp:
int subAlign = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt(
CSettings::SETTING_SUBTITLES_ALIGN);
if (subAlign == SUBTITLE_ALIGN_TOP_INSIDE || subAlign == SUBTITLE_ALIGN_TOP_OUTSIDE)
m_overlayStyle->alignment = KODI::SUBTITLES::FontAlignment::TOP_CENTER;
else
m_overlayStyle->alignment = KODI::SUBTITLES::FontAlignment::SUB_CENTER;
if (subAlign == SUBTITLE_ALIGN_BOTTOM_OUTSIDE || subAlign == SUBTITLE_ALIGN_TOP_OUTSIDE)
m_overlayStyle->drawWithinBlackBars = true;
--