Audaspace: porting upstream pulseaudio fixes.
[blender.git] / intern / opencolorio / ocio_impl.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2012 Blender Foundation.
17  * All rights reserved.
18  */
19
20 #ifndef __OCIO_IMPL_H__
21 #define __OCIO_IMPL_H__
22
23 #include "ocio_capi.h"
24
25 class IOCIOImpl {
26  public:
27   virtual ~IOCIOImpl()
28   {
29   }
30
31   virtual OCIO_ConstConfigRcPtr *getCurrentConfig(void) = 0;
32   virtual void setCurrentConfig(const OCIO_ConstConfigRcPtr *config) = 0;
33
34   virtual OCIO_ConstConfigRcPtr *configCreateFromEnv(void) = 0;
35   virtual OCIO_ConstConfigRcPtr *configCreateFromFile(const char *filename) = 0;
36
37   virtual void configRelease(OCIO_ConstConfigRcPtr *config) = 0;
38
39   virtual int configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config) = 0;
40   virtual const char *configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config, int index) = 0;
41   virtual OCIO_ConstColorSpaceRcPtr *configGetColorSpace(OCIO_ConstConfigRcPtr *config,
42                                                          const char *name) = 0;
43   virtual int configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const char *name) = 0;
44
45   virtual int colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs) = 0;
46   virtual int colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs) = 0;
47   virtual void colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config,
48                                    OCIO_ConstColorSpaceRcPtr *cs,
49                                    bool &is_scene_linear,
50                                    bool &is_srgb) = 0;
51
52   virtual void colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs) = 0;
53
54   virtual const char *configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config) = 0;
55   virtual int configGetNumDisplays(OCIO_ConstConfigRcPtr *config) = 0;
56   virtual const char *configGetDisplay(OCIO_ConstConfigRcPtr *config, int index) = 0;
57   virtual const char *configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display) = 0;
58   virtual int configGetNumViews(OCIO_ConstConfigRcPtr *config, const char *display) = 0;
59   virtual const char *configGetView(OCIO_ConstConfigRcPtr *config,
60                                     const char *display,
61                                     int index) = 0;
62   virtual const char *configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config,
63                                                      const char *display,
64                                                      const char *view) = 0;
65
66   virtual void configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr *config, float *rgb) = 0;
67   virtual void configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config, float xyz_to_rgb[3][3]) = 0;
68
69   virtual int configGetNumLooks(OCIO_ConstConfigRcPtr *config) = 0;
70   virtual const char *configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config, int index) = 0;
71   virtual OCIO_ConstLookRcPtr *configGetLook(OCIO_ConstConfigRcPtr *config, const char *name) = 0;
72
73   virtual const char *lookGetProcessSpace(OCIO_ConstLookRcPtr *look) = 0;
74   virtual void lookRelease(OCIO_ConstLookRcPtr *look) = 0;
75
76   virtual OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config,
77                                                                 const char *srcName,
78                                                                 const char *dstName) = 0;
79   virtual void processorRelease(OCIO_ConstProcessorRcPtr *processor) = 0;
80
81   virtual OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *p) = 0;
82   virtual void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
83                                  OCIO_PackedImageDesc *img) = 0;
84   virtual void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
85                                            OCIO_PackedImageDesc *img) = 0;
86   virtual void cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) = 0;
87   virtual void cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel) = 0;
88   virtual void cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
89                                                float *pixel) = 0;
90   virtual void cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor) = 0;
91
92   virtual const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs) = 0;
93   virtual const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs) = 0;
94   virtual const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs) = 0;
95
96   virtual OCIO_ConstProcessorRcPtr *createDisplayProcessor(OCIO_ConstConfigRcPtr *config,
97                                                            const char *input,
98                                                            const char *view,
99                                                            const char *display,
100                                                            const char *look,
101                                                            const float scale,
102                                                            const float exponent) = 0;
103
104   virtual OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data,
105                                                            long width,
106                                                            long height,
107                                                            long numChannels,
108                                                            long chanStrideBytes,
109                                                            long xStrideBytes,
110                                                            long yStrideBytes) = 0;
111
112   virtual void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p) = 0;
113
114   /* Optional GPU support. */
115   virtual bool supportGPUShader()
116   {
117     return false;
118   }
119   virtual bool gpuDisplayShaderBind(OCIO_ConstConfigRcPtr * /*config*/,
120                                     const char * /*input*/,
121                                     const char * /*view*/,
122                                     const char * /*display*/,
123                                     const char * /*look*/,
124                                     OCIO_CurveMappingSettings * /*curve_mapping_settings*/,
125                                     const float /*scale*/,
126                                     const float /*exponent*/,
127                                     const float /*dither*/,
128                                     const bool /*use_predivide*/,
129                                     const bool /*use_overlay*/)
130   {
131     return false;
132   }
133   virtual void gpuDisplayShaderUnbind(void)
134   {
135   }
136   virtual void gpuCacheFree(void)
137   {
138   }
139
140   virtual const char *getVersionString(void) = 0;
141   virtual int getVersionHex(void) = 0;
142 };
143
144 class FallbackImpl : public IOCIOImpl {
145  public:
146   FallbackImpl()
147   {
148   }
149
150   OCIO_ConstConfigRcPtr *getCurrentConfig(void);
151   void setCurrentConfig(const OCIO_ConstConfigRcPtr *config);
152
153   OCIO_ConstConfigRcPtr *configCreateFromEnv(void);
154   OCIO_ConstConfigRcPtr *configCreateFromFile(const char *filename);
155
156   void configRelease(OCIO_ConstConfigRcPtr *config);
157
158   int configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config);
159   const char *configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
160   OCIO_ConstColorSpaceRcPtr *configGetColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
161   int configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
162
163   int colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs);
164   int colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs);
165   void colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config,
166                            OCIO_ConstColorSpaceRcPtr *cs,
167                            bool &is_scene_linear,
168                            bool &is_srgb);
169
170   void colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs);
171
172   const char *configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config);
173   int configGetNumDisplays(OCIO_ConstConfigRcPtr *config);
174   const char *configGetDisplay(OCIO_ConstConfigRcPtr *config, int index);
175   const char *configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display);
176   int configGetNumViews(OCIO_ConstConfigRcPtr *config, const char *display);
177   const char *configGetView(OCIO_ConstConfigRcPtr *config, const char *display, int index);
178   const char *configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config,
179                                              const char *display,
180                                              const char *view);
181
182   void configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr *config, float *rgb);
183   void configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config, float xyz_to_rgb[3][3]);
184
185   int configGetNumLooks(OCIO_ConstConfigRcPtr *config);
186   const char *configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
187   OCIO_ConstLookRcPtr *configGetLook(OCIO_ConstConfigRcPtr *config, const char *name);
188
189   const char *lookGetProcessSpace(OCIO_ConstLookRcPtr *look);
190   void lookRelease(OCIO_ConstLookRcPtr *look);
191
192   OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config,
193                                                         const char *srcName,
194                                                         const char *dstName);
195   void processorRelease(OCIO_ConstProcessorRcPtr *processor);
196
197   OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor);
198   void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img);
199   void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
200                                    OCIO_PackedImageDesc *img);
201   void cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel);
202   void cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel);
203   void cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel);
204   void cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor);
205
206   const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs);
207   const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs);
208   const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs);
209
210   OCIO_ConstProcessorRcPtr *createDisplayProcessor(OCIO_ConstConfigRcPtr *config,
211                                                    const char *input,
212                                                    const char *view,
213                                                    const char *display,
214                                                    const char *look,
215                                                    const float scale,
216                                                    const float exponent);
217
218   OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data,
219                                                    long width,
220                                                    long height,
221                                                    long numChannels,
222                                                    long chanStrideBytes,
223                                                    long xStrideBytes,
224                                                    long yStrideBytes);
225
226   void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p);
227
228   const char *getVersionString(void);
229   int getVersionHex(void);
230 };
231
232 #ifdef WITH_OCIO
233 class OCIOImpl : public IOCIOImpl {
234  public:
235   OCIOImpl(){};
236
237   OCIO_ConstConfigRcPtr *getCurrentConfig(void);
238   void setCurrentConfig(const OCIO_ConstConfigRcPtr *config);
239
240   OCIO_ConstConfigRcPtr *configCreateFromEnv(void);
241   OCIO_ConstConfigRcPtr *configCreateFromFile(const char *filename);
242
243   void configRelease(OCIO_ConstConfigRcPtr *config);
244
245   int configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config);
246   const char *configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
247   OCIO_ConstColorSpaceRcPtr *configGetColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
248   int configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const char *name);
249
250   int colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs);
251   int colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs);
252   void colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config,
253                            OCIO_ConstColorSpaceRcPtr *cs,
254                            bool &is_scene_linear,
255                            bool &is_srgb);
256
257   void colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs);
258
259   const char *configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config);
260   int configGetNumDisplays(OCIO_ConstConfigRcPtr *config);
261   const char *configGetDisplay(OCIO_ConstConfigRcPtr *config, int index);
262   const char *configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display);
263   int configGetNumViews(OCIO_ConstConfigRcPtr *config, const char *display);
264   const char *configGetView(OCIO_ConstConfigRcPtr *config, const char *display, int index);
265   const char *configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config,
266                                              const char *display,
267                                              const char *view);
268
269   void configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr *config, float *rgb);
270   void configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config, float xyz_to_rgb[3][3]);
271
272   int configGetNumLooks(OCIO_ConstConfigRcPtr *config);
273   const char *configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config, int index);
274   OCIO_ConstLookRcPtr *configGetLook(OCIO_ConstConfigRcPtr *config, const char *name);
275
276   const char *lookGetProcessSpace(OCIO_ConstLookRcPtr *look);
277   void lookRelease(OCIO_ConstLookRcPtr *look);
278
279   OCIO_ConstProcessorRcPtr *configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config,
280                                                         const char *srcName,
281                                                         const char *dstName);
282   void processorRelease(OCIO_ConstProcessorRcPtr *processor);
283
284   OCIO_ConstCPUProcessorRcPtr *processorGetCPUProcessor(OCIO_ConstProcessorRcPtr *processor);
285   void cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor, OCIO_PackedImageDesc *img);
286   void cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
287                                    OCIO_PackedImageDesc *img);
288   void cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel);
289   void cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel);
290   void cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor, float *pixel);
291   void cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor);
292
293   const char *colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs);
294   const char *colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs);
295   const char *colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs);
296
297   OCIO_ConstProcessorRcPtr *createDisplayProcessor(OCIO_ConstConfigRcPtr *config,
298                                                    const char *input,
299                                                    const char *view,
300                                                    const char *display,
301                                                    const char *look,
302                                                    const float scale,
303                                                    const float exponent);
304
305   OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data,
306                                                    long width,
307                                                    long height,
308                                                    long numChannels,
309                                                    long chanStrideBytes,
310                                                    long xStrideBytes,
311                                                    long yStrideBytes);
312
313   void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *p);
314
315   bool supportGPUShader();
316   bool gpuDisplayShaderBind(OCIO_ConstConfigRcPtr *config,
317                             const char *input,
318                             const char *view,
319                             const char *display,
320                             const char *look,
321                             OCIO_CurveMappingSettings *curve_mapping_settings,
322                             const float scale,
323                             const float exponent,
324                             const float dither,
325                             const bool use_predivide,
326                             const bool use_overlay);
327   void gpuDisplayShaderUnbind(void);
328   void gpuCacheFree(void);
329
330   const char *getVersionString(void);
331   int getVersionHex(void);
332 };
333 #endif
334
335 #endif /* OCIO_IMPL_H */