From e39e9de7b4dccf2f140d04c6ea1d893640153fde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Wed, 16 Apr 2014 19:49:04 +0300 Subject: [PATCH] Fixed|libdeng2|Time: Deserializing a Time instance IssueID #1748 --- .../include/de/core/highperformancetimer.h | 5 +++++ .../libdeng2/src/core/highperformancetimer.cpp | 7 +++++++ doomsday/libdeng2/src/data/time.cpp | 16 ++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/doomsday/libdeng2/include/de/core/highperformancetimer.h b/doomsday/libdeng2/include/de/core/highperformancetimer.h index da77168fdf..af33c01dae 100644 --- a/doomsday/libdeng2/include/de/core/highperformancetimer.h +++ b/doomsday/libdeng2/include/de/core/highperformancetimer.h @@ -37,6 +37,11 @@ class DENG2_PUBLIC HighPerformanceTimer */ TimeDelta elapsed() const; + /** + * Returns the time when the timer was started. + */ + Time startedAt() const; + private: DENG2_PRIVATE(d) }; diff --git a/doomsday/libdeng2/src/core/highperformancetimer.cpp b/doomsday/libdeng2/src/core/highperformancetimer.cpp index 63fd0132a1..0e6bc76a03 100644 --- a/doomsday/libdeng2/src/core/highperformancetimer.cpp +++ b/doomsday/libdeng2/src/core/highperformancetimer.cpp @@ -28,11 +28,13 @@ static duint32 const WARP_INTERVAL = 12 * 60 * 60 * 1000; DENG2_PIMPL_NOREF(HighPerformanceTimer), public Lockable { + QDateTime origin; QTime startedAt; duint64 timerOffset; /// Range extension. QTime only provides a 24h range. Instance() : timerOffset(0) { + origin = QDateTime::currentDateTime(); startedAt.start(); } @@ -62,4 +64,9 @@ TimeDelta HighPerformanceTimer::elapsed() const return TimeDelta(d->milliSeconds() / 1000.0); } +Time HighPerformanceTimer::startedAt() const +{ + return d->origin; +} + } // namespace de diff --git a/doomsday/libdeng2/src/data/time.cpp b/doomsday/libdeng2/src/data/time.cpp index a899d7765b..50cf93f7b0 100644 --- a/doomsday/libdeng2/src/data/time.cpp +++ b/doomsday/libdeng2/src/data/time.cpp @@ -452,6 +452,22 @@ void Time::operator << (Reader &from) from >> d->highPerfElapsed; } + + if((flags & HAS_DATETIME) && (flags & HAS_HIGH_PERF)) + { + // If both are present, the high-performance time should be synced + // with current high-perf timer. + if(d->dateTime < highPerfTimer.startedAt().asDateTime()) + { + // Current high-performance timer was started after this time; + // we can't represent the time as high performance delta. + d->flags &= ~Instance::HighPerformance; + } + else + { + d->highPerfElapsed = highPerfTimer.startedAt().deltaTo(d->dateTime); + } + } } else {