From 1f1556998546e7cfe3b38fab00a70a948c35bcc0 Mon Sep 17 00:00:00 2001 From: nyamatongwe Date: Thu, 15 Nov 2001 00:50:13 +0000 Subject: Added ElapsedTime. --- gtk/PlatGTK.cxx | 40 ++++++++++++++++++++++++++++++++++++++++ win32/PlatWin.cxx | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index 34a33f581..7ecd1cbee 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -886,6 +886,46 @@ void Menu::Show(Point pt, Window &) { gtk_item_factory_popup(reinterpret_cast(id), pt.x - 4, pt.y, 3, 0); } +static double DoublePack(glong a, glong b) { + double d; + long *lp = reinterpret_cast(&d); + lp[0] = a; + lp[1] = b; + return d; +} + +static void DoubleUnpack(double d, glong &a, glong &b) { + long *lp = reinterpret_cast(&d); + a = lp[0]; + b = lp[1]; +} + +static double Now() { + GTimeVal curTime; + g_get_current_time(&curTime); + return DoublePack(curTime.tv_sec, curTime.tv_usec); +} + +ElapsedTime::ElapsedTime() { + beginTime = Now(); +} + +double ElapsedTime::Duration(bool reset) { + double endTime = Now(); + GTimeVal tvStart; + DoubleUnpack(beginTime, tvStart.tv_sec, tvStart.tv_usec); + GTimeVal tvEnd; + DoubleUnpack(endTime, tvEnd.tv_sec, tvEnd.tv_usec); + double result = tvEnd.tv_sec - tvStart.tv_sec; + result *= 1000000; + result += tvEnd.tv_usec - tvStart.tv_usec; + result /= 1000000; + if (reset) { + beginTime = endTime; + } + return result; +} + ColourDesired Platform::Chrome() { return ColourDesired(0xe0, 0xe0, 0xe0); } diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 666c962cf..d227aa7a1 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -10,6 +10,7 @@ #include #include #include +#include #define _WIN32_WINNT 0x0400 #include @@ -872,6 +873,46 @@ void Menu::Show(Point pt, Window &w) { Destroy(); } +static bool initialisedET = false; +static bool usePerformanceCounter = false; +static LARGE_INTEGER frequency; + +static double Now() { + if (usePerformanceCounter) { + LARGE_INTEGER timeVal; + ::QueryPerformanceCounter(&timeVal); + return *(reinterpret_cast(&timeVal)); + } else { + return clock(); + } +} + +ElapsedTime::ElapsedTime() { + if (!initialisedET) { + usePerformanceCounter = ::QueryPerformanceFrequency(&frequency); + initialisedET = true; + } + beginTime = Now(); +} + +double ElapsedTime::Duration(bool reset) { + double endTime = Now(); + double result; + if (usePerformanceCounter) { + LARGE_INTEGER lBegin = *(reinterpret_cast(&beginTime)); + LARGE_INTEGER lEnd = *(reinterpret_cast(&endTime)); + double elapsed = lEnd.QuadPart - lBegin.QuadPart; + result = elapsed / static_cast(frequency.QuadPart); + } else { + double elapsed = endTime - beginTime; + result = elapsed / CLOCKS_PER_SEC; + } + if (reset) { + beginTime = endTime; + } + return result; +} + ColourDesired Platform::Chrome() { return ::GetSysColor(COLOR_3DFACE); } -- cgit v1.2.3