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; }
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; }
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(); } }