Support Forum       G3D Web Page     
Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Static Protected Attributes | Friends | List of all members
G3D::Image Class Reference

Provides general image loading, saving, conversion and pixel access. More...

Inherits G3D::ReferenceCountedObject.

Classes

class  Error
 

Public Types

enum  ImageFileFormat {
  UNKNOWN = -1,
  BMP = 0,
  ICO = 1,
  JPEG = 2,
  JNG = 3,
  KOALA = 4,
  LBM = 5,
  IFF = LBM,
  MNG = 6,
  PBM = 7,
  PBMRAW = 8,
  PCD = 9,
  PCX = 10,
  PGM = 11,
  PGMRAW = 12,
  PNG = 13,
  PPM = 14,
  PPMRAW = 15,
  RAS = 16,
  TARGA = 17,
  TIFF = 18,
  WBMP = 19,
  PSD = 20,
  CUT = 21,
  XBM = 22,
  XPM = 23,
  DDS = 24,
  GIF = 25,
  HDR = 26,
  FAXG3 = 27,
  SGI = 28,
  EXR = 29,
  J2K = 30,
  JP2 = 31,
  PFM = 32,
  PICT = 33,
  RAW = 34
}
 

Public Member Functions

virtual ~Image ()
 
Color4 bicubic (float x, float y, WrapMode w=WrapMode::ERROR) const
 
Color4 bicubic (const Point2 &pos, WrapMode w=WrapMode::ERROR) const
 
Color4 bilinear (float x, float y, WrapMode wrap=WrapMode::ERROR) const
 
Bilinear interpolation, in the style of OpenGL's GL_LINEAR. More...
 
Color4 bilinear (const Point2 &pos, WrapMode wrap=WrapMode::ERROR) const
 

Bilinear interpolation, in the style of OpenGL's GL_LINEAR. More...
 
Color4 bilinearGamma (float x, float y, float gamma, WrapMode wrap=WrapMode::ERROR) const
 Bilinear interpolation, with gamma applied to RGB channels. More...
 
template<class ColorN >
void bilinearIncrement (const Point2 &pos, const ColorN &color, WrapMode wrap=WrapMode::IGNORE)
 Increments values within the bilinear footprint according to their weights. More...
 
Rect2D bounds () const
 
shared_ptr< Imageclone () const
 Copies the underlying pixel data. More...
 
void convert (const ImageFormat *dstFmt)
 Convert the internal representation to the specified format using G3D::ImageConvert. More...
 
bool convertToL8 ()
 Direct replacements for old GImage functions for now. More...
 
bool convertToR8 ()
 
bool convertToRGB8 ()
 
bool convertToRGBA8 ()
 
void flipHorizontal ()
 
void flipVertical ()
 
template<typename ColorType >
void forEachPixel (std::function< ColorType(const ColorType &src, Point2int32 coord)> callback, bool multiThread=false)
 Executes for each pixel at coord of this, where src is the value before callback runs and the result is set to the return value of the callback. More...
 
template<typename ColorType >
void forEachPixel (std::function< ColorType(const ColorType &src)> callback, bool multiThread=false)
 
template<typename ColorType >
void forEachPixel (std::function< ColorType(ColorType src)> callback, bool multiThread=false)
 
template<typename ColorType >
void forEachPixel (std::function< void(ColorType src)> callback, bool multiThread=false) const
 
template<typename ColorType >
void forEachPixel (std::function< ColorType(Point2int32 coord)> callback, bool multiThread=false)
 
const ImageFormatformat () const
 
void get (const Point2int32 &pos, Color4 &color) const
 8-bit and 16-bit values are returned on the range [0, 1] losslessly. More...
 
void get (const Point2int32 &pos, Color3 &color) const
 
void get (const Point2int32 &pos, Color1 &color) const
 
void get (const Point2int32 &pos, Color4unorm8 &color) const
 
void get (const Point2int32 &pos, Color3unorm8 &color) const
 
void get (const Point2int32 &pos, Color1unorm8 &color) const
 
template<class ValueType >
ValueType get (Point2int32 pos, WrapMode wrap=WrapMode::ERROR) const
 Provides functional access with wrap modes. More...
 
template<class ValueType >
ValueType get (int x, int y, WrapMode w=WrapMode::ERROR) const
 
Helper function for convenient functional access to elements and wrap modes. More...
 
