Merging r50625 through r51896 from trunk into soc-2011-tomato
[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 __LOG_IMAGE_CORE_H__
34 #define __LOG_IMAGE_CORE_H__
35
36 #include <stdio.h>
37
38 #include "BLO_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 {
57         int             depth;
58         int             bitsPerSample;
59         int             dataOffset;
60         int             packing;
61         int             transfer;
62         int             descriptor;
63         unsigned int    refLowData;
64         unsigned int    refHighData;
65         float           refLowQuantity;
66         float           refHighQuantity;
67         float           maxValue; /* = 2^bitsPerSample - 1 (used internally, doesn't come from the file header) */
68 } LogImageElement;
69
70 typedef struct LogImageFile
71 {
72         /* specified in header */
73         int width;
74         int height;
75         int numElements;
76         int depth;
77         LogImageElement element[8];
78
79         /* used for log <-> lin conversion */
80         float referenceBlack;
81         float referenceWhite;
82         float gamma;
83
84         /* io stuff */
85         FILE *file;
86         unsigned char *memBuffer;
87         uintptr_t memBufferSize;
88         unsigned char *memCursor;
89
90         /* is the file LSB or MSB ? */
91         int isMSB;
92
93         /* DPX or Cineon ? */
94         int srcFormat;
95 } LogImageFile;
96
97
98 /* The SMPTE defines this code:
99  *  0 - User-defined
100  *  1 - Printing density
101  *  2 - Linear
102  *  3 - Logarithmic
103  *  4 - Unspecified video
104  *  5 - SMPTE 240M
105  *  6 - CCIR 709-1
106  *  7 - CCIR 601-2 system B or G
107  *  8 - CCIR 601-2 system M
108  *  9 - NTSC composite video
109  *  10 - PAL composite video
110  *  11 - Z linear
111  *  12 - homogeneous
112  *
113  * Note that transfer_characteristics is U8, don't need
114  * check the byte order.
115  */
116
117 enum transfer {
118         transfer_UserDefined,
119         transfer_PrintingDensity,
120         transfer_Linear,
121         transfer_Logarithmic,
122         transfer_Unspecified,
123         transfer_Smpte240M,
124         transfer_Ccir7091,
125         transfer_Ccir6012BG,
126         transfer_Ccir6012M,
127         transfer_NTSC,
128         transfer_PAL,
129         transfer_ZLinear,
130         transfer_Homogeneous
131 };
132
133 /* The SMPTE defines this code:
134  * 0 - User-defined
135  * 1 - Red
136  * 2 - Green
137  * 3 - Blue
138  * 4 - Alpha
139  * 6 - Luminance
140  * 7 - Chrominance
141  * 8 - Depth
142  * 9 - Composite video
143  * 50 - RGB
144  * 51 - RGBA
145  * 52 - ABGR
146  * 100 - CbYCrY
147  * 101 - CbYACrYA
148  * 102 - CbYCr
149  * 103 - CbYCrA
150  * 150 - User-defined 2-component element
151  * 151 - User-defined 3-component element
152  * 152 - User-defined 4-component element
153  * 153 - User-defined 5-component element
154  * 154 - User-defined 6-component element
155  * 155 - User-defined 7-component element
156  * 156 - User-defined 8-component element
157  */
158
159 enum descriptor {
160         descriptor_UserDefined,
161         descriptor_Red,
162         descriptor_Green,
163         descriptor_Blue,
164         descriptor_Alpha,
165         descriptor_Luminance        = 6, /* don't ask me why there's no 5 */
166         descriptor_Chrominance,
167         descriptor_Depth,
168         descriptor_Composite,
169         descriptor_RGB              = 50,
170         descriptor_RGBA,
171         descriptor_ABGR,
172         descriptor_CbYCrY           = 100,
173         descriptor_CbYACrYA,
174         descriptor_CbYCr,
175         descriptor_CbYCrA,
176         descriptor_UserDefined2Elt  = 150,
177         descriptor_UserDefined3Elt,
178         descriptor_UserDefined4Elt,
179         descriptor_UserDefined5Elt,
180         descriptor_UserDefined6Elt,
181         descriptor_UserDefined7Elt,
182         descriptor_UserDefined8Elt,
183         /* following descriptors are for internal use only */
184         descriptor_YA
185 };
186
187 /* int functions return 0 for OK */
188
189 void logImageSetVerbose(int verbosity);
190 int logImageIsDpx(const void *buffer);
191 int logImageIsCineon(const void *buffer);
192 LogImageFile *logImageOpenFromMemory(const unsigned char *buffer, unsigned int size);
193 LogImageFile *logImageOpenFromFile(const char *filename, int cineon);
194 void logImageGetSize(LogImageFile *logImage, int *width, int *height, int *depth);
195 LogImageFile *logImageCreate(const char *filename, int cineon, int width, int height, int bitsPerSample,
196                              int isLogarithmic, int hasAlpha, int referenceWhite, int referenceBlack,
197                              float gamma, const char *creator);
198 void logImageClose(LogImageFile *logImage);
199
200 /* Data handling */
201 unsigned int getRowLength(int width, LogImageElement logElement);
202 int logImageSetDataRGBA(LogImageFile *logImage, float *data, int dataIsLinearRGB);
203 int logImageGetDataRGBA(LogImageFile *logImage, float *data, int dataIsLinearRGB);
204
205 /*
206  * Inline routines
207  */
208
209 /* Endianness swapping */
210
211 BLI_INLINE unsigned short swap_ushort(unsigned short x, int swap)
212 {
213         if (swap != 0)
214                 return (x >> 8) | (x << 8);
215         else
216                 return x;
217 }
218
219 BLI_INLINE unsigned int swap_uint(unsigned int x, int swap)
220 {
221         if (swap != 0)
222                 return (x >> 24) | ((x << 8) & 0x00FF0000) | ((x >> 8) & 0x0000FF00) | (x << 24);
223         else
224                 return x;
225 }
226
227 BLI_INLINE float swap_float(float x, int swap)
228 {
229         if (swap != 0) {
230                 union {
231                         float f;
232                         unsigned char b[4];
233                 } dat1, dat2;
234
235                 dat1.f = x;
236                 dat2.b[0] = dat1.b[3];
237                 dat2.b[1] = dat1.b[2];
238                 dat2.b[2] = dat1.b[1];
239                 dat2.b[3] = dat1.b[0];
240                 return dat2.f;
241         }
242         else
243                 return x;
244 }
245
246 /* Other */
247
248 BLI_INLINE unsigned int clamp_uint(unsigned int x, unsigned int low, unsigned int high)
249 {
250         if (x > high)
251                 return high;
252         else if (x < low)
253                 return low;
254         else
255                 return x;
256 }
257
258 BLI_INLINE float clamp_float(float x, float low, float high)
259 {
260         if (x > high)
261                 return high;
262         else if (x < low)
263                 return low;
264         else
265                 return x;
266 }
267
268 BLI_INLINE unsigned int float_uint(float value, unsigned int max)
269 {
270         if (value < 0.0f)
271                 return 0;
272         else if (value > (1.0f - 0.5f / (float)max))
273                 return max;
274         else
275                 return (unsigned int)(((float)max * value) + 0.5f);
276 }
277
278
279 #ifdef __cplusplus
280 }
281 #endif
282
283 #endif  /* __LOG_IMAGE_CORE_H__ */