diff --git a/openVulkanoCpp/Image/ImageLoader.cpp b/openVulkanoCpp/Image/ImageLoader.cpp index 624818e..14c51e5 100644 --- a/openVulkanoCpp/Image/ImageLoader.cpp +++ b/openVulkanoCpp/Image/ImageLoader.cpp @@ -60,4 +60,16 @@ namespace OpenVulkano::Image stbi_image_free(pixelData); return std::make_unique(std::move(result)); } + + Math::Vector2i IImageLoader::GetDimensionsInternal(const std::string& filename) + { + Math::Vector2i res = {}; + int channels; + if (!stbi_info(filename.c_str(), &res.x, &res.y, &channels)) + { + Logger::FILESYS->error("Failed to read image header of file {}", filename); + return Math::Vector2i{ -1, -1 }; + } + return res; + } } \ No newline at end of file diff --git a/openVulkanoCpp/Image/ImageLoader.hpp b/openVulkanoCpp/Image/ImageLoader.hpp index 1bc6b0f..d6340da 100644 --- a/openVulkanoCpp/Image/ImageLoader.hpp +++ b/openVulkanoCpp/Image/ImageLoader.hpp @@ -21,5 +21,8 @@ namespace OpenVulkano::Image static std::unique_ptr loadData(const uint8_t* data, int size, int desiredChannels = 0); virtual std::unique_ptr loadFromFile(const std::string& filePath) = 0; virtual std::unique_ptr loadFromMemory(const std::vector& buffer) = 0; + virtual Math::Vector2i GetImageDimensions(const std::string& filename) = 0; + protected: + static Math::Vector2i GetDimensionsInternal(const std::string& filename); }; } \ No newline at end of file diff --git a/openVulkanoCpp/Image/ImageLoaderJpeg.cpp b/openVulkanoCpp/Image/ImageLoaderJpeg.cpp index 4afd5f0..1a9fe74 100644 --- a/openVulkanoCpp/Image/ImageLoaderJpeg.cpp +++ b/openVulkanoCpp/Image/ImageLoaderJpeg.cpp @@ -31,6 +31,33 @@ namespace OpenVulkano::Image return loadJpeg(buffer.data(), buffer.size()); } + Math::Vector2i ImageLoaderJpeg::GetImageDimensions(const std::string& filename) + { +#if __has_include("turbojpeg.h") + auto image = Utils::ReadFile(filename); + tjhandle jpegDecompressor = tjInitDecompress(); + if (!jpegDecompressor) + { + Logger::FILESYS->error("Failed to read jpeg header. Error: {}", tjGetErrorStr()); + return Math::Vector2i { -1, -1 }; + } + Math::Vector2i res = {}; + int size = 0, jpegSubsamp = 0; + int status = tjDecompressHeader2(jpegDecompressor, reinterpret_cast(image.Data()), image.Size(), + &res.x, &res.y, &jpegSubsamp); + if (status != 0) + { + Logger::FILESYS->error("Failed to read jpeg header. Error: {}", tjGetErrorStr()); + tjDestroy(jpegDecompressor); + return Math::Vector2i { -1, -1 }; + } + tjDestroy(jpegDecompressor); + return res; +#else + return IImageLoader::GetDimensionsInternal(filename); +#endif + } + std::unique_ptr ImageLoaderJpeg::loadJpeg(const uint8_t* data, size_t size) { #if __has_include("turbojpeg.h") diff --git a/openVulkanoCpp/Image/ImageLoaderJpeg.hpp b/openVulkanoCpp/Image/ImageLoaderJpeg.hpp index 5890ac9..8b5d87a 100644 --- a/openVulkanoCpp/Image/ImageLoaderJpeg.hpp +++ b/openVulkanoCpp/Image/ImageLoaderJpeg.hpp @@ -15,7 +15,7 @@ namespace OpenVulkano::Image public: std::unique_ptr loadFromFile(const std::string& filePath) override; std::unique_ptr loadFromMemory(const std::vector& buffer) override; - + Math::Vector2i GetImageDimensions(const std::string& filename) override; private: std::unique_ptr loadJpeg(const uint8_t* data, size_t size); }; diff --git a/openVulkanoCpp/Image/ImageLoaderPng.cpp b/openVulkanoCpp/Image/ImageLoaderPng.cpp index 0968e4f..92900b9 100644 --- a/openVulkanoCpp/Image/ImageLoaderPng.cpp +++ b/openVulkanoCpp/Image/ImageLoaderPng.cpp @@ -22,4 +22,9 @@ namespace OpenVulkano::Image { return loadData(buffer.data(), static_cast(buffer.size())); } + + Math::Vector2i ImageLoaderPng::GetImageDimensions(const std::string& filename) + { + return GetDimensionsInternal(filename); + } } \ No newline at end of file diff --git a/openVulkanoCpp/Image/ImageLoaderPng.hpp b/openVulkanoCpp/Image/ImageLoaderPng.hpp index 7b449cf..2ab52dc 100644 --- a/openVulkanoCpp/Image/ImageLoaderPng.hpp +++ b/openVulkanoCpp/Image/ImageLoaderPng.hpp @@ -15,5 +15,6 @@ namespace OpenVulkano::Image public: std::unique_ptr loadFromFile(const std::string& filePath) override; std::unique_ptr loadFromMemory(const std::vector& buffer) override; + Math::Vector2i GetImageDimensions(const std::string& filename) override; }; } \ No newline at end of file