int height () const
 Height in pixels. More...
 
template<class ColorN >
void increment (const Point2int32 &pos, const ColorN &color)
 
template<class ColorN >
void increment (const Point2int32 &pos, const ColorN &color, WrapMode wrapMode)
 
Color4 nearest (const Point2 &pos, WrapMode w=WrapMode::ERROR) const
 Returns the nearest neighbor's pixel value, as in OpenGL's GL_NEAREST texture filter mode. More...
 
Color4 nearest (int x, int y, WrapMode w=WrapMode::ERROR) const
 Returns the nearest neighbor's pixel value, as in OpenGL's GL_NEAREST texture filter mode. More...
 
void rotateCCW (double radians)
 
void rotateCW (double radians)
 
void save (const String &filename) const
 Saves internal pixel data to file specified by filename. More...
 
void serialize (BinaryOutput &bo, ImageFileFormat fileFormat) const
 Saves internal pixel data to existing BinaryOutput bo. More...
 
void set (const shared_ptr< PixelTransferBuffer > &buffer)
 Copies all elements from buffer, adjusting the size and format of this to match. More...
 
void set (const shared_ptr< PixelTransferBuffer > &buffer, int x, int y)
 Copies only pixels from buffer to the specified location in the image. More...
 
void set (const Point2int32 &pos, const Color4 &color)
 
void set (const Point2int32 &pos, const Color3 &color)
 
void set (const Point2int32 &pos, const Color1 &color)
 
void set (const Point2int32 &pos, const Color4unorm8 &color)
 
void set (const Point2int32 &pos, const Color3unorm8 &color)
 
void set (const Point2int32 &pos, const Color1unorm8 &color)
 
template<class ValueType >
void set (Point2int32 pos, const ValueType &v, WrapMode wrap)
 Slower than the other set methods. More...
 
template<class ValueType >
void set (int x, int y, const ValueType &v, WrapMode wrap=WrapMode::ERROR)
 
void setAll (const Color4 &color)
 
void setAll (const Color3 &color)
 
void setAll (const Color1 &color)
 
void setAll (const Color4unorm8 &color)
 
void setAll (const Color3unorm8 &color)
 
void setAll (const Color1unorm8 &color)
 
void setSize (int w, int h, const ImageFormat *fmt=ImageFormat::AUTO())
 The contents are undefined after resize. More...
 
shared_ptr< PixelTransferBuffertoPixelTransferBuffer () const
 Extracts a copy of the pixel data. More...
 
shared_ptr< PixelTransferBuffertoPixelTransferBuffer (Rect2D rect, shared_ptr< PixelTransferBuffer > ptb=nullptr) const
 Extracts a copy of the pixel data within the specified rectangle. More...
 
int width () const
 Width in pixels. More...
 

Static Public Member Functions

static shared_ptr< PixelTransferBufferarrayToPixelTransferBuffer (const Array< shared_ptr< Image > > &images)
 Takes in an Array of Images and loades them all into a single CPUPixelTransferBuffer. More...
 
static shared_ptr< Imagecreate (int width, int height, const ImageFormat *imageFormat)
 
static bool fileSupported (const String &filename, bool allowCheckSignature=false)
 Determines if the format of a file is supported. More...
 
static shared_ptr< ImagefromBinaryInput (BinaryInput &bi, const ImageFormat *imageFormat=ImageFormat::AUTO())
 Loads an image from existing BinaryInput bi. More...
 
static shared_ptr< ImagefromFile (const String &filename, const ImageFormat *imageFormat=ImageFormat::AUTO())
 Loads an image from file specified by filename. More...
 
static shared_ptr< ImagefromPixelTransferBuffer (const shared_ptr< PixelTransferBuffer > &buffer)
 Loads an image from existing PixelTransferBuffer buffer. More...
 
static bool metaDataFromBinaryInput (BinaryInput &bi, int &width, int &height, const ImageFormat *&format)
 Reads just metadata (if the file format supports it, undefined otherwise). More...
 
static void saveGIF (const String &filename, const Array< shared_ptr< Image >> &sequence, const double &fps)
 Saves GIF of a sequence of images to file specified by filename/ The save is not lossy if the images are RGB8 format and have a palette size of at most 256 colros. More...
 

Protected Member Functions

 Image ()
 
 Image (const Image &)
 
