HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
OpenColorAppHelpers.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: BSD-3-Clause
2 // Copyright Contributors to the OpenColorIO Project.
3 
4 
5 #ifndef INCLUDED_OCIO_OPENCOLORAPPHELPERS_H
6 #define INCLUDED_OCIO_OPENCOLORAPPHELPERS_H
7 
8 #include "OpenColorTypes.h"
9 
10 #ifndef OCIO_NAMESPACE
11 #error This header cannot be used directly. Use <OpenColorIO/OpenColorIO.h> instead.
12 #endif
13 
14 
15 namespace OCIO_NAMESPACE
16 {
17 
18 /**
19  * Parameters controlling which color spaces appear in menus.
20  *
21  * The ColorSpaceMenuHelper class is intended to be used by applications to get the list of items
22  * to show in color space menus.
23  *
24  * The ColorSpaceMenuParameters class is used to configure the behavior as needed for any given
25  * menu. Here is the algorithm used to produce a list of "items" (or strings) that will appear in
26  * a menu:
27  *
28  * 1) Use setRole to identify a role that controls a given menu. If the config has this role,
29  * then only that color space is returned. The name is set to the color space name, the UIName
30  * is presented as "<role name> (<color space name>)". It may be useful for the application to
31  * then grey-out the menu or otherwise indicate to the user that the value for this menu is not
32  * user selectable since it was pre-determined by the config. If the config does not have that
33  * role, the algorithm continues to the remaining steps.
34  *
35  * 2) The IncludeColorSpaces, SearchReferenceSpaceType, and IncludeNamedTransforms parameters are
36  * used to identify a set of items from the config that are potential candidates for use in the
37  * menu, as follows:
38  * - IncludeColorSpaces: Set to true to include color spaces in the menu.
39  * - SearchReferenceSpaceType: Use this to control whether the menu should include all color
40  * spaces, only display color spaces, or only non-display color spaces.
41  * - IncludeNamedTransforms: Set to true to include named transforms in the menu.
42  *
43  * 3) The set of items from step 2 is then filtered in step 3 using the following parameters:
44  * - AppCategories: A list of strings specified by the application based on the purpose of
45  * the menu. For example, if the menu is used to select a color space for importing an
46  * image, the application might specify the 'file-io' category, whereas if it is to select
47  * a working color space, it might specify the 'working-space' category. Application
48  * developers should document what strings they are using for each menu so that config
49  * authors know what categories to use in their configs. Alternatively, an application
50  * could let advanced users customize the string to use for a given menu in the
51  * application.
52  * - Encodings: A list of strings used to further refine the items selected from the
53  * AppCategories. For example, an application might specify 'working-space' as the
54  * category and then specify 'scene-linear' as the encoding to only use items that have
55  * both of those properties (e.g., only select scene-linear working color spaces).
56  * - UserCategories: A list of strings specified by the end-user of the application. OCIO
57  * will check for these strings in an environment variable, or they may be passed in from
58  * the application.
59  *
60  * Basically the intent is for the filtering to return the intersection of the app categories,
61  * encoding, and user categories. However, some fall-backs are in place to ensure that the
62  * filtering does not remove all menu items. Here is the detailed description:
63  *
64  * 3a) The items from step 2 are filtered to generate a list of appItems containing only the ones
65  * that contain at least one of the AppCategories strings in their "categories" property and
66  * one of the encodings in their "encoding" property. If this list is empty, an attempt is
67  * made to generate a non-empty appItems list by only filtering by AppCategories. If that is
68  * empty, an attempt is made to only filter by Encodings.
69  *
70  * 3b) The items from step 2 are filtered to generate a list of userItems containing only the ones
71  * that have at least one of the UserCategories strings in their "categories" property.
72  *
73  * 3c) If both appItems and userItems are non-empty, a list of resultItems will be generated as
74  * the intersection of those two lists.
75  *
76  * 3d) If the resultItems list is empty, the appList will be expanded by only filtering by
77  * AppCategories and not encodings. The resultItems will be formed again as the intersection
78  * of the appItems and userItems.
79  *
80  * 3e) If the resultItems is still empty, it will be set to just the appItems from step 3a.
81  *
82  * 3f) If the resultItems is still empty, it will be set to just the userItems.
83  *
84  * 3g) If the resultItems is still empty, the items are not filtered and all items from step 2 are
85  * returned. The rationale is that if step 2 has produced any items, it is not acceptable for
86  * step 3 to remove all of them. An application usually expects to have a non-zero number of
87  * items to display in the menu. However, if step 2 produces no items (e.g. the application
88  * requests only named transforms and the config has no named transform), then no items will
89  * be returned.
90  *
91  *
92  * 4) If IncludeRoles is true, the items from step 3 are extended by including an item for each
93  * role. The name is set to the role name, the UIName is presented as "<role name> (<color
94  * space name>)", and the family is set to "Roles".
95  *
96  * 5) If AddColorSpace has been used to add any additional items, these are appended to the final
97  * list.
98  */
100 {
101 public:
102  static ColorSpaceMenuParametersRcPtr Create(ConstConfigRcPtr config);
103  /// Config is required to be able to create a ColorSpaceMenuHelper.
104  virtual void setConfig(ConstConfigRcPtr config) noexcept = 0;
105  virtual ConstConfigRcPtr getConfig() const noexcept = 0;
106 
107  /// If role is a valid role, other parameters are ignored and menu will contain only that role.
108  virtual void setRole(const char * role) noexcept = 0;
109  virtual const char * getRole() const noexcept = 0;
110 
111 
112  /**
113  * Include all color spaces (or not) to ColorSpaceMenuHelper. Default is to include color
114  * spaces.
115  */
116  virtual void setIncludeColorSpaces(bool include) noexcept = 0;
117  virtual bool getIncludeColorSpaces() const noexcept = 0;
118 
119  /**
120  * Can be used to restrict the search using the ReferenceSpaceType of the color spaces.
121  * It has no effect on roles and named transforms.
122  */
123  virtual SearchReferenceSpaceType getSearchReferenceSpaceType() const noexcept = 0;
124  virtual void setSearchReferenceSpaceType(SearchReferenceSpaceType colorSpaceType) noexcept = 0;
125 
126  /**
127  * Include all named transforms (or not) to ColorSpaceMenuHelper. Default is not to include
128  * named transforms.
129  */
130  virtual void setIncludeNamedTransforms(bool include) noexcept = 0;
131  virtual bool getIncludeNamedTransforms() const noexcept = 0;
132 
133 
134  /**
135  * App categories is a comma separated list of categories. If appCategories is not NULL and
136  * not empty, all color spaces that have one of the categories will be part of the menu.
137  */
138  virtual void setAppCategories(const char * appCategories) noexcept = 0;
139  virtual const char * getAppCategories() const noexcept = 0;
140 
141  /**
142  * Encodings is a comma separated list of encodings. When not empty, is retricting the search
143  * to color spaces that are using one of the encodings.
144  */
145  virtual void setEncodings(const char * encodings) noexcept = 0;
146  virtual const char * getEncodings() const noexcept = 0;
147 
148  /**
149  * User categories is a comma separated list of categories. If OCIO_USER_CATEGORIES_ENVVAR
150  * env. variable is defined and not empty, this parameter is ignored and the value of the
151  * env. variable is used for user categories.
152  */
153  virtual void setUserCategories(const char * userCategories) noexcept = 0;
154  virtual const char * getUserCategories() const noexcept = 0;
155 
156 
157  /**
158  * Include all roles (or not) to ColorSpaceMenuHelper. Default is not to include roles.
159  * Roles are added after color spaces with an single hierarchy level named "Roles".
160  */
161  virtual void setIncludeRoles(bool include) noexcept = 0;
162  virtual bool getIncludeRoles() const noexcept = 0;
163 
164  /**
165  * Add an additional color space (or named transform) to the menu.
166  *
167  * Note that an additional color space could be:
168  * * an inactive color space,
169  * * an active color space not having at least one of the selected categories,
170  * * a newly created color space.
171  * Will throw when creating the menu if color space is not part of the config. Nothing is done
172  * if it is already part of the menu.
173  * It's ok to call this multiple times with the same color space, it will only be added to the
174  * menu once. If a role name is passed in, the name in the menu will be the color space name
175  * the role points to.
176  */
177  virtual void addColorSpace(const char * name) noexcept = 0;
178 
179  virtual size_t getNumAddedColorSpaces() const noexcept = 0;
180  virtual const char * getAddedColorSpace(size_t index) const noexcept = 0;
181  virtual void clearAddedColorSpaces() noexcept = 0;
182 
183  /// Do not use (needed only for pybind11).
184  virtual ~ColorSpaceMenuParameters() = default;
185 };
186 
187 extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const ColorSpaceMenuParameters &);
188 
189 /**
190  * Helper class to create menus for the content of a config.
191  *
192  * Menu can list color spaces, roles, named transforms. Each entry has a name, a UI name, a
193  * description, and a family. Family can also be accessed as hierarchy levels; levels are created
194  * by splitting the family using the 'family separator'. Hierarchy levels are meant to be used as
195  * sub-menus.
196  *
197  * The UI name is what is intended to be put in application menus seen by the end-user. However,
198  * please note that the UI name is not guaranteed to remain stable between releases and so if
199  * applications need to save something it should be the 'name' rather than the 'UI name'.
200  * Currently, the only difference between the 'name' and 'UI name' is for roles.
201  *
202  * The overall ordering of items is: color spaces, named transforms, roles, and additional color
203  * spaces. The display color spaces will either come before or after the other color spaces based
204  * on where that block of spaces appears in the config. The order of items returned by the menu
205  * helper preserves the order of items in the config itself for each type of elements, thus
206  * preserving the intent of the config author. For example, if you call getName at idx
207  * and idx+1, the name returned at idx+1 will be from farther down in the config than the one at
208  * idx as long as both are of the same type. (An application may ask for only the items in one
209  * of those blocks if it wants to handle them separately.) If the application makes use of
210  * hierarchical menus, that will obviously impose a different order on what the user sees in the
211  * menu. Though even with hierarchical menus, applications should try to preserve config ordering
212  * (which is equivalent to index ordering) for items within the same sub-menu.
213  */
215 {
216 public:
218 
219  /// Access to the color spaces (or roles).
220  virtual size_t getNumColorSpaces() const noexcept = 0;
221  /**
222  * Get the color space (or role) name used in the config for this menu item. Will be empty
223  * if the index is out of range.
224  */
225  virtual const char * getName(size_t idx) const noexcept = 0;
226  /**
227  * Get the name to use in the menu UI. This might be different from the config name, for
228  * example in the case of roles. Will be empty if the index is out of range.
229  */
230  virtual const char * getUIName(size_t idx) const noexcept = 0;
231 
232  /**
233  * Get the index of the element of a given name. Return (size_t)-1 name if NULL or empty, or if
234  * no element with that name is found.
235  */
236  virtual size_t getIndexFromName(const char * name) const noexcept = 0;
237  virtual size_t getIndexFromUIName(const char * name) const noexcept = 0;
238 
239  virtual const char * getDescription(size_t idx) const noexcept = 0;
240  virtual const char * getFamily(size_t idx) const noexcept = 0;
241 
242  /**
243  * Hierarchy levels are created from the family string. It is split into levels using the
244  * 'family separator'.
245  */
246  virtual size_t getNumHierarchyLevels(size_t idx) const noexcept = 0;
247  virtual const char * getHierarchyLevel(size_t idx, size_t i) const noexcept = 0;
248 
249  /// Get the color space name from the UI name.
250  virtual const char * getNameFromUIName(const char * uiName) const noexcept = 0;
251  /// Get the color space UI name from the name.
252  virtual const char * getUINameFromName(const char * name) const noexcept = 0;
253 
254  ColorSpaceMenuHelper(const ColorSpaceMenuHelper &) = delete;
256 
257  /// Do not use (needed only for pybind11).
258  virtual ~ColorSpaceMenuHelper() = default;
259 
260 protected:
261  ColorSpaceMenuHelper() = default;
262 };
263 
264 extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const ColorSpaceMenuHelper &);
265 
266 namespace ColorSpaceHelpers
267 {
268 /**
269  * Add a new color space to the config instance. The output of the userTransform must be in the
270  * specified connectionColorSpace.
271  *
272  * Note: If the config does not already use categories, we do not add them since that would
273  * make a big change to how existing color spaces show up in menus.
274  */
275 extern OCIOEXPORT void AddColorSpace(ConfigRcPtr & config,
276  const char * name,
277  const char * transformFilePath,
278  const char * categories, // Could be null or empty.
279  const char * connectionColorSpaceName);
280 
281 } // ColorSpaceHelpers
282 
283 namespace DisplayViewHelpers
284 {
285 
286 /**
287  * Get the processor from the working color space to (display, view) pair (forward) or (display,
288  * view) pair to working (inverse). The working color space name could be a role name or a color
289  * space name. ChannelView can be empty. If not already present, each of these functions adds
290  * ExposureContrastTransforms to enable changing exposure, contrast, and gamma after the processor
291  * has been created using dynamic properties.
292  */
294  const ConstContextRcPtr & context,
295  const char * workingName,
296  const char * displayName,
297  const char * viewName,
298  const ConstMatrixTransformRcPtr & channelView,
300 
302  const char * workingName,
303  const char * displayName,
304  const char * viewName,
305  const ConstMatrixTransformRcPtr & channelView,
306  TransformDirection direction);
307 
308 /// Get an identity processor containing only the ExposureContrastTransforms.
310 
311 /**
312  * Add a new (display, view) pair and the new color space to a configuration instance.
313  * The input to the userTransform must be in the specified connectionColorSpace.
314  */
315 extern OCIOEXPORT void AddDisplayView(ConfigRcPtr & config,
316  const char * displayName,
317  const char * viewName,
318  const char * lookDefinition, // Could be empty or null
319  const char * colorSpaceName, // Could be empty or null
320  const char * colorSpaceFamily, // Could be empty or null
321  const char * colorSpaceDescription, // Could be empty or null
322  const char * categories, // Could be empty or null
323  const char * transformFilePath,
324  const char * connectionColorSpaceName);
325 
326 /**
327  * Remove a (display, view) pair including the associated color space (only if not used).
328  * Note that the view is always removed but the display is only removed if empty.
329  */
330 extern OCIOEXPORT void RemoveDisplayView(ConfigRcPtr & config,
331  const char * displayName,
332  const char * viewName);
333 
334 } // DisplayViewHelpers
335 
336 
337 /**
338  * Whereas the DisplayViewTransform simply applies a specific view from an OCIO display, the
339  * LegacyViewingPipeline provides an example of a complete viewing pipeline of the sort that could
340  * be used to implement a viewport in a typical application. It therefore adds, around the
341  * DisplayViewTransform, various optional color correction steps and RGBA channel view swizzling.
342  * The direction of the DisplayViewTranform is used as the direction of the pipeline.
343  * Note: The LegacyViewingPipeline class provides the same functionality as the OCIO v1
344  * DisplayTransform.
345  *
346  * Legacy viewing pipeline:
347  * * Start in display transform input color space.
348  * * If linearCC is provided:
349  * * Go to scene_linear colorspace.
350  * * Apply linearCC transform.
351  * * If colorTimingCC is provided:
352  * * Go to color_timing colorspace.
353  * * Apply colorTimingCC transform.
354  * * Apply looks (from display transform or from looks override).
355  * * Go to first look color space.
356  * * Apply first look transform.
357  * * Iterate for all looks.
358  * * Apply channelView transform.
359  * * Apply display transform (without looks).
360  * * Apply displayCC.
361  * Note that looks are applied even if the display transform involves data color spaces.
362  */
364 {
365 public:
366  static LegacyViewingPipelineRcPtr Create();
367 
368  virtual ConstDisplayViewTransformRcPtr getDisplayViewTransform() const noexcept = 0;
369  virtual void setDisplayViewTransform(const ConstDisplayViewTransformRcPtr & dt) noexcept = 0;
370 
371  virtual ConstTransformRcPtr getLinearCC() const noexcept = 0;
372  virtual void setLinearCC(const ConstTransformRcPtr & cc) noexcept = 0;
373 
374  virtual ConstTransformRcPtr getColorTimingCC() const noexcept = 0;
375  virtual void setColorTimingCC(const ConstTransformRcPtr & cc) noexcept = 0;
376 
377  virtual ConstTransformRcPtr getChannelView() const noexcept = 0;
378  virtual void setChannelView(const ConstTransformRcPtr & transform) noexcept = 0;
379 
380  virtual ConstTransformRcPtr getDisplayCC() const noexcept = 0;
381  virtual void setDisplayCC(const ConstTransformRcPtr & cc) noexcept = 0;
382 
383  /**
384  * Specify whether the lookOverride should be used, or not. This is a separate flag, as
385  * it's often useful to override "looks" to an empty string.
386  */
387  virtual void setLooksOverrideEnabled(bool enable) = 0;
388  virtual bool getLooksOverrideEnabled() const = 0;
389 
390  /**
391  * A user can optionally override the looks that are, by default, used with the expected
392  * display / view combination. A common use case for this functionality is in an image
393  * viewing app, where per-shot looks are supported. If for some reason a per-shot look is
394  * not defined for the current Context, the Config::getProcessor fcn will not succeed by
395  * default. Thus, with this mechanism the viewing app could override to looks = "", and
396  * this will allow image display to continue (though hopefully) the interface would reflect
397  * this fallback option.
398  *
399  * Looks is a potentially comma (or colon) delimited list of lookNames, where +/- prefixes
400  * are optionally allowed to denote forward/inverse look specification (and forward is
401  * assumed in the absence of either).
402  */
403  virtual void setLooksOverride(const char * looks) = 0;
404  virtual const char * getLooksOverride() const = 0;
405 
406  virtual ConstProcessorRcPtr getProcessor(const ConstConfigRcPtr & config,
407  const ConstContextRcPtr & context) const = 0;
408 
409  virtual ConstProcessorRcPtr getProcessor(const ConstConfigRcPtr & config) const = 0;
410 
413 
414  /// Do not use (needed only for pybind11).
415  virtual ~LegacyViewingPipeline() = default;
416 
417 protected:
418  LegacyViewingPipeline() = default;
419 };
420 
421 extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const LegacyViewingPipeline &);
422 
423 /**
424  * The MixingSlider and MixingColorSpaceManager classes are to help applications implement correct
425  * color pickers. The term "color mixing" is used here to describe what is done in a typical
426  * application "color picker" user interface.
427  *
428  * A user may want to mix colors in different color spaces. The two most common mixing space
429  * options are a scene-linear working space or the display space.
430  *
431  * Since scene-linear color spaces are not perceptually uniform, it is necessary to compensate UI
432  * widgets such as sliders. For example, it is nice if mid-gray falls near the center of mixing
433  * controls rather than way over near the black end. This may be done by using a mapping from
434  * linear into an approximately perceptually uniform space.
435  *
436  * Also note that a color picking/mixing UI may want to present a given color space in several
437  * different encodings. The most common two encodings for color mixing are RGB and HSV.
438  *
439  * Note that these helpers anticipate that a user may want to mix colors using values that extend
440  * outside the typical [0,1] domain.
441  */
443 {
444 public:
445  /// Set the minimum edge of a UI slider for conversion to mixing space.
446  virtual void setSliderMinEdge(float sliderMixingMinEdge) noexcept = 0;
447 
448  /// Minimum edge of a UI slider for conversion to mixing space.
449  virtual float getSliderMinEdge() const noexcept = 0;
450 
451  /// Set the maximum edge of a UI slider for conversion to mixing space.
452  virtual void setSliderMaxEdge(float sliderMixingMaxEdge) noexcept = 0;
453 
454  /// Maximum edge of a UI slider for conversion to mixing space.
455  virtual float getSliderMaxEdge() const noexcept = 0;
456 
457  /// Convert from units in distance along the slider to mixing space units.
458  virtual float sliderToMixing(float sliderUnits) const noexcept = 0;
459 
460  /// Convert from mixing space units to distance along the slider.
461  virtual float mixingToSlider(float mixingUnits) const noexcept = 0;
462 
463  MixingSlider(const MixingSlider &) = delete;
464  MixingSlider & operator=(const MixingSlider &) = delete;
465 
466  /// Do not use (needed only for pybind11).
467  virtual ~MixingSlider() = default;
468 
469 protected:
470  MixingSlider() = default;
471 };
472 
473 extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const MixingSlider &);
474 
475 /**
476  * Used to mix (or pick/choose) colors.
477  */
479 {
480 public:
481 
482  static MixingColorSpaceManagerRcPtr Create(ConstConfigRcPtr & config);
483 
484  /// Access to the mixing spaces.
485  virtual size_t getNumMixingSpaces() const noexcept = 0;
486  virtual const char * getMixingSpaceUIName(size_t idx) const = 0;
487  virtual size_t getSelectedMixingSpaceIdx() const noexcept = 0;
488  virtual void setSelectedMixingSpaceIdx(size_t idx) = 0;
489  virtual void setSelectedMixingSpace(const char * mixingSpace) = 0;
490 
491  virtual bool isPerceptuallyUniform() const noexcept = 0;
492 
493  /// Access to the mixing encodings.
494  virtual size_t getNumMixingEncodings() const noexcept = 0;
495  virtual const char * getMixingEncodingName(size_t idx) const = 0;
496  virtual size_t getSelectedMixingEncodingIdx() const noexcept = 0;
497  virtual void setSelectedMixingEncodingIdx(size_t idx) = 0;
498  virtual void setSelectedMixingEncoding(const char * mixingEncoding) = 0;
499 
500  /// Refresh the instance (i.e. needed following a configuration change for example).
501  virtual void refresh(ConstConfigRcPtr config) = 0;
502 
503  virtual ConstProcessorRcPtr getProcessor(const char * workingName,
504  const char * displayName,
505  const char * viewName,
506  TransformDirection direction) const = 0;
507 
508  virtual MixingSlider & getSlider() noexcept = 0;
509  virtual MixingSlider & getSlider(float sliderMixingMinEdge,
510  float sliderMixingMaxEdge) noexcept = 0;
511 
514 
515  /// Do not use (needed only for pybind11).
516  virtual ~MixingColorSpaceManager() = default;
517 
518 protected:
519  MixingColorSpaceManager() = default;
520 };
521 
522 extern OCIOEXPORT std::ostream & operator<<(std::ostream &, const MixingColorSpaceManager &);
523 
524 } // namespace OCIO_NAMESPACE
525 
526 #endif // INCLUDED_OCIO_OPENCOLORAPPHELPERS_H
OCIOEXPORT void AddDisplayView(ConfigRcPtr &config, const char *displayName, const char *viewName, const char *lookDefinition, const char *colorSpaceName, const char *colorSpaceFamily, const char *colorSpaceDescription, const char *categories, const char *transformFilePath, const char *connectionColorSpaceName)
PXL_API const char * getDescription(const ColorSpace *space)
Return the description of the color space.
OCIOEXPORT void RemoveDisplayView(ConfigRcPtr &config, const char *displayName, const char *viewName)
IMF_EXPORT IMATH_NAMESPACE::V3f direction(const IMATH_NAMESPACE::Box2i &dataWindow, const IMATH_NAMESPACE::V2f &pixelPosition)
OCIO_SHARED_PTR< ColorSpaceMenuParameters > ColorSpaceMenuParametersRcPtr
OCIO_SHARED_PTR< const Transform > ConstTransformRcPtr
#define OCIO_NAMESPACE
Definition: OpenColorABI.h:8
OCIO_SHARED_PTR< LegacyViewingPipeline > LegacyViewingPipelineRcPtr
OCIOEXPORT ConstProcessorRcPtr GetProcessor(const ConstConfigRcPtr &config, const ConstContextRcPtr &context, const char *workingName, const char *displayName, const char *viewName, const ConstMatrixTransformRcPtr &channelView, TransformDirection direction)
OCIO_SHARED_PTR< const ColorSpaceMenuParameters > ConstColorSpaceMenuParametersRcPtr
OCIO_SHARED_PTR< const Context > ConstContextRcPtr
OCIOEXPORT ConstProcessorRcPtr GetIdentityProcessor(const ConstConfigRcPtr &config)
Get an identity processor containing only the ExposureContrastTransforms.
PXL_API const char * getName(const ColorSpace *space)
Return the name of the color space.
OCIO_SHARED_PTR< MixingColorSpaceManager > MixingColorSpaceManagerRcPtr
OCIOEXPORT void AddColorSpace(ConfigRcPtr &config, const char *name, const char *transformFilePath, const char *categories, const char *connectionColorSpaceName)
#define OCIOEXPORT
Definition: OpenColorABI.h:67
OCIO_SHARED_PTR< const Processor > ConstProcessorRcPtr
GLuint const GLchar * name
Definition: glcorearb.h:786
GA_API const UT_StringHolder transform
OCIO_SHARED_PTR< const DisplayViewTransform > ConstDisplayViewTransformRcPtr
OCIO_SHARED_PTR< ColorSpaceMenuHelper > ColorSpaceMenuHelperRcPtr
OCIO_SHARED_PTR< const Config > ConstConfigRcPtr
OCIO_SHARED_PTR< const MatrixTransform > ConstMatrixTransformRcPtr
OCIO_SHARED_PTR< Config > ConfigRcPtr
LeafData & operator=(const LeafData &)=delete
GLuint index
Definition: glcorearb.h:786
OCIOEXPORT std::ostream & operator<<(std::ostream &, const ColorSpaceMenuParameters &)