0032463: Visualization - implement Image_AlienPixMap::Load() via emscripten_get_prelo...
authorkgv <kgv@opencascade.com>
Sun, 27 Jun 2021 14:32:27 +0000 (17:32 +0300)
committerkgv <kgv@opencascade.com>
Sun, 27 Jun 2021 14:32:27 +0000 (17:32 +0300)
samples/webgl/CMakeLists.txt
samples/webgl/WasmOcctPixMap.cpp [deleted file]
samples/webgl/WasmOcctPixMap.h [deleted file]
samples/webgl/WasmOcctView.cpp
src/Image/Image_AlienPixMap.cxx

index be2e464..6243aca 100644 (file)
@@ -35,11 +35,9 @@ file(GLOB SOURCES
   *.cpp
 )
 source_group ("Headers" FILES
-  WasmOcctView.h
-  WasmOcctPixMap.h)
+  WasmOcctView.h)
 source_group ("Sources" FILES
   WasmOcctView.cpp
-  WasmOcctPixMap.cpp
   main.cpp)
 
 # FreeType
diff --git a/samples/webgl/WasmOcctPixMap.cpp b/samples/webgl/WasmOcctPixMap.cpp
deleted file mode 100644 (file)
index 7a39a26..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2021 OPEN CASCADE SAS
-//
-// This file is part of the examples of the Open CASCADE Technology software library.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
-
-#include "WasmOcctPixMap.h"
-
-#include <Message.hxx>
-
-#include <emscripten.h>
-
-// ================================================================
-// Function : WasmOcctPixMap
-// Purpose  :
-// ================================================================
-WasmOcctPixMap::WasmOcctPixMap()
-: myRawDataPtr (nullptr) {}
-
-// ================================================================
-// Function : ~WasmOcctPixMap
-// Purpose  :
-// ================================================================
-WasmOcctPixMap::~WasmOcctPixMap()
-{
-  Clear();
-}
-
-// ================================================================
-// Function : Clear
-// Purpose  :
-// ================================================================
-void WasmOcctPixMap::Clear()
-{
-  if (myRawDataPtr != nullptr) { free (myRawDataPtr); }
-  myRawDataPtr = nullptr;
-  Image_PixMap::Clear();
-}
-
-// ================================================================
-// Function : Init
-// Purpose  :
-// ================================================================
-bool WasmOcctPixMap::Init (const char* theFilePath)
-{
-  Clear();
-  int aSizeX = 0, aSizeY = 0;
-  char* anImgData = emscripten_get_preloaded_image_data (theFilePath, &aSizeX, &aSizeY);
-  if (anImgData == nullptr)
-  {
-    Message::DefaultMessenger()->Send (TCollection_AsciiString("Error: invalid image ") + theFilePath, Message_Fail);
-    return false;
-  }
-
-  Message::DefaultMessenger()->Send (TCollection_AsciiString("Loaded image ") + theFilePath + "@" + aSizeX + "x" + aSizeY, Message_Info);
-  InitWrapper (Image_Format_RGBA, (Standard_Byte* )anImgData, aSizeX, aSizeY);
-  SetTopDown (true);
-  myRawDataPtr = anImgData;
-  return true;
-}
diff --git a/samples/webgl/WasmOcctPixMap.h b/samples/webgl/WasmOcctPixMap.h
deleted file mode 100644 (file)
index 6cd0faa..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 2021 OPEN CASCADE SAS
-//
-// This file is part of the examples of the Open CASCADE Technology software library.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
-
-#ifndef _WasmOcctPixMap_HeaderFile
-#define _WasmOcctPixMap_HeaderFile
-
-#include <Image_PixMap.hxx>
-
-//! Image pixmap loading image using Emscripten.
-class WasmOcctPixMap : public Image_PixMap
-{
-public:
-  //! Empty constructor.
-  WasmOcctPixMap();
-
-  //! Destructor.
-  virtual ~WasmOcctPixMap();
-
-  //! Load RGBA pixmap using emscripten_get_preloaded_image_data() from the given path.
-  bool Init (const char* theFilePath);
-
-  //! Release memory.
-  virtual void Clear() override;
-
-private:
-  char* myRawDataPtr;
-};
-
-#endif // _WasmOcctPixMap_HeaderFile
index 057bf08..1054046 100644 (file)
 
 #include "WasmOcctView.h"
 
-#include "WasmOcctPixMap.h"
-
 #include <AIS_Shape.hxx>
 #include <AIS_ViewCube.hxx>
 #include <Aspect_Handle.hxx>
 #include <Aspect_DisplayConnection.hxx>
+#include <Image_AlienPixMap.hxx>
 #include <Message.hxx>
 #include <Message_Messenger.hxx>
 #include <Graphic3d_CubeMapPacked.hxx>
@@ -82,8 +81,8 @@ namespace
     static void onImageRead (const char* theFilePath)
     {
       Handle(Graphic3d_CubeMapPacked) aCubemap;
-      Handle(WasmOcctPixMap) anImage = new WasmOcctPixMap();
-      if (anImage->Init (theFilePath))
+      Handle(Image_AlienPixMap) anImage = new Image_AlienPixMap();
+      if (anImage->Load (theFilePath))
       {
         aCubemap = new Graphic3d_CubeMapPacked (anImage);
       }
index 291938d..fafaf56 100644 (file)
@@ -35,6 +35,8 @@
   #ifdef _MSC_VER
     #pragma comment(lib, "Ole32.lib")
   #endif
+#elif defined(__EMSCRIPTEN__)
+  #include <emscripten/emscripten.h>
 #endif
 
 #include <Image_AlienPixMap.hxx>
@@ -494,6 +496,12 @@ void Image_AlienPixMap::Clear()
     FreeImage_Unload (myLibImage);
     myLibImage = NULL;
   }
+#elif defined(__EMSCRIPTEN__)
+  if (myLibImage != NULL)
+  {
+    free ((void* )myLibImage);
+    myLibImage = NULL;
+  }
 #endif
 }
 
@@ -798,6 +806,39 @@ bool Image_AlienPixMap::Load (std::istream& theStream,
 
   return Load (&aBuff.ChangeFirst(), aBuff.Size(), theFilePath);
 }
+#elif defined(__EMSCRIPTEN__)
+bool Image_AlienPixMap::Load (std::istream& ,
+                              const TCollection_AsciiString& )
+{
+  Clear();
+  Message::SendFail ("Error: no image library available for decoding stream");
+  return false;
+}
+bool Image_AlienPixMap::Load (const Standard_Byte* theData,
+                              Standard_Size theLength,
+                              const TCollection_AsciiString& theImagePath)
+{
+  Clear();
+  if (theData != NULL)
+  {
+    (void )theLength;
+    Message::SendFail ("Error: no image library available for decoding in-memory buffer");
+    return false;
+  }
+
+  int aSizeX = 0, aSizeY = 0;
+  char* anImgData = emscripten_get_preloaded_image_data (theImagePath.ToCString(), &aSizeX, &aSizeY);
+  if (anImgData == NULL)
+  {
+    Message::SendFail() << "Error: image '" << theImagePath << "' is not preloaded";
+    return false;
+  }
+
+  Image_PixMap::InitWrapper (Image_Format_RGBA, (Standard_Byte* )anImgData, aSizeX, aSizeY);
+  SetTopDown (true);
+  myLibImage = (FIBITMAP* )anImgData;
+  return true;
+}
 #else
 bool Image_AlienPixMap::Load (std::istream& ,
                               const TCollection_AsciiString& )