diff options
author | jmarshallnz <jcmarsha@gmail.com> | 2014-06-30 09:50:33 +1200 |
---|---|---|
committer | Trent Nelson <trent.nelson@pivosgroup.com> | 2014-07-11 10:49:09 +0800 |
commit | 19bb2fa8cfa8028c2da948df0db1ae16bcb97261 (patch) | |
tree | 7063d478522e9d78910290bb21752f6580f590e4 | |
parent | 1459cb92701d4db3cde0efc39130968cd5586dee (diff) |
Merge pull request #4885 from sportica/collect_subtitles
Collect subtitles at the same time to prevent overlap
-rw-r--r-- | xbmc/cores/VideoRenderers/OverlayRenderer.cpp | 30 | ||||
-rw-r--r-- | xbmc/cores/VideoRenderers/OverlayRenderer.h | 3 | ||||
-rw-r--r-- | xbmc/cores/VideoRenderers/OverlayRendererGUI.cpp | 15 | ||||
-rw-r--r-- | xbmc/cores/VideoRenderers/OverlayRendererGUI.h | 1 |
4 files changed, 41 insertions, 8 deletions
diff --git a/xbmc/cores/VideoRenderers/OverlayRenderer.cpp b/xbmc/cores/VideoRenderers/OverlayRenderer.cpp index e6a2d811b5..ea07d9fd11 100644 --- a/xbmc/cores/VideoRenderers/OverlayRenderer.cpp +++ b/xbmc/cores/VideoRenderers/OverlayRenderer.cpp @@ -25,6 +25,7 @@ #include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayImage.h" #include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySpu.h" #include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySSA.h" +#include "cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h" #include "cores/VideoRenderers/RenderManager.h" #include "guilib/GraphicContext.h" #include "Application.h" @@ -172,6 +173,7 @@ void CRenderer::Render(int idx) Release(m_cleanup); + std::vector<COverlay*> render; SElementV& list = m_buffers[idx]; for(SElementV::iterator it = list.begin(); it != list.end(); ++it) { @@ -184,14 +186,37 @@ void CRenderer::Render(int idx) if(!o) continue; + + render.push_back(o); + } + + float total_height = 0.0f; + for (std::vector<COverlay*>::iterator it = render.begin(); it != render.end(); ++it) + { + COverlay* o = *it; + o->PrepareRender(); + if (o->m_align == COverlay::ALIGN_SUBTITLE) + total_height += o->m_height; + } + + for (std::vector<COverlay*>::iterator it = render.begin(); it != render.end(); ++it) + { + COverlay* o = *it; + + float adjust_height = 0.0f; + if (o->m_align == COverlay::ALIGN_SUBTITLE) + { + total_height -= o->m_height; + adjust_height = -total_height; + } - Render(o); + Render(o, adjust_height); o->Release(); } } -void CRenderer::Render(COverlay* o) +void CRenderer::Render(COverlay* o, float adjust_height) { CRect rs, rd, rv; RESOLUTION_INFO res; @@ -276,6 +301,7 @@ void CRenderer::Render(COverlay* o) } state.x += GetStereoscopicDepth(); + state.y += adjust_height; o->Render(state); } diff --git a/xbmc/cores/VideoRenderers/OverlayRenderer.h b/xbmc/cores/VideoRenderers/OverlayRenderer.h index 7be2c4c9f4..9b8e9dab5f 100644 --- a/xbmc/cores/VideoRenderers/OverlayRenderer.h +++ b/xbmc/cores/VideoRenderers/OverlayRenderer.h @@ -50,6 +50,7 @@ namespace OVERLAY { virtual COverlay* Acquire(); virtual long Release(); virtual void Render(SRenderState& state) = 0; + virtual void PrepareRender() {}; enum EType { TYPE_NONE @@ -118,7 +119,7 @@ namespace OVERLAY { typedef std::vector<COverlay*> COverlayV; typedef std::vector<SElement> SElementV; - void Render(COverlay* o); + void Render(COverlay* o, float adjust_height); COverlay* Convert(CDVDOverlay* o, double pts); COverlay* Convert(CDVDOverlaySSA* o, double pts); diff --git a/xbmc/cores/VideoRenderers/OverlayRendererGUI.cpp b/xbmc/cores/VideoRenderers/OverlayRendererGUI.cpp index 7575a10745..4837b5a31e 100644 --- a/xbmc/cores/VideoRenderers/OverlayRendererGUI.cpp +++ b/xbmc/cores/VideoRenderers/OverlayRendererGUI.cpp @@ -147,6 +147,14 @@ COverlayText::~COverlayText() delete m_layout; } +void COverlayText::PrepareRender() +{ + RESOLUTION_INFO res = g_graphicsContext.GetResInfo(); + float width_max = (float)res.Overscan.right - res.Overscan.left; + m_layout->Update(m_text, width_max * 0.9f, false, true); // true to force LTR reading order (most Hebrew subs are this format) + m_layout->GetTextExtent(m_width, m_height); +} + void COverlayText::Render(OVERLAY::SRenderState &state) { if(m_layout == NULL) @@ -172,18 +180,15 @@ void COverlayText::Render(OVERLAY::SRenderState &state) g_graphicsContext.SetTransform(mat, 1.0f, 1.0f); float width_max = (float) res.Overscan.right - res.Overscan.left; - float width, height; - m_layout->Update(m_text, width_max * 0.9f, false, true); // true to force LTR reading order (most Hebrew subs are this format) - m_layout->GetTextExtent(width, height); if (m_subalign == SUBTITLE_ALIGN_MANUAL || m_subalign == SUBTITLE_ALIGN_TOP_OUTSIDE || m_subalign == SUBTITLE_ALIGN_BOTTOM_INSIDE) - y -= height; + y -= m_height; // clamp inside screen y = std::max(y, (float) res.Overscan.top); - y = std::min(y, res.Overscan.bottom - height); + y = std::min(y, res.Overscan.bottom - m_height); m_layout->RenderOutline(x, y, 0, 0xFF000000, XBFONT_CENTER_X, width_max); g_graphicsContext.RemoveTransform(); diff --git a/xbmc/cores/VideoRenderers/OverlayRendererGUI.h b/xbmc/cores/VideoRenderers/OverlayRendererGUI.h index 9099ea6a2e..abedcfba98 100644 --- a/xbmc/cores/VideoRenderers/OverlayRendererGUI.h +++ b/xbmc/cores/VideoRenderers/OverlayRendererGUI.h @@ -45,6 +45,7 @@ public: COverlayText(CDVDOverlayText* src); virtual ~COverlayText(); virtual void Render(SRenderState& state); + virtual void PrepareRender(); CGUITextLayout* m_layout; std::string m_text; |