DeltaControl::DeltaControl() {
static deltacontrol d = {0,0,0,0};
m_Major = d;
m_Minor = d;
m_ErrorTerm = 0;
}
void DeltaControl::SetFrom(int Major, int Minor) {
m_Major.current = Major;
m_Minor.current = Minor;
}
void DeltaControl::SetTo(int Major, int Minor) {
SetTo(Major, &m_Major);
SetTo(Minor, &m_Minor);
m_ErrorTerm = m_Major.len / 2;
m_MinorLast = TRUE;
}
BOOL DeltaControl::Next() {
if (m_MinorLast) m_MinorLast = FALSE;
else {
m_ErrorTerm += m_Minor.len;
if (m_ErrorTerm > m_Major.len && m_Minor.togo) {
m_Minor.current += m_Minor.delta;
OnMinorChange(m_Minor.current);
m_ErrorTerm -= m_Major.len;
m_Minor.togo--;
m_MinorLast = TRUE;
return TRUE;
}
}
if (!m_Major.togo) return FALSE;
m_Major.current += m_Major.delta;
m_Major.togo--;
OnMajorChange(m_Major.current);
return TRUE;
}
void DeltaControl::SetTo(int In, deltacontrol *Out) {
int i = In - Out->current;
Out->delta = (i < 0) ? -1 : 1;
Out->togo = Out->len = abs(i);
}
End of Listing