Imageoperator= (const Image &)
 
float R (float x) const
 

Static Protected Member Functions

template<class T , class ... ArgTypes>
static shared_ptr< T > createShared (ArgTypes &&... args)
 Like std::make_shared, but works for protected constructors. More...
 
static void initFreeImage ()
 Initialize the FreeImage library on first use. More...
 

Protected Attributes

const ImageFormatm_format
 
fipImage * m_image
 

Static Protected Attributes

static std::mutex s_freeImageMutex
 Ensures that FreeImage is not initialized on multiple threads simultaneously. More...
 

Friends

class CubeMap
 

Detailed Description

Provides general image loading, saving, conversion and pixel access.

Image allows you to load a variety of supported file formats in their native pixel format with very few exceptions. Callers are responsible for converting pixel data to the desired format after loading and before saving.

Image will also try to save directly to a file in the same pixel format as it is stored internally. If a file format does not support that pixel format, then the caller is responsible for converting before saving.

The Image::Error exception is thrown if a file cannot be loaded.

Member Enumeration Documentation

◆ ImageFileFormat

Enumerator
UNKNOWN 
BMP 
ICO 
JPEG 
JNG 
KOALA 
LBM 
IFF 
MNG 
PBM 
PBMRAW 
PCD 
PCX 
PGM 
PGMRAW 
PNG 
PPM 
PPMRAW 
RAS 
TARGA 
TIFF 
WBMP 
PSD 
CUT 
XBM 
XPM 
DDS 
GIF 
HDR 
FAXG3 
SGI 
EXR 
J2K 
JP2 
PFM 
PICT 
RAW 

Constructor & Destructor Documentation

◆ Image() [1/2]

G3D::Image::Image ( )
protected

◆ Image() [2/2]

G3D::Image::Image ( const Image )
protected

◆ ~Image()

virtual G3D::Image::~Image ( )
virtual

Member Function Documentation

◆ arrayToPixelTransferBuffer()

static shared_ptr<PixelTransferBuffer> G3D::Image::arrayToPixelTransferBuffer ( const Array< shared_ptr< Image > > &  images)
static

Takes in an Array of Images and loades them all into a single CPUPixelTransferBuffer.

This is meant to be used for creating 2D_Texture Arrays.

◆ bicubic() [1/2]

Color4 G3D::Image::bicubic ( float  x,
float  y,
WrapMode  w = WrapMode::ERROR 
) const

◆ bicubic() [2/2]

Color4 G3D::Image::bicubic ( const Point2 pos,
WrapMode  w = WrapMode::ERROR 
) const

◆ bilinear() [1/2]

Color4 G3D::Image::bilinear ( float  x,
float  y,
WrapMode  wrap = WrapMode::ERROR 
) const


Bilinear interpolation, in the style of OpenGL's GL_LINEAR.

Needs to access elements from (floor(x), floor(y)) to (floor(x) + 1, floor(y) + 1) and will use the wrap mode appropriately, possibly generating out of bounds errors.

Guaranteed to match nearest(x, y) at integer locations. That is, pixel centers are at integers.

See also
nearest, get

◆ bilinear() [2/2]

Color4 G3D::Image::bilinear ( const Point2 pos,
WrapMode  wrap = WrapMode::ERROR 
) const



Bilinear interpolation, in the style of OpenGL's GL_LINEAR.

Needs to access elements from (floor(x), floor(y)) to (floor(x) + 1, floor(y) + 1) and will use the wrap mode appropriately, possibly generating out of bounds errors.

Guaranteed to match nearest(x, y) at integer locations. That is, pixel centers are at integers.

See also
nearest, get
bilinearGamma

◆ bilinearGamma()

Color4 G3D::Image::bilinearGamma ( float  x,
float  y,
float  gamma,
WrapMode  wrap = WrapMode::ERROR 
) const

Bilinear interpolation, with gamma applied to RGB channels.

◆ bilinearIncrement()

template<class ColorN >
void G3D::Image::bilinearIncrement ( const Point2 pos,
const ColorN &  color,
WrapMode  wrap = WrapMode::IGNORE 
)
inline

Increments values within the bilinear footprint according to their weights.

Needs to access elements from (floor(x), floor(y)) to (floor(x) + 1, floor(y) + 1) and will use the wrap mode appropriately, possibly generating out of bounds errors.

