From 059fc9ebfd86df9a687a601a325405000b8bea77 Mon Sep 17 00:00:00 2001
From: Benau <Benau@users.noreply.github.com>
Date: Mon, 18 Apr 2022 10:46:23 +0800
Subject: [PATCH] Add GE::getResizedImage using IReadFile

---
 lib/graphics_engine/include/ge_texture.hpp      |  4 ++++
 .../include/ge_vulkan_driver.hpp                |  1 -
 lib/graphics_engine/src/ge_texture.cpp          | 17 ++++++++++++++++-
 lib/irrlicht/include/IVideoDriver.h             |  2 ++
 lib/irrlicht/source/Irrlicht/CNullDriver.h      |  1 +
 5 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/lib/graphics_engine/include/ge_texture.hpp b/lib/graphics_engine/include/ge_texture.hpp
index 8a5e51aa2..518ebf5f7 100644
--- a/lib/graphics_engine/include/ge_texture.hpp
+++ b/lib/graphics_engine/include/ge_texture.hpp
@@ -5,6 +5,7 @@
 #include <string>
 #include <ITexture.h>
 #include <IImage.h>
+#include <IReadFile.h>
 
 namespace GE
 {
@@ -15,6 +16,9 @@ irr::video::ITexture* createTexture(irr::video::IImage* img,
 irr::video::IImage* getResizedImage(const std::string& path,
                            const irr::core::dimension2d<irr::u32>& max_size,
                            irr::core::dimension2d<irr::u32>* orig_size = NULL);
+irr::video::IImage* getResizedImage(irr::io::IReadFile* file,
+                           const irr::core::dimension2d<irr::u32>& max_size,
+                           irr::core::dimension2d<irr::u32>* orig_size = NULL);
 irr::video::ITexture* createTexture(const std::string& path,
     std::function<void(irr::video::IImage*)> image_mani = nullptr);
 };   // GE
diff --git a/lib/graphics_engine/include/ge_vulkan_driver.hpp b/lib/graphics_engine/include/ge_vulkan_driver.hpp
index 43add979c..5cbbb5ab2 100644
--- a/lib/graphics_engine/include/ge_vulkan_driver.hpp
+++ b/lib/graphics_engine/include/ge_vulkan_driver.hpp
@@ -291,7 +291,6 @@ namespace GE
                                                           { return m_features; }
         const VkPhysicalDeviceProperties& getPhysicalDeviceProperties() const
                                                         { return m_properties; }
-        io::IFileSystem* getFileSystem() const            { return FileSystem; }
         VkExtent2D getSwapChainExtent() const    { return m_swap_chain_extent; }
         size_t getSwapChainImagesCount() const
                                       { return m_vk->swap_chain_images.size(); }
diff --git a/lib/graphics_engine/src/ge_texture.cpp b/lib/graphics_engine/src/ge_texture.cpp
index f5c5ae301..5f7fd2990 100644
--- a/lib/graphics_engine/src/ge_texture.cpp
+++ b/lib/graphics_engine/src/ge_texture.cpp
@@ -4,6 +4,7 @@
 #include "ge_vulkan_texture.hpp"
 #include "ge_texture.hpp"
 
+#include <IFileSystem.h>
 #include <IVideoDriver.h>
 
 namespace GE
@@ -13,7 +14,21 @@ video::IImage* getResizedImage(const std::string& path,
                                const core::dimension2du& max_size,
                                core::dimension2d<u32>* orig_size)
 {
-    video::IImage* image = getDriver()->createImageFromFile(path.c_str());
+    io::IReadFile* file =
+        getDriver()->getFileSystem()->createAndOpenFile(path.c_str());
+    if (file == NULL)
+        return NULL;
+    video::IImage* image = getResizedImage(file, max_size, orig_size);
+    file->drop();
+    return image;
+}   // getResizedImage
+
+// ----------------------------------------------------------------------------
+video::IImage* getResizedImage(irr::io::IReadFile* file,
+                               const core::dimension2du& max_size,
+                               core::dimension2d<u32>* orig_size)
+{
+    video::IImage* image = getDriver()->createImageFromFile(file);
     if (image == NULL)
         return NULL;
     if (orig_size)
diff --git a/lib/irrlicht/include/IVideoDriver.h b/lib/irrlicht/include/IVideoDriver.h
index 2f23505df..f79be0010 100644
--- a/lib/irrlicht/include/IVideoDriver.h
+++ b/lib/irrlicht/include/IVideoDriver.h
@@ -25,6 +25,7 @@ namespace irr
 namespace io
 {
 	class IAttributes;
+	class IFileSystem;
 	struct SAttributeReadWriteOptions;
 	class IReadFile;
 	class IWriteFile;
@@ -1483,6 +1484,7 @@ namespace video
 		virtual void disableScissorTest() {}
 		virtual void pauseRendering() {}
 		virtual void unpauseRendering() {}
+		virtual io::IFileSystem* getFileSystem() const = 0;
 	};
 
 } // end namespace video
diff --git a/lib/irrlicht/source/Irrlicht/CNullDriver.h b/lib/irrlicht/source/Irrlicht/CNullDriver.h
index 355991a0f..22b862458 100644
--- a/lib/irrlicht/source/Irrlicht/CNullDriver.h
+++ b/lib/irrlicht/source/Irrlicht/CNullDriver.h
@@ -672,6 +672,7 @@ namespace video
 
 		virtual bool checkDriverReset() {return false;}
 		virtual u32 getDefaultFramebuffer() const { return 0; }
+		virtual io::IFileSystem* getFileSystem() const { return FileSystem; }
 	protected:
 
 		//! deletes all textures