Blender V4.5
libocio_display.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "libocio_display.hh"
6
7#if defined(WITH_OPENCOLORIO)
8
9# include "BLI_index_range.hh"
10
11# include "OCIO_config.hh"
12
13# include "../opencolorio.hh"
14
15# include "error_handling.hh"
16# include "libocio_config.hh"
19
20namespace blender::ocio {
21
22LibOCIODisplay::LibOCIODisplay(const int index, const LibOCIOConfig &config) : config_(&config)
23{
24 const OCIO_NAMESPACE::ConstConfigRcPtr &ocio_config = config.get_ocio_config();
25
26 this->index = index;
27
28 name_ = ocio_config->getDisplay(index);
29
30 /* Initialize views. */
31 const int num_views = ocio_config->getNumViews(name_.c_str());
32 if (num_views < 0) {
33 report_error("Invalid OpenColorIO configuration: negative number of views");
34 return;
35 }
36 views_.reserve(num_views);
37 for (const int view_index : IndexRange(num_views)) {
38 const char *view_name = ocio_config->getView(name_.c_str(), view_index);
39 views_.append_as(view_index, view_name);
40 }
41}
42
43const View *LibOCIODisplay::get_view_by_name(const StringRefNull name) const
44{
45 /* TODO(sergey): Is there faster way to lookup Blender-side view? */
46 for (const LibOCIOView &view : views_) {
47 if (view.name() == name) {
48 return &view;
49 }
50 }
51 return nullptr;
52}
53
54int LibOCIODisplay::get_num_views() const
55{
56 return views_.size();
57}
58
59const View *LibOCIODisplay::get_view_by_index(const int index) const
60{
61 if (index < 0 || index >= views_.size()) {
62 return nullptr;
63 }
64 return &views_[index];
65}
66
67const CPUProcessor *LibOCIODisplay::get_to_scene_linear_cpu_processor() const
68{
69 return to_scene_linear_cpu_processor_.get([&]() -> std::unique_ptr<CPUProcessor> {
70 DisplayParameters display_parameters;
71 display_parameters.from_colorspace = OCIO_NAMESPACE::ROLE_SCENE_LINEAR;
72 display_parameters.view = get_default_view()->name();
73 display_parameters.display = name_;
74 display_parameters.inverse = true;
75 OCIO_NAMESPACE::ConstProcessorRcPtr ocio_processor = create_ocio_display_processor(
76 *config_, display_parameters);
77 if (!ocio_processor) {
78 return nullptr;
79 }
80
81 OCIO_NAMESPACE::ConstCPUProcessorRcPtr ocio_cpu_processor =
82 ocio_processor->getDefaultCPUProcessor();
83 if (!ocio_cpu_processor) {
84 return nullptr;
85 }
86
87 return std::make_unique<LibOCIOCPUProcessor>(ocio_cpu_processor);
88 });
89}
90
91const CPUProcessor *LibOCIODisplay::get_from_scene_linear_cpu_processor() const
92{
93 return from_scene_linear_cpu_processor_.get([&]() -> std::unique_ptr<CPUProcessor> {
94 DisplayParameters display_parameters;
95 display_parameters.from_colorspace = OCIO_NAMESPACE::ROLE_SCENE_LINEAR;
96 display_parameters.view = get_default_view()->name();
97 display_parameters.display = name_;
98 OCIO_NAMESPACE::ConstProcessorRcPtr ocio_processor = create_ocio_display_processor(
99 *config_, display_parameters);
100 if (!ocio_processor) {
101 return nullptr;
102 }
103
104 OCIO_NAMESPACE::ConstCPUProcessorRcPtr ocio_cpu_processor =
105 ocio_processor->getDefaultCPUProcessor();
106 if (!ocio_cpu_processor) {
107 return nullptr;
108 }
109
110 return std::make_unique<LibOCIOCPUProcessor>(ocio_cpu_processor);
111 });
112}
113
114} // namespace blender::ocio
115
116#endif
static AppView * view
static void View(GHOST_IWindow *window, bool stereo, int eye=0)