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