Cleanup: style
[blender.git] / source / blender / imbuf / intern / cineon / logImageCore.h
1 /*
2  * Cineon image file format library definitions.
3  * Cineon and DPX common structures.
4  *
5  * This header file contains private details.
6  * User code should generally use cineonlib.h and dpxlib.h only.
7  * Hmm. I thought the two formats would have more in common!
8  *
9  * Copyright 1999,2000,2001 David Hodson <hodsond@acm.org>
10  *
11  * This program is free software; you can redistribute it and/or modify it
12  * under the terms of the GNU General Public License as published by the Free
13  * Software Foundation; either version 2 of the License, or (at your option)
14  * any later version.
15  *
16  * This program is distributed in the hope that it will be useful, but
17  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19  * for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24  *
25  * Contributor(s): Julien Enche.
26  *
27  */
28
29 /** \file blender/imbuf/intern/cineon/logImageCore.h
30  *  \ingroup imbcineon
31  */
32
33 #ifndef __LOGIMAGECORE_H__
34 #define __LOGIMAGECORE_H__
35
36 #include <stdio.h>
37
38 #include "BLI_sys_types.h"
39 #include "BLI_utildefines.h"
40
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44
45 /*
46  * Image structure
47  */
48
49 /* There are some differences between DPX and Cineon so we need to know from what type of file the datas come from */
50 enum format {
51         format_DPX,
52         format_Cineon
53 };
54
55 typedef struct LogImageElement {
56         int             depth;
57         int             bitsPerSample;
58         int             dataOffset;
59         int             packing;
60         int             transfer;
61         int             descriptor;
62         unsigned int    refLowData;
63         unsigned int    refHighData;
64         float           refLowQuantity;
65         float           refHighQuantity;
66         float           maxValue; /* = 2^bitsPerSample - 1 (used internally, doesn't come from the file header) */
67 } LogImageElement;
68
69 typedef struct LogImageFile {
70         /* specified in header */
71         int width;
72         int height;
73         int numElements;
74         int depth;
75         LogImageElement element[8];
76
77         /* used for log <-> lin conversion */
78         float referenceBlack;
79         float referenceWhite;
80         float gamma;
81
82         /* io stuff */
83         FILE *file;
84         unsigned char *memBuffer;
85         uintptr_t memBufferSize;
86         unsigned char *memCursor;
87
88         /* is the file LSB or MSB ? */
89         int isMSB;
90
91         /* DPX or Cineon ? */
92         int srcFormat;
93 } LogImageFile;
94
95
96 /* The SMPTE defines this code:
97  *  0 - User-defined
98  *  1 - Printing density
99  *  2 - Linear
100  *  3 - Logarithmic
101  *  4 - Unspecified video
102  *  5 - SMPTE 240M
103  *  6 - CCIR 709-1
104  *  7 - CCIR 601-2 system B or G
105  *  8 - CCIR 601-2 system M
106  *  9 - NTSC composite video
107  *  10 - PAL composite video
108  *  11 - Z linear
109  *  12 - homogeneous
110  *
111  * Note that transfer_characteristics is U8, don't need
112  * check the byte order.
113  */
114
115 enum transfer {
116         transfer_UserDefined,
117         transfer_PrintingDensity,
118         transfer_Linear,
119         transfer_Logarithmic,
120         transfer_Unspecified,
121         transfer_Smpte240M,
122         transfer_Ccir7091,
123         transfer_Ccir6012BG,
124         transfer_Ccir6012M,
125         transfer_NTSC,
126         transfer_PAL,
127         transfer_ZLinear,
128         transfer_Homogeneous
129 };
130
131 /* The SMPTE defines this code:
132  * 0 - User-defined
133  * 1 - Red
134  * 2 - Green
135  * 3 - Blue
136  * 4 - Alpha
137  * 6 - Luminance
138  * 7 - Chrominance
139  * 8 - Depth
140  * 9 - Composite video
141  * 50 - RGB
142  * 51 - RGBA
143  * 52 - ABGR
144  * 100 - CbYCrY
145  * 101 - CbYACrYA
146  * 102 - CbYCr
147  * 103 - CbYCrA
148  * 150 - User-defined 2-component element
149  * 151 - User-defined 3-component element
150  * 152 - User-defined 4-component element
151  * 153 - User-defined 5-component element
152  * 154 - User-defined 6-component element
153  * 155 - User-defined 7-component element
154  * 156 - User-defined 8-component element
155  */
156
157 enum descriptor {
158         descriptor_UserDefined,
159         descriptor_Red,
160         descriptor_Green,
161         descriptor_Blue,
162         descriptor_Alpha,
163         descriptor_Luminance        = 6, /* don't ask me why there's no 5 */
164         descriptor_Chrominance,
165         descriptor_Depth,
166         descriptor_Composite,
167         descriptor_RGB              = 50,
168         descriptor_RGBA,
169         descriptor_ABGR,
170         descriptor_CbYCrY           = 100,
171         descriptor_CbYACrYA,
172         descriptor_CbYCr,
173         descriptor_CbYCrA,
174         descriptor_UserDefined2Elt  = 150,
175         descriptor_UserDefined3Elt,
176         descriptor_UserDefined4Elt,
177         descriptor_UserDefined5Elt,
178         descriptor_UserDefined6Elt,
179         descriptor_UserDefined7Elt,
180         descriptor_UserDefined8Elt,
181         /* following descriptors are for internal use only */
182         descriptor_YA
183 };
184
185 /* int functions return 0 for OK */
186
187 void logImageSetVerbose(int verbosity);
188 int logImageIsDpx(const void *buffer);
189 int logImageIsCineon(const void *buffer);
190 LogImageFile *logImageOpenFromMemory(const unsigned char *buffer, unsigned int size);
191 LogImageFile *logImageOpenFromFile(const char *filename, int cineon);
192 void logImageGetSize(LogImageFile *logImage, int *width, int *height, int *depth);
193 LogImageFile *logImageCreate(const char *filename, int cineon, int width, int height, int bitsPerSample,
194                              int isLogarithmic, int hasAlpha, int referenceWhite, int referenceBlack,
195                              float gamma, const char *creator);
196 void logImageClose(LogImageFile *logImage);
197
198 /* Data handling */
199 unsigned int getRowLength(int width, LogImageElement logElement);
200 int logImageSetDataRGBA(LogImageFile *logImage, float *data, int dataIsLinearRGB);
201 int logImageGetDataRGBA(LogImageFile *logImage, float *data, int dataIsLinearRGB);
202
203 /*
204  * Inline routines
205  */
206
207 /* Endianness swapping */
208
209 BLI_INLINE unsigned short swap_ushort(unsigned short x, int swap)
210 {
211         if (swap != 0)
212                 return (x >> 8) | (x << 8);
213         else
214                 return x;
215 }
216
217 BLI_INLINE unsigned int swap_uint(unsigned int x, int swap)
218 {
219         if (swap != 0)
220                 return (x >> 24) | ((x << 8) & 0x00FF0000) | ((x >> 8) & 0x0000FF00) | (x << 24);
221         else
222                 return x;
223 }
224
225 BLI_INLINE float swap_float(float x, int swap)
226 {
227         if (swap != 0) {
228                 union {
229                         float f;
230                         unsigned char b[4];
231                 } dat1, dat2;
232
233                 dat1.f = x;
234                 dat2.b[0] = dat1.b[3];
235                 dat2.b[1] = dat1.b[2];
236                 dat2.b[2] = dat1.b[1];
237                 dat2.b[3] = dat1.b[0];
238                 return dat2.f;
239         }
240         else
241                 return x;
242 }
243
244 /* Other */
245
246 BLI_INLINE unsigned int clamp_uint(unsigned int x, unsigned int low, unsigned int high)
247 {
248         if (x > high)
249                 return high;
250         else if (x < low)
251                 return low;
252         else
253                 return x;
254 }
255
256 BLI_INLINE float clamp_float(float x, float low, float high)
257 {
258         if (x > high)
259                 return high;
260         else if (x < low)
261                 return low;
262         else
263                 return x;
264 }
265
266 BLI_INLINE unsigned int float_uint(float value, unsigned int max)
267 {
268         if (value < 0.0f)
269                 return 0;
270         else if (value > (1.0f - 0.5f / (float)max))
271                 return max;
272         else
273                 return (unsigned int)(((float)max * value) + 0.5f);
274 }
275
276
277 #ifdef __cplusplus
278 }
279 #endif
280
281 #endif  /* __LOGIMAGECORE_H__ */