Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

137 lines
3.9 KiB

#include "stdafx.h"
#include "Motion.h"
#include "Context.h"
#include "Action.h"
/***************************************************************************\
*****************************************************************************
*
* class MotionSC
*
*****************************************************************************
\***************************************************************************/
IMPLEMENT_SUBCONTEXT(Context::slMotion, MotionSC);
//------------------------------------------------------------------------------
MotionSC::~MotionSC()
{
//
// NOTE: The Context (and its SubContexts) can be destroyed on a different
// thread during destruction. It is advisable to allocate any dangling data
// on the Process heap so that it can be safely destroyed at this time.
//
for (UINT idx = 0; idx < SC_MAXCOLORS; idx++) {
if (m_rghbrStd[idx] != NULL) {
DeleteObject(m_rghbrStd[idx]);
}
if (m_rghpenStd[idx] != NULL) {
DeleteObject(m_rghpenStd[idx]);
}
if (m_rgpgpbrStd[idx] != NULL) {
delete m_rgpgpbrStd[idx];
}
if (m_rgpgppenStd[idx] != NULL) {
delete m_rgpgppenStd[idx];
}
}
}
/***************************************************************************\
*
* MotionSC::OnIdle
*
* OnIdle() gives this SubContext an opportunity to perform any idle-time
* processing. This is time when there are no more messages to process.
*
\***************************************************************************/
DWORD
MotionSC::xwOnIdleNL()
{
int nDelta;
DWORD dwDelay, dwCurTick;
dwCurTick = ::GetTickCount();
nDelta = ComputeTickDelta(dwCurTick, m_dwLastTimeslice + m_dwPauseTimeslice);
if (nDelta >= 0) {
//
// The timeslice is up again, so let the Scheduler process the Actions.
//
dwDelay = m_sch.xwProcessActionsNL();
m_dwLastTimeslice = dwCurTick;
} else {
dwDelay = (DWORD) (-nDelta);
}
return dwDelay;
}
/***************************************************************************\
*
* MotionSC::xwPreDestroyNL
*
* xwPreDestroyNL() gives this SubContext an opportunity to perform any cleanup
* while the Context is still valid. Any operations that involve callbacks
* MUST be done at this time.
*
\***************************************************************************/
void
MotionSC::xwPreDestroyNL()
{
//
// When we callback to allow the SubContext's to destroy, we need to
// grab a ContextLock so that we can defer messages. When we leave
// this scope, all of these messages will be triggered. This needs
// to occur BEFORE the Context continues getting blown away.
//
ContextLock cl;
Verify(cl.LockNL(ContextLock::edDefer, m_pParent));
m_sch.xwPreDestroy();
}
//------------------------------------------------------------------------------
Gdiplus::Brush *
MotionSC::GetBrushF(UINT idxBrush) const
{
AssertMsg(idxBrush <= SC_MAXCOLORS, "Ensure valid color");
if (m_rgpgpbrStd[idxBrush] == NULL) {
if (!ResourceManager::IsInitGdiPlus()) {
return NULL;
}
m_rgpgpbrStd[idxBrush] = new Gdiplus::SolidBrush(GdGetColorInfo(idxBrush)->GetColorF());
}
return m_rgpgpbrStd[idxBrush];
}
//------------------------------------------------------------------------------
Gdiplus::Pen *
MotionSC::GetPenF(UINT idxPen) const
{
AssertMsg(idxPen <= SC_MAXCOLORS, "Ensure valid color");
if (m_rgpgppenStd[idxPen] == NULL) {
if (!ResourceManager::IsInitGdiPlus()) {
return NULL;
}
m_rgpgppenStd[idxPen] = new Gdiplus::Pen(GdGetColorInfo(idxPen)->GetColorF());
}
return m_rgpgppenStd[idxPen];
}