// // Copyright Contributors to the MaterialX Project // SPDX-License-Identifier: Apache-2.0 // #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable : 4100) #pragma warning(disable : 4505) #pragma warning(disable : 4996) #endif #define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_STATIC 1 #include #if defined(__APPLE__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" #endif #define STB_IMAGE_WRITE_IMPLEMENTATION #define STB_IMAGE_WRITE_STATIC 1 #include #if defined(_MSC_VER) #pragma warning(pop) #endif MATERIALX_NAMESPACE_BEGIN bool StbImageLoader::saveImage(const FilePath& filePath, ConstImagePtr image, bool verticalFlip) { bool isChar = image->getBaseType() == Image::BaseType::UINT8; bool isFloat = image->getBaseType() == Image::BaseType::FLOAT; if (!isChar && !isFloat) { return false; } int returnValue = -1; // Set global "flip" flag int prevFlip = stbi__flip_vertically_on_write; stbi__flip_vertically_on_write = verticalFlip ? 1 : 0; int w = static_cast(image->getWidth()); int h = static_cast(image->getHeight()); int channels = static_cast(image->getChannelCount()); void* data = image->getResourceBuffer(); const string filePathName = filePath.asString(); string extension = filePath.getExtension(); if (!isFloat) { if (extension == PNG_EXTENSION) { returnValue = stbi_write_png(filePathName.c_str(), w, h, channels, data, w * image->getChannelCount()); } else if (extension == BMP_EXTENSION) { returnValue = stbi_write_bmp(filePathName.c_str(), w, h, channels, data); } else if (extension == TGA_EXTENSION) { returnValue = stbi_write_tga(filePathName.c_str(), w, h, channels, data); } else if (extension == JPG_EXTENSION || extension == JPEG_EXTENSION) { returnValue = stbi_write_jpg(filePathName.c_str(), w, h, channels, data, 100); } } else { if (extension == HDR_EXTENSION) { returnValue = stbi_write_hdr(filePathName.c_str(), w, h, channels, static_cast(data)); } } if (verticalFlip) { stbi__flip_vertically_on_write = prevFlip; } return (returnValue == 1); } ImagePtr StbImageLoader::loadImage(const FilePath& filePath) { int width = 0; int height = 0; int channelCount = 0; Image::BaseType baseType = Image::BaseType::UINT8; void* buffer = nullptr; // Select standard or float reader based on file extension. string extension = filePath.getExtension(); if (extension == HDR_EXTENSION) { buffer = stbi_loadf(filePath.asString().c_str(), &width, &height, &channelCount, 0); baseType = Image::BaseType::FLOAT; } else { buffer = stbi_load(filePath.asString().c_str(), &width, &height, &channelCount, 0); baseType = Image::BaseType::UINT8; } if (!buffer) { return nullptr; } // Create the image object. ImagePtr image = Image::create(width, height, channelCount, baseType); image->setResourceBuffer(buffer); image->setResourceBufferDeallocator(&stbi_image_free); return image; } #if defined(__APPLE__) #pragma clang diagnostic pop #endif MATERIALX_NAMESPACE_END