21249c9e8f72804e0d9e7dfeae0d91d8b61e34dc
[blender.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 void IMB_filter(struct ImBuf *ibuf);
247 void IMB_filterN(struct ImBuf *out, struct ImBuf *in);
248 void IMB_filter_extend(struct ImBuf *ibuf, char *mask);
249 void IMB_makemipmap(struct ImBuf *ibuf, int use_filter);
250 void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter);
251 struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level);
252
253 /**
254  *
255  * @attention Defined in cache.c
256  */
257
258 void IMB_tile_cache_params(int totthread, int maxmem);
259 unsigned int *IMB_gettile(struct ImBuf *ibuf, int tx, int ty, int thread);
260 void IMB_tiles_to_rect(struct ImBuf *ibuf);
261
262 /**
263  *
264  * @attention Defined in filter.c
265  */
266 void IMB_filtery(struct ImBuf *ibuf);
267
268 /**
269  *
270  * @attention Defined in scaling.c
271  */
272 struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1);
273
274 /**
275  *
276  * @attention Defined in scaling.c
277  */
278 struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
279
280 /**
281  *
282  * @attention Defined in scaling.c
283  */
284 struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
285
286 /**
287  *
288  * @attention Defined in writeimage.c
289  */
290 short IMB_saveiff(struct ImBuf *ibuf, const char *filepath, int flags);
291
292 /**
293  * Encodes a png image from an ImBuf
294  *
295  * @attention Defined in png_encode.c
296  */
297 short IMB_png_encode(struct ImBuf *ibuf, int file, int flags);
298
299 /**
300  *
301  * @attention Defined in util.c
302  */
303 int IMB_ispic(const char *name);
304
305 /**
306  *
307  * @attention Defined in util.c
308  */
309 int IMB_isanim(const char *name);
310
311 /**
312  *
313  * @attention Defined in util.c
314  */
315 int imb_get_anim_type(const char *name);
316
317 /**
318  *
319  * @attention Defined in divers.c
320  */
321 void IMB_de_interlace(struct ImBuf *ibuf);
322 void IMB_interlace(struct ImBuf *ibuf);
323 void IMB_rect_from_float(struct ImBuf *ibuf);
324 void IMB_float_from_rect(struct ImBuf *ibuf);
325 void IMB_float_from_rect_simple(struct ImBuf *ibuf); /* no profile conversion */
326 /* note, check that the conversion exists, only some are supported */
327 void IMB_convert_profile(struct ImBuf *ibuf, int profile);
328 float *IMB_float_profile_ensure(struct ImBuf *ibuf, int profile, int *alloc);
329
330 /**
331  * Change the ordering of the color bytes pointed to by rect from
332  * rgba to abgr. size * 4 color bytes are reordered.
333  *
334  * @attention Defined in imageprocess.c
335  */
336 void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf);
337
338 /**
339  * Change the ordering of the color bytes pointed to by rect from
340  * rgba to abgr. size * 4 color bytes are reordered.
341  *
342  * @attention Defined in imageprocess.c
343  */
344 void IMB_convert_bgra_to_rgba(int size, unsigned int *rect);
345
346 /**
347  *
348  * @attention defined in imageprocess.c
349  */
350 void bicubic_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
351 void neareast_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
352 void bilinear_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
353
354 void bicubic_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
355 void neareast_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
356 void bilinear_interpolation_color(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
357 void bilinear_interpolation_color_wrap(struct ImBuf *in, unsigned char *col, float *col_float, float u, float v);
358
359 /**
360  *
361  * @attention defined in readimage.c
362  * @deprecated Only here for backwards compatibility of the
363  * @deprecated plugin system.
364  */
365 struct ImBuf *IMB_loadiffmem(int *mem, int flags);
366
367 /**
368  *
369  * @attention defined in readimage.c
370  * @deprecated Only here for backwards compatibility of the
371  * @deprecated plugin system.
372  */  
373 struct ImBuf *IMB_loadifffile(int file, int flags);
374
375 /**
376  *
377  * @attention defined in scaling.c
378  */
379 struct ImBuf *IMB_half_x(struct ImBuf *ibuf1);
380
381 /**
382  *
383  * @attention defined in scaling.c
384  */
385 struct ImBuf *IMB_double_fast_x(struct ImBuf *ibuf1);
386
387 /**
388  *
389  * @attention defined in scaling.c
390  */
391 struct ImBuf *IMB_double_x(struct ImBuf *ibuf1);
392
393 /**
394  *
395  * @attention defined in scaling.c
396  */
397 struct ImBuf *IMB_half_y(struct ImBuf *ibuf1);
398
399 /**
400  *
401  * @attention defined in scaling.c
402  */
403 struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1);
404
405 /**
406  *
407  * @attention defined in scaling.c
408  */
409 struct ImBuf *IMB_double_y(struct ImBuf *ibuf1);
410
411 /**
412  *
413  * @attention Defined in rotate.c
414  */
415 void IMB_flipx(struct ImBuf *ibuf);
416 void IMB_flipy(struct ImBuf *ibuf);
417
418 /* Premultiply alpha */
419
420 void IMB_premultiply_alpha(struct ImBuf *ibuf);
421
422 /**
423  *
424  * @attention Defined in allocimbuf.c
425  */
426 void IMB_freezbufImBuf(struct ImBuf *ibuf);
427 void IMB_freezbuffloatImBuf(struct ImBuf *ibuf);
428
429 /**
430  *
431  * @attention Defined in rectop.c
432  */
433 void IMB_rectfill(struct ImBuf *drect, float col[4]);
434 void IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int y1, int x2, int y2);
435
436 /* this should not be here, really, we needed it for operating on render data, IMB_rectfill_area calls it */
437 void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height, float *col, int x1, int y1, int x2, int y2);
438
439 /* defined in metadata.c */
440 int IMB_metadata_change_field(struct ImBuf *img, const char *key, const char *field);
441
442 /* exported for image tools in blender, to quickly allocate 32 bits rect */
443 short imb_addrectImBuf(struct ImBuf *ibuf);
444 void imb_freerectImBuf(struct ImBuf *ibuf);
445
446 short imb_addrectfloatImBuf(struct ImBuf *ibuf);
447 void imb_freerectfloatImBuf(struct ImBuf *ibuf);
448 void imb_freemipmapImBuf(struct ImBuf *ibuf);
449
450 short imb_addtilesImBuf(struct ImBuf *ibuf);
451 void imb_freetilesImBuf(struct ImBuf *ibuf);
452
453 #endif
454