COverlay* CRenderer::Convert(CDVDOverlay* o, double pts) { COverlay* r = o->m_overlay; if(r) return r->Acquire(); #if defined(HAS_GL) || defined(HAS_GLES) if (o->IsOverlayType(DVDOVERLAY_TYPE_IMAGE)) r = new COverlayTextureGL((CDVDOverlayImage*)o); else if(o->IsOverlayType(DVDOVERLAY_TYPE_SPU)) r = new COverlayTextureGL((CDVDOverlaySpu*)o); else if(o->IsOverlayType(DVDOVERLAY_TYPE_SSA)) r = new COverlayGlyphGL((CDVDOverlaySSA*)o, pts); #elif defined(HAS_DX) if (o->IsOverlayType(DVDOVERLAY_TYPE_IMAGE)) r = new COverlayImageDX((CDVDOverlayImage*)o); else if(o->IsOverlayType(DVDOVERLAY_TYPE_SPU)) r = new COverlayImageDX((CDVDOverlaySpu*)o); else if(o->IsOverlayType(DVDOVERLAY_TYPE_SSA)) r = new COverlayQuadsDX((CDVDOverlaySSA*)o, pts); #endif if(r && !o->IsOverlayType(DVDOVERLAY_TYPE_SSA)) o->m_overlay = r->Acquire(); return r; }
COverlay* CRenderer::Convert(CDVDOverlay* o, double pts) { COverlay* r = NULL; if(o->IsOverlayType(DVDOVERLAY_TYPE_SSA)) r = Convert((CDVDOverlaySSA*)o, pts); else if(o->m_overlay) r = o->m_overlay->Acquire(); if(r) { if(o->m_overlay) o->m_overlay->Release(); o->m_overlay = r->Acquire(); return r; } #if defined(HAS_GL) || defined(HAS_GLES) if (o->IsOverlayType(DVDOVERLAY_TYPE_IMAGE)) r = new COverlayTextureGL((CDVDOverlayImage*)o); else if(o->IsOverlayType(DVDOVERLAY_TYPE_SPU)) r = new COverlayTextureGL((CDVDOverlaySpu*)o); #elif defined(HAS_DX) if (o->IsOverlayType(DVDOVERLAY_TYPE_IMAGE)) r = new COverlayImageDX((CDVDOverlayImage*)o); else if(o->IsOverlayType(DVDOVERLAY_TYPE_SPU)) r = new COverlayImageDX((CDVDOverlaySpu*)o); #endif if(r) o->m_overlay = r->Acquire(); return r; }
void CRenderer::Render(int idx) { CSingleLock lock(m_section); Release(m_cleanup); std::vector<COverlay*> render; SElementV& list = m_buffers[idx]; for(SElementV::iterator it = list.begin(); it != list.end(); ++it) { COverlay* o = NULL; if(it->overlay) o = it->overlay->Acquire(); else if(it->overlay_dvd) o = Convert(it->overlay_dvd, it->pts); if(!o) continue; render.push_back(o); } float total_height = 0.0f; float cur_height = 0.0f; int subalign = CSettings::Get().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); for (std::vector<COverlay*>::iterator it = render.begin(); it != render.end(); ++it) { COverlay* o = *it; o->PrepareRender(); 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_type == COverlay::TYPE_GUITEXT) { if(subalign == SUBTITLE_ALIGN_TOP_INSIDE || subalign == SUBTITLE_ALIGN_TOP_OUTSIDE) { adjust_height = cur_height; cur_height += o->m_height; } else { total_height -= o->m_height; adjust_height = -total_height; } } Render(o, adjust_height); o->Release(); } }
void CRenderer::Render(int idx) { CSingleLock lock(m_section); Release(m_cleanup); std::vector<COverlay*> render; SElementV& list = m_buffers[idx]; for(SElementV::iterator it = list.begin(); it != list.end(); ++it) { COverlay* o = NULL; if(it->overlay) o = it->overlay->Acquire(); else if(it->overlay_dvd) o = Convert(it->overlay_dvd, it->pts); 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, adjust_height); o->Release(); } }
void CRenderer::Render() { CSingleLock lock(m_section); Release(m_cleanup); SElementV& list = m_buffers[m_render]; for(SElementV::iterator it = list.begin(); it != list.end(); it++) { COverlay* o = NULL; if(it->overlay) o = it->overlay->Acquire(); else if(it->overlay_dvd) o = Convert(it->overlay_dvd, it->pts); if(!o) continue; Render(o); o->Release(); } }
void CRenderer::Render(int idx) { CSingleLock lock(m_section); std::vector<COverlay*> render; std::vector<SElement>& list = m_buffers[idx]; for(std::vector<SElement>::iterator it = list.begin(); it != list.end(); ++it) { COverlay* o = NULL; if(it->overlay_dvd) o = Convert(it->overlay_dvd, it->pts); if(!o) continue; render.push_back(o); } const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings(); float total_height = 0.0f; float cur_height = 0.0f; int subalign = settings->GetInt(CSettings::SETTING_SUBTITLES_ALIGN); for (std::vector<COverlay*>::iterator it = render.begin(); it != render.end(); ++it) { COverlay* o = nullptr; COverlayText *text = dynamic_cast<COverlayText*>(*it); if (text) { // Compute the color to be used for the overlay background (depending on the opacity) UTILS::Color bgcolor = bgcolors[settings->GetInt(CSettings::SETTING_SUBTITLES_BGCOLOR)]; int bgopacity = settings->GetInt(CSettings::SETTING_SUBTITLES_BGOPACITY); if (bgopacity > 0 && bgopacity < 100) { bgcolor = ColorUtils::ChangeOpacity(bgcolor, bgopacity / 100.0f); } else if (bgopacity == 0) { bgcolor = UTILS::COLOR::NONE; } text->PrepareRender(settings->GetString(CSettings::SETTING_SUBTITLES_FONT), settings->GetInt(CSettings::SETTING_SUBTITLES_COLOR), settings->GetInt(CSettings::SETTING_SUBTITLES_HEIGHT), settings->GetInt(CSettings::SETTING_SUBTITLES_STYLE), m_font, m_fontBorder, bgcolor, m_rv); o = text; } else { o = *it; o->PrepareRender(); } 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_type == COverlay::TYPE_GUITEXT) { if(subalign == SUBTITLE_ALIGN_TOP_INSIDE || subalign == SUBTITLE_ALIGN_TOP_OUTSIDE) { adjust_height = cur_height; cur_height += o->m_height; } else { total_height -= o->m_height; adjust_height = -total_height; } } Render(o, adjust_height); } ReleaseUnused(); }
void CRenderer::Render(int idx) { CSingleLock lock(m_section); std::vector<COverlay*> render; std::vector<SElement>& list = m_buffers[idx]; for(std::vector<SElement>::iterator it = list.begin(); it != list.end(); ++it) { COverlay* o = NULL; if(it->overlay_dvd) o = Convert(it->overlay_dvd, it->pts); if(!o) continue; render.push_back(o); } float total_height = 0.0f; float cur_height = 0.0f; int subalign = CServiceBroker::GetSettings().GetInt(CSettings::SETTING_SUBTITLES_ALIGN); for (std::vector<COverlay*>::iterator it = render.begin(); it != render.end(); ++it) { COverlay* o = nullptr; COverlayText *text = dynamic_cast<COverlayText*>(*it); if (text) { text->PrepareRender(CServiceBroker::GetSettings().GetString(CSettings::SETTING_SUBTITLES_FONT), CServiceBroker::GetSettings().GetInt(CSettings::SETTING_SUBTITLES_COLOR), CServiceBroker::GetSettings().GetInt(CSettings::SETTING_SUBTITLES_HEIGHT), CServiceBroker::GetSettings().GetInt(CSettings::SETTING_SUBTITLES_STYLE), m_font, m_fontBorder); o = text; } else { o = *it; o->PrepareRender(); } 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_type == COverlay::TYPE_GUITEXT) { if(subalign == SUBTITLE_ALIGN_TOP_INSIDE || subalign == SUBTITLE_ALIGN_TOP_OUTSIDE) { adjust_height = cur_height; cur_height += o->m_height; } else { total_height -= o->m_height; adjust_height = -total_height; } } Render(o, adjust_height); } ReleaseUnused(); }