diff --git a/include/SFML/System/FileInputStream.hpp b/include/SFML/System/FileInputStream.hpp index 20899ba97..edbb83ed9 100644 --- a/include/SFML/System/FileInputStream.hpp +++ b/include/SFML/System/FileInputStream.hpp @@ -147,8 +147,8 @@ private: // Member data //////////////////////////////////////////////////////////// #ifdef SFML_SYSTEM_ANDROID - std::unique_ptr m_file; -#else + std::unique_ptr m_androidFile; +#endif //////////////////////////////////////////////////////////// /// \brief Deleter for stdio file stream that closes the file stream /// @@ -159,7 +159,6 @@ private: }; std::unique_ptr m_file; //!< stdio file stream -#endif }; } // namespace sf diff --git a/src/SFML/Graphics/Image.cpp b/src/SFML/Graphics/Image.cpp index ded88ea1a..62d9fe940 100644 --- a/src/SFML/Graphics/Image.cpp +++ b/src/SFML/Graphics/Image.cpp @@ -31,6 +31,7 @@ #include #include #ifdef SFML_SYSTEM_ANDROID +#include #include #endif @@ -157,7 +158,15 @@ void Image::create(const Vector2u& size, const std::uint8_t* pixels) //////////////////////////////////////////////////////////// bool Image::loadFromFile(const std::filesystem::path& filename) { -#ifndef SFML_SYSTEM_ANDROID +#ifdef SFML_SYSTEM_ANDROID + + if (priv::getActivityStatesPtr() != nullptr) + { + priv::ResourceStream stream(filename); + return loadFromStream(stream); + } + +#endif // Clear the array (just in case) m_pixels.clear(); @@ -186,13 +195,6 @@ bool Image::loadFromFile(const std::filesystem::path& filename) return false; } - -#else - - priv::ResourceStream stream(filename); - return loadFromStream(stream); - -#endif } diff --git a/src/SFML/System/FileInputStream.cpp b/src/SFML/System/FileInputStream.cpp index 38d8467b8..b523ff797 100644 --- a/src/SFML/System/FileInputStream.cpp +++ b/src/SFML/System/FileInputStream.cpp @@ -27,6 +27,7 @@ //////////////////////////////////////////////////////////// #include #ifdef SFML_SYSTEM_ANDROID +#include #include #endif #include @@ -36,12 +37,10 @@ namespace sf { //////////////////////////////////////////////////////////// -#ifndef SFML_SYSTEM_ANDROID void FileInputStream::FileCloser::operator()(std::FILE* file) { std::fclose(file); } -#endif //////////////////////////////////////////////////////////// @@ -64,69 +63,88 @@ FileInputStream& FileInputStream::operator=(FileInputStream&&) noexcept = defaul bool FileInputStream::open(const std::filesystem::path& filename) { #ifdef SFML_SYSTEM_ANDROID - m_file = std::make_unique(filename); - return m_file->tell() != -1; -#else + if (priv::getActivityStatesPtr() != nullptr) + { + m_androidFile = std::make_unique(filename); + return m_androidFile->tell() != -1; + } +#endif #ifdef SFML_SYSTEM_WINDOWS m_file.reset(_wfopen(filename.c_str(), L"rb")); #else m_file.reset(std::fopen(filename.c_str(), "rb")); #endif return m_file != nullptr; -#endif } //////////////////////////////////////////////////////////// std::int64_t FileInputStream::read(void* data, std::int64_t size) { +#ifdef SFML_SYSTEM_ANDROID + if (priv::getActivityStatesPtr() != nullptr) + { + if (!m_androidFile) + return -1; + return m_androidFile->read(data, size); + } +#endif if (!m_file) return -1; -#ifdef SFML_SYSTEM_ANDROID - return m_file->read(data, size); -#else return static_cast(std::fread(data, 1, static_cast(size), m_file.get())); -#endif } //////////////////////////////////////////////////////////// std::int64_t FileInputStream::seek(std::int64_t position) { +#ifdef SFML_SYSTEM_ANDROID + if (priv::getActivityStatesPtr() != nullptr) + { + if (!m_androidFile) + return -1; + return m_androidFile->seek(position); + } +#endif if (!m_file) return -1; -#ifdef SFML_SYSTEM_ANDROID - return m_file->seek(position); -#else if (std::fseek(m_file.get(), static_cast(position), SEEK_SET)) return -1; return tell(); -#endif } //////////////////////////////////////////////////////////// std::int64_t FileInputStream::tell() { +#ifdef SFML_SYSTEM_ANDROID + if (priv::getActivityStatesPtr() != nullptr) + { + if (!m_androidFile) + return -1; + return m_androidFile->tell(); + } +#endif if (!m_file) return -1; -#ifdef SFML_SYSTEM_ANDROID - return m_file->tell(); -#else return std::ftell(m_file.get()); -#endif } //////////////////////////////////////////////////////////// std::int64_t FileInputStream::getSize() { +#ifdef SFML_SYSTEM_ANDROID + if (priv::getActivityStatesPtr() != nullptr) + { + if (!m_androidFile) + return -1; + return m_androidFile->getSize(); + } +#endif if (!m_file) return -1; -#ifdef SFML_SYSTEM_ANDROID - return m_file->getSize(); -#else const std::int64_t position = tell(); std::fseek(m_file.get(), 0, SEEK_END); const std::int64_t size = tell(); @@ -135,7 +153,6 @@ std::int64_t FileInputStream::getSize() return -1; return size; -#endif } } // namespace sf