Particles
[blender.git] / source / blender / imbuf / IMB_imbuf.h
1 /**
2  * @file IMB_imbuf.h
3  * @brief IMage Buffer module.
4  *
5  * This module offers import/export of several graphical file formats.
6  * \ref IMB
7  * @ingroup imbuf
8  * @ingroup undoc
9  *
10  * @page IMB - Imbuf module external interface
11  *
12  *
13  * @section about About the IMB module
14  *
15  * External interface of the IMage Buffer module. This module offers
16  * import/export of several graphical file formats. It offers the
17  * ImBuf type as a common structure to refer to different graphical
18  * file formats, and to enable a uniform way of handling them.
19  *
20  * @section issues Known issues with IMB
21  *
22  * - imbuf is written in C.
23  * - Endianness issues are dealt with internally.
24  * - File I/O must be done externally. The module uses FILE*'s to
25  *   direct input/output.
26  * - Platform dependency is limited. Some minor patches for
27  *   amiga and Irix are present. A 'posix-compliancy-patch'
28  *   provides the interface to windows.
29  *
30  * @section dependencies Dependencies
31  *
32  * IMB needs:
33  * - SDNA module
34  *     The listbase types are used for handling the memory
35  *     management.
36  * - blenlib module
37  *     blenlib handles guarded memory management in blender-style.
38  *     BLI_winstuff.h makes a few windows specific behaviours
39  *     posix-compliant.
40  * - avi
41  *     avi defines import/export to the avi format. Only anim.c
42  *     needs this. It uses the following functions:
43  *       - avi_close
44  *       - avi_is_avi
45  *       - avi_print_error
46  *       - avi_open_movie
47  *       - avi_read_frame
48  *       - avi_get_stream
49  *     Additionally, it needs the types from the avi module.
50  * - external jpeg library
51  *     The jpeg lib defines import/export to the jpeg format.
52  *     only jpeg.c needs these. Used functions are:
53  *       - jpeg_destroy
54  *       - jpeg_resync_to_restart
55  *       - jpeg_set_marker_processor
56  *       - jpeg_read_header
57  *       - jpeg_start_decompress
58  *       - jpeg_abort_decompress
59  *       - jpeg_read_scanlines
60  *       - jpeg_finish_decompress
61  *       - jpeg_std_error
62  *       - jpeg_create_decompress
63  *       - jpeg_stdio_src
64  *       - jpeg_start_compress
65  *       - jpeg_write_marker
66  *       - jpeg_write_scanlines
67  *       - jpeg_finish_compress
68  *       - jpeg_create_compress
69  *       - jpeg_stdio_dest
70  *       - jpeg_set_defaults
71  *       - jpeg_set_quality
72  *       - jpeg_destroy_compress
73  *     Additionally, it needs the types from the jpeg lib.
74  */
75 /*
76  * $Id$ 
77  *
78  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
79  *
80  * This program is free software; you can redistribute it and/or
81  * modify it under the terms of the GNU General Public License
82  * as published by the Free Software Foundation; either version 2
83  * of the License, or (at your option) any later version. The Blender
84  * Foundation also sells licenses for use in proprietary software under
85  * the Blender License.  See http://www.blender.org/BL/ for information
86  * about this.
87  *
88  * This program is distributed in the hope that it will be useful,
89  * but WITHOUT ANY WARRANTY; without even the implied warranty of
90  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
91  * GNU General Public License for more details.
92  *
93  * You should have received a copy of the GNU General Public License
94  * along with this program; if not, write to the Free Software Foundation,
95  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
96  *
97  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
98  * All rights reserved.
99  *
100  * The Original Code is: all of this file.
101  *
102  * Contributor(s): none yet.
103  *
104  * ***** END GPL/BL DUAL LICENSE BLOCK *****
105  */
106 #ifndef IMB_IMBUF_H
107 #define IMB_IMBUF_H
108
109 /**
110  *
111  * @attention defined in ???
112  */
113 struct ImBuf;
114
115 /**
116  *
117  * @attention defined in ???
118  */
119 struct anim;
120
121 /**
122  *
123  * @attention Defined in cmap.c
124  */
125 void IMB_freeImBufdata(void);
126
127 /**
128  *
129  * @attention Defined in cmap.c
130  */
131 void IMB_applycmap(struct ImBuf *ibuf);
132
133 /**
134  *
135  * @attention Defined in cmap.c
136  */
137 short IMB_converttocmap(struct ImBuf *ibuf);
138
139 /**
140  *
141  * @attention Defined in cmap.c
142  */
143 int IMB_alpha_to_col0(int value);
144
145 /**
146  *
147  * @attention Defined in readimage.c
148  */
149 struct ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags);
150
151 /**
152  *
153  * @attention Defined in readimage.c
154  */
155 struct ImBuf *IMB_testiffname(char *naam,int flags);
156
157 /**
158  *
159  * @attention Defined in readimage.c
160  */
161 struct ImBuf *IMB_loadiffname(const char *naam, int flags);
162
163 /**
164  *
165  * @attention Defined in allocimbuf.c
166  */
167 void IMB_freeImBuf(struct ImBuf * ibuf);
168
169 /**
170  *
171  * @attention Defined in allocimbuf.c
172  */
173 struct ImBuf *IMB_allocImBuf(short x, short y,
174                                                  unsigned char d, unsigned int flags,
175                                                  unsigned char bitmap);
176
177 /**
178  *
179  * Increase reference count to imbuf
180  * (to delete an imbuf you have to call freeImBuf as many times as it
181  * is referenced)
182  *
183  * @attention Defined in allocimbuf.c
184  */
185
186 void IMB_refImBuf(struct ImBuf * ibuf);
187
188 /**
189  *
190  * @attention Defined in allocimbuf.c
191  */
192 void IMB_cache_limiter_insert(struct ImBuf * i);
193 void IMB_cache_limiter_unmanage(struct ImBuf * i);
194 void IMB_cache_limiter_touch(struct ImBuf * i);
195 void IMB_cache_limiter_ref(struct ImBuf * i);
196 void IMB_cache_limiter_unref(struct ImBuf * i);
197 int IMB_cache_limiter_get_refcount(struct ImBuf * i);
198
199 /**
200  *
201  * @attention Defined in allocimbuf.c
202  */
203 struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1);
204
205 /**
206  *
207  * @attention Defined in allocimbuf.c
208  */
209 short addzbufImBuf(struct ImBuf * ibuf);
210 short addzbuffloatImBuf(struct ImBuf * ibuf);
211
212 /**
213  *
214  * @attention Defined in allocimbuf.c
215  */
216 void IMB_freecmapImBuf(struct ImBuf * ibuf);
217
218 /**
219  *
220  * @attention Defined in rectop.c
221  */
222
223 typedef enum IMB_BlendMode {
224         IMB_BLEND_MIX = 0,
225         IMB_BLEND_ADD = 1,
226         IMB_BLEND_SUB = 2,
227         IMB_BLEND_MUL = 3,
228         IMB_BLEND_LIGHTEN = 4,
229         IMB_BLEND_DARKEN = 5,
230         IMB_BLEND_ERASE_ALPHA = 6,
231         IMB_BLEND_ADD_ALPHA = 7,
232
233         IMB_BLEND_COPY = 1000,
234         IMB_BLEND_COPY_RGB = 1001,
235         IMB_BLEND_COPY_ALPHA = 1002
236 } IMB_BlendMode;
237
238 unsigned int IMB_blend_color(unsigned int src1, unsigned int src2, int fac,
239         IMB_BlendMode mode);
240 void IMB_blend_color_float(float *dst, float *src1, float *src2, float fac,
241         IMB_BlendMode mode);
242
243 void IMB_rectclip(struct ImBuf *dbuf, struct ImBuf *sbuf, int *destx, 
244         int *desty, int *srcx, int *srcy, int *width, int *height);
245 void IMB_rectcpy(struct ImBuf *drect, struct ImBuf *srect, int destx,
246         int desty, int srcx, int srcy, int width, int height);
247 void IMB_rectblend(struct ImBuf *dbuf, struct ImBuf *sbuf, int destx, 
248         int desty, int srcx, int srcy, int width, int height, IMB_BlendMode mode);
249 void IMB_rectblend_torus(struct ImBuf *dbuf, struct ImBuf *sbuf, int destx, 
250         int desty, int srcx, int srcy, int width, int height, IMB_BlendMode mode);
251
252 /**
253  * Return the length (in frames) of the given @a anim.
254  */
255 int IMB_anim_get_duration(struct anim *anim);
256
257 /**
258  *
259  * @attention Defined in anim.c
260  */
261 struct anim * IMB_open_anim(const char * name, int ib_flags);
262 void IMB_close_anim(struct anim * anim);
263
264 /**
265  *
266  * @attention Defined in anim.c
267  */
268
269 int ismovie(char *name);
270 void IMB_anim_set_preseek(struct anim * anim, int preseek);
271 int IMB_anim_get_preseek(struct anim * anim);
272
273 /**
274  *
275  * @attention Defined in anim.c
276  */
277
278 struct ImBuf * IMB_anim_absolute(struct anim * anim, int position);
279
280 /**
281  *
282  * @attention Defined in anim.c
283  * fetches a define previewframe, usually half way into the movie
284  */
285 struct ImBuf * IMB_anim_previewframe(struct anim * anim);
286
287 /**
288  *
289  * @attention Defined in anim.c
290  */
291 void IMB_free_anim_ibuf(struct anim * anim);
292
293 /**
294  *
295  * @attention Defined in anim.c
296  */
297 void IMB_free_anim(struct anim * anim);
298
299 /**
300  *
301  * @attention Defined in anim.c
302  */
303 struct ImBuf * IMB_anim_nextpic(struct anim * anim);     
304
305
306 /**
307  *
308  * @attention Defined in antialias.c
309  */
310 void IMB_clever_double (struct ImBuf * ibuf);
311
312 /**
313  *
314  * @attention Defined in antialias.c
315  */
316 void IMB_antialias(struct ImBuf * ibuf);
317
318 /**
319  *
320  * @attention Defined in filter.c
321  */
322 void IMB_filter(struct ImBuf *ibuf);
323 void IMB_filterN(struct ImBuf *out, struct ImBuf *in);
324 void IMB_filter_extend(struct ImBuf *ibuf);
325 void IMB_makemipmap(struct ImBuf *ibuf, int use_filter);
326
327 /**
328  *
329  * @attention Defined in filter.c
330  */
331 void IMB_filtery(struct ImBuf *ibuf);
332
333 /**
334  *
335  * @attention Defined in scaling.c
336  */
337 struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1);
338
339 /**
340  *
341  * @attention Defined in scaling.c
342  */
343 struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, short newx, short newy);
344
345 /**
346  *
347  * @attention Defined in scaling.c
348  */
349 struct ImBuf *IMB_scalefieldImBuf(struct ImBuf *ibuf, short newx, short newy);
350
351 /**
352  *
353  * @attention Defined in scaling.c
354  */
355 struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy);
356
357 /**
358  *
359  * @attention Defined in writeimage.c
360  */
361 short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags);
362
363 /**
364  * Encodes a png image from an ImBuf
365  *
366  * @attention Defined in png_encode.c
367  */
368 short IMB_png_encode(struct ImBuf *ibuf, int file, int flags);
369
370 /**
371  *
372  * @attention Defined in util.c
373  */
374 int IMB_ispic(char *name);
375
376 /**
377  *
378  * @attention Defined in util.c
379  */
380 int IMB_isanim(char * name);
381
382 /**
383  *
384  * @attention Defined in util.c
385  */
386 int imb_get_anim_type(char * name);
387
388 /**
389  *
390  * @attention Defined in divers.c
391  */
392 void IMB_de_interlace(struct ImBuf *ibuf);
393 void IMB_interlace(struct ImBuf *ibuf);
394 void IMB_gamwarp(struct ImBuf *ibuf, double gamma);
395 void IMB_rect_from_float(struct ImBuf *ibuf);
396 void IMB_float_from_rect(struct ImBuf *ibuf);
397
398 /**
399  * Change the ordering of the color bytes pointed to by rect from
400  * rgba to abgr. size * 4 color bytes are reordered.
401  *
402  * @attention Defined in imageprocess.c
403  */
404 void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf);
405 /**
406  *
407  * @attention defined in imageprocess.c
408  */
409 void bicubic_interpolation(struct ImBuf *in, struct ImBuf *out, float x, float y, int xout, int yout);
410 void neareast_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
411 void bilinear_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
412 /**
413  * Change the ordering of the color bytes pointed to by rect from
414  * rgba to abgr. size * 4 color bytes are reordered.
415  *
416  * @attention Defined in imageprocess.c
417  */
418 void IMB_convert_bgra_to_rgba(int size, unsigned int *rect);
419
420 /**
421  *
422  * @attention defined in scaling.c
423  */
424 struct ImBuf *IMB_scalefastfieldImBuf(struct ImBuf *ibuf,
425                                                                           short newx,
426                                                                           short newy);
427
428 /**
429  *
430  * @attention defined in readimage.c
431  * @deprecated Only here for backwards compatibility of the
432  * @deprecated plugin system.
433  */
434 struct ImBuf *IMB_loadiffmem(int *mem, int flags);
435
436 /**
437  *
438  * @attention defined in readimage.c
439  * @deprecated Only here for backwards compatibility of the
440  * @deprecated plugin system.
441  */  
442 struct ImBuf *IMB_loadifffile(int file, int flags);
443
444 /**
445  *
446  * @attention defined in scaling.c
447  */
448 struct ImBuf *IMB_half_x(struct ImBuf *ibuf1);
449
450 /**
451  *
452  * @attention defined in scaling.c
453  */
454 struct ImBuf *IMB_double_fast_x(struct ImBuf *ibuf1);
455
456 /**
457  *
458  * @attention defined in scaling.c
459  */
460 struct ImBuf *IMB_double_x(struct ImBuf *ibuf1);
461
462 /**
463  *
464  * @attention defined in scaling.c
465  */
466 struct ImBuf *IMB_half_y(struct ImBuf *ibuf1);
467
468 /**
469  *
470  * @attention defined in scaling.c
471  */
472 struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1);
473
474 /**
475  *
476  * @attention defined in scaling.c
477  */
478 struct ImBuf *IMB_double_y(struct ImBuf *ibuf1);
479
480 /**
481  *
482  * @attention defined in scaling.c
483  */
484 struct ImBuf *IMB_onethird(struct ImBuf *ibuf1);
485
486 /**
487  *
488  * @attention defined in scaling.c
489  */
490 struct ImBuf *IMB_halflace(struct ImBuf *ibuf1);
491
492 /**
493  *
494  * @attention defined in dither.c
495  */
496 void IMB_dit2(struct ImBuf * ibuf, short ofs, short bits);
497
498 /**
499  *
500  * @attention defined in dither.c
501  */
502 void IMB_dit0(struct ImBuf * ibuf, short ofs, short bits);
503
504 /** Externally used vars: fortunately they do not use funny types */
505
506 /**
507  * boolean toggle that tells whether or not to
508  * scale the color map in the y-direction.
509  *
510  * @attention declared in hamx.c
511  */
512 extern int scalecmapY;
513
514 /**
515  * This 'matrix' defines the transformation from rgb to bw color
516  * maps. You need to do a sort of dot-product for that. It is a matrix
517  * with fixed coefficients, extracted from some book.
518  *
519  * @attention Defined in matrix.h, only included in hamx.c
520  */
521 extern float rgb_to_bw[4][4]; 
522
523 /**
524  *
525  * @attention Defined in rotate.c
526  */
527 void IMB_flipx(struct ImBuf *ibuf);
528 void IMB_flipy(struct ImBuf * ibuf);
529
530 /**
531  *
532  * @attention Defined in cspace.c
533  */
534 void IMB_cspace(struct ImBuf *ibuf, float mat[][4]);
535
536 /**
537  *
538  * @attention Defined in allocimbuf.c
539  */
540 void IMB_freezbufImBuf(struct ImBuf * ibuf);
541 void IMB_freezbuffloatImBuf(struct ImBuf * ibuf);
542
543 /**
544  *
545  * @attention Defined in rectop.c
546  */
547 void IMB_rectfill(struct ImBuf *drect, float col[4]);
548 void IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int y1, int x2, int y2);
549
550 /* this should not be here, really, we needed it for operating on render data, IMB_rectfill_area calls it */
551 void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height, float *col, int x1, int y1, int x2, int y2);
552
553 /* defined in imginfo.c */
554 int IMB_imginfo_change_field(struct ImBuf *img, const char *key, const char *field);
555
556 /* exported for image tools in blender, to quickly allocate 32 bits rect */
557 short imb_addrectImBuf(struct ImBuf * ibuf);
558 void imb_freerectImBuf(struct ImBuf * ibuf);
559
560 short imb_addrectfloatImBuf(struct ImBuf * ibuf);
561 void imb_freerectfloatImBuf(struct ImBuf * ibuf);
562 void imb_freemipmapImBuf(struct ImBuf * ibuf);
563
564 #ifdef WITH_QUICKTIME
565 /**
566  *
567  * @attention Defined in quicktime_import.c
568  */
569 void quicktime_init(void);
570
571 /**
572  *
573  * @attention Defined in quicktime_import.c
574  */
575 void quicktime_exit(void);
576
577 #endif //WITH_QUICKTIME
578
579 /* intern/dynlibtiff.c */
580 void libtiff_init(void);
581 void libtiff_exit(void);
582
583 #endif