DYT/Tool/OpenSceneGraph-3.6.5/include/OpenEXR/ImfContextInit.h
2024-12-25 07:49:36 +08:00

149 lines
4.1 KiB
C++

//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Contributors to the OpenEXR Project.
//
#ifndef INCLUDED_IMF_CONTEXT_INIT_H
#define INCLUDED_IMF_CONTEXT_INIT_H
#include "ImfForward.h"
#include "openexr.h"
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
/// @brief ContextInitializer provides a basic type
/// to initialize a Context with.
///
/// A context fundamentally represents an EXR file of some sort
/// (reading a file, reading a stream, etc.)
class IMF_EXPORT_TYPE ContextInitializer
{
enum class ContextFileType
{
READ,
WRITE,
READ_WRITE,
TEMP
};
public:
ContextInitializer& setErrorHandler (exr_error_handler_cb_t errfn) noexcept
{
_initializer.error_handler_fn = errfn;
return *this;
}
ContextInitializer& setAllocationFunctions (
exr_memory_allocation_func_t allocfn,
exr_memory_free_func_t freefn) noexcept
{
_initializer.alloc_fn = allocfn;
_initializer.free_fn = freefn;
return *this;
}
IMF_EXPORT
ContextInitializer& setInputStream (IStream* istr);
IMF_EXPORT
ContextInitializer& setOutputStream (OStream* ostr);
ContextInitializer& setCustomInputIO (
void* user,
exr_read_func_ptr_t readfn,
exr_query_size_func_ptr_t sizefn,
exr_destroy_stream_func_ptr_t destroyfn) noexcept
{
_initializer.user_data = user;
_initializer.read_fn = readfn;
_initializer.size_fn = sizefn;
_initializer.destroy_fn = destroyfn;
_ctxt_type = ContextFileType::READ;
return *this;
}
ContextInitializer& setCustomOutputIO (
void* user,
exr_write_func_ptr_t writefn,
exr_destroy_stream_func_ptr_t destroyfn,
exr_read_func_ptr_t readfn = nullptr,
exr_query_size_func_ptr_t sizefn = nullptr) noexcept
{
_initializer.user_data = user;
_initializer.read_fn = readfn;
_initializer.size_fn = sizefn;
_initializer.write_fn = writefn;
_initializer.destroy_fn = destroyfn;
_ctxt_type = (readfn) ? ContextFileType::READ_WRITE
: ContextFileType::WRITE;
return *this;
}
ContextInitializer& setMaxImageSize (int w, int h) noexcept
{
_initializer.max_image_width = w;
_initializer.max_image_height = h;
return *this;
}
ContextInitializer& setMaxTileSize (int w, int h) noexcept
{
_initializer.max_tile_width = w;
_initializer.max_tile_height = h;
return *this;
}
ContextInitializer& setZipLevel (int zl) noexcept
{
_initializer.zip_level = zl;
return *this;
}
ContextInitializer& setDWAQuality (float dq) noexcept
{
_initializer.dwa_quality = dq;
return *this;
}
ContextInitializer& strictHeaderValidation (bool onoff) noexcept
{
setFlag (EXR_CONTEXT_FLAG_STRICT_HEADER, onoff);
return *this;
}
ContextInitializer& silentHeaderParse (bool onoff) noexcept
{
setFlag (EXR_CONTEXT_FLAG_SILENT_HEADER_PARSE, onoff);
return *this;
}
ContextInitializer& disableChunkReconstruction (bool onoff) noexcept
{
setFlag (EXR_CONTEXT_FLAG_DISABLE_CHUNK_RECONSTRUCTION, onoff);
return *this;
}
ContextInitializer& writeLegacyHeader (bool onoff) noexcept
{
setFlag (EXR_CONTEXT_FLAG_WRITE_LEGACY_HEADER, onoff);
return *this;
}
private:
void setFlag (const int flag, bool onoff)
{
_initializer.flags =
(_initializer.flags & ~(flag)) | (onoff ? flag : 0);
}
friend class Context;
exr_context_initializer_t _initializer = EXR_DEFAULT_CONTEXT_INITIALIZER;
ContextFileType _ctxt_type = ContextFileType::TEMP;
IStream* _prov_stream = nullptr;
}; // class ContextInitializer
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
#endif // INCLUDED_IMF_CONTEXT_INIT_H