0025748: Parallel version of progress indicator
[occt.git] / src / RWStl / RWStl_Reader.cxx
index 6921e24..e851471 100644 (file)
@@ -18,7 +18,7 @@
 #include <gp_XY.hxx>
 #include <Message.hxx>
 #include <Message_Messenger.hxx>
-#include <Message_ProgressSentry.hxx>
+#include <Message_ProgressScope.hxx>
 #include <NCollection_DataMap.hxx>
 #include <NCollection_IncAllocator.hxx>
 #include <FSD_BinaryFile.hxx>
@@ -129,7 +129,7 @@ namespace
 //==============================================================================
 
 Standard_Boolean RWStl_Reader::Read (const char* theFile,
-                                     const Handle(Message_ProgressIndicator)& theProgress)
+                                     const Message_ProgressRange& theProgress)
 {
   std::filebuf aBuf;
   OSD_OpenStream (aBuf, theFile, std::ios::in | std::ios::binary);
@@ -153,18 +153,24 @@ Standard_Boolean RWStl_Reader::Read (const char* theFile,
 
   Standard_ReadLineBuffer aBuffer (THE_BUFFER_SIZE);
 
+  // Note: here we are trying to handle rare but realistic case of
+  // STL files which are composed of several STL data blocks
+  // running translation in cycle.
+  // For this reason use infinite (logarithmic) progress scale,
+  // but in special mode so that the first cycle will take ~ 70% of it
+  Message_ProgressScope aPS (theProgress, NULL, 1, true);
   while (aStream.good())
   {
     if (isAscii)
     {
-      if (!ReadAscii (aStream, aBuffer, theEnd, theProgress))
+      if (!ReadAscii (aStream, aBuffer, theEnd, aPS.Next(2)))
       {
         break;
       }
     }
     else
     {
-      if (!ReadBinary (aStream, theProgress))
+      if (!ReadBinary (aStream, aPS.Next(2)))
       {
         break;
       }
@@ -275,7 +281,7 @@ static bool ReadVertex (const char* theStr, double& theX, double& theY, double&
 Standard_Boolean RWStl_Reader::ReadAscii (Standard_IStream& theStream,
                                           Standard_ReadLineBuffer& theBuffer,
                                           const std::streampos theUntilPos,
-                                          const Handle(Message_ProgressIndicator)& theProgress)
+                                          const Message_ProgressRange& theProgress)
 {
   // use method seekpos() to get true 64-bit offset to enable
   // handling of large files (VS 2010 64-bit)
@@ -299,15 +305,15 @@ Standard_Boolean RWStl_Reader::ReadAscii (Standard_IStream& theStream,
   // report progress every 1 MiB of read data
   const int aStepB = 1024 * 1024;
   const Standard_Integer aNbSteps = 1 + Standard_Integer((GETPOS(theUntilPos) - aStartPos) / aStepB);
-  Message_ProgressSentry aPSentry (theProgress, "Reading text STL file", 0, aNbSteps, 1);
+  Message_ProgressScope aPS (theProgress, "Reading text STL file", aNbSteps);
   int64_t aProgressPos = aStartPos + aStepB;
   int aNbLine = 1;
 
-  while (aPSentry.More())
+  while (aPS.More())
   {
     if (GETPOS(theStream.tellg()) > aProgressPos)
     {
-      aPSentry.Next();
+      aPS.Next();
       aProgressPos += aStepB;
     }
 
@@ -378,7 +384,7 @@ Standard_Boolean RWStl_Reader::ReadAscii (Standard_IStream& theStream,
     aNbLine += 2;
   }
 
-  return aPSentry.More();
+  return aPS.More();
 }
 
 //==============================================================================
@@ -387,7 +393,7 @@ Standard_Boolean RWStl_Reader::ReadAscii (Standard_IStream& theStream,
 //==============================================================================
 
 Standard_Boolean RWStl_Reader::ReadBinary (Standard_IStream& theStream,
-                                           const Handle(Message_ProgressIndicator)& theProgress)
+                                           const Message_ProgressRange& theProgress)
 {
 /*
   // the size of the file (minus the header size)
@@ -416,7 +422,7 @@ Standard_Boolean RWStl_Reader::ReadBinary (Standard_IStream& theStream,
 
   // don't trust the number of triangles which is coded in the file
   // sometimes it is wrong, and with this technique we don't need to swap endians for integer
-  Message_ProgressSentry  aPSentry (theProgress, "Reading binary STL file", 0, aNbFacets, 1);
+  Message_ProgressScope  aPS (theProgress, "Reading binary STL file", aNbFacets);
   Standard_Integer        aNbRead = 0;
 
   // allocate buffer for 80 triangles
@@ -428,8 +434,8 @@ Standard_Boolean RWStl_Reader::ReadBinary (Standard_IStream& theStream,
   const size_t aFaceDataLen = aVec3Size * 4 + 2;
   const char*  aBufferPtr   = aBuffer;
   Standard_Integer aNbFacesInBuffer = 0;
-  for (Standard_Integer aNbFacetRead = 0; aNbFacetRead < aNbFacets && aPSentry.More();
-       ++aNbFacetRead, ++aNbRead, --aNbFacesInBuffer, aBufferPtr += aFaceDataLen, aPSentry.Next())
+  for (Standard_Integer aNbFacetRead = 0; aNbFacetRead < aNbFacets && aPS.More();
+       ++aNbFacetRead, ++aNbRead, --aNbFacesInBuffer, aBufferPtr += aFaceDataLen, aPS.Next())
   {
     // read more data
     if (aNbFacesInBuffer <= 0)
@@ -460,5 +466,5 @@ Standard_Boolean RWStl_Reader::ReadBinary (Standard_IStream& theStream,
     }
   }
 
-  return true;
+  return aPS.More();
 }