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 #include "MEM_guardedalloc.h"
21 
22 #include "ocio_impl.h"
23 
24 static IOCIOImpl *impl = NULL;
25 
OCIO_init(void)26 void OCIO_init(void)
27 {
28 #ifdef WITH_OCIO
29   impl = new OCIOImpl();
30 #else
31   impl = new FallbackImpl();
32 #endif
33 }
34 
OCIO_exit(void)35 void OCIO_exit(void)
36 {
37   delete impl;
38   impl = NULL;
39 }
40 
OCIO_getCurrentConfig(void)41 OCIO_ConstConfigRcPtr *OCIO_getCurrentConfig(void)
42 {
43   return impl->getCurrentConfig();
44 }
45 
OCIO_configCreateFallback(void)46 OCIO_ConstConfigRcPtr *OCIO_configCreateFallback(void)
47 {
48   delete impl;
49   impl = new FallbackImpl();
50 
51   return impl->getCurrentConfig();
52 }
53 
OCIO_setCurrentConfig(const OCIO_ConstConfigRcPtr * config)54 void OCIO_setCurrentConfig(const OCIO_ConstConfigRcPtr *config)
55 {
56   impl->setCurrentConfig(config);
57 }
58 
OCIO_configCreateFromEnv(void)59 OCIO_ConstConfigRcPtr *OCIO_configCreateFromEnv(void)
60 {
61   return impl->configCreateFromEnv();
62 }
63 
OCIO_configCreateFromFile(const char * filename)64 OCIO_ConstConfigRcPtr *OCIO_configCreateFromFile(const char *filename)
65 {
66   return impl->configCreateFromFile(filename);
67 }
68 
OCIO_configRelease(OCIO_ConstConfigRcPtr * config)69 void OCIO_configRelease(OCIO_ConstConfigRcPtr *config)
70 {
71   impl->configRelease(config);
72 }
73 
OCIO_configGetNumColorSpaces(OCIO_ConstConfigRcPtr * config)74 int OCIO_configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config)
75 {
76   return impl->configGetNumColorSpaces(config);
77 }
78 
OCIO_configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr * config,int index)79 const char *OCIO_configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config, int index)
80 {
81   return impl->configGetColorSpaceNameByIndex(config, index);
82 }
83 
OCIO_configGetColorSpace(OCIO_ConstConfigRcPtr * config,const char * name)84 OCIO_ConstColorSpaceRcPtr *OCIO_configGetColorSpace(OCIO_ConstConfigRcPtr *config,
85                                                     const char *name)
86 {
87   return impl->configGetColorSpace(config, name);
88 }
89 
OCIO_configGetIndexForColorSpace(OCIO_ConstConfigRcPtr * config,const char * name)90 int OCIO_configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const char *name)
91 {
92   return impl->configGetIndexForColorSpace(config, name);
93 }
94 
OCIO_configGetDefaultDisplay(OCIO_ConstConfigRcPtr * config)95 const char *OCIO_configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config)
96 {
97   return impl->configGetDefaultDisplay(config);
98 }
99 
OCIO_configGetNumDisplays(OCIO_ConstConfigRcPtr * config)100 int OCIO_configGetNumDisplays(OCIO_ConstConfigRcPtr *config)
101 {
102   return impl->configGetNumDisplays(config);
103 }
104 
OCIO_configGetDisplay(OCIO_ConstConfigRcPtr * config,int index)105 const char *OCIO_configGetDisplay(OCIO_ConstConfigRcPtr *config, int index)
106 {
107   return impl->configGetDisplay(config, index);
108 }
109 
OCIO_configGetDefaultView(OCIO_ConstConfigRcPtr * config,const char * display)110 const char *OCIO_configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display)
111 {
112   return impl->configGetDefaultView(config, display);
113 }
114 
OCIO_configGetNumViews(OCIO_ConstConfigRcPtr * config,const char * display)115 int OCIO_configGetNumViews(OCIO_ConstConfigRcPtr *config, const char *display)
116 {
117   return impl->configGetNumViews(config, display);
118 }
119 
OCIO_configGetView(OCIO_ConstConfigRcPtr * config,const char * display,int index)120 const char *OCIO_configGetView(OCIO_ConstConfigRcPtr *config, const char *display, int index)
121 {
122   return impl->configGetView(config, display, index);
123 }
124 
OCIO_configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr * config,const char * display,const char * view)125 const char *OCIO_configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config,
126                                                 const char *display,
127                                                 const char *view)
128 {
129   return impl->configGetDisplayColorSpaceName(config, display, view);
130 }
131 
OCIO_configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr * config,float * rgb)132 void OCIO_configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr *config, float *rgb)
133 {
134   impl->configGetDefaultLumaCoefs(config, rgb);
135 }
136 
OCIO_configGetXYZtoRGB(OCIO_ConstConfigRcPtr * config,float xyz_to_rgb[3][3])137 void OCIO_configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config, float xyz_to_rgb[3][3])
138 {
139   impl->configGetXYZtoRGB(config, xyz_to_rgb);
140 }
141 
OCIO_configGetNumLooks(OCIO_ConstConfigRcPtr * config)142 int OCIO_configGetNumLooks(OCIO_ConstConfigRcPtr *config)
143 {
144   return impl->configGetNumLooks(config);
145 }
146 
OCIO_configGetLookNameByIndex(OCIO_ConstConfigRcPtr * config,int index)147 const char *OCIO_configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config, int index)
148 {
149   return impl->configGetLookNameByIndex(config, index);
150 }
151 
OCIO_configGetLook(OCIO_ConstConfigRcPtr * config,const char * name)152 OCIO_ConstLookRcPtr *OCIO_configGetLook(OCIO_ConstConfigRcPtr *config, const char *name)
153 {
154   return impl->configGetLook(config, name);
155 }
156 
OCIO_lookGetProcessSpace(OCIO_ConstLookRcPtr * look)157 const char *OCIO_lookGetProcessSpace(OCIO_ConstLookRcPtr *look)
158 {
159   return impl->lookGetProcessSpace(look);
160 }
161 
OCIO_lookRelease(OCIO_ConstLookRcPtr * look)162 void OCIO_lookRelease(OCIO_ConstLookRcPtr *look)
163 {
164   impl->lookRelease(look);
165 }
166 
OCIO_colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr * cs)167 int OCIO_colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs)
168 {
169   return impl->colorSpaceIsInvertible(cs);
170 }
171 
OCIO_colorSpaceIsData(OCIO_ConstColorSpaceRcPtr * cs)172 int OCIO_colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs)
173 {
174   return impl->colorSpaceIsData(cs);
175 }
176 
OCIO_colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr * config,OCIO_ConstColorSpaceRcPtr * cs,bool * is_scene_linear,bool * is_srgb)177 void OCIO_colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config,
178                               OCIO_ConstColorSpaceRcPtr *cs,
179                               bool *is_scene_linear,
180                               bool *is_srgb)
181 {
182   impl->colorSpaceIsBuiltin(config, cs, *is_scene_linear, *is_srgb);
183 }
184 
OCIO_colorSpaceRelease(OCIO_ConstColorSpaceRcPtr * cs)185 void OCIO_colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs)
186 {
187   impl->colorSpaceRelease(cs);
188 }
189 
OCIO_configGetProcessorWithNames(OCIO_ConstConfigRcPtr * config,const char * srcName,const char * dstName)190 OCIO_ConstProcessorRcPtr *OCIO_configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config,
191                                                            const char *srcName,
192                                                            const char *dstName)
193 {
194   return impl->configGetProcessorWithNames(config, srcName, dstName);
195 }
196 
OCIO_configGetProcessor(OCIO_ConstConfigRcPtr * config,OCIO_ConstTransformRcPtr * transform)197 OCIO_ConstProcessorRcPtr *OCIO_configGetProcessor(OCIO_ConstConfigRcPtr *config,
198                                                   OCIO_ConstTransformRcPtr *transform)
199 {
200   return impl->configGetProcessor(config, transform);
201 }
202 
OCIO_processorApply(OCIO_ConstProcessorRcPtr * processor,OCIO_PackedImageDesc * img)203 void OCIO_processorApply(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img)
204 {
205   impl->processorApply(processor, img);
206 }
207 
OCIO_processorApply_predivide(OCIO_ConstProcessorRcPtr * processor,OCIO_PackedImageDesc * img)208 void OCIO_processorApply_predivide(OCIO_ConstProcessorRcPtr *processor, OCIO_PackedImageDesc *img)
209 {
210   impl->processorApply_predivide(processor, img);
211 }
212 
OCIO_processorApplyRGB(OCIO_ConstProcessorRcPtr * processor,float * pixel)213 void OCIO_processorApplyRGB(OCIO_ConstProcessorRcPtr *processor, float *pixel)
214 {
215   impl->processorApplyRGB(processor, pixel);
216 }
217 
OCIO_processorApplyRGBA(OCIO_ConstProcessorRcPtr * processor,float * pixel)218 void OCIO_processorApplyRGBA(OCIO_ConstProcessorRcPtr *processor, float *pixel)
219 {
220   impl->processorApplyRGBA(processor, pixel);
221 }
222 
OCIO_processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr * processor,float * pixel)223 void OCIO_processorApplyRGBA_predivide(OCIO_ConstProcessorRcPtr *processor, float *pixel)
224 {
225   impl->processorApplyRGBA_predivide(processor, pixel);
226 }
227 
OCIO_processorRelease(OCIO_ConstProcessorRcPtr * p)228 void OCIO_processorRelease(OCIO_ConstProcessorRcPtr *p)
229 {
230   impl->processorRelease(p);
231 }
232 
OCIO_colorSpaceGetName(OCIO_ConstColorSpaceRcPtr * cs)233 const char *OCIO_colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs)
234 {
235   return impl->colorSpaceGetName(cs);
236 }
237 
OCIO_colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr * cs)238 const char *OCIO_colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs)
239 {
240   return impl->colorSpaceGetDescription(cs);
241 }
242 
OCIO_colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr * cs)243 const char *OCIO_colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs)
244 {
245   return impl->colorSpaceGetFamily(cs);
246 }
247 
OCIO_createDisplayTransform(void)248 OCIO_DisplayTransformRcPtr *OCIO_createDisplayTransform(void)
249 {
250   return impl->createDisplayTransform();
251 }
252 
OCIO_displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr * dt,const char * name)253 void OCIO_displayTransformSetInputColorSpaceName(OCIO_DisplayTransformRcPtr *dt, const char *name)
254 {
255   impl->displayTransformSetInputColorSpaceName(dt, name);
256 }
257 
OCIO_displayTransformSetDisplay(OCIO_DisplayTransformRcPtr * dt,const char * name)258 void OCIO_displayTransformSetDisplay(OCIO_DisplayTransformRcPtr *dt, const char *name)
259 {
260   impl->displayTransformSetDisplay(dt, name);
261 }
262 
OCIO_displayTransformSetView(OCIO_DisplayTransformRcPtr * dt,const char * name)263 void OCIO_displayTransformSetView(OCIO_DisplayTransformRcPtr *dt, const char *name)
264 {
265   impl->displayTransformSetView(dt, name);
266 }
267 
OCIO_displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr * dt,OCIO_ConstTransformRcPtr * t)268 void OCIO_displayTransformSetDisplayCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *t)
269 {
270   impl->displayTransformSetDisplayCC(dt, t);
271 }
272 
OCIO_displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr * dt,OCIO_ConstTransformRcPtr * t)273 void OCIO_displayTransformSetLinearCC(OCIO_DisplayTransformRcPtr *dt, OCIO_ConstTransformRcPtr *t)
274 {
275   impl->displayTransformSetLinearCC(dt, t);
276 }
277 
OCIO_displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr * dt,const char * looks)278 void OCIO_displayTransformSetLooksOverride(OCIO_DisplayTransformRcPtr *dt, const char *looks)
279 {
280   impl->displayTransformSetLooksOverride(dt, looks);
281 }
282 
OCIO_displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr * dt,bool enabled)283 void OCIO_displayTransformSetLooksOverrideEnabled(OCIO_DisplayTransformRcPtr *dt, bool enabled)
284 {
285   impl->displayTransformSetLooksOverrideEnabled(dt, enabled);
286 }
287 
OCIO_displayTransformRelease(OCIO_DisplayTransformRcPtr * dt)288 void OCIO_displayTransformRelease(OCIO_DisplayTransformRcPtr *dt)
289 {
290   impl->displayTransformRelease(dt);
291 }
292 
OCIO_createOCIO_PackedImageDesc(float * data,long width,long height,long numChannels,long chanStrideBytes,long xStrideBytes,long yStrideBytes)293 OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data,
294                                                       long width,
295                                                       long height,
296                                                       long numChannels,
297                                                       long chanStrideBytes,
298                                                       long xStrideBytes,
299                                                       long yStrideBytes)
300 {
301   return impl->createOCIO_PackedImageDesc(
302       data, width, height, numChannels, chanStrideBytes, xStrideBytes, yStrideBytes);
303 }
304 
OCIO_PackedImageDescRelease(OCIO_PackedImageDesc * id)305 void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id)
306 {
307   impl->OCIO_PackedImageDescRelease(id);
308 }
309 
OCIO_createGroupTransform(void)310 OCIO_GroupTransformRcPtr *OCIO_createGroupTransform(void)
311 {
312   return impl->createGroupTransform();
313 }
314 
OCIO_groupTransformSetDirection(OCIO_GroupTransformRcPtr * gt,const bool forward)315 void OCIO_groupTransformSetDirection(OCIO_GroupTransformRcPtr *gt, const bool forward)
316 {
317   impl->groupTransformSetDirection(gt, forward);
318 }
319 
OCIO_groupTransformPushBack(OCIO_GroupTransformRcPtr * gt,OCIO_ConstTransformRcPtr * tr)320 void OCIO_groupTransformPushBack(OCIO_GroupTransformRcPtr *gt, OCIO_ConstTransformRcPtr *tr)
321 {
322   impl->groupTransformPushBack(gt, tr);
323 }
324 
OCIO_groupTransformRelease(OCIO_GroupTransformRcPtr * gt)325 void OCIO_groupTransformRelease(OCIO_GroupTransformRcPtr *gt)
326 {
327   impl->groupTransformRelease(gt);
328 }
329 
OCIO_createColorSpaceTransform(void)330 OCIO_ColorSpaceTransformRcPtr *OCIO_createColorSpaceTransform(void)
331 {
332   return impl->createColorSpaceTransform();
333 }
334 
OCIO_colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr * ct,const char * name)335 void OCIO_colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr *ct, const char *name)
336 {
337   impl->colorSpaceTransformSetSrc(ct, name);
338 }
339 
OCIO_colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr * ct)340 void OCIO_colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr *ct)
341 {
342   impl->colorSpaceTransformRelease(ct);
343 }
344 
OCIO_createExponentTransform(void)345 OCIO_ExponentTransformRcPtr *OCIO_createExponentTransform(void)
346 {
347   return impl->createExponentTransform();
348 }
349 
OCIO_exponentTransformSetValue(OCIO_ExponentTransformRcPtr * et,const float * exponent)350 void OCIO_exponentTransformSetValue(OCIO_ExponentTransformRcPtr *et, const float *exponent)
351 {
352   impl->exponentTransformSetValue(et, exponent);
353 }
354 
OCIO_exponentTransformRelease(OCIO_ExponentTransformRcPtr * et)355 void OCIO_exponentTransformRelease(OCIO_ExponentTransformRcPtr *et)
356 {
357   impl->exponentTransformRelease(et);
358 }
359 
OCIO_createMatrixTransform(void)360 OCIO_MatrixTransformRcPtr *OCIO_createMatrixTransform(void)
361 {
362   return impl->createMatrixTransform();
363 }
364 
OCIO_matrixTransformSetValue(OCIO_MatrixTransformRcPtr * mt,const float * m44,const float * offset4)365 void OCIO_matrixTransformSetValue(OCIO_MatrixTransformRcPtr *mt,
366                                   const float *m44,
367                                   const float *offset4)
368 {
369   impl->matrixTransformSetValue(mt, m44, offset4);
370 }
371 
OCIO_matrixTransformRelease(OCIO_MatrixTransformRcPtr * mt)372 void OCIO_matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt)
373 {
374   impl->matrixTransformRelease(mt);
375 }
376 
OCIO_matrixTransformScale(float * m44,float * offset4,const float * scale4f)377 void OCIO_matrixTransformScale(float *m44, float *offset4, const float *scale4f)
378 {
379   impl->matrixTransformScale(m44, offset4, scale4f);
380 }
381 
OCIO_supportGLSLDraw(void)382 int OCIO_supportGLSLDraw(void)
383 {
384   return (int)impl->supportGLSLDraw();
385 }
386 
OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState ** state_r,OCIO_ConstProcessorRcPtr * ocio_processor_scene_to_ui,OCIO_ConstProcessorRcPtr * ocio_processor_ui_to_display,OCIO_CurveMappingSettings * curve_mapping_settings,float dither,bool predivide,bool overlay)387 int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r,
388                        OCIO_ConstProcessorRcPtr *ocio_processor_scene_to_ui,
389                        OCIO_ConstProcessorRcPtr *ocio_processor_ui_to_display,
390                        OCIO_CurveMappingSettings *curve_mapping_settings,
391                        float dither,
392                        bool predivide,
393                        bool overlay)
394 {
395   return (int)impl->setupGLSLDraw(state_r,
396                                   ocio_processor_scene_to_ui,
397                                   ocio_processor_ui_to_display,
398                                   curve_mapping_settings,
399                                   dither,
400                                   predivide,
401                                   overlay);
402 }
403 
OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState * state)404 void OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState *state)
405 {
406   impl->finishGLSLDraw(state);
407 }
408 
OCIO_freeOGLState(struct OCIO_GLSLDrawState * state)409 void OCIO_freeOGLState(struct OCIO_GLSLDrawState *state)
410 {
411   impl->freeGLState(state);
412 }
413 
OCIO_getVersionString(void)414 const char *OCIO_getVersionString(void)
415 {
416   return impl->getVersionString();
417 }
418 
OCIO_getVersionHex(void)419 int OCIO_getVersionHex(void)
420 {
421   return impl->getVersionHex();
422 }
423