Parameters
wrapDefaults to WrapMode::IGNORE

◆ bounds()

Rect2D G3D::Image::bounds ( ) const
inline

◆ clone()

shared_ptr<Image> G3D::Image::clone ( ) const

Copies the underlying pixel data.

◆ convert()

void G3D::Image::convert ( const ImageFormat dstFmt)

Convert the internal representation to the specified format using G3D::ImageConvert.

◆ convertToL8()

bool G3D::Image::convertToL8 ( )

Direct replacements for old GImage functions for now.

Deprecated:
Do not call

◆ convertToR8()

bool G3D::Image::convertToR8 ( )
Deprecated:
Do not call

◆ convertToRGB8()

bool G3D::Image::convertToRGB8 ( )
Deprecated:
Do not call

◆ convertToRGBA8()

bool G3D::Image::convertToRGBA8 ( )
Deprecated:
Do not call

◆ create()

static shared_ptr<Image> G3D::Image::create ( int  width,
int  height,
const ImageFormat imageFormat 
)
static

◆ createShared()

template<class T , class ... ArgTypes>
static shared_ptr<T> G3D::ReferenceCountedObject::createShared ( ArgTypes &&...  args)
inlinestaticprotectedinherited

Like std::make_shared, but works for protected constructors.

Call as createShared<myclass>.

◆ fileSupported()

static bool G3D::Image::fileSupported ( const String filename,
bool  allowCheckSignature = false 
)
static

Determines if the format of a file is supported.

Does not open file unless allowCheckSignature is true.

Does not check if the pixel format is supported.

◆ flipHorizontal()

void G3D::Image::flipHorizontal ( )

◆ flipVertical()

void G3D::Image::flipVertical ( )

◆ forEachPixel() [1/5]

template<typename ColorType >
void G3D::Image::forEachPixel ( std::function< ColorType(const ColorType &src, Point2int32 coord)>  callback,
bool  multiThread = false 
)
inline

Executes for each pixel at coord of this, where src is the value before callback runs and the result is set to the return value of the callback.

If multiThread is true (the default in release mode) then multiple CPU threads may be used.

Note that there are overloads that accept just a coordinate or just a source color.

Examples:

img.forEachPixel<Color4>([&](const Color4& src) { return Color4(src.rgb() * 2, src.a); });
img.forEachPixel<Color4unorm8>([&](const Color4unorm8& src) { return Color4unorm8(src.b, src.g, src.r, src.a); });
img.forEachPixel(std::bind<tracePixel, this>);

◆ forEachPixel() [2/5]

template<typename ColorType >
void G3D::Image::forEachPixel ( std::function< ColorType(const ColorType &src)>  callback,
bool  multiThread = false 
)
inline

◆ forEachPixel() [3/5]

template<typename ColorType >
void G3D::Image::forEachPixel ( std::function< ColorType(ColorType src)>  callback,
bool  multiThread = false 
)
inline

◆ forEachPixel() [4/5]

template<typename ColorType >
void G3D::Image::forEachPixel ( std::function< void(ColorType src)>  callback,
bool  multiThread = false 
) const
inline

◆ forEachPixel() [5/5]

template<typename ColorType >
void G3D::Image::forEachPixel ( std::function< ColorType(Point2int32 coord)>  callback,
bool  multiThread = false 
)
inline

◆ format()

const ImageFormat* G3D::Image::format ( ) const

◆ fromBinaryInput()

static shared_ptr<Image> G3D::Image::fromBinaryInput ( BinaryInput bi,
const ImageFormat imageFormat = ImageFormat::AUTO() 
)
static

Loads an image from existing BinaryInput bi.

See also
fromFile, convert

◆ fromFile()

static shared_ptr<Image> G3D::Image::fromFile ( const String filename,
const ImageFormat imageFormat = ImageFormat::AUTO() 
)
static

Loads an image from file specified by filename.

Parameters
imageFormatIf specified and bit-compatible (ImageFormat::canInterpretAs()) with the image's original file format, reinterprets the data in the new format (i.e., as if with a C++ reinterpret_cast). For example, RGB8 data could be reinterpreted as SRGB8, RGB8I, RGB8UI, BGR8, etc.
See also
fromBinaryInput, convert

Referenced by G3D::OSWindow::setIcon().

