コード例 #1
0
ファイル: OverlayRenderer.cpp プロジェクト: Gemini88/xbmc-1
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;
}
コード例 #2
0
ファイル: OverlayRenderer.cpp プロジェクト: 2BReality/xbmc
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;
}
コード例 #3
0
ファイル: OverlayRenderer.cpp プロジェクト: ntamvl/xbmc
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();
  }
}
コード例 #4
0
ファイル: OverlayRenderer.cpp プロジェクト: 7orlum/xbmc
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();
  }
}
コード例 #5
0
ファイル: OverlayRenderer.cpp プロジェクト: 2BReality/xbmc
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();
  }
}
コード例 #6
0
ファイル: OverlayRenderer.cpp プロジェクト: 68foxboris/xbmc
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();
}
コード例 #7
0
ファイル: OverlayRenderer.cpp プロジェクト: HofiOne/xbmc
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();
}