#pragma once #include "CesiumGltf/ImageAsset.h" #include "CesiumGltfReader/Library.h" #include #include #include #include #include namespace CesiumGltfReader { /** * @brief The result of reading an image with {@link ImageDecoder::readImage}. */ struct CESIUMGLTFREADER_API ImageReaderResult { /** * @brief The {@link CesiumGltf::ImageAsset} that was read. * * This will be `std::nullopt` if the image could not be read. */ CesiumUtility::IntrusivePointer pImage; /** * @brief Error messages that occurred while trying to read the image. */ std::vector errors; /** * @brief Warning messages that occurred while reading the image. */ std::vector warnings; }; /** * @brief Contains methods for reading and manipulating images. */ class ImageDecoder { public: /** * @brief Reads an image from a buffer. * * The [stb_image](https://github.com/nothings/stb) library is used to decode * images in `JPG`, `PNG`, `TGA`, `BMP`, `PSD`, `GIF`, `HDR`, or `PIC` format. * * @param data The buffer from which to read the image. * @param ktx2TranscodeTargets The compression format to transcode * KTX v2 textures into. If this is std::nullopt, KTX v2 textures will be * fully decompressed into raw pixels. * @return The result of reading the image. */ static ImageReaderResult readImage( const std::span& data, const CesiumGltf::Ktx2TranscodeTargets& ktx2TranscodeTargets); /** * @brief Generate mipmaps for this image. * * Does nothing if mipmaps already exist or the compressedPixelFormat is not * GpuCompressedPixelFormat::NONE. * * @param image The image to generate mipmaps for. * * @return A string describing the error, if unable to generate mipmaps. */ static std::optional generateMipMaps(CesiumGltf::ImageAsset& image); /** * @brief Resize an image, without validating the provided pointers or ranges. * * @param pInputPixels The input image. * @param inputWidth The width of the input image, in pixels. * @param inputHeight The height of the input image, in pixels. * @param inputStrideBytes The stride of the input image, in bytes. Stride is * the number of bytes between successive rows. * @param pOutputPixels The buffer into which to write the output image. * @param outputWidth The width of the output image, in pixels. * @param outputHeight The height of the otuput image, in pixels. * @param outputStrideBytes The stride of the output image, in bytes. Stride * is the number of bytes between successive rows. * @param channels The number of channels in both the input and output images. * @return True if the resize succeeded, false if it failed. */ static bool unsafeResize( const std::byte* pInputPixels, int32_t inputWidth, int32_t inputHeight, int32_t inputStrideBytes, std::byte* pOutputPixels, int32_t outputWidth, int32_t outputHeight, int32_t outputStrideBytes, int32_t channels); }; } // namespace CesiumGltfReader