Replace obsolete/broken lcoregtklaz with new lcorelazarus
[lcore.git] / btime.pas
index 14b734e6e4c6344a742a353de42b26dca961a150..8218e6415a97bf63f25a278f6c75ceb0ad95280c 100644 (file)
--- a/btime.pas
+++ b/btime.pas
@@ -9,7 +9,9 @@ works on windows/delphi, and on freepascal on unix.
 \r
 \r
 unit btime;\r
-\r
+{$ifdef fpc}\r
+  {$mode delphi}\r
+{$endif}\r
 interface\r
 \r
 {$ifdef mswindows}\r
@@ -105,9 +107,7 @@ var
 \r
 implementation\r
 \r
-{$ifdef fpc}\r
-  {$mode delphi}\r
-{$endif}\r
+\r
 \r
 uses\r
   {$ifdef UNIX}\r
@@ -138,7 +138,7 @@ end;
 \r
 function oletounix(t:tdatetime):tunixtimeint;\r
 begin\r
-  result := trunc(oletounixfloat(t));\r
+  result := round(oletounixfloat(t));\r
 end;\r
 \r
 function unixtoole(i:float):tdatetime;\r
@@ -553,12 +553,51 @@ begin
   result := mmqpctimefloat;\r
 end;\r
 \r
+\r
+\r
+var\r
+  GetSystemTimePreciseAsFileTime:procedure(var v:tfiletime); stdcall;\r
+  win8inited:boolean;\r
+\r
+procedure initwin8;\r
+var\r
+  dllhandle:thandle;\r
+\r
+begin\r
+  win8inited := true;\r
+  dllhandle := loadlibrary('kernel32.dll');\r
+  if (dllhandle <> 0) then begin\r
+    GetSystemTimePreciseAsFileTime := getprocaddress(dllhandle,'GetSystemTimePreciseAsFileTime');\r
+  end;\r
+end;\r
+\r
+\r
+function unixtimefloat_win8:float;\r
+var\r
+  ft:tfiletime;\r
+  i:int64 absolute ft;\r
+begin\r
+  GetSystemTimePreciseAsFileTime(ft);\r
+  {change from windows 1601-01-01 to unix 1970-01-01.\r
+  use integer math for this, to preserve precision}\r
+  dec(i, 116444736000000000);\r
+  result := (i / 10000000);\r
+end;\r
+\r
+\r
+\r
 function unixtimefloat:float;\r
 const\r
   margin = 0.0012;\r
 var\r
   f,g,h:float;\r
 begin\r
+  if not win8inited then initwin8;\r
+  if assigned(@GetSystemTimePreciseAsFileTime) then begin\r
+    result := unixtimefloat_win8;\r
+    exit;\r
+  end;\r
+\r
   result := monotimefloat+timefloatbias;\r
   f := result-unixtimefloat_systemtime;\r
   if ((f > ticks_freq2+margin) or (f < -margin)) or (timefloatbias = 0) then begin\r