Color Management: fallback to stub ocio implementation in cases when
[blender.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 ConstConfigRcPtr *getCurrentConfig(void) = 0;
36         virtual void setCurrentConfig(const ConstConfigRcPtr *config) = 0;
37
38         virtual ConstConfigRcPtr *configCreateFromEnv(void) = 0;
39         virtual ConstConfigRcPtr *configCreateFromFile(const char* filename) = 0;
40
41         virtual void configRelease(ConstConfigRcPtr *config) = 0;
42
43         virtual int configGetNumColorSpaces(ConstConfigRcPtr *config) = 0;
44         virtual const char *configGetColorSpaceNameByIndex(ConstConfigRcPtr *config, int index) = 0;
45         virtual ConstColorSpaceRcPtr *configGetColorSpace(ConstConfigRcPtr *config, const char *name) = 0;
46         virtual int configGetIndexForColorSpace(ConstConfigRcPtr *config, const char *name) = 0;
47
48         virtual int colorSpaceIsInvertible(ConstColorSpaceRcPtr *cs) = 0;
49         virtual int colorSpaceIsData(ConstColorSpaceRcPtr *cs) = 0;
50
51         virtual void colorSpaceRelease(ConstColorSpaceRcPtr *cs) = 0;
52
53         virtual const char *configGetDefaultDisplay(ConstConfigRcPtr *config) = 0;
54         virtual int         configGetNumDisplays(ConstConfigRcPtr *config) = 0;
55         virtual const char *configGetDisplay(ConstConfigRcPtr *config, int index) = 0;
56         virtual const char *configGetDefaultView(ConstConfigRcPtr *config, const char *display) = 0;
57         virtual int         configGetNumViews(ConstConfigRcPtr *config, const char *display) = 0;
58         virtual const char *configGetView(ConstConfigRcPtr *config, const char *display, int index) = 0;
59         virtual const char *configGetDisplayColorSpaceName(ConstConfigRcPtr *config, const char *display, const char *view) = 0;
60
61         virtual ConstProcessorRcPtr *configGetProcessorWithNames(ConstConfigRcPtr *config, const char *srcName, const char *dstName) = 0;
62         virtual ConstProcessorRcPtr *configGetProcessor(ConstConfigRcPtr *config, ConstTransformRcPtr *transform) = 0;
63
64         virtual void processorApply(ConstProcessorRcPtr *processor, PackedImageDesc *img) = 0;
65         virtual void processorApply_predivide(ConstProcessorRcPtr *processor, PackedImageDesc *img) = 0;
66         virtual void processorApplyRGB(ConstProcessorRcPtr *processor, float *pixel) = 0;
67         virtual void processorApplyRGBA(ConstProcessorRcPtr *processor, float *pixel) = 0;
68         virtual void processorApplyRGBA_predivide(ConstProcessorRcPtr *processor, float *pixel) = 0;
69
70         virtual void processorRelease(ConstProcessorRcPtr *p) = 0;
71
72         virtual const char *colorSpaceGetName(ConstColorSpaceRcPtr *cs) = 0;
73         virtual const char *colorSpaceGetDescription(ConstColorSpaceRcPtr *cs) = 0;
74         virtual const char *colorSpaceGetFamily(ConstColorSpaceRcPtr *cs) = 0;
75
76         virtual DisplayTransformRcPtr *createDisplayTransform(void) = 0;
77         virtual void displayTransformSetInputColorSpaceName(DisplayTransformRcPtr *dt, const char *name) = 0;
78         virtual void displayTransformSetDisplay(DisplayTransformRcPtr *dt, const char *name) = 0;
79         virtual void displayTransformSetView(DisplayTransformRcPtr *dt, const char *name) = 0;
80         virtual void displayTransformSetDisplayCC(DisplayTransformRcPtr *dt, ConstTransformRcPtr *et) = 0;
81         virtual void displayTransformSetLinearCC(DisplayTransformRcPtr *dt, ConstTransformRcPtr *et) = 0;
82         virtual void displayTransformRelease(DisplayTransformRcPtr *dt) = 0;
83
84         virtual PackedImageDesc *createPackedImageDesc(float *data, long width, long height, long numChannels,
85                                                        long chanStrideBytes, long xStrideBytes, long yStrideBytes) = 0;
86
87         virtual void packedImageDescRelease(PackedImageDesc *p) = 0;
88
89         virtual ExponentTransformRcPtr *createExponentTransform(void) = 0;
90         virtual void exponentTransformSetValue(ExponentTransformRcPtr *et, const float *exponent) = 0;
91         virtual void exponentTransformRelease(ExponentTransformRcPtr *et) = 0;
92
93         virtual MatrixTransformRcPtr *createMatrixTransform(void) = 0;
94         virtual void matrixTransformSetValue(MatrixTransformRcPtr *et, const float *m44, const float *offset4) = 0;
95         virtual void matrixTransformRelease(MatrixTransformRcPtr *mt) = 0;
96
97         virtual void matrixTransformScale(float * m44, float * offset4, const float * scale4) = 0;
98 };
99
100 class FallbackImpl : public IOCIOImpl {
101 public:
102         FallbackImpl() {};
103
104         ConstConfigRcPtr *getCurrentConfig(void);
105         void setCurrentConfig(const ConstConfigRcPtr *config);
106
107         ConstConfigRcPtr *configCreateFromEnv(void);
108         ConstConfigRcPtr *configCreateFromFile(const char* filename);
109
110         void configRelease(ConstConfigRcPtr *config);
111
112         int configGetNumColorSpaces(ConstConfigRcPtr *config);
113         const char *configGetColorSpaceNameByIndex(ConstConfigRcPtr *config, int index);
114         ConstColorSpaceRcPtr *configGetColorSpace(ConstConfigRcPtr *config, const char *name);
115         int configGetIndexForColorSpace(ConstConfigRcPtr *config, const char *name);
116
117         int colorSpaceIsInvertible(ConstColorSpaceRcPtr *cs);
118         int colorSpaceIsData(ConstColorSpaceRcPtr *cs);
119
120         void colorSpaceRelease(ConstColorSpaceRcPtr *cs);
121
122         const char *configGetDefaultDisplay(ConstConfigRcPtr *config);
123         int         configGetNumDisplays(ConstConfigRcPtr *config);
124         const char *configGetDisplay(ConstConfigRcPtr *config, int index);
125         const char *configGetDefaultView(ConstConfigRcPtr *config, const char *display);
126         int         configGetNumViews(ConstConfigRcPtr *config, const char *display);
127         const char *configGetView(ConstConfigRcPtr *config, const char *display, int index);
128         const char *configGetDisplayColorSpaceName(ConstConfigRcPtr *config, const char *display, const char *view);
129
130         ConstProcessorRcPtr *configGetProcessorWithNames(ConstConfigRcPtr *config, const char *srcName, const char *dstName);
131         ConstProcessorRcPtr *configGetProcessor(ConstConfigRcPtr *config, ConstTransformRcPtr *transform);
132
133         void processorApply(ConstProcessorRcPtr *processor, PackedImageDesc *img);
134         void processorApply_predivide(ConstProcessorRcPtr *processor, PackedImageDesc *img);
135         void processorApplyRGB(ConstProcessorRcPtr *processor, float *pixel);
136         void processorApplyRGBA(ConstProcessorRcPtr *processor, float *pixel);
137         void processorApplyRGBA_predivide(ConstProcessorRcPtr *processor, float *pixel);
138
139         void processorRelease(ConstProcessorRcPtr *p);
140
141         const char *colorSpaceGetName(ConstColorSpaceRcPtr *cs);
142         const char *colorSpaceGetDescription(ConstColorSpaceRcPtr *cs);
143         const char *colorSpaceGetFamily(ConstColorSpaceRcPtr *cs);
144
145         DisplayTransformRcPtr *createDisplayTransform(void);
146         void displayTransformSetInputColorSpaceName(DisplayTransformRcPtr *dt, const char *name);
147         void displayTransformSetDisplay(DisplayTransformRcPtr *dt, const char *name);
148         void displayTransformSetView(DisplayTransformRcPtr *dt, const char *name);
149         void displayTransformSetDisplayCC(DisplayTransformRcPtr *dt, ConstTransformRcPtr *et);
150         void displayTransformSetLinearCC(DisplayTransformRcPtr *dt, ConstTransformRcPtr *et);
151         void displayTransformRelease(DisplayTransformRcPtr *dt);
152
153         PackedImageDesc *createPackedImageDesc(float *data, long width, long height, long numChannels,
154                                                long chanStrideBytes, long xStrideBytes, long yStrideBytes);
155
156         void packedImageDescRelease(PackedImageDesc *p);
157
158         ExponentTransformRcPtr *createExponentTransform(void);
159         void exponentTransformSetValue(ExponentTransformRcPtr *et, const float *exponent);
160         void exponentTransformRelease(ExponentTransformRcPtr *et);
161
162         MatrixTransformRcPtr *createMatrixTransform(void);
163         void matrixTransformSetValue(MatrixTransformRcPtr *et, const float *m44, const float *offset4);
164         void matrixTransformRelease(MatrixTransformRcPtr *mt);
165
166         void matrixTransformScale(float * m44, float * offset4, const float * scale4);
167 };
168
169 #ifdef WITH_OCIO
170 class OCIOImpl : public IOCIOImpl {
171 public:
172         OCIOImpl() {};
173
174         ConstConfigRcPtr *getCurrentConfig(void);
175         void setCurrentConfig(const ConstConfigRcPtr *config);
176
177         ConstConfigRcPtr *configCreateFromEnv(void);
178         ConstConfigRcPtr *configCreateFromFile(const char* filename);
179
180         void configRelease(ConstConfigRcPtr *config);
181
182         int configGetNumColorSpaces(ConstConfigRcPtr *config);
183         const char *configGetColorSpaceNameByIndex(ConstConfigRcPtr *config, int index);
184         ConstColorSpaceRcPtr *configGetColorSpace(ConstConfigRcPtr *config, const char *name);
185         int configGetIndexForColorSpace(ConstConfigRcPtr *config, const char *name);
186
187         int colorSpaceIsInvertible(ConstColorSpaceRcPtr *cs);
188         int colorSpaceIsData(ConstColorSpaceRcPtr *cs);
189
190         void colorSpaceRelease(ConstColorSpaceRcPtr *cs);
191
192         const char *configGetDefaultDisplay(ConstConfigRcPtr *config);
193         int         configGetNumDisplays(ConstConfigRcPtr *config);
194         const char *configGetDisplay(ConstConfigRcPtr *config, int index);
195         const char *configGetDefaultView(ConstConfigRcPtr *config, const char *display);
196         int         configGetNumViews(ConstConfigRcPtr *config, const char *display);
197         const char *configGetView(ConstConfigRcPtr *config, const char *display, int index);
198         const char *configGetDisplayColorSpaceName(ConstConfigRcPtr *config, const char *display, const char *view);
199
200         ConstProcessorRcPtr *configGetProcessorWithNames(ConstConfigRcPtr *config, const char *srcName, const char *dstName);
201         ConstProcessorRcPtr *configGetProcessor(ConstConfigRcPtr *config, ConstTransformRcPtr *transform);
202
203         void processorApply(ConstProcessorRcPtr *processor, PackedImageDesc *img);
204         void processorApply_predivide(ConstProcessorRcPtr *processor, PackedImageDesc *img);
205         void processorApplyRGB(ConstProcessorRcPtr *processor, float *pixel);
206         void processorApplyRGBA(ConstProcessorRcPtr *processor, float *pixel);
207         void processorApplyRGBA_predivide(ConstProcessorRcPtr *processor, float *pixel);
208
209         void processorRelease(ConstProcessorRcPtr *p);
210
211         const char *colorSpaceGetName(ConstColorSpaceRcPtr *cs);
212         const char *colorSpaceGetDescription(ConstColorSpaceRcPtr *cs);
213         const char *colorSpaceGetFamily(ConstColorSpaceRcPtr *cs);
214
215         DisplayTransformRcPtr *createDisplayTransform(void);
216         void displayTransformSetInputColorSpaceName(DisplayTransformRcPtr *dt, const char *name);
217         void displayTransformSetDisplay(DisplayTransformRcPtr *dt, const char *name);
218         void displayTransformSetView(DisplayTransformRcPtr *dt, const char *name);
219         void displayTransformSetDisplayCC(DisplayTransformRcPtr *dt, ConstTransformRcPtr *et);
220         void displayTransformSetLinearCC(DisplayTransformRcPtr *dt, ConstTransformRcPtr *et);
221         void displayTransformRelease(DisplayTransformRcPtr *dt);
222
223         PackedImageDesc *createPackedImageDesc(float *data, long width, long height, long numChannels,
224                                                long chanStrideBytes, long xStrideBytes, long yStrideBytes);
225
226         void packedImageDescRelease(PackedImageDesc *p);
227
228         ExponentTransformRcPtr *createExponentTransform(void);
229         void exponentTransformSetValue(ExponentTransformRcPtr *et, const float *exponent);
230         void exponentTransformRelease(ExponentTransformRcPtr *et);
231
232         MatrixTransformRcPtr *createMatrixTransform(void);
233         void matrixTransformSetValue(MatrixTransformRcPtr *et, const float *m44, const float *offset4);
234         void matrixTransformRelease(MatrixTransformRcPtr *mt);
235
236         void matrixTransformScale(float * m44, float * offset4, const float * scale4);
237 };
238 #endif
239
240 #endif /* OCIO_IMPL_H */