void RGBMatrix::insertStartValues(FadeChannel& fc, uint fadeTime) const { Q_ASSERT(m_fader != NULL); // To create a nice and smooth fade, get the starting value from // m_fader's existing FadeChannel (if any). Otherwise just assume // we're starting from zero. QHash <FadeChannel,FadeChannel>::const_iterator oldChannelIterator = m_fader->channels().find(fc); if (oldChannelIterator != m_fader->channels().end()) { FadeChannel old = oldChannelIterator.value(); fc.setCurrent(old.current()); if (fc.target() == old.target()) { fc.setStart(old.start()); fc.setElapsed(old.elapsed()); } else fc.setStart(old.current()); } else { fc.setCurrent(0); fc.setStart(0); } // The channel is not ready yet fc.setReady(false); // Fade in speed is used for all non-zero targets if (fc.target() == 0) fc.setFadeTime(fadeOutSpeed()); else fc.setFadeTime(fadeTime); }
void FadeChannel_Test::nextStep() { FadeChannel fc; fc.setStart(0); fc.setTarget(250); fc.setFadeTime(1000); for (int i = 5; i < 250; i += 5) { int value = fc.nextStep(MasterTimer::tick()); QCOMPARE(value, i); } fc.setCurrent(0); fc.setReady(false); fc.setFadeTime(0); fc.setElapsed(0); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(250)); fc.setCurrent(0); fc.setReady(false); fc.setFadeTime(MasterTimer::tick() / 5); fc.setElapsed(0); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(250)); fc.setCurrent(0); fc.setReady(false); fc.setFadeTime(1 * MasterTimer::tick()); fc.setElapsed(0); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(250)); fc.setCurrent(0); fc.setReady(false); fc.setFadeTime(2 * MasterTimer::tick()); fc.setElapsed(0); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(125)); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(250)); fc.setCurrent(0); fc.setReady(false); fc.setFadeTime(5 * MasterTimer::tick()); fc.setElapsed(0); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(50)); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(100)); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(150)); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(200)); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(250)); // Maximum elapsed() reached fc.setCurrent(0); fc.setTarget(255); fc.setReady(false); fc.setElapsed(UINT_MAX); fc.setFadeTime(5 * MasterTimer::tick()); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(255)); QCOMPARE(fc.elapsed(), UINT_MAX); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(255)); QCOMPARE(fc.elapsed(), UINT_MAX); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(255)); QCOMPARE(fc.elapsed(), UINT_MAX); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(255)); QCOMPARE(fc.elapsed(), UINT_MAX); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(255)); QCOMPARE(fc.elapsed(), UINT_MAX); // Channel marked as ready fc.setReady(true); fc.setElapsed(0); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(255)); QCOMPARE(fc.elapsed(), MasterTimer::tick() * 1); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(255)); QCOMPARE(fc.elapsed(), MasterTimer::tick() * 2); QCOMPARE(fc.nextStep(MasterTimer::tick()), uchar(255)); QCOMPARE(fc.elapsed(), MasterTimer::tick() * 3); }