示例#1
0
void CXBMCRenderManager::ReleaseRenderCapture(CRenderCapture* capture)
{
  CSingleLock lock(m_captCritSect);

  RemoveCapture(capture);

  //because a CRenderCapture might have some gl things allocated, it can only be deleted from app thread
  if (g_application.IsCurrentThread())
  {
    delete capture;
  }
  else
  {
    capture->SetState(CAPTURESTATE_NEEDSDELETE);
    m_captures.push_back(capture);
  }

  if (!m_captures.empty())
    m_hasCaptures = true;
}
示例#2
0
void CXBMCRenderManager::Capture(CRenderCapture* capture, unsigned int width, unsigned int height, int flags)
{
  CSingleLock lock(m_captCritSect);

  RemoveCapture(capture);

  capture->SetState(CAPTURESTATE_NEEDSRENDER);
  capture->SetUserState(CAPTURESTATE_WORKING);
  capture->SetWidth(width);
  capture->SetHeight(height);
  capture->SetFlags(flags);
  capture->GetEvent().Reset();

  if (g_application.IsCurrentThread())
  {
    if (flags & CAPTUREFLAG_IMMEDIATELY)
    {
      //render capture and read out immediately
      RenderCapture(capture);
      capture->SetUserState(capture->GetState());
      capture->GetEvent().Set();
    }

    if ((flags & CAPTUREFLAG_CONTINUOUS) || !(flags & CAPTUREFLAG_IMMEDIATELY))
    {
      //schedule this capture for a render and readout
      m_captures.push_back(capture);
    }
  }
  else
  {
    //schedule this capture for a render and readout
    m_captures.push_back(capture);
  }

  if (!m_captures.empty())
    m_hasCaptures = true;
}
示例#3
0
MouseResult Pane::HitTest(IInputProvider* pprovider, const Point& point, bool bCaptured)
{
    bool bInside = 
           !m_bHidden
        && point.X() >= 0
        && point.X() < (float)XSize() 
        && point.Y() >= 0 
        && point.Y() < (float)YSize();

    if (m_ppaneCapture) {
        ZAssert(bCaptured);

        //
        // Is the mouse over the captured pane?
        //

        MouseResult mouseResult = 
            m_ppaneCapture->HitTest(
                pprovider, 
                point - Point::Cast(m_ppaneCapture->m_offset),
                true
            );

        if (mouseResult.Test(MouseResultHit())) {
            m_ppaneHit = m_ppaneCapture;
        } else {
            m_ppaneHit = NULL;
        }

        //
        // Release Capture?
        //

        if (mouseResult.Test(MouseResultRelease())) {
            RemoveCapture();
            return mouseResult;
        }

        //
        // Call MouseMove
        //

        m_ppaneCapture->MouseMove(
            pprovider,
            point - Point::Cast(m_ppaneCapture->m_offset),
            true,
            m_ppaneHit != NULL
        );
    } else {
        //
        //
        // Which image are we over?
        //

        Pane* ppaneHit  = NULL;

        // !!! if (bInside || m_ppaneHit != NULL) {

        if (bInside) {
            TRef<Pane> ppane;

            for(ppane = m_pchild; ppane!= NULL; ppane = ppane->m_pnext) {
                MouseResult mouseResult =
                    ppane->HitTest(
                        pprovider,
                        point - Point::Cast(ppane->m_offset),
                        false
                    );

                if (mouseResult.Test(MouseResultHit())) {
                    // !!! some of the mdl files violate this
                    // ZAssert(ppaneHit == NULL);
                    if (ppaneHit == NULL) {
                        ppaneHit = ppane;
                    }
                }
            }
        }

        //
        // Call MouseMove, MouseEnter, or MouseLeave
        //

        if (m_ppaneHit != ppaneHit) {
            if (m_ppaneHit) {
                m_ppaneHit->MouseLeave(pprovider);
            }
            m_ppaneHit = ppaneHit;
            if (m_ppaneHit) {
                m_ppaneHit->MouseEnter(
                    pprovider,
                    point - Point::Cast(m_ppaneHit->m_offset)
                );
            }
        } else if (m_ppaneHit) {
            m_ppaneHit->MouseMove(
                pprovider,
                point - Point::Cast(m_ppaneHit->m_offset),
                false,
                true
            );
        }
    }

    if (bInside) {
        return MouseResultHit();
    } else {
        return MouseResult();
    }
}