CMake: add WITH_LINKER_LLD option for unix platforms
[blender-staging.git] / source / blender / imbuf / IMB_imbuf_types.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) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 #ifndef __IMB_IMBUF_TYPES_H__
21 #define __IMB_IMBUF_TYPES_H__
22
23 #include "DNA_vec_types.h" /* for rcti */
24
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28
29 /** \file
30  * \ingroup imbuf
31  * \brief Contains defines and structs used throughout the imbuf module.
32  * \todo Clean up includes.
33  *
34  * Types needed for using the image buffer.
35  *
36  * Imbuf is external code, slightly adapted to live in the Blender
37  * context. It requires an external jpeg module, and the avi-module
38  * (also external code) in order to function correctly.
39  *
40  * This file contains types and some constants that go with them. Most
41  * are self-explanatory (e.g. IS_amiga tests whether the buffer
42  * contains an Amiga-format file).
43  */
44
45 #define IMB_MIPMAP_LEVELS 20
46 #define IMB_FILENAME_SIZE 1024
47
48 typedef struct DDSData {
49   /** DDS fourcc info */
50   unsigned int fourcc;
51   /** The number of mipmaps in the dds file */
52   unsigned int nummipmaps;
53   /** The compressed image data */
54   unsigned char *data;
55   /** The size of the compressed data */
56   unsigned int size;
57 } DDSData;
58
59 /**
60  * \ingroup imbuf
61  * This is the abstraction of an image.  ImBuf is the basic type used for all
62  * imbuf operations.
63  *
64  * Also; add new variables to the end to save pain!
65  */
66
67 /* Warning: Keep explicit value assignments here,
68  * this file is included in areas where not all format defines are set
69  * (e.g. intern/dds only get WITH_DDS, even if TIFF, HDR etc are also defined).
70  * See T46524. */
71
72 /** #ImBuf.ftype flag, main image types. */
73 enum eImbTypes {
74   IMB_FTYPE_PNG = 1,
75   IMB_FTYPE_TGA = 2,
76   IMB_FTYPE_JPG = 3,
77   IMB_FTYPE_BMP = 4,
78   IMB_FTYPE_OPENEXR = 5,
79   IMB_FTYPE_IMAGIC = 6,
80 #ifdef WITH_OPENIMAGEIO
81   IMB_FTYPE_PSD = 7,
82 #endif
83 #ifdef WITH_OPENJPEG
84   IMB_FTYPE_JP2 = 8,
85 #endif
86 #ifdef WITH_HDR
87   IMB_FTYPE_RADHDR = 9,
88 #endif
89 #ifdef WITH_TIFF
90   IMB_FTYPE_TIF = 10,
91 #endif
92 #ifdef WITH_CINEON
93   IMB_FTYPE_CINEON = 11,
94   IMB_FTYPE_DPX = 12,
95 #endif
96
97 #ifdef WITH_DDS
98   IMB_FTYPE_DDS = 13,
99 #endif
100 };
101
102 /* ibuf->foptions flag, type specific options.
103  * Some formats include compression rations on some bits */
104
105 #define OPENEXR_HALF (1 << 8)
106 /* careful changing this, it's used in DNA as well */
107 #define OPENEXR_COMPRESS (15)
108
109 #ifdef WITH_CINEON
110 #  define CINEON_LOG (1 << 8)
111 #  define CINEON_16BIT (1 << 7)
112 #  define CINEON_12BIT (1 << 6)
113 #  define CINEON_10BIT (1 << 5)
114 #endif
115
116 #ifdef WITH_OPENJPEG
117 #  define JP2_12BIT (1 << 9)
118 #  define JP2_16BIT (1 << 8)
119 #  define JP2_YCC (1 << 7)
120 #  define JP2_CINE (1 << 6)
121 #  define JP2_CINE_48FPS (1 << 5)
122 #  define JP2_JP2 (1 << 4)
123 #  define JP2_J2K (1 << 3)
124 #endif
125
126 #define PNG_16BIT (1 << 10)
127
128 #define RAWTGA 1
129
130 #ifdef WITH_TIFF
131 #  define TIF_16BIT (1 << 8)
132 #  define TIF_COMPRESS_NONE (1 << 7)
133 #  define TIF_COMPRESS_DEFLATE (1 << 6)
134 #  define TIF_COMPRESS_LZW (1 << 5)
135 #  define TIF_COMPRESS_PACKBITS (1 << 4)
136 #endif
137
138 typedef struct ImbFormatOptions {
139   short flag;
140   /** quality serves dual purpose as quality number for jpeg or compression amount for png */
141   char quality;
142 } ImbFormatOptions;
143
144 /**
145  * \name Imbuf Component flags
146  * \brief These flags determine the components of an ImBuf struct.
147  *
148  * \{ */
149
150 typedef enum eImBufFlags {
151   IB_rect = 1 << 0,
152   IB_test = 1 << 1,
153   IB_zbuf = 1 << 3,
154   IB_mem = 1 << 4,
155   IB_rectfloat = 1 << 5,
156   IB_zbuffloat = 1 << 6,
157   IB_multilayer = 1 << 7,
158   IB_metadata = 1 << 8,
159   IB_animdeinterlace = 1 << 9,
160   IB_tiles = 1 << 10,
161   IB_tilecache = 1 << 11,
162   /** indicates whether image on disk have premul alpha */
163   IB_alphamode_premul = 1 << 12,
164   /** if this flag is set, alpha mode would be guessed from file */
165   IB_alphamode_detect = 1 << 13,
166   /* alpha channel is unrelated to RGB and should not affect it */
167   IB_alphamode_channel_packed = 1 << 14,
168   /** ignore alpha on load and substitute it with 1.0f */
169   IB_alphamode_ignore = 1 << 15,
170   IB_thumbnail = 1 << 16,
171   IB_multiview = 1 << 17,
172   IB_halffloat = 1 << 18,
173 } eImBufFlags;
174
175 /** \} */
176 typedef struct ImBuf {
177   struct ImBuf *next, *prev; /**< allow lists of ImBufs, for caches or flipbooks */
178
179   /* dimensions */
180   /** Width and Height of our image buffer.
181    * Should be 'unsigned int' since most formats use this.
182    * but this is problematic with texture math in imagetexture.c
183    * avoid problems and use int. - campbell */
184   int x, y;
185
186   /** Active amount of bits/bitplanes */
187   unsigned char planes;
188   /** Number of channels in `rect_float` (0 = 4 channel default) */
189   int channels;
190
191   /* flags */
192   /** Controls which components should exist. */
193   int flags;
194   /** what is malloced internal, and can be freed */
195   int mall;
196
197   /* pixels */
198
199   /** Image pixel buffer (8bit representation):
200    * - color space defaults to `sRGB`.
201    * - alpha defaults to 'straight'.
202    */
203   unsigned int *rect;
204   /** Image pixel buffer (float representation):
205    * - color space defaults to 'linear' (`rec709`).
206    * - alpha defaults to 'premul'.
207    * \note May need gamma correction to `sRGB` when generating 8bit representations.
208    * \note Formats that support higher more than 8 but channels load as floats.
209    */
210   float *rect_float;
211
212   /* resolution - pixels per meter */
213   double ppm[2];
214
215   /* tiled pixel storage */
216   int tilex, tiley;
217   int xtiles, ytiles;
218   unsigned int **tiles;
219
220   /* zbuffer */
221   /** z buffer data, original zbuffer */
222   int *zbuf;
223   /** z buffer data, camera coordinates */
224   float *zbuf_float;
225
226   /* parameters used by conversion between byte and float */
227   /** random dither value, for conversion from float -> byte rect */
228   float dither;
229
230   /* mipmapping */
231   /** MipMap levels, a series of halved images */
232   struct ImBuf *mipmap[IMB_MIPMAP_LEVELS];
233   int miptot, miplevel;
234
235   /* externally used data */
236   /** reference index for ImBuf lists */
237   int index;
238   /** used to set imbuf to dirty and other stuff */
239   int userflags;
240   /** image metadata */
241   struct IDProperty *metadata;
242   /** temporary storage */
243   void *userdata;
244
245   /* file information */
246   /** file type we are going to save as */
247   enum eImbTypes ftype;
248   /** file format specific flags */
249   ImbFormatOptions foptions;
250   /** filename associated with this image */
251   char name[IMB_FILENAME_SIZE];
252   /** full filename used for reading from cache */
253   char cachename[IMB_FILENAME_SIZE];
254
255   /* memory cache limiter */
256   /** handle for cache limiter */
257   struct MEM_CacheLimiterHandle_s *c_handle;
258   /** reference counter for multiple users */
259   int refcounter;
260
261   /* some parameters to pass along for packing images */
262   /** Compressed image only used with png and exr currently */
263   unsigned char *encodedbuffer;
264   /** Size of data written to encodedbuffer */
265   unsigned int encodedsize;
266   /** Size of encodedbuffer */
267   unsigned int encodedbuffersize;
268
269   /* color management */
270   /** color space of byte buffer */
271   struct ColorSpace *rect_colorspace;
272   /** color space of float buffer, used by sequencer only */
273   struct ColorSpace *float_colorspace;
274   /** array of per-display display buffers dirty flags */
275   unsigned int *display_buffer_flags;
276   /** cache used by color management */
277   struct ColormanageCache *colormanage_cache;
278   int colormanage_flag;
279   rcti invalid_rect;
280
281   /* information for compressed textures */
282   struct DDSData dds_data;
283 } ImBuf;
284
285 /**
286  * \brief userflags: Flags used internally by blender for imagebuffers
287  */
288
289 enum {
290   /** image needs to be saved is not the same as filename */
291   IB_BITMAPDIRTY = (1 << 1),
292   /** image mipmaps are invalid, need recreate */
293   IB_MIPMAP_INVALID = (1 << 2),
294   /** float buffer changed, needs recreation of byte rect */
295   IB_RECT_INVALID = (1 << 3),
296   /** either float or byte buffer changed, need to re-calculate display buffers */
297   IB_DISPLAY_BUFFER_INVALID = (1 << 4),
298   /** image buffer is persistent in the memory and should never be removed from the cache */
299   IB_PERSISTENT = (1 << 5),
300 };
301
302 /**
303  * \name Imbuf preset profile tags
304  * \brief Some predefined color space profiles that 8 bit imbufs can represent
305  *
306  * \{ */
307 #define IB_PROFILE_NONE 0
308 #define IB_PROFILE_LINEAR_RGB 1
309 #define IB_PROFILE_SRGB 2
310 #define IB_PROFILE_CUSTOM 3
311
312 /** \} */
313
314 /* dds */
315 #ifdef WITH_DDS
316 #  ifndef DDS_MAKEFOURCC
317 #    define DDS_MAKEFOURCC(ch0, ch1, ch2, ch3) \
318       ((unsigned long)(unsigned char)(ch0) | ((unsigned long)(unsigned char)(ch1) << 8) | \
319        ((unsigned long)(unsigned char)(ch2) << 16) | ((unsigned long)(unsigned char)(ch3) << 24))
320 #  endif /* DDS_MAKEFOURCC */
321
322 /*
323  * FOURCC codes for DX compressed-texture pixel formats
324  */
325
326 #  define FOURCC_DDS (DDS_MAKEFOURCC('D', 'D', 'S', ' '))
327 #  define FOURCC_DXT1 (DDS_MAKEFOURCC('D', 'X', 'T', '1'))
328 #  define FOURCC_DXT2 (DDS_MAKEFOURCC('D', 'X', 'T', '2'))
329 #  define FOURCC_DXT3 (DDS_MAKEFOURCC('D', 'X', 'T', '3'))
330 #  define FOURCC_DXT4 (DDS_MAKEFOURCC('D', 'X', 'T', '4'))
331 #  define FOURCC_DXT5 (DDS_MAKEFOURCC('D', 'X', 'T', '5'))
332
333 #endif /* DDS */
334 extern const char *imb_ext_image[];
335 extern const char *imb_ext_movie[];
336 extern const char *imb_ext_audio[];
337
338 /* image formats that can only be loaded via filepath */
339 extern const char *imb_ext_image_filepath_only[];
340
341 /**
342  * \name Imbuf Color Management Flag
343  * \brief Used with #ImBuf.colormanage_flag
344  *
345  * \{ */
346
347 enum {
348   IMB_COLORMANAGE_IS_DATA = (1 << 0),
349 };
350
351 /** \} */
352
353 #ifdef __cplusplus
354 }
355 #endif
356
357 #endif /* __IMB_IMBUF_TYPES_H__ */