Files
UnrealEngine/Engine/Source/ThirdParty/MaterialX/MaterialX-1.38.10/source/MaterialXRender/Image.h
2025-05-18 13:04:45 +08:00

237 lines
6.3 KiB
C++

//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//
#ifndef MATERIALX_IMAGE_H
#define MATERIALX_IMAGE_H
/// @file
/// Image class
#include <MaterialXRender/Export.h>
#include <MaterialXFormat/File.h>
#include <MaterialXCore/Types.h>
MATERIALX_NAMESPACE_BEGIN
class Image;
/// A shared pointer to an image
using ImagePtr = shared_ptr<Image>;
/// A shared pointer to a const image
using ConstImagePtr = shared_ptr<const Image>;
/// A map from strings to images.
using ImageMap = std::unordered_map<string, ImagePtr>;
/// A vetor of images.
using ImageVec = std::vector<ImagePtr>;
/// A pair of images.
using ImagePair = std::pair<ImagePtr, ImagePtr>;
/// A function to perform image buffer deallocation
using ImageBufferDeallocator = std::function<void(void*)>;
/// A pair of unsigned integers.
using UnsignedIntPair = std::pair<unsigned int, unsigned int>;
/// @class Image
/// Class representing an image in system memory
class MX_RENDER_API Image
{
public:
enum class BaseType
{
UINT8,
INT8,
UINT16,
INT16,
HALF,
FLOAT
};
public:
/// Create an empty image with the given properties.
static ImagePtr create(unsigned int width, unsigned int height, unsigned int channelCount, BaseType baseType = BaseType::UINT8)
{
return ImagePtr(new Image(width, height, channelCount, baseType));
}
~Image();
/// @name Property Accessors
/// @{
/// Return the width of the image.
unsigned int getWidth() const
{
return _width;
}
/// Return the height of the image.
unsigned int getHeight() const
{
return _height;
}
/// Return the channel count of the image.
unsigned int getChannelCount() const
{
return _channelCount;
}
/// Return the base type of the image.
BaseType getBaseType() const
{
return _baseType;
}
/// Return the stride of our base type in bytes.
unsigned int getBaseStride() const;
/// Return the stride of an image row in bytes.
unsigned int getRowStride() const
{
return _width * _channelCount * getBaseStride();
}
/// Return the maximum number of mipmaps for this image.
unsigned int getMaxMipCount() const;
/// @}
/// @name Texel Accessors
/// @{
/// Set the texel color at the given coordinates. If the coordinates
/// or image resource buffer are invalid, then an exception is thrown.
void setTexelColor(unsigned int x, unsigned int y, const Color4& color);
/// Return the texel color at the given coordinates. If the coordinates
/// or image resource buffer are invalid, then an exception is thrown.
Color4 getTexelColor(unsigned int x, unsigned int y) const;
/// @}
/// @name Image Analysis
/// @{
/// Compute the average color of the image.
Color4 getAverageColor();
/// Return true if all texels of this image are identical in color.
/// @param uniformColor Return the uniform color of the image, if any.
bool isUniformColor(Color4* uniformColor = nullptr);
/// @}
/// @name Image Processing
/// @{
/// Set all texels of this image to a uniform color.
void setUniformColor(const Color4& color);
/// Apply the given matrix transform to all texels of this image.
void applyMatrixTransform(const Matrix33& mat);
/// Apply the given gamma transform to all texels of this image.
void applyGammaTransform(float gamma);
/// Create a copy of this image with the given channel count and base type.
ImagePtr copy(unsigned int channelCount, BaseType baseType) const;
/// Apply a 3x3 box blur to this image, returning a new blurred image.
ImagePtr applyBoxBlur();
/// Apply a 7x7 Gaussian blur to this image, returning a new blurred image.
ImagePtr applyGaussianBlur();
/// Split this image by the given luminance threshold, returning the
/// resulting underflow and overflow images.
ImagePair splitByLuminance(float luminance);
/// Save a channel of this image to disk as a text table, in a format
/// that can be used for curve and surface fitting.
void writeTable(const FilePath& filePath, unsigned int channel);
/// @}
/// @name Resource Buffers
/// @{
/// Set the resource buffer for this image.
void setResourceBuffer(void* buffer)
{
_resourceBuffer = buffer;
}
/// Return the resource buffer for this image.
void* getResourceBuffer() const
{
return _resourceBuffer;
}
/// Allocate a resource buffer for this image that matches its properties.
void createResourceBuffer();
/// Release the resource buffer for this image.
void releaseResourceBuffer();
/// Set the resource buffer deallocator for this image.
void setResourceBufferDeallocator(ImageBufferDeallocator deallocator)
{
_resourceBufferDeallocator = deallocator;
}
/// Return the resource buffer deallocator for this image.
ImageBufferDeallocator getResourceBufferDeallocator() const
{
return _resourceBufferDeallocator;
}
/// @}
/// @name Resource IDs
/// @{
/// Set the resource ID for this image.
void setResourceId(unsigned int id)
{
_resourceId = id;
}
/// Return the resource ID for this image.
unsigned int getResourceId() const
{
return _resourceId;
}
/// @}
protected:
Image(unsigned int width, unsigned int height, unsigned int channelCount, BaseType baseType);
protected:
unsigned int _width;
unsigned int _height;
unsigned int _channelCount;
BaseType _baseType;
void* _resourceBuffer;
ImageBufferDeallocator _resourceBufferDeallocator;
unsigned int _resourceId = 0;
};
/// Create a uniform-color image with the given properties.
MX_RENDER_API ImagePtr createUniformImage(unsigned int width, unsigned int height, unsigned int channelCount, Image::BaseType baseType, const Color4& color);
/// Create a horizontal image strip from a vector of images with identical resolutions and formats.
MX_RENDER_API ImagePtr createImageStrip(const vector<ImagePtr>& imageVec);
/// Compute the maximum width and height of all images in the given vector.
MX_RENDER_API UnsignedIntPair getMaxDimensions(const vector<ImagePtr>& imageVec);
MATERIALX_NAMESPACE_END
#endif