merge from trunk #37722
[blender-staging.git] / source / blender / imbuf / IMB_imbuf.h
1 /*
2  * $Id$ 
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 /** \file blender/imbuf/IMB_imbuf.h
31  *  \ingroup imbuf
32  */
33
34 /**
35  * @file IMB_imbuf.h
36  * @brief IMage Buffer module.
37  *
38  * This module offers import/export of several graphical file formats.
39  * @ingroup imbuf
40  *
41  * @page IMB Imbuf module external interface
42  *
43  *
44  * @section about About the IMB module
45  *
46  * External interface of the IMage Buffer module. This module offers
47  * import/export of several graphical file formats. It offers the
48  * ImBuf type as a common structure to refer to different graphical
49  * file formats, and to enable a uniform way of handling them.
50  *
51  * @section issues Known issues with IMB
52  *
53  * - imbuf is written in C.
54  * - Endianness issues are dealt with internally.
55  * - File I/O must be done externally. The module uses FILE*'s to
56  *   direct input/output.
57  * - Platform dependency is limited. Some minor patches for
58  *   amiga and Irix are present. A 'posix-compliancy-patch'
59  *   provides the interface to windows.
60  *
61  * @section dependencies Dependencies
62  *
63  * IMB needs:
64  * - \ref DNA module
65  *     The listbase types are used for handling the memory
66  *     management.
67  * - \ref blenlib module
68  *     blenlib handles guarded memory management in blender-style.
69  *     BLI_winstuff.h makes a few windows specific behaviours
70  *     posix-compliant.
71  */
72
73 #ifndef IMB_IMBUF_H
74 #define IMB_IMBUF_H
75
76 /**
77  *
78  * @attention defined in ???
79  */
80 struct ImBuf;
81
82 /**
83  *
84  * @attention defined in ???
85  */
86 struct anim;
87
88 /**
89  *
90  * @attention Defined in allocimbuf.c
91  */
92 void IMB_init(void);
93 void IMB_exit(void);
94
95 /**
96  *
97  * @attention Defined in readimage.c
98  */
99 struct ImBuf *IMB_ibImageFromMemory(unsigned char *mem, size_t size, int flags);
100
101 /**
102  *
103  * @attention Defined in readimage.c
104  */
105 struct ImBuf *IMB_testiffname(char *naam,int flags);
106
107 /**
108  *
109  * @attention Defined in readimage.c
110  */
111 struct ImBuf *IMB_loadiffname(const char *naam, int flags);
112
113 /**
114  *
115  * @attention Defined in allocimbuf.c
116  */
117 void IMB_freeImBuf(struct ImBuf *ibuf);
118
119 /**
120  *
121  * @attention Defined in allocimbuf.c
122  */
123 struct ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y,
124                                                  unsigned char d, unsigned int flags);
125
126 /**
127  *
128  * Increase reference count to imbuf
129  * (to delete an imbuf you have to call freeImBuf as many times as it
130  * is referenced)
131  *
132  * @attention Defined in allocimbuf.c
133  */
134
135 void IMB_refImBuf(struct ImBuf *ibuf);
136
137 /**
138  *
139  * @attention Defined in allocimbuf.c
140  */
141 void IMB_cache_limiter_insert(struct ImBuf *i);
142 void IMB_cache_limiter_unmanage(struct ImBuf *i);
143 void IMB_cache_limiter_touch(struct ImBuf *i);
144 void IMB_cache_limiter_ref(struct ImBuf *i);
145 void IMB_cache_limiter_unref(struct ImBuf *i);
146 int IMB_cache_limiter_get_refcount(struct ImBuf *i);
147
148 void IMB_free_cache_limiter(void);
149
150 /**
151  *
152  * @attention Defined in allocimbuf.c
153  */
154 struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1);
155
156 /**
157  *
158  * @attention Defined in allocimbuf.c
159  */
160 short addzbufImBuf(struct ImBuf *ibuf);
161 short addzbuffloatImBuf(struct ImBuf *ibuf);
162
163 /**
164  *
165  * @attention Defined in rectop.c
166  */
167
168 typedef enum IMB_BlendMode {
169         IMB_BLEND_MIX = 0,
170         IMB_BLEND_ADD = 1,
171         IMB_BLEND_SUB = 2,
172         IMB_BLEND_MUL = 3,
173         IMB_BLEND_LIGHTEN = 4,
174         IMB_BLEND_DARKEN = 5,
175         IMB_BLEND_ERASE_ALPHA = 6,
176         IMB_BLEND_ADD_ALPHA = 7,
177
178         IMB_BLEND_COPY = 1000,
179         IMB_BLEND_COPY_RGB = 1001,
180         IMB_BLEND_COPY_ALPHA = 1002
181 } IMB_BlendMode;
182
183 unsigned int IMB_blend_color(unsigned int src1, unsigned int src2, int fac,
184         IMB_BlendMode mode);
185 void IMB_blend_color_float(float *dst, float *src1, float *src2, float fac,
186         IMB_BlendMode mode);
187
188 void IMB_rectclip(struct ImBuf *dbuf, struct ImBuf *sbuf, int *destx, 
189         int *desty, int *srcx, int *srcy, int *width, int *height);
190 void IMB_rectcpy(struct ImBuf *drect, struct ImBuf *srect, int destx,
191         int desty, int srcx, int srcy, int width, int height);
192 void IMB_rectblend(struct ImBuf *dbuf, struct ImBuf *sbuf, int destx, 
193         int desty, int srcx, int srcy, int width, int height, IMB_BlendMode mode);
194
195 /**
196  * Return the length (in frames) of the given @a anim.
197  */
198 int IMB_anim_get_duration(struct anim *anim);
199
200 /**
201  *
202  * @attention Defined in anim.c
203  */
204 struct anim *IMB_open_anim(const char *name, int ib_flags);
205 void IMB_close_anim(struct anim *anim);
206
207 /**
208  *
209  * @attention Defined in anim.c
210  */
211
212 int ismovie(const char *name);
213 void IMB_anim_set_preseek(struct anim *anim, int preseek);
214 int IMB_anim_get_preseek(struct anim *anim);
215
216 /**
217  *
218  * @attention Defined in anim.c
219  */
220
221 struct ImBuf *IMB_anim_absolute(struct anim *anim, int position);
222
223 /**
224  *
225  * @attention Defined in anim.c
226  * fetches a define previewframe, usually half way into the movie
227  */
228 struct ImBuf *IMB_anim_previewframe(struct anim *anim);
229
230 /**
231  *
232  * @attention Defined in anim.c
233  */
234 void IMB_free_anim_ibuf(struct anim *anim);
235
236 /**
237  *
238  * @attention Defined in anim.c
239  */
240 void IMB_free_anim(struct anim *anim);
241
242 /**
243  *
244  * @attention Defined in filter.c
245  */
246
247 #define FILTER_MASK_NULL                0
248 #define FILTER_MASK_MARGIN              1
249 #define FILTER_MASK_USED                2
250
251 void IMB_filter(struct ImBuf *ibuf);
252 void IMB_filterN(struct ImBuf *out, struct ImBuf *in);
253 void IMB_mask_filter_extend(char *mask, int width, int height);
254 void IMB_mask_clear(struct ImBuf *ibuf, char *mask, int val);
255 void IMB_filter_extend(struct ImBuf *ibuf, char *mask);
256 void IMB_makemipmap(struct ImBuf *ibuf, int use_filter);
257 void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter);
258 struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level);
259
260 /**
261  *
262  * @attention Defined in cache.c
263  */
264
265 void IMB_tile_cache_params(int totthread, int maxmem);
266 unsigned int *IMB_gettile(struct ImBuf *ibuf, int tx, int ty, int thread);
267 void IMB_tiles_to_rect(struct ImBuf *ibuf);
268
269 /**
270  *
271  * @attention Defined in filter.c
272  */
273 void IMB_filtery(struct ImBuf *ibuf);
274
275 /**
276  *
277  * @attention Defined in scaling.c
278  */
279 struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1);
280
281 /**
282  *
283  * @attention Defined in scaling.c
284  */
285 struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
286
287 /**
288  *
289  * @attention Defined in scaling.c
290  */
291 struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
292
293 /**
294  *
295  * @attention Defined in writeimage.c
296  */
297 short IMB_saveiff(struct ImBuf *ibuf, const char *filepath, int flags);
298
299 /**
300  * Encodes a png image from an ImBuf
301  *
302  * @attention Defined in png_encode.c
303  */
304 short IMB_png_encode(struct ImBuf *ibuf, int file, int flags);
305
306 /**
307  *
308  * @attention Defined in util.c
309  */
310 int IMB_ispic(const char *name);
311
312 /**
313  *
314  * @attention Defined in util.c
315  */
316 int IMB_isanim(const char *name);
317
318 /**
319  *
320  * @attention Defined in util.c
321  */
322 int imb_get_anim_type(const char *name);
323
324 /**
325  *
326  * @attention Defined in divers.c
327  */
328 void IMB_de_interlace(struct ImBuf *ibuf);
329 void IMB_interlace(struct ImBuf *ibuf);
330
331 /* create char buffer, color corrected if necessary, for ImBufs that lack one */ 
332 void IMB_rect_from_float(struct ImBuf *ibuf);
333 /* create char buffer for part of the image, color corrected if necessary,
334    Changed part will be stored in buffer. This is expected to be used for texture painting updates */ 
335 void IMB_partial_rect_from_float(struct ImBuf *ibuf, float *buffer, int x, int y, int w, int h);
336 void IMB_float_from_rect(struct ImBuf *ibuf);
337 void IMB_float_from_rect_simple(struct ImBuf *ibuf); /* no profile conversion */
338 /* note, check that the conversion exists, only some are supported */
339 void IMB_convert_profile(struct ImBuf *ibuf, int profile);
340 float *IMB_float_profile_ensure(struct ImBuf *ibuf, int profile, int *alloc);
341
342 /**
343  * Change the ordering of the color bytes pointed to by rect from
344  * rgba to abgr. size * 4 color bytes are reordered.
345  *
346  * @attention Defined in imageprocess.c
347  */
348 void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf);
349
350 /**
351  * Change the ordering of the color bytes pointed to by rect from
352  * rgba to abgr. size * 4 color bytes are reordered.
353  *
354  * @attention Defined in imageprocess.c
355  */
356 void IMB_convert_bgra_to_rgba(int size, unsigned int *rect);
357
358 /**
359  *
360  * @attention defined in imageprocess.c
361  */
362 void bicubic_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
363 void neareast_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
364 void bilinear_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
365
366 void bicubic_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
367 void neareast_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
368 void bilinear_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
369 void bilinear_interpolation_color_wrap(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
370
371 /**
372  *
373  * @attention defined in readimage.c
374  * @deprecated Only here for backwards compatibility of the
375  * @deprecated plugin system.
376  */
377 struct ImBuf *IMB_loadiffmem(int *mem, int flags);
378
379 /**
380  *
381  * @attention defined in readimage.c
382  * @deprecated Only here for backwards compatibility of the
383  * @deprecated plugin system.
384  */  
385 struct ImBuf *IMB_loadifffile(int file, int flags);
386
387 /**
388  *
389  * @attention defined in scaling.c
390  */
391 struct ImBuf *IMB_half_x(struct ImBuf *ibuf1);
392
393 /**
394  *
395  * @attention defined in scaling.c
396  */
397 struct ImBuf *IMB_double_fast_x(struct ImBuf *ibuf1);
398
399 /**
400  *
401  * @attention defined in scaling.c
402  */
403 struct ImBuf *IMB_double_x(struct ImBuf *ibuf1);
404
405 /**
406  *
407  * @attention defined in scaling.c
408  */
409 struct ImBuf *IMB_half_y(struct ImBuf *ibuf1);
410
411 /**
412  *
413  * @attention defined in scaling.c
414  */
415 struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1);
416
417 /**
418  *
419  * @attention defined in scaling.c
420  */
421 struct ImBuf *IMB_double_y(struct ImBuf *ibuf1);
422
423 /**
424  *
425  * @attention Defined in rotate.c
426  */
427 void IMB_flipx(struct ImBuf *ibuf);
428 void IMB_flipy(struct ImBuf *ibuf);
429
430 /* Premultiply alpha */
431
432 void IMB_premultiply_alpha(struct ImBuf *ibuf);
433
434 /**
435  *
436  * @attention Defined in allocimbuf.c
437  */
438 void IMB_freezbufImBuf(struct ImBuf *ibuf);
439 void IMB_freezbuffloatImBuf(struct ImBuf *ibuf);
440
441 /**
442  *
443  * @attention Defined in rectop.c
444  */
445 void IMB_rectfill(struct ImBuf *drect, const float col[4]);
446 void IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int y1, int x2, int y2);
447 void IMB_rectfill_alpha(struct ImBuf *ibuf, const float value);
448
449 /* this should not be here, really, we needed it for operating on render data, IMB_rectfill_area calls it */
450 void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height, float *col, int x1, int y1, int x2, int y2);
451
452 /* defined in metadata.c */
453 int IMB_metadata_change_field(struct ImBuf *img, const char *key, const char *field);
454
455 /* exported for image tools in blender, to quickly allocate 32 bits rect */
456 short imb_addrectImBuf(struct ImBuf *ibuf);
457 void imb_freerectImBuf(struct ImBuf *ibuf);
458
459 short imb_addrectfloatImBuf(struct ImBuf *ibuf);
460 void imb_freerectfloatImBuf(struct ImBuf *ibuf);
461 void imb_freemipmapImBuf(struct ImBuf *ibuf);
462
463 short imb_addtilesImBuf(struct ImBuf *ibuf);
464 void imb_freetilesImBuf(struct ImBuf *ibuf);
465
466 #endif
467