◆ fromPixelTransferBuffer()

static shared_ptr<Image> G3D::Image::fromPixelTransferBuffer ( const shared_ptr< PixelTransferBuffer > &  buffer)
static

Loads an image from existing PixelTransferBuffer buffer.

Performs a copy of pixel data.

◆ get() [1/8]

void G3D::Image::get ( const Point2int32 pos,
Color4 color 
) const

8-bit and 16-bit values are returned on the range [0, 1] losslessly.

32-bit float values are mapped with some precision loss. float32 values are unmodified.

◆ get() [2/8]

void G3D::Image::get ( const Point2int32 pos,
Color3 color 
) const

◆ get() [3/8]

void G3D::Image::get ( const Point2int32 pos,
Color1 color 
) const

◆ get() [4/8]

void G3D::Image::get ( const Point2int32 pos,
Color4unorm8 color 
) const

◆ get() [5/8]

void G3D::Image::get ( const Point2int32 pos,
Color3unorm8 color 
) const

◆ get() [6/8]

void G3D::Image::get ( const Point2int32 pos,
Color1unorm8 color 
) const

◆ get() [7/8]

template<class ValueType >
ValueType G3D::Image::get ( Point2int32  pos,
WrapMode  wrap = WrapMode::ERROR 
) const
inline

Provides functional access with wrap modes.

This is slower than the other get() methods.

◆ get() [8/8]

template<class ValueType >
ValueType G3D::Image::get ( int  x,
int  y,
WrapMode  w = WrapMode::ERROR 
) const
inline


Helper function for convenient functional access to elements and wrap modes.

This is slower than the other get() methods.

Example:

const Color3& c(im->get<Color3>(x, y));
const Color3& d((im->get<Color3>(2 * x, y) + im->get<Color3>(2 * x + 1, y)) / 2);

◆ height()

int G3D::Image::height ( ) const

Height in pixels.

Referenced by bounds(), forEachPixel(), get(), and set().

◆ increment() [1/2]

template<class ColorN >
void G3D::Image::increment ( const Point2int32 pos,
const ColorN &  color 
)
inline
See also
set, nearestIncrement, bilinearIncrement

◆ increment() [2/2]

template<class ColorN >
void G3D::Image::increment ( const Point2int32 pos,
const ColorN &  color,
WrapMode  wrapMode 
)
inline
See also
set, nearestIncrement, bilinearIncrement Not thread safe, but will be when atomic float is supported by all compilers.

◆ initFreeImage()

static void G3D::Image::initFreeImage ( )
staticprotected

Initialize the FreeImage library on first use.

◆ metaDataFromBinaryInput()

static bool G3D::Image::metaDataFromBinaryInput ( BinaryInput bi,
int &  width,
int &  height,
const ImageFormat *&  format 
)
static

Reads just metadata (if the file format supports it, undefined otherwise).

Returns true on success, false on failure

◆ nearest() [1/2]

Color4 G3D::Image::nearest ( const Point2 pos,
WrapMode  w = WrapMode::ERROR 
) const

Returns the nearest neighbor's pixel value, as in OpenGL's GL_NEAREST texture filter mode.

Values are considered to be at pixel centers, so image->nearest(x, y) == image->get<Color4>(iFloor(x), iFloor(y)).

Note that this method uses pixel addressing, not texel addressing, so the lower-right edge of the image is at (width(), height()), not (1, 1)

See also
bilinear, get

◆ nearest() [2/2]

Color4 G3D::Image::nearest ( int  x,
int  y,
WrapMode  w = WrapMode::ERROR 
) const

Returns the nearest neighbor's pixel value, as in OpenGL's GL_NEAREST texture filter mode.

Values are considered to be at pixel centers, so image->nearest(x, y) == image->get<Color4>(iFloor(x), iFloor(y)).

Note that this method uses pixel addressing, not texel addressing, so the lower-right edge of the image is at (width(), height()), not (1, 1)

See also
bilinear, get

◆ operator=()

Image& G3D::Image::operator= ( const Image )
protected

◆ R()

float G3D::Image::R ( float  x) const
inlineprotected

◆ rotateCCW()

void G3D::Image::rotateCCW ( double  radians)

◆ rotateCW()

void G3D::Image::rotateCW ( double  radians)

◆ save()

void G3D::Image::save ( const String filename) const

Saves internal pixel data to file specified by filename.

Does not convert pixel format before saving. Throws string exception if failure.

◆ saveGIF()

static void G3D::Image::saveGIF ( const String filename,
const Array< shared_ptr< Image >> &  sequence,
const double &  fps 
)
static

Saves GIF of a sequence of images to file specified by filename/ The save is not lossy if the images are RGB8 format and have a palette size of at most 256 colros.

All images must have same width and height as specified by first image in sequence. Fails silently if empty sequence or 0 framerate. Throws string exception if failure.

◆ serialize()

void G3D::Image::serialize ( BinaryOutput bo,
ImageFileFormat  fileFormat 
) const

Saves internal pixel data to existing BinaryOutput bo.

Does not convert pixel format before saving.

◆ set() [1/10]

void G3D::Image::set ( const shared_ptr< PixelTransferBuffer > &  buffer)

Copies all elements from buffer, adjusting the size and format of this to match.

◆ set() [2/10]

void G3D::Image::set ( const shared_ptr< PixelTransferBuffer > &  buffer,
int  x,
int  y 
)

Copies only pixels from buffer to the specified location in the image.

Does not adjust the size nor format of this to match

◆ set() [3/10]

void G3D::Image::set ( const Point2int32 pos,
const Color4 color 
)

◆ set() [4/10]

void G3D::Image::set ( const Point2int32 pos,
const Color3 color 
)

◆ set() [5/10]

void G3D::Image::set ( const Point2int32 pos,
const Color1 color 
)

◆ set() [6/10]

void G3D::Image::set ( const Point2int32 pos,
const Color4unorm8 color 
)

◆ set() [7/10]

void G3D::Image::set ( const Point2int32 pos,
const Color3unorm8 color 
)

◆ set() [8/10]

void G3D::Image::set ( const Point2int32 pos,
const Color1unorm8 color 
)

◆ set() [9/10]

template<class ValueType >
void G3D::Image::set ( Point2int32  pos,
const ValueType &  v,
WrapMode  wrap 
)
inline

Slower than the other set methods.

◆ set() [10/10]

template<class ValueType >
void G3D::Image::set ( int  x,
int  y,
const ValueType &  v,
WrapMode  wrap = WrapMode::ERROR 
)
inline

◆ setAll() [1/6]

void G3D::Image::setAll ( const Color4 color)

◆ setAll() [2/6]

void G3D::Image::setAll ( const Color3 color)

◆ setAll() [3/6]

void G3D::Image::setAll ( const Color1 color)

◆ setAll() [4/6]

void G3D::Image::setAll ( const Color4unorm8 color)

◆ setAll() [5/6]

void G3D::Image::setAll ( const Color3unorm8 color)

◆ setAll() [6/6]

void G3D::Image::setAll ( const Color1unorm8 color)

◆ setSize()

void G3D::Image::setSize ( int  w,
int  h,
const ImageFormat fmt = ImageFormat::AUTO() 
)

The contents are undefined after resize.

Does not resize if the width, height, and format are unchanged.

Parameters
fmtIf ImageFormat::AUTO(), then the current format is retained

◆ toPixelTransferBuffer() [1/2]

shared_ptr<PixelTransferBuffer> G3D::Image::toPixelTransferBuffer ( ) const

Extracts a copy of the pixel data.

◆ toPixelTransferBuffer() [2/2]

shared_ptr<PixelTransferBuffer> G3D::Image::toPixelTransferBuffer ( Rect2D  rect,
shared_ptr< PixelTransferBuffer ptb = nullptr 
) const

Extracts a copy of the pixel data within the specified rectangle.

Parameters
ptbIf non-null, must have the matching size and format.

◆ width()

int G3D::Image::width ( ) const

Width in pixels.

Referenced by bounds(), forEachPixel(), get(), and set().

Friends And Related Function Documentation

◆ CubeMap

friend class CubeMap
friend

Member Data Documentation

◆ m_format

const ImageFormat* G3D::Image::m_format
protected

◆ m_image

fipImage* G3D::Image::m_image
protected

◆ s_freeImageMutex

std::mutex G3D::Image::s_freeImageMutex
staticprotected

Ensures that FreeImage is not initialized on multiple threads simultaneously.


documentation generated on Wed Nov 24 2021 08:01:57 using doxygen 1.8.15