Implement GPU-side dither
[blender-staging.git] / intern / opencolorio / ocio_impl.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): Sergey Sharybin
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 #ifndef __OCIO_IMPL_H__
27 #define __OCIO_IMPL_H__
28
29 #include "ocio_capi.h"
30
31 class IOCIOImpl {
32 public:
33         virtual ~IOCIOImpl() {}
34
35         virtual OCIO_ConstConfigRcPtr *getCurrentConfig(void) = 0;
36         virtual void setCurrentConfig(const OCIO_ConstConfigRcPtr *config) = 0;
37
38         virtual OCIO_ConstConfigRcPtr *configCreateFromEnv(void) = 0;
39         virtual OCIO_ConstConfigRcPtr *configCreateFromFile(const char* filename) = 0;
40
41         virtual void configRelease(OCIO_ConstConfigRcPtr *config) = 0;
42
43         virtual int configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config) = 0;
44         virtual const char *configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config, int index) = 0;
45         virtual OCIO_ConstColorSpaceRcPtr *configGetColorSpace(OCIO_ConstConfigRcPtr *config, const char *name) = 0;
46         virtual int configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const char *name) = 0;
47
48         virtual int colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs) = 0;
49         virtual int colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs) = 0;
50
51         virtual void colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs) = 0;
52
53         virtual const char *configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config) = 0;
54         virtual int         configGetNumDisplays(OCIO_ConstConfigRcPtr *config) = 0;
55         virtual const char *configGetDisplay(OCIO_ConstConfigRcPtr *config, int index) = 0;
56         virtual const char *configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display) = 0;
57         virtual int         configGetNumViews(OCIO_ConstConfigRcPtr *config, const char *display) = 0;
58         virtual const char *configGetView(OCIO_ConstConfigRcPtr *config, const char *display, int index) = 0;
59         virtual const char *configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config, const char *display, const char *view) = 0;
60
61         virtual int                  configGetNumLooks(OCIO_ConstConfigRcPtr *config) = 0;
62         virtual const char          *configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config, int index) = 0;
63         virtual OCIO_ConstLookRcPtr *configGetLook(OCIO_ConstConfigRcPtr *config, const char *name) = 0;
64
65         virtual const char *lookGetProcessSpace(OCIO_ConstLookRcPtr *look) = 0;
66         virtual void        lookRelease(OCIO_ConstLookRcPtr *look) = 0;
67
68         virtual OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName) = 0;
69         virtual OCIO_ConstProcessorRcPtr *configGetProcessor(OCIO_ConstConfigRcPtr *config, OCIO_ConstTransformRcPtr *transform) = 0;
70
71         virtual void processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) = 0;
72         virtual void processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img) = 0;
73         virtual void processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel) = 0;
74         virtual void processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel) = 0;
75         virtual void processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel) = 0;
76
77         virtual void processorRelease(OCIO_ConstProcessorRcPtr *p) = 0;
78
79         virtual const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) = 0;
80         virtual const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs) = 0;
81         virtual const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs) = 0;
82
83         virtual OCIO_DisplayTransformRcPtr *createDisplayTransform(void) = 0;
84         virtual void displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name) = 0;
85         virtual void displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name) = 0;
86         virtual void displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name) = 0;
87         virtual void displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et) = 0;
88         virtual void displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et) = 0;
89         virtual void displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks) = 0;
90         virtual void displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled) = 0;
91         virtual void displayTransformRelease(OCIO_DisplayTransformRcPtr *dt) = 0;
92
93         virtual OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data, long width, long height, long numChannels,
94                                                        long chanStrideBytes, long xStrideBytes, long yStrideBytes) = 0;
95
96         virtual void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p) = 0;
97
98         virtual OCIO_ExponentTransformRcPtr *createExponentTransform(void) = 0;
99         virtual void exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent) = 0;
100         virtual void exponentTransformRelease(OCIO_ExponentTransformRcPtr *et) = 0;
101
102         virtual OCIO_MatrixTransformRcPtr *createMatrixTransform(void) = 0;
103         virtual void matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, const float *m44, const float *offset4) = 0;
104         virtual void matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt) = 0;
105
106         virtual void matrixTransformScale(float * m44, float * offset4, const float * scale4) = 0;
107
108         virtual bool supportGLSLDraw(void) = 0;
109         virtual bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor,
110                                    OCIO_CurveMappingSettings *curve_mapping_settings, float dither, bool predivide) = 0;
111         virtual void finishGLSLDraw(struct OCIO_GLSLDrawState *state) = 0;
112         virtual void freeGLState(struct OCIO_GLSLDrawState *state_r) = 0;
113
114         virtual const char *getVersionString(void) = 0;
115         virtual int getVersionHex(void) = 0;
116 };
117
118 class FallbackImpl : public IOCIOImpl {
119 public:
120         FallbackImpl() {}
121
122         OCIO_ConstConfigRcPtr *getCurrentConfig(void);
123         void setCurrentConfig(const OCIO_ConstConfigRcPtr *config);
124
125         OCIO_ConstConfigRcPtr *configCreateFromEnv(void);
126         OCIO_ConstConfigRcPtr *configCreateFromFile(const char* filename);
127
128         void configRelease(OCIO_ConstConfigRcPtr *config);
129
130         int configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config);
131         const char *configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
132         OCIO_ConstColorSpaceRcPtr *configGetColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
133         int configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
134
135         int colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs);
136         int colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs);
137
138         void colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs);
139
140         const char *configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config);
141         int         configGetNumDisplays(OCIO_ConstConfigRcPtr *config);
142         const char *configGetDisplay(OCIO_ConstConfigRcPtr *config, int index);
143         const char *configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display);
144         int         configGetNumViews(OCIO_ConstConfigRcPtr *config, const char *display);
145         const char *configGetView(OCIO_ConstConfigRcPtr *config, const char *display, int index);
146         const char *configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config, const char *display, const char *view);
147
148         int                  configGetNumLooks(OCIO_ConstConfigRcPtr *config);
149         const char          *configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
150         OCIO_ConstLookRcPtr *configGetLook(OCIO_ConstConfigRcPtr *config, const char *name);
151
152         const char *lookGetProcessSpace(OCIO_ConstLookRcPtr *look);
153         void        lookRelease(OCIO_ConstLookRcPtr *look);
154
155         OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName);
156         OCIO_ConstProcessorRcPtr *configGetProcessor(OCIO_ConstConfigRcPtr *config, OCIO_ConstTransformRcPtr *transform);
157
158         void processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img);
159         void processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img);
160         void processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel);
161         void processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel);
162         void processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel);
163
164         void processorRelease(OCIO_ConstProcessorRcPtr *p);
165
166         const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs);
167         const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs);
168         const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs);
169
170         OCIO_DisplayTransformRcPtr *createDisplayTransform(void);
171         void displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name);
172         void displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name);
173         void displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name);
174         void displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et);
175         void displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et);
176         void displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks);
177         void displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled);
178         void displayTransformRelease(OCIO_DisplayTransformRcPtr *dt);
179
180         OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data, long width, long height, long numChannels,
181                                                long chanStrideBytes, long xStrideBytes, long yStrideBytes);
182
183         void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p);
184
185         OCIO_ExponentTransformRcPtr *createExponentTransform(void);
186         void exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent);
187         void exponentTransformRelease(OCIO_ExponentTransformRcPtr *et);
188
189         OCIO_MatrixTransformRcPtr *createMatrixTransform(void);
190         void matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, const float *m44, const float *offset4);
191         void matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt);
192
193         void matrixTransformScale(float *m44, float *offset4, const float *scale4);
194
195         bool supportGLSLDraw(void);
196         bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor,
197                            OCIO_CurveMappingSettings *curve_mapping_settings, float dither, bool predivide);
198         void finishGLSLDraw(struct OCIO_GLSLDrawState *state);
199         void freeGLState(struct OCIO_GLSLDrawState *state_r);
200
201         const char *getVersionString(void);
202         int getVersionHex(void);
203 };
204
205 #ifdef WITH_OCIO
206 class OCIOImpl : public IOCIOImpl {
207 public:
208         OCIOImpl() {};
209
210         OCIO_ConstConfigRcPtr *getCurrentConfig(void);
211         void setCurrentConfig(const OCIO_ConstConfigRcPtr *config);
212
213         OCIO_ConstConfigRcPtr *configCreateFromEnv(void);
214         OCIO_ConstConfigRcPtr *configCreateFromFile(const char* filename);
215
216         void configRelease(OCIO_ConstConfigRcPtr *config);
217
218         int configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config);
219         const char *configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
220         OCIO_ConstColorSpaceRcPtr *configGetColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
221         int configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
222
223         int colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs);
224         int colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs);
225
226         void colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs);
227
228         const char *configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config);
229         int         configGetNumDisplays(OCIO_ConstConfigRcPtr *config);
230         const char *configGetDisplay(OCIO_ConstConfigRcPtr *config, int index);
231         const char *configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display);
232         int         configGetNumViews(OCIO_ConstConfigRcPtr *config, const char *display);
233         const char *configGetView(OCIO_ConstConfigRcPtr *config, const char *display, int index);
234         const char *configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config, const char *display, const char *view);
235
236         int                  configGetNumLooks(OCIO_ConstConfigRcPtr *config);
237         const char          *configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
238         OCIO_ConstLookRcPtr *configGetLook(OCIO_ConstConfigRcPtr *config, const char *name);
239
240         const char *lookGetProcessSpace(OCIO_ConstLookRcPtr *look);
241         void        lookRelease(OCIO_ConstLookRcPtr *look);
242
243         OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config, const char *srcName, const char *dstName);
244         OCIO_ConstProcessorRcPtr *configGetProcessor(OCIO_ConstConfigRcPtr *config, OCIO_ConstTransformRcPtr *transform);
245
246         void processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img);
247         void processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img);
248         void processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel);
249         void processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel);
250         void processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel);
251
252         void processorRelease(OCIO_ConstProcessorRcPtr *p);
253
254         const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs);
255         const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs);
256         const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs);
257
258         OCIO_DisplayTransformRcPtr *createDisplayTransform(void);
259         void displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name);
260         void displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name);
261         void displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name);
262         void displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et);
263         void displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *et);
264         void displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks);
265         void displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled);
266         void displayTransformRelease(OCIO_DisplayTransformRcPtr *dt);
267
268         OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data, long width, long height, long numChannels,
269                                                long chanStrideBytes, long xStrideBytes, long yStrideBytes);
270
271         void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p);
272
273         OCIO_ExponentTransformRcPtr *createExponentTransform(void);
274         void exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent);
275         void exponentTransformRelease(OCIO_ExponentTransformRcPtr *et);
276
277         OCIO_MatrixTransformRcPtr *createMatrixTransform(void);
278         void matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt, const float *m44, const float *offset4);
279         void matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt);
280
281         void matrixTransformScale(float * m44, float * offset4, const float * scale4);
282
283         bool supportGLSLDraw(void);
284         bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor,
285                            OCIO_CurveMappingSettings *curve_mapping_settings, float dither, bool predivide);
286         void finishGLSLDraw(struct OCIO_GLSLDrawState *state);
287         void freeGLState(struct OCIO_GLSLDrawState *state_r);
288
289         const char *getVersionString(void);
290         int getVersionHex(void);
291 };
292 #endif
293
294 #endif /* OCIO_IMPL_H */