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.
 
 
 
 
 
 

221 lines
6.0 KiB

#if !defined(CTRL__Interpolation_h__INCLUDED)
#define CTRL__Interpolation_h__INCLUDED
#pragma once
#if ENABLE_MSGTABLE_API
/***************************************************************************\
*****************************************************************************
*
* class DuInterpolation
*
*****************************************************************************
\***************************************************************************/
class DuInterpolation :
public InterpolationImpl<DuInterpolation, DUser::SGadget>
{
// Operations
public:
inline DuInterpolation()
{
m_cRef = 1;
}
dapi HRESULT ApiAddRef(Interpolation::AddRefMsg *)
{
m_cRef++;
return S_OK;
}
dapi HRESULT ApiRelease(Interpolation::ReleaseMsg *)
{
if (--m_cRef == 0) {
DeleteHandle(GetHandle());
}
return S_OK;
}
dapi HRESULT ApiCompute(Interpolation::ComputeMsg * pmsg)
{
pmsg->flResult = 0.0f;
return S_OK;
}
// Data
protected:
ULONG m_cRef;
};
/***************************************************************************\
*****************************************************************************
*
* class DuLinearInterpolation
*
*****************************************************************************
\***************************************************************************/
class DuLinearInterpolation :
public LinearInterpolationImpl<DuLinearInterpolation, DuInterpolation>
{
// Operations
public:
dapi HRESULT ApiCompute(Interpolation::ComputeMsg * pmsg)
{
pmsg->flResult = (1.0f - pmsg->flProgress) * pmsg->flStart + pmsg->flProgress * pmsg->flEnd;
return S_OK;
}
};
/***************************************************************************\
*****************************************************************************
*
* class DuLogInterpolation
*
*****************************************************************************
\***************************************************************************/
class DuLogInterpolation :
public LogInterpolationImpl<DuLogInterpolation, DuInterpolation>
{
// Operations
public:
inline DuLogInterpolation()
{
m_flScale = 1.0f;
}
dapi HRESULT ApiCompute(Interpolation::ComputeMsg * pmsg)
{
float flMax = (float) log10(m_flScale * 9.0f + 1.0f);
float flT = (float) log10(pmsg->flProgress * m_flScale * 9.0f + 1.0f) / flMax;
pmsg->flResult = (1.0f - flT) * pmsg->flStart + flT * pmsg->flEnd;
return S_OK;
}
dapi HRESULT ApiSetScale(LogInterpolation::SetScaleMsg * pmsg)
{
m_flScale = pmsg->flScale;
return S_OK;
}
// Data
protected:
float m_flScale;
};
/***************************************************************************\
*****************************************************************************
*
* class DuExpInterpolation
*
*****************************************************************************
\***************************************************************************/
class DuExpInterpolation :
public ExpInterpolationImpl<DuExpInterpolation, DuInterpolation>
{
// Operations
public:
inline DuExpInterpolation()
{
m_flScale = 1.0f;
}
dapi HRESULT ApiCompute(Interpolation::ComputeMsg * pmsg)
{
double dflProgress = pmsg->flProgress;
double dflStart = pmsg->flStart;
double dflEnd = pmsg->flEnd;
double dflScale = m_flScale;
double dflMax = (((10.0 * dflScale) - 1.0) / 9.0);
double dflT = (((pow(10.0 * dflScale, dflProgress) - 1.0) / 9.0) / dflMax);
pmsg->flResult = (float) ((1.0 - dflT) * dflStart + dflT * dflEnd);
return S_OK;
}
dapi HRESULT ApiSetScale(ExpInterpolation::SetScaleMsg * pmsg)
{
m_flScale = pmsg->flScale;
return S_OK;
}
// Data
protected:
float m_flScale;
};
/***************************************************************************\
*****************************************************************************
*
* class DuSCurveInterpolation
*
*****************************************************************************
\***************************************************************************/
class DuSCurveInterpolation :
public SCurveInterpolationImpl<DuSCurveInterpolation, DuInterpolation>
{
// Operations
public:
inline DuSCurveInterpolation()
{
m_flScale = 1.0f;
}
dapi HRESULT ApiCompute(Interpolation::ComputeMsg * pmsg)
{
//
// Slow - fast - slow
//
double dflProgress = pmsg->flProgress;
double dflStart = pmsg->flStart;
double dflEnd = pmsg->flEnd;
double dflScale = m_flScale;
double dflMax;
double dflT;
if (dflProgress < 0.5) {
double dflPartProgress = dflProgress * 2.0;
dflMax = (((10.0 * dflScale) - 1.0) / 9.0) * 2.0;
dflT = ((pow(10.0 * dflScale, dflPartProgress) - 1.0) / 9.0) / dflMax;
} else {
double dflPartProgress = (1.0 - dflProgress) * 2.0;
dflMax = (((10.0 * dflScale) - 1.0) / 9.0) * 2.0;
dflT = 1.0 - ((pow(10.0 * dflScale, dflPartProgress) - 1.0) / 9.0) / dflMax;
}
pmsg->flResult = (float) ((1.0 - dflT) * dflStart + dflT * dflEnd);
return S_OK;
}
dapi HRESULT ApiSetScale(SCurveInterpolation::SetScaleMsg * pmsg)
{
m_flScale = pmsg->flScale;
return S_OK;
}
// Data
protected:
float m_flScale;
};
#endif // ENABLE_MSGTABLE_API
#endif // CTRL__Interpolation_h__INCLUDED