Implement GPU-side dither
[blender-staging.git] / intern / opencolorio / ocio_capi.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2012 Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): Xavier Thomas
22  *                 Lukas Toene
23  *                 Sergey Sharybin
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef __OCIO_CAPI_H__
29 #define __OCIO_CAPI_H__
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 struct OCIO_GLSLDrawState;
36
37 #define OCIO_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name
38
39 #define OCIO_ROLE_SCENE_LINEAR       "scene_linear"
40 #define OCIO_ROLE_COLOR_PICKING      "color_picking"
41 #define OCIO_ROLE_TEXTURE_PAINT      "texture_paint"
42 #define OCIO_ROLE_DEFAULT_BYTE       "default_byte"
43 #define OCIO_ROLE_DEFAULT_FLOAT      "default_float"
44 #define OCIO_ROLE_DEFAULT_SEQUENCER  "default_sequencer"
45
46 OCIO_DECLARE_HANDLE(OCIO_ConstConfigRcPtr);
47 OCIO_DECLARE_HANDLE(OCIO_ConstColorSpaceRcPtr);
48 OCIO_DECLARE_HANDLE(OCIO_ConstProcessorRcPtr);
49 OCIO_DECLARE_HANDLE(OCIO_ConstContextRcPtr);
50 OCIO_DECLARE_HANDLE(OCIO_PackedImageDesc);
51 OCIO_DECLARE_HANDLE(OCIO_DisplayTransformRcPtr);
52 OCIO_DECLARE_HANDLE(OCIO_ConstTransformRcPtr);
53 OCIO_DECLARE_HANDLE(OCIO_ExponentTransformRcPtr);
54 OCIO_DECLARE_HANDLE(OCIO_MatrixTransformRcPtr);
55 OCIO_DECLARE_HANDLE(OCIO_ConstLookRcPtr);
56
57 /* This structure is used to pass curve mapping settings from
58  * blender's DNA structure stored in view transform settings
59  * to a generic OpenColorIO C-API.
60  */
61 typedef struct OCIO_CurveMappingSettings {
62         /* This is a LUT which contain values for all 4 curve mapping tables
63          * (combined, R, G and B).
64          *
65          * Element I for table T is stored at I * 4 + T element of this LUT.
66          *
67          * This array is usually returned by curvemapping_table_RGBA().
68          */
69         float *lut;
70
71         /* Size of single curve mapping table, 1/4 size of lut array. */
72         int lut_size;
73
74         /* Extend extrapolation flags for all the tables.
75          * if use_extend_extrapolate[T] != 0 means extrapolation for
76          * table T is needed.
77          */
78         int use_extend_extrapolate[4];
79
80         /* Minimal X value of the curve mapping tables. */
81         float mintable[4];
82
83         /* Per curve mapping table range. */
84         float range[4];
85
86         /* Lower extension value, stored as per-component arrays. */
87         float ext_in_x[4], ext_in_y[4];
88
89         /* Higher extension value, stored as per-component arrays. */
90         float ext_out_x[4], ext_out_y[4];
91
92         /* First points of the tables, both X and Y values.
93          * Needed for easier and faster access when extrapolating.
94          */
95         float first_x[4], first_y[4];
96
97         /* Last points of the tables, both X and Y values.
98          * Needed for easier and faster access when extrapolating.
99          */
100         float last_x[4], last_y[4];
101
102         /* Premultiplication settings: black level and scale to match
103          * with white level.
104          */
105         float black[3], bwmul[3];
106
107         /* Cache id of the original curve mapping, used to detect when
108          * upload of new settings to GPU is needed.
109          */
110         size_t cache_id;
111 } OCIO_CurveMappingSettings;
112
113 void OCIO_init(void);
114 void OCIO_exit(void);
115
116 OCIO_ConstConfigRcPtr *OCIO_getCurrentConfig(void);
117 void OCIO_setCurrentConfig(const OCIO_ConstConfigRcPtr *config);
118
119 OCIO_ConstConfigRcPtr *OCIO_configCreateFromEnv(void);
120 OCIO_ConstConfigRcPtr *OCIO_configCreateFromFile(const char* filename);
121 OCIO_ConstConfigRcPtr *OCIO_configCreateFallback(void);
122
123 void OCIO_configRelease(OCIO_ConstConfigRcPtr *config);
124
125 int OCIO_configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config);
126 const char *OCIO_configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
127 OCIO_ConstColorSpaceRcPtr *OCIO_configGetColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
128 int OCIO_configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
129
130 int OCIO_colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs);
131 int OCIO_colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs);
132
133 void OCIO_colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs);
134
135 const char *OCIO_configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config);
136 int         OCIO_configGetNumDisplays(OCIO_ConstConfigRcPtr *config);
137 const char *OCIO_configGetDisplay(OCIO_ConstConfigRcPtr *config, int index);
138 const char *OCIO_configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display);
139 int         OCIO_configGetNumViews(OCIO_ConstConfigRcPtr *config, const char *display);
140 const char *OCIO_configGetView(OCIO_ConstConfigRcPtr *config, const char *display, int index);
141 const char *OCIO_configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config, const char *display, const char *view);
142
143 int                  OCIO_configGetNumLooks(OCIO_ConstConfigRcPtr *config);
144 const char          *OCIO_configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
145 OCIO_ConstLookRcPtr *OCIO_configGetLook(OCIO_ConstConfigRcPtr *config, const char *name);
146
147 const char *OCIO_lookGetProcessSpace(OCIO_ConstLookRcPtr *look);
148 void OCIO_lookRelease(OCIO_ConstLookRcPtr *look);
149
150 OCIO_ConstProcessorRcPtr *OCIO_configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName);
151 OCIO_ConstProcessorRcPtr *OCIO_configGetProcessor(OCIO_ConstConfigRcPtr *config, OCIO_ConstTransformRcPtr *transform);
152
153 void OCIO_processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img);
154 void OCIO_processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img);
155 void OCIO_processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel);
156 void OCIO_processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel);
157 void OCIO_processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel);
158
159 void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *p);
160
161 const char *OCIO_colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs);
162 const char *OCIO_colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs);
163 const char *OCIO_colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs);
164
165 OCIO_DisplayTransformRcPtr *OCIO_createDisplayTransform(void);
166 void OCIO_displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name);
167 void OCIO_displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name);
168 void OCIO_displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name);
169 void OCIO_displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et);
170 void OCIO_displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et);
171 void OCIO_displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks);
172 void OCIO_displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled);
173 void OCIO_displayTransformRelease(OCIO_DisplayTransformRcPtr *dt);
174
175 OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data, long width, long height, long numChannels,
176                                                       long chanStrideBytes, long xStrideBytes, long yStrideBytes);
177
178 void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p);
179
180 OCIO_ExponentTransformRcPtr *OCIO_createExponentTransform(void);
181 void OCIO_exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent);
182 void OCIO_exponentTransformRelease(OCIO_ExponentTransformRcPtr *et);
183
184 OCIO_MatrixTransformRcPtr *OCIO_createMatrixTransform(void);
185 void OCIO_matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, const float *m44, const float *offset4);
186 void OCIO_matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt);
187
188 void OCIO_matrixTransformScale(float *m44, float *offset4, const float *scale4);
189
190 int OCIO_supportGLSLDraw(void);
191 int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor,
192                        OCIO_CurveMappingSettings *curve_mapping_settings, float dither, bool predivide);
193 void OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState *state);
194 void OCIO_freeOGLState(struct OCIO_GLSLDrawState *state);
195
196 const char *OCIO_getVersionString(void);
197 int OCIO_getVersionHex(void);
198
199 #ifdef __cplusplus
200 }
201 #endif
202
203 #endif /* OCIO_CAPI_H */