Coverage Report

Created: 2025-07-16 07:53

/usr/local/include/OpenEXR/ImfContextInit.h
Line
Count
Source (jump to first uncovered line)
1
//
2
// SPDX-License-Identifier: BSD-3-Clause
3
// Copyright (c) Contributors to the OpenEXR Project.
4
//
5
6
#ifndef INCLUDED_IMF_CONTEXT_INIT_H
7
#define INCLUDED_IMF_CONTEXT_INIT_H
8
9
#include "ImfForward.h"
10
11
#include "openexr.h"
12
13
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
14
15
/// @brief ContextInitializer provides a basic type
16
/// to initialize a Context with.
17
///
18
/// A context fundamentally represents an EXR file of some sort
19
/// (reading a file, reading a stream, etc.)
20
class IMF_EXPORT_TYPE ContextInitializer
21
{
22
    enum class ContextFileType
23
    {
24
        READ,
25
        WRITE,
26
        READ_WRITE,
27
        TEMP
28
    };
29
30
public:
31
    ContextInitializer& setErrorHandler (exr_error_handler_cb_t errfn) noexcept
32
0
    {
33
0
        _initializer.error_handler_fn = errfn;
34
0
        return *this;
35
0
    }
36
37
    ContextInitializer& setAllocationFunctions (
38
        exr_memory_allocation_func_t allocfn,
39
        exr_memory_free_func_t       freefn) noexcept
40
0
    {
41
0
        _initializer.alloc_fn = allocfn;
42
0
        _initializer.free_fn  = freefn;
43
0
        return *this;
44
0
    }
45
46
    IMF_EXPORT
47
    ContextInitializer& setInputStream (IStream* istr);
48
    IMF_EXPORT
49
    ContextInitializer& setOutputStream (OStream* ostr);
50
51
    ContextInitializer& setCustomInputIO (
52
        void*                         user,
53
        exr_read_func_ptr_t           readfn,
54
        exr_query_size_func_ptr_t     sizefn,
55
        exr_destroy_stream_func_ptr_t destroyfn) noexcept
56
0
    {
57
0
        _initializer.user_data  = user;
58
0
        _initializer.read_fn    = readfn;
59
0
        _initializer.size_fn    = sizefn;
60
0
        _initializer.destroy_fn = destroyfn;
61
0
        _ctxt_type              = ContextFileType::READ;
62
0
        return *this;
63
0
    }
64
65
    ContextInitializer& setCustomOutputIO (
66
        void*                         user,
67
        exr_write_func_ptr_t          writefn,
68
        exr_destroy_stream_func_ptr_t destroyfn,
69
        exr_read_func_ptr_t           readfn = nullptr,
70
        exr_query_size_func_ptr_t     sizefn = nullptr) noexcept
71
0
    {
72
0
        _initializer.user_data  = user;
73
0
        _initializer.read_fn    = readfn;
74
0
        _initializer.size_fn    = sizefn;
75
0
        _initializer.write_fn   = writefn;
76
0
        _initializer.destroy_fn = destroyfn;
77
0
        _ctxt_type              = (readfn) ? ContextFileType::READ_WRITE
78
0
                                           : ContextFileType::WRITE;
79
0
        return *this;
80
0
    }
81
82
    ContextInitializer& setMaxImageSize (int w, int h) noexcept
83
0
    {
84
0
        _initializer.max_image_width  = w;
85
0
        _initializer.max_image_height = h;
86
0
        return *this;
87
0
    }
88
89
    ContextInitializer& setMaxTileSize (int w, int h) noexcept
90
0
    {
91
0
        _initializer.max_tile_width  = w;
92
0
        _initializer.max_tile_height = h;
93
0
        return *this;
94
0
    }
95
96
    ContextInitializer& setZipLevel (int zl) noexcept
97
0
    {
98
0
        _initializer.zip_level = zl;
99
0
        return *this;
100
0
    }
101
102
    ContextInitializer& setDWAQuality (float dq) noexcept
103
0
    {
104
0
        _initializer.dwa_quality = dq;
105
0
        return *this;
106
0
    }
107
108
    ContextInitializer& strictHeaderValidation (bool onoff) noexcept
109
    {
110
        setFlag (EXR_CONTEXT_FLAG_STRICT_HEADER, onoff);
111
        return *this;
112
    }
113
114
    ContextInitializer& silentHeaderParse (bool onoff) noexcept
115
    {
116
        setFlag (EXR_CONTEXT_FLAG_SILENT_HEADER_PARSE, onoff);
117
        return *this;
118
    }
119
120
    ContextInitializer& disableChunkReconstruction (bool onoff) noexcept
121
    {
122
        setFlag (EXR_CONTEXT_FLAG_DISABLE_CHUNK_RECONSTRUCTION, onoff);
123
        return *this;
124
    }
125
126
    ContextInitializer& writeLegacyHeader (bool onoff) noexcept
127
0
    {
128
0
        setFlag (EXR_CONTEXT_FLAG_WRITE_LEGACY_HEADER, onoff);
129
0
        return *this;
130
0
    }
131
132
private:
133
    void setFlag (const int flag, bool onoff)
134
    {
135
        _initializer.flags =
136
            (_initializer.flags & ~(flag)) | (onoff ? flag : 0);
137
    }
138
139
    friend class Context;
140
141
    exr_context_initializer_t _initializer = EXR_DEFAULT_CONTEXT_INITIALIZER;
142
    ContextFileType           _ctxt_type   = ContextFileType::TEMP;
143
    IStream*                  _prov_stream = nullptr;
144
}; // class ContextInitializer
145
146
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
147
148
#endif // INCLUDED_IMF_CONTEXT_INIT_H