diff --git a/openVulkanoCpp/Image/ImageLoader.cpp b/openVulkanoCpp/Image/ImageLoader.cpp index 624818e..c1b001a 100644 --- a/openVulkanoCpp/Image/ImageLoader.cpp +++ b/openVulkanoCpp/Image/ImageLoader.cpp @@ -60,4 +60,10 @@ namespace OpenVulkano::Image stbi_image_free(pixelData); return std::make_unique(std::move(result)); } + + bool IImageLoader::GetDimensionsInternal(const std::string& filename, int& width, int& height) + { + int channels; + return stbi_info(filename.c_str(), &width, &height, &channels); + } } \ No newline at end of file diff --git a/openVulkanoCpp/Image/ImageLoader.hpp b/openVulkanoCpp/Image/ImageLoader.hpp index 1bc6b0f..3af4d86 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 bool GetImageDimensions(const std::string& filename, int& width, int& height) = 0; + protected: + static bool GetDimensionsInternal(const std::string& filename, int& width, int& height); }; } \ No newline at end of file diff --git a/openVulkanoCpp/Image/ImageLoaderJpeg.cpp b/openVulkanoCpp/Image/ImageLoaderJpeg.cpp index 4afd5f0..b7bd57e 100644 --- a/openVulkanoCpp/Image/ImageLoaderJpeg.cpp +++ b/openVulkanoCpp/Image/ImageLoaderJpeg.cpp @@ -31,6 +31,32 @@ namespace OpenVulkano::Image return loadJpeg(buffer.data(), buffer.size()); } + bool ImageLoaderJpeg::GetImageDimensions(const std::string& filename, int& width, int& height) + { +#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 false; + } + int size = 0, jpegSubsamp = 0; + int status = tjDecompressHeader2(jpegDecompressor, reinterpret_cast(image.Data()), image.Size(), + &width, &height, &jpegSubsamp); + if (status != 0) + { + Logger::FILESYS->error("Failed to read jpeg header. Error: {}", tjGetErrorStr()); + tjDestroy(jpegDecompressor); + return false; + } + tjDestroy(jpegDecompressor); + return true; +#else + return IImageLoader::GetDimensionsInternal(filename, width, height); +#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..a127b18 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; - + bool GetImageDimensions(const std::string& filename, int& width, int& height) 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..462f0f8 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())); } + + bool ImageLoaderPng::GetImageDimensions(const std::string& filename, int& width, int& height) + { + return GetDimensionsInternal(filename, width, height); + } } \ No newline at end of file diff --git a/openVulkanoCpp/Image/ImageLoaderPng.hpp b/openVulkanoCpp/Image/ImageLoaderPng.hpp index 7b449cf..ef0181b 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; + bool GetImageDimensions(const std::string& filename, int& width, int& height) override; }; } \ No newline at end of file