/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "ImageLoaderJpeg.hpp" #include "Base/Utils.hpp" #include #include #include #if __has_include("turbojpeg.h") #include #else #define STB_IMAGE_IMPLEMENTATION #include #endif namespace OpenVulkano::Image { std::unique_ptr ImageLoaderJpeg::loadFromFile(const std::string& filePath) { Array buffer = OpenVulkano::Utils::ReadFile(filePath); return loadJpeg(reinterpret_cast(buffer.Data()), buffer.Size()); } std::unique_ptr ImageLoaderJpeg::loadFromMemory(const std::vector& buffer) { return loadJpeg(buffer.data(), buffer.size()); } std::unique_ptr ImageLoaderJpeg::loadJpeg(const uint8_t* data, size_t size) { #if __has_include("turbojpeg.h") { Image result; int rows, cols; unsigned char* compressedImage = const_cast(data); int jpegSubsamp; tjhandle jpegDecompressor = tjInitDecompress(); tjDecompressHeader2(jpegDecompressor, compressedImage, size, &cols, &rows, &jpegSubsamp); const int channels = 4; result.data = OpenVulkano::Array(cols * rows * channels); result.dataFormat = OpenVulkano::DataFormat::R8G8B8A8_UINT; tjDecompress2(jpegDecompressor, compressedImage, size, result.data.Data(), cols, 0 /*pitch*/, rows, TJPF_RGBA, TJFLAG_FASTDCT); tjDestroy(jpegDecompressor); result.resolution.x = cols; result.resolution.y = rows; result.resolution.z = 1; return std::make_unique(std::move(result)); } #else { return loadData(data, static_cast(size)); } #endif } }