diff options
author | Strangerke | 2015-12-12 19:38:00 +0100 |
---|---|---|
committer | Willem Jan Palenstijn | 2015-12-23 21:34:01 +0100 |
commit | 7bb45a8eaaf663cca9d0765d84b38967c3cc3275 (patch) | |
tree | e044d20af588b81a96776004bfc3bbb037086ed0 /engines/lab/utils.cpp | |
parent | 0c0b2da235bfbbc3a11ef9677137d5a77f5b35a2 (diff) | |
download | scummvm-rg350-7bb45a8eaaf663cca9d0765d84b38967c3cc3275.tar.gz scummvm-rg350-7bb45a8eaaf663cca9d0765d84b38967c3cc3275.tar.bz2 scummvm-rg350-7bb45a8eaaf663cca9d0765d84b38967c3cc3275.zip |
LAB: Move timing functions to the utility class
Diffstat (limited to 'engines/lab/utils.cpp')
-rw-r--r-- | engines/lab/utils.cpp | 93 |
1 files changed, 92 insertions, 1 deletions
diff --git a/engines/lab/utils.cpp b/engines/lab/utils.cpp index f9a6656174..1ac083790e 100644 --- a/engines/lab/utils.cpp +++ b/engines/lab/utils.cpp @@ -433,7 +433,7 @@ void Utils::setBytesPerRow(int num) { uint16 Utils::getRandom(uint16 max) { uint32 secs, micros; - _vm->getTime(&secs, µs); + getTime(&secs, µs); return ((micros + secs) % max); } @@ -442,4 +442,95 @@ void Utils::readBlock(void *Buffer, uint32 Size, byte **File) { (*File) += Size; } +/** + * Waits for for Secs seconds and Micros microseconds to pass. + */ +void Utils::microDelay(uint32 secs, uint32 micros) { + uint32 waitSecs, waitMicros; + addCurTime(secs, micros, &waitSecs, &waitMicros); + + while (1) { + getTime(&secs, µs); + + if ((secs > waitSecs) || ((secs == waitSecs) && (micros >= waitMicros))) + return; + + g_system->delayMillis(10); + } +} + +/** + * Gets the current system time. + */ +void Utils::getTime(uint32 *secs, uint32 *micros) { + uint32 t = g_system->getMillis(); + + *secs = t / 1000; + *micros = t % 1000; +} + +/** + * Adds seconds and microseconds to current time to get a new time. + */ +void Utils::addCurTime(uint32 sec, uint32 micros, uint32 *timeSec, uint32 *timeMicros) { + getTime(timeSec, timeMicros); + + (*timeSec) += sec; + (*timeMicros) += micros; + + if (*timeMicros >= ONESECOND) { + (*timeSec)++; + (*timeMicros) -= ONESECOND; + } +} + +/** + * Finds the difference between time1 and time2. If time1 is later than + * time2, returns 0. + */ +void Utils::anyTimeDiff(uint32 sec1, uint32 micros1, uint32 sec2, uint32 micros2, uint32 *diffSecs, uint32 *diffMicros) { + *diffSecs = 0; + *diffMicros = 0; + + if (sec1 > sec2) + return; + else if ((sec1 == sec2) && (micros1 >= micros2)) + return; + + if (micros1 > micros2) { + *diffSecs = sec2 - sec1 - 1; + *diffMicros = (ONESECOND - micros1) + micros2; + } else { + *diffSecs = sec2 - sec1; + *diffMicros = micros2 - micros1; + } +} + +/** + * Finds the difference between the current time, and a future time. Returns + * 0 if the future time is actually before the current time. + */ +void Utils::timeDiff(uint32 sec, uint32 micros, uint32 *diffSec, uint32 *diffMicros) { + uint32 curSec, curMicros; + getTime(&curSec, &curMicros); + anyTimeDiff(curSec, curMicros, sec, micros, diffSec, diffMicros); +} + +/** + * Waits for a specified time to occur. + */ +void Utils::waitForTime(uint32 sec, uint32 micros) { + uint32 curSec, curMicros; + getTime(&curSec, &curMicros); + + if (curSec > sec) + return; + else if ((curSec == sec) && (curMicros >= micros)) + return; + + if (curMicros > micros) + microDelay(sec - curSec - 1, (ONESECOND - curMicros) + micros - 1); + else + microDelay(sec - curSec, micros - curMicros - 1); +} } // End of namespace Lab |