149 lines
4.1 KiB
C
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
|