2022-02-10 22:07:11 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
* Copyright 2012 Blender Foundation. All rights reserved. */
|
2012-09-15 10:03:17 +00:00
|
|
|
|
|
|
|
#ifndef __OCIO_CAPI_H__
|
|
|
|
#define __OCIO_CAPI_H__
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
OpenColorIO: upgrade to version 2.0.0
Ref T84819
Build System
============
This is an API breaking new version, and the updated code only builds with
OpenColorIO 2.0 and later. Adding backwards compatibility was too complicated.
* Tinyxml was replaced with Expat, adding a new dependency.
* Yaml-cpp is now built as a dependency on Unix, as was already done on Windows.
* Removed currently unused LCMS code.
* Pystring remains built as part of OCIO itself, since it has no good build system.
* Linux and macOS check for the OpenColorIO verison, and disable it if too old.
Ref D10270
Processors and Transforms
=========================
CPU processors now need to be created to do CPU processing. These are cached
internally, but the cache lookup is not fast enough to execute per pixel or
texture sample, so for performance these are now also exposed in the C API.
The C API for transforms will no longer be needed afer all changes, so remove
it to simplify the API and fallback implementation.
Ref D10271
Display Transforms
==================
Needs a bit more manual work constructing the transform. LegacyViewingPipeline
could also have been used, but isn't really any simpler and since it's legacy
we better not rely on it.
We moved more logic into the opencolorio module, to simplify the API. There is
no need to wrap a dozen functions just to be able to do this in C rather than C++.
It's also tightly coupled to the GPU shader logic, and so should be in the same
module.
Ref D10271
GPU Display Shader
==================
To avoid baking exposure and gamma into the GLSL shader and requiring slow
recompiles when tweaking, we manually apply them in the shader. This leads
to some logic duplicaton between the CPU and GPU display processor, but it
seems unavoidable.
Caching was also changed. Previously this was done both on the imbuf and
opencolorio module levels. Now it's all done in the opencolorio module by
simply matching color space names. We no longer use cacheIDs from OpenColorIO
since computing them is expensive, and they are unlikely to match now that
more is baked into the shader code.
Shaders can now use multiple 2D textures, 3D textures and uniforms, rather
than a single 3D texture. So allocating and binding those adds some code.
Color space conversions for blending with overlays is now hardcoded in the
shader. This was using harcoded numbers anyway, if this every becomes a
general OpenColorIO transform it can be changed, but for now there is no
point to add code complexity.
Ref D10273
CIE XYZ
=======
We need standard CIE XYZ values for rendering effects like blackbody emission.
The relation to the scene linear role is based on OpenColorIO configuration.
In OpenColorIO 2.0 configs roles can no longer have the same name as color
spaces, which means our XYZ role and colorspace in the configuration give an
error.
Instead use the new standard aces_interchange role, which relates scene linear
to a known scene referred color space. Compatibility with the old XYZ role is
preserved, if the configuration file has no conflicting names.
Also includes a non-functional change to the configuraton file to use an
XYZ-to-ACES matrix instead of REC709-to-ACES, makes debugging a little easier
since the matrix is the same one we have in the code now and that is also
found easily in the ACES specs.
Ref D10274
2021-01-31 18:35:00 +00:00
|
|
|
typedef struct OCIO_GPUShader OCIO_GPUShader;
|
2013-03-29 16:02:27 +00:00
|
|
|
|
2012-09-15 10:03:17 +00:00
|
|
|
#define OCIO_DECLARE_HANDLE(name) \
|
|
|
|
typedef struct name##__ { \
|
|
|
|
int unused; \
|
|
|
|
} * name
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2019-04-23 11:56:30 +00:00
|
|
|
#define OCIO_ROLE_DATA "data"
|
2012-10-05 10:05:26 +00:00
|
|
|
#define OCIO_ROLE_SCENE_LINEAR "scene_linear"
|
|
|
|
#define OCIO_ROLE_COLOR_PICKING "color_picking"
|
|
|
|
#define OCIO_ROLE_TEXTURE_PAINT "texture_paint"
|
|
|
|
#define OCIO_ROLE_DEFAULT_BYTE "default_byte"
|
|
|
|
#define OCIO_ROLE_DEFAULT_FLOAT "default_float"
|
|
|
|
#define OCIO_ROLE_DEFAULT_SEQUENCER "default_sequencer"
|
|
|
|
|
|
|
|
OCIO_DECLARE_HANDLE(OCIO_ConstConfigRcPtr);
|
|
|
|
OCIO_DECLARE_HANDLE(OCIO_ConstColorSpaceRcPtr);
|
|
|
|
OCIO_DECLARE_HANDLE(OCIO_ConstProcessorRcPtr);
|
OpenColorIO: upgrade to version 2.0.0
Ref T84819
Build System
============
This is an API breaking new version, and the updated code only builds with
OpenColorIO 2.0 and later. Adding backwards compatibility was too complicated.
* Tinyxml was replaced with Expat, adding a new dependency.
* Yaml-cpp is now built as a dependency on Unix, as was already done on Windows.
* Removed currently unused LCMS code.
* Pystring remains built as part of OCIO itself, since it has no good build system.
* Linux and macOS check for the OpenColorIO verison, and disable it if too old.
Ref D10270
Processors and Transforms
=========================
CPU processors now need to be created to do CPU processing. These are cached
internally, but the cache lookup is not fast enough to execute per pixel or
texture sample, so for performance these are now also exposed in the C API.
The C API for transforms will no longer be needed afer all changes, so remove
it to simplify the API and fallback implementation.
Ref D10271
Display Transforms
==================
Needs a bit more manual work constructing the transform. LegacyViewingPipeline
could also have been used, but isn't really any simpler and since it's legacy
we better not rely on it.
We moved more logic into the opencolorio module, to simplify the API. There is
no need to wrap a dozen functions just to be able to do this in C rather than C++.
It's also tightly coupled to the GPU shader logic, and so should be in the same
module.
Ref D10271
GPU Display Shader
==================
To avoid baking exposure and gamma into the GLSL shader and requiring slow
recompiles when tweaking, we manually apply them in the shader. This leads
to some logic duplicaton between the CPU and GPU display processor, but it
seems unavoidable.
Caching was also changed. Previously this was done both on the imbuf and
opencolorio module levels. Now it's all done in the opencolorio module by
simply matching color space names. We no longer use cacheIDs from OpenColorIO
since computing them is expensive, and they are unlikely to match now that
more is baked into the shader code.
Shaders can now use multiple 2D textures, 3D textures and uniforms, rather
than a single 3D texture. So allocating and binding those adds some code.
Color space conversions for blending with overlays is now hardcoded in the
shader. This was using harcoded numbers anyway, if this every becomes a
general OpenColorIO transform it can be changed, but for now there is no
point to add code complexity.
Ref D10273
CIE XYZ
=======
We need standard CIE XYZ values for rendering effects like blackbody emission.
The relation to the scene linear role is based on OpenColorIO configuration.
In OpenColorIO 2.0 configs roles can no longer have the same name as color
spaces, which means our XYZ role and colorspace in the configuration give an
error.
Instead use the new standard aces_interchange role, which relates scene linear
to a known scene referred color space. Compatibility with the old XYZ role is
preserved, if the configuration file has no conflicting names.
Also includes a non-functional change to the configuraton file to use an
XYZ-to-ACES matrix instead of REC709-to-ACES, makes debugging a little easier
since the matrix is the same one we have in the code now and that is also
found easily in the ACES specs.
Ref D10274
2021-01-31 18:35:00 +00:00
|
|
|
OCIO_DECLARE_HANDLE(OCIO_ConstCPUProcessorRcPtr);
|
2012-10-05 10:05:26 +00:00
|
|
|
OCIO_DECLARE_HANDLE(OCIO_ConstContextRcPtr);
|
|
|
|
OCIO_DECLARE_HANDLE(OCIO_PackedImageDesc);
|
2013-09-09 09:48:26 +00:00
|
|
|
OCIO_DECLARE_HANDLE(OCIO_ConstLookRcPtr);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2018-10-12 14:42:34 +00:00
|
|
|
/* Standard XYZ to linear sRGB transform, for fallback. */
|
|
|
|
static const float OCIO_XYZ_TO_LINEAR_SRGB[3][3] = {{3.2404542f, -0.9692660f, 0.0556434f},
|
|
|
|
{-1.5371385f, 1.8760108f, -0.2040259f},
|
|
|
|
{-0.4985314f, 0.0415560f, 1.0572252f}};
|
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* This structure is used to pass curve mapping settings from
|
|
|
|
* blender's DNA structure stored in view transform settings
|
|
|
|
* to a generic OpenColorIO C-API.
|
|
|
|
*/
|
|
|
|
typedef struct OCIO_CurveMappingSettings {
|
|
|
|
/* This is a LUT which contain values for all 4 curve mapping tables
|
|
|
|
* (combined, R, G and B).
|
|
|
|
*
|
|
|
|
* Element I for table T is stored at I * 4 + T element of this LUT.
|
|
|
|
*
|
|
|
|
* This array is usually returned by curvemapping_table_RGBA().
|
|
|
|
*/
|
|
|
|
float *lut;
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* Size of single curve mapping table, 1/4 size of lut array. */
|
|
|
|
int lut_size;
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* Extend extrapolation flags for all the tables.
|
2019-11-01 11:09:55 +00:00
|
|
|
* if use_extend_extrapolate != 0 means extrapolation for
|
|
|
|
* curve.
|
2013-10-09 15:57:32 +00:00
|
|
|
*/
|
2019-11-01 11:09:55 +00:00
|
|
|
int use_extend_extrapolate;
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* Minimal X value of the curve mapping tables. */
|
|
|
|
float mintable[4];
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* Per curve mapping table range. */
|
|
|
|
float range[4];
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* Lower extension value, stored as per-component arrays. */
|
|
|
|
float ext_in_x[4], ext_in_y[4];
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* Higher extension value, stored as per-component arrays. */
|
|
|
|
float ext_out_x[4], ext_out_y[4];
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* First points of the tables, both X and Y values.
|
|
|
|
* Needed for easier and faster access when extrapolating.
|
|
|
|
*/
|
|
|
|
float first_x[4], first_y[4];
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* Last points of the tables, both X and Y values.
|
|
|
|
* Needed for easier and faster access when extrapolating.
|
|
|
|
*/
|
|
|
|
float last_x[4], last_y[4];
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* Premultiplication settings: black level and scale to match
|
|
|
|
* with white level.
|
|
|
|
*/
|
|
|
|
float black[3], bwmul[3];
|
2019-04-17 04:17:24 +00:00
|
|
|
|
2013-10-09 15:57:32 +00:00
|
|
|
/* Cache id of the original curve mapping, used to detect when
|
|
|
|
* upload of new settings to GPU is needed.
|
|
|
|
*/
|
|
|
|
size_t cache_id;
|
|
|
|
} OCIO_CurveMappingSettings;
|
|
|
|
|
2012-10-04 13:39:08 +00:00
|
|
|
void OCIO_init(void);
|
|
|
|
void OCIO_exit(void);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
OCIO_ConstConfigRcPtr *OCIO_getCurrentConfig(void);
|
|
|
|
void OCIO_setCurrentConfig(const OCIO_ConstConfigRcPtr *config);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
OCIO_ConstConfigRcPtr *OCIO_configCreateFromEnv(void);
|
|
|
|
OCIO_ConstConfigRcPtr *OCIO_configCreateFromFile(const char *filename);
|
|
|
|
OCIO_ConstConfigRcPtr *OCIO_configCreateFallback(void);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
void OCIO_configRelease(OCIO_ConstConfigRcPtr *config);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
int OCIO_configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config);
|
|
|
|
const char *OCIO_configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
|
|
|
|
OCIO_ConstColorSpaceRcPtr *OCIO_configGetColorSpace(OCIO_ConstConfigRcPtr *config,
|
|
|
|
const char *name);
|
|
|
|
int OCIO_configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
int OCIO_colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs);
|
|
|
|
int OCIO_colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs);
|
2019-05-05 11:14:37 +00:00
|
|
|
void OCIO_colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config,
|
|
|
|
OCIO_ConstColorSpaceRcPtr *cs,
|
|
|
|
bool *is_scene_linear,
|
|
|
|
bool *is_srgb);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
void OCIO_colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
const char *OCIO_configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config);
|
|
|
|
int OCIO_configGetNumDisplays(OCIO_ConstConfigRcPtr *config);
|
|
|
|
const char *OCIO_configGetDisplay(OCIO_ConstConfigRcPtr *config, int index);
|
|
|
|
const char *OCIO_configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display);
|
|
|
|
int OCIO_configGetNumViews(OCIO_ConstConfigRcPtr *config, const char *display);
|
|
|
|
const char *OCIO_configGetView(OCIO_ConstConfigRcPtr *config, const char *display, int index);
|
|
|
|
const char *OCIO_configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config,
|
|
|
|
const char *display,
|
|
|
|
const char *view);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2015-03-17 13:15:05 +00:00
|
|
|
void OCIO_configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr *config, float *rgb);
|
2018-10-12 14:42:34 +00:00
|
|
|
void OCIO_configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config, float xyz_to_rgb[3][3]);
|
2015-03-17 13:15:05 +00:00
|
|
|
|
2013-09-09 09:48:26 +00:00
|
|
|
int OCIO_configGetNumLooks(OCIO_ConstConfigRcPtr *config);
|
|
|
|
const char *OCIO_configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
|
|
|
|
OCIO_ConstLookRcPtr *OCIO_configGetLook(OCIO_ConstConfigRcPtr *config, const char *name);
|
|
|
|
|
|
|
|
const char *OCIO_lookGetProcessSpace(OCIO_ConstLookRcPtr *look);
|
|
|
|
void OCIO_lookRelease(OCIO_ConstLookRcPtr *look);
|
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
OCIO_ConstProcessorRcPtr *OCIO_configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config,
|
|
|
|
const char *srcName,
|
|
|
|
const char *dstName);
|
OpenColorIO: upgrade to version 2.0.0
Ref T84819
Build System
============
This is an API breaking new version, and the updated code only builds with
OpenColorIO 2.0 and later. Adding backwards compatibility was too complicated.
* Tinyxml was replaced with Expat, adding a new dependency.
* Yaml-cpp is now built as a dependency on Unix, as was already done on Windows.
* Removed currently unused LCMS code.
* Pystring remains built as part of OCIO itself, since it has no good build system.
* Linux and macOS check for the OpenColorIO verison, and disable it if too old.
Ref D10270
Processors and Transforms
=========================
CPU processors now need to be created to do CPU processing. These are cached
internally, but the cache lookup is not fast enough to execute per pixel or
texture sample, so for performance these are now also exposed in the C API.
The C API for transforms will no longer be needed afer all changes, so remove
it to simplify the API and fallback implementation.
Ref D10271
Display Transforms
==================
Needs a bit more manual work constructing the transform. LegacyViewingPipeline
could also have been used, but isn't really any simpler and since it's legacy
we better not rely on it.
We moved more logic into the opencolorio module, to simplify the API. There is
no need to wrap a dozen functions just to be able to do this in C rather than C++.
It's also tightly coupled to the GPU shader logic, and so should be in the same
module.
Ref D10271
GPU Display Shader
==================
To avoid baking exposure and gamma into the GLSL shader and requiring slow
recompiles when tweaking, we manually apply them in the shader. This leads
to some logic duplicaton between the CPU and GPU display processor, but it
seems unavoidable.
Caching was also changed. Previously this was done both on the imbuf and
opencolorio module levels. Now it's all done in the opencolorio module by
simply matching color space names. We no longer use cacheIDs from OpenColorIO
since computing them is expensive, and they are unlikely to match now that
more is baked into the shader code.
Shaders can now use multiple 2D textures, 3D textures and uniforms, rather
than a single 3D texture. So allocating and binding those adds some code.
Color space conversions for blending with overlays is now hardcoded in the
shader. This was using harcoded numbers anyway, if this every becomes a
general OpenColorIO transform it can be changed, but for now there is no
point to add code complexity.
Ref D10273
CIE XYZ
=======
We need standard CIE XYZ values for rendering effects like blackbody emission.
The relation to the scene linear role is based on OpenColorIO configuration.
In OpenColorIO 2.0 configs roles can no longer have the same name as color
spaces, which means our XYZ role and colorspace in the configuration give an
error.
Instead use the new standard aces_interchange role, which relates scene linear
to a known scene referred color space. Compatibility with the old XYZ role is
preserved, if the configuration file has no conflicting names.
Also includes a non-functional change to the configuraton file to use an
XYZ-to-ACES matrix instead of REC709-to-ACES, makes debugging a little easier
since the matrix is the same one we have in the code now and that is also
found easily in the ACES specs.
Ref D10274
2021-01-31 18:35:00 +00:00
|
|
|
void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *cpu_processor);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
OpenColorIO: upgrade to version 2.0.0
Ref T84819
Build System
============
This is an API breaking new version, and the updated code only builds with
OpenColorIO 2.0 and later. Adding backwards compatibility was too complicated.
* Tinyxml was replaced with Expat, adding a new dependency.
* Yaml-cpp is now built as a dependency on Unix, as was already done on Windows.
* Removed currently unused LCMS code.
* Pystring remains built as part of OCIO itself, since it has no good build system.
* Linux and macOS check for the OpenColorIO verison, and disable it if too old.
Ref D10270
Processors and Transforms
=========================
CPU processors now need to be created to do CPU processing. These are cached
internally, but the cache lookup is not fast enough to execute per pixel or
texture sample, so for performance these are now also exposed in the C API.
The C API for transforms will no longer be needed afer all changes, so remove
it to simplify the API and fallback implementation.
Ref D10271
Display Transforms
==================
Needs a bit more manual work constructing the transform. LegacyViewingPipeline
could also have been used, but isn't really any simpler and since it's legacy
we better not rely on it.
We moved more logic into the opencolorio module, to simplify the API. There is
no need to wrap a dozen functions just to be able to do this in C rather than C++.
It's also tightly coupled to the GPU shader logic, and so should be in the same
module.
Ref D10271
GPU Display Shader
==================
To avoid baking exposure and gamma into the GLSL shader and requiring slow
recompiles when tweaking, we manually apply them in the shader. This leads
to some logic duplicaton between the CPU and GPU display processor, but it
seems unavoidable.
Caching was also changed. Previously this was done both on the imbuf and
opencolorio module levels. Now it's all done in the opencolorio module by
simply matching color space names. We no longer use cacheIDs from OpenColorIO
since computing them is expensive, and they are unlikely to match now that
more is baked into the shader code.
Shaders can now use multiple 2D textures, 3D textures and uniforms, rather
than a single 3D texture. So allocating and binding those adds some code.
Color space conversions for blending with overlays is now hardcoded in the
shader. This was using harcoded numbers anyway, if this every becomes a
general OpenColorIO transform it can be changed, but for now there is no
point to add code complexity.
Ref D10273
CIE XYZ
=======
We need standard CIE XYZ values for rendering effects like blackbody emission.
The relation to the scene linear role is based on OpenColorIO configuration.
In OpenColorIO 2.0 configs roles can no longer have the same name as color
spaces, which means our XYZ role and colorspace in the configuration give an
error.
Instead use the new standard aces_interchange role, which relates scene linear
to a known scene referred color space. Compatibility with the old XYZ role is
preserved, if the configuration file has no conflicting names.
Also includes a non-functional change to the configuraton file to use an
XYZ-to-ACES matrix instead of REC709-to-ACES, makes debugging a little easier
since the matrix is the same one we have in the code now and that is also
found easily in the ACES specs.
Ref D10274
2021-01-31 18:35:00 +00:00
|
|
|
OCIO_ConstCPUProcessorRcPtr *OCIO_processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor);
|
|
|
|
void OCIO_cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img);
|
|
|
|
void OCIO_cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
|
2021-02-13 06:05:50 +00:00
|
|
|
OCIO_PackedImageDesc *img);
|
OpenColorIO: upgrade to version 2.0.0
Ref T84819
Build System
============
This is an API breaking new version, and the updated code only builds with
OpenColorIO 2.0 and later. Adding backwards compatibility was too complicated.
* Tinyxml was replaced with Expat, adding a new dependency.
* Yaml-cpp is now built as a dependency on Unix, as was already done on Windows.
* Removed currently unused LCMS code.
* Pystring remains built as part of OCIO itself, since it has no good build system.
* Linux and macOS check for the OpenColorIO verison, and disable it if too old.
Ref D10270
Processors and Transforms
=========================
CPU processors now need to be created to do CPU processing. These are cached
internally, but the cache lookup is not fast enough to execute per pixel or
texture sample, so for performance these are now also exposed in the C API.
The C API for transforms will no longer be needed afer all changes, so remove
it to simplify the API and fallback implementation.
Ref D10271
Display Transforms
==================
Needs a bit more manual work constructing the transform. LegacyViewingPipeline
could also have been used, but isn't really any simpler and since it's legacy
we better not rely on it.
We moved more logic into the opencolorio module, to simplify the API. There is
no need to wrap a dozen functions just to be able to do this in C rather than C++.
It's also tightly coupled to the GPU shader logic, and so should be in the same
module.
Ref D10271
GPU Display Shader
==================
To avoid baking exposure and gamma into the GLSL shader and requiring slow
recompiles when tweaking, we manually apply them in the shader. This leads
to some logic duplicaton between the CPU and GPU display processor, but it
seems unavoidable.
Caching was also changed. Previously this was done both on the imbuf and
opencolorio module levels. Now it's all done in the opencolorio module by
simply matching color space names. We no longer use cacheIDs from OpenColorIO
since computing them is expensive, and they are unlikely to match now that
more is baked into the shader code.
Shaders can now use multiple 2D textures, 3D textures and uniforms, rather
than a single 3D texture. So allocating and binding those adds some code.
Color space conversions for blending with overlays is now hardcoded in the
shader. This was using harcoded numbers anyway, if this every becomes a
general OpenColorIO transform it can be changed, but for now there is no
point to add code complexity.
Ref D10273
CIE XYZ
=======
We need standard CIE XYZ values for rendering effects like blackbody emission.
The relation to the scene linear role is based on OpenColorIO configuration.
In OpenColorIO 2.0 configs roles can no longer have the same name as color
spaces, which means our XYZ role and colorspace in the configuration give an
error.
Instead use the new standard aces_interchange role, which relates scene linear
to a known scene referred color space. Compatibility with the old XYZ role is
preserved, if the configuration file has no conflicting names.
Also includes a non-functional change to the configuraton file to use an
XYZ-to-ACES matrix instead of REC709-to-ACES, makes debugging a little easier
since the matrix is the same one we have in the code now and that is also
found easily in the ACES specs.
Ref D10274
2021-01-31 18:35:00 +00:00
|
|
|
void OCIO_cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel);
|
|
|
|
void OCIO_cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel);
|
2021-02-13 06:05:50 +00:00
|
|
|
void OCIO_cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
|
|
|
|
float *pixel);
|
OpenColorIO: upgrade to version 2.0.0
Ref T84819
Build System
============
This is an API breaking new version, and the updated code only builds with
OpenColorIO 2.0 and later. Adding backwards compatibility was too complicated.
* Tinyxml was replaced with Expat, adding a new dependency.
* Yaml-cpp is now built as a dependency on Unix, as was already done on Windows.
* Removed currently unused LCMS code.
* Pystring remains built as part of OCIO itself, since it has no good build system.
* Linux and macOS check for the OpenColorIO verison, and disable it if too old.
Ref D10270
Processors and Transforms
=========================
CPU processors now need to be created to do CPU processing. These are cached
internally, but the cache lookup is not fast enough to execute per pixel or
texture sample, so for performance these are now also exposed in the C API.
The C API for transforms will no longer be needed afer all changes, so remove
it to simplify the API and fallback implementation.
Ref D10271
Display Transforms
==================
Needs a bit more manual work constructing the transform. LegacyViewingPipeline
could also have been used, but isn't really any simpler and since it's legacy
we better not rely on it.
We moved more logic into the opencolorio module, to simplify the API. There is
no need to wrap a dozen functions just to be able to do this in C rather than C++.
It's also tightly coupled to the GPU shader logic, and so should be in the same
module.
Ref D10271
GPU Display Shader
==================
To avoid baking exposure and gamma into the GLSL shader and requiring slow
recompiles when tweaking, we manually apply them in the shader. This leads
to some logic duplicaton between the CPU and GPU display processor, but it
seems unavoidable.
Caching was also changed. Previously this was done both on the imbuf and
opencolorio module levels. Now it's all done in the opencolorio module by
simply matching color space names. We no longer use cacheIDs from OpenColorIO
since computing them is expensive, and they are unlikely to match now that
more is baked into the shader code.
Shaders can now use multiple 2D textures, 3D textures and uniforms, rather
than a single 3D texture. So allocating and binding those adds some code.
Color space conversions for blending with overlays is now hardcoded in the
shader. This was using harcoded numbers anyway, if this every becomes a
general OpenColorIO transform it can be changed, but for now there is no
point to add code complexity.
Ref D10273
CIE XYZ
=======
We need standard CIE XYZ values for rendering effects like blackbody emission.
The relation to the scene linear role is based on OpenColorIO configuration.
In OpenColorIO 2.0 configs roles can no longer have the same name as color
spaces, which means our XYZ role and colorspace in the configuration give an
error.
Instead use the new standard aces_interchange role, which relates scene linear
to a known scene referred color space. Compatibility with the old XYZ role is
preserved, if the configuration file has no conflicting names.
Also includes a non-functional change to the configuraton file to use an
XYZ-to-ACES matrix instead of REC709-to-ACES, makes debugging a little easier
since the matrix is the same one we have in the code now and that is also
found easily in the ACES specs.
Ref D10274
2021-01-31 18:35:00 +00:00
|
|
|
void OCIO_cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *processor);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
const char *OCIO_colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs);
|
|
|
|
const char *OCIO_colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs);
|
|
|
|
const char *OCIO_colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs);
|
2022-03-22 18:14:42 +00:00
|
|
|
int OCIO_colorSpaceGetNumAliases(OCIO_ConstColorSpaceRcPtr *cs);
|
|
|
|
const char *OCIO_colorSpaceGetAlias(OCIO_ConstColorSpaceRcPtr *cs, const int index);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
OpenColorIO: upgrade to version 2.0.0
Ref T84819
Build System
============
This is an API breaking new version, and the updated code only builds with
OpenColorIO 2.0 and later. Adding backwards compatibility was too complicated.
* Tinyxml was replaced with Expat, adding a new dependency.
* Yaml-cpp is now built as a dependency on Unix, as was already done on Windows.
* Removed currently unused LCMS code.
* Pystring remains built as part of OCIO itself, since it has no good build system.
* Linux and macOS check for the OpenColorIO verison, and disable it if too old.
Ref D10270
Processors and Transforms
=========================
CPU processors now need to be created to do CPU processing. These are cached
internally, but the cache lookup is not fast enough to execute per pixel or
texture sample, so for performance these are now also exposed in the C API.
The C API for transforms will no longer be needed afer all changes, so remove
it to simplify the API and fallback implementation.
Ref D10271
Display Transforms
==================
Needs a bit more manual work constructing the transform. LegacyViewingPipeline
could also have been used, but isn't really any simpler and since it's legacy
we better not rely on it.
We moved more logic into the opencolorio module, to simplify the API. There is
no need to wrap a dozen functions just to be able to do this in C rather than C++.
It's also tightly coupled to the GPU shader logic, and so should be in the same
module.
Ref D10271
GPU Display Shader
==================
To avoid baking exposure and gamma into the GLSL shader and requiring slow
recompiles when tweaking, we manually apply them in the shader. This leads
to some logic duplicaton between the CPU and GPU display processor, but it
seems unavoidable.
Caching was also changed. Previously this was done both on the imbuf and
opencolorio module levels. Now it's all done in the opencolorio module by
simply matching color space names. We no longer use cacheIDs from OpenColorIO
since computing them is expensive, and they are unlikely to match now that
more is baked into the shader code.
Shaders can now use multiple 2D textures, 3D textures and uniforms, rather
than a single 3D texture. So allocating and binding those adds some code.
Color space conversions for blending with overlays is now hardcoded in the
shader. This was using harcoded numbers anyway, if this every becomes a
general OpenColorIO transform it can be changed, but for now there is no
point to add code complexity.
Ref D10273
CIE XYZ
=======
We need standard CIE XYZ values for rendering effects like blackbody emission.
The relation to the scene linear role is based on OpenColorIO configuration.
In OpenColorIO 2.0 configs roles can no longer have the same name as color
spaces, which means our XYZ role and colorspace in the configuration give an
error.
Instead use the new standard aces_interchange role, which relates scene linear
to a known scene referred color space. Compatibility with the old XYZ role is
preserved, if the configuration file has no conflicting names.
Also includes a non-functional change to the configuraton file to use an
XYZ-to-ACES matrix instead of REC709-to-ACES, makes debugging a little easier
since the matrix is the same one we have in the code now and that is also
found easily in the ACES specs.
Ref D10274
2021-01-31 18:35:00 +00:00
|
|
|
OCIO_ConstProcessorRcPtr *OCIO_createDisplayProcessor(OCIO_ConstConfigRcPtr *config,
|
|
|
|
const char *input,
|
|
|
|
const char *view,
|
|
|
|
const char *display,
|
|
|
|
const char *look,
|
|
|
|
const float scale,
|
2022-04-11 17:38:45 +00:00
|
|
|
const float exponent,
|
|
|
|
const bool inverse);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2012-10-05 10:05:26 +00:00
|
|
|
OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data,
|
|
|
|
long width,
|
|
|
|
long height,
|
|
|
|
long numChannels,
|
2013-01-08 20:55:07 +00:00
|
|
|
long chanStrideBytes,
|
|
|
|
long xStrideBytes,
|
|
|
|
long yStrideBytes);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
2013-01-08 20:55:07 +00:00
|
|
|
void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p);
|
2012-09-15 10:03:17 +00:00
|
|
|
|
OpenColorIO: upgrade to version 2.0.0
Ref T84819
Build System
============
This is an API breaking new version, and the updated code only builds with
OpenColorIO 2.0 and later. Adding backwards compatibility was too complicated.
* Tinyxml was replaced with Expat, adding a new dependency.
* Yaml-cpp is now built as a dependency on Unix, as was already done on Windows.
* Removed currently unused LCMS code.
* Pystring remains built as part of OCIO itself, since it has no good build system.
* Linux and macOS check for the OpenColorIO verison, and disable it if too old.
Ref D10270
Processors and Transforms
=========================
CPU processors now need to be created to do CPU processing. These are cached
internally, but the cache lookup is not fast enough to execute per pixel or
texture sample, so for performance these are now also exposed in the C API.
The C API for transforms will no longer be needed afer all changes, so remove
it to simplify the API and fallback implementation.
Ref D10271
Display Transforms
==================
Needs a bit more manual work constructing the transform. LegacyViewingPipeline
could also have been used, but isn't really any simpler and since it's legacy
we better not rely on it.
We moved more logic into the opencolorio module, to simplify the API. There is
no need to wrap a dozen functions just to be able to do this in C rather than C++.
It's also tightly coupled to the GPU shader logic, and so should be in the same
module.
Ref D10271
GPU Display Shader
==================
To avoid baking exposure and gamma into the GLSL shader and requiring slow
recompiles when tweaking, we manually apply them in the shader. This leads
to some logic duplicaton between the CPU and GPU display processor, but it
seems unavoidable.
Caching was also changed. Previously this was done both on the imbuf and
opencolorio module levels. Now it's all done in the opencolorio module by
simply matching color space names. We no longer use cacheIDs from OpenColorIO
since computing them is expensive, and they are unlikely to match now that
more is baked into the shader code.
Shaders can now use multiple 2D textures, 3D textures and uniforms, rather
than a single 3D texture. So allocating and binding those adds some code.
Color space conversions for blending with overlays is now hardcoded in the
shader. This was using harcoded numbers anyway, if this every becomes a
general OpenColorIO transform it can be changed, but for now there is no
point to add code complexity.
Ref D10273
CIE XYZ
=======
We need standard CIE XYZ values for rendering effects like blackbody emission.
The relation to the scene linear role is based on OpenColorIO configuration.
In OpenColorIO 2.0 configs roles can no longer have the same name as color
spaces, which means our XYZ role and colorspace in the configuration give an
error.
Instead use the new standard aces_interchange role, which relates scene linear
to a known scene referred color space. Compatibility with the old XYZ role is
preserved, if the configuration file has no conflicting names.
Also includes a non-functional change to the configuraton file to use an
XYZ-to-ACES matrix instead of REC709-to-ACES, makes debugging a little easier
since the matrix is the same one we have in the code now and that is also
found easily in the ACES specs.
Ref D10274
2021-01-31 18:35:00 +00:00
|
|
|
bool OCIO_supportGPUShader(void);
|
|
|
|
bool OCIO_gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config,
|
|
|
|
const char *input,
|
|
|
|
const char *view,
|
|
|
|
const char *display,
|
|
|
|
const char *look,
|
|
|
|
OCIO_CurveMappingSettings *curve_mapping_settings,
|
|
|
|
const float scale,
|
|
|
|
const float exponent,
|
|
|
|
const float dither,
|
|
|
|
const bool use_predivide,
|
|
|
|
const bool use_overlay);
|
|
|
|
void OCIO_gpuDisplayShaderUnbind(void);
|
|
|
|
void OCIO_gpuCacheFree(void);
|
2013-03-29 16:02:27 +00:00
|
|
|
|
2013-12-08 09:03:17 +00:00
|
|
|
const char *OCIO_getVersionString(void);
|
|
|
|
int OCIO_getVersionHex(void);
|
|
|
|
|
2012-09-15 10:03:17 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-10-04 13:39:08 +00:00
|
|
|
#endif /* OCIO_CAPI_